challenge ビンゴの結果を整形表示

重複無し乱数」の続編です。

「重複無し乱数」で作ったbingo関数の結果を下のように「何番目の乱数か」とセットにして10個ずつ折り返して表示するコードを書いてください。

>>> bingo(30)
  1  2  3  4  5  6  7  8  9 10
 29 14 16 13 30 15 22 11 25  9

 11 12 13 14 15 16 17 18 19 20
 23  4 18  5 28 17  8 12 21 20

 21 22 23 24 25 26 27 28 29 30
 26  6  2 19  1  7 10 27  3 24

>>> bingo(35)
  1  2  3  4  5  6  7  8  9 10
  7 15  3 32  1 16 17 28  6 29

 11 12 13 14 15 16 17 18 19 20
 19 23 30 26 20  5 12  2 25 31

 21 22 23 24 25 26 27 28 29 30
 35 13 24 18 11  8 10 34 22 21

 31 32 33 34 35
  9  4 27 33 14

Posted feedbacks - C

混ざり具合は良くないですが(-_-
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <stdlib.h>

static int cmp(const void *p1, const void *p2)
{
    return (rand() % 2)?1:-1;
}

int *bingo(int num)
{
    int i, n;
    int *nums;

    if(num <= 0) return NULL;
    nums = (int*)malloc(sizeof(int) * num);
    for(i=0; i<num; i++){
        nums[i] = i + 1;
    }
    qsort(nums, num, sizeof(int), (int (*)(const void*, const void*))cmp);
    return nums;
}

void bingo_print(int *nums, int n)
{
    int i, j;
    for(i=0; i<n; i=j){
        for(j=i; j < n && (i == j || j % 10); j++)
            printf("%2d ", j + 1);
        printf("\n");
        for(j=i; j < n && (i == j || j % 10); j++)
            printf("%2d ", nums[j]);
        printf("\n\n");
    }
}

int main(int argc, char *argv[])
{
    int n;
    int *nums;
    if(argc < 2) return EXIT_FAILURE;
    n = atoi(argv[1]);
    srand(time(NULL));
    nums = bingo(n);
    bingo_print(nums, n);
    free(nums);
    return EXIT_SUCCESS;
}

表示桁指定は * でできますが、表示桁の求め方を 2 種類用意しました。
1. libm をリンクして、log10 を使う方法
2. stderr を捨てて fprintf を使う方法
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//#include <math.h>

void bingo( int n ){
   int tmp;
   int i,j;
   //int k = (int)log10( n )+1;
   int k = fprintf(stderr, "%d",n);
   int *deck = (int*)malloc(sizeof(int)*n);

   for( i = 0; i < n; i++ )
      deck[i] = i+1;

   for( i = 0; i < n; i++ ){
      j = rand() % (n-i);
      tmp = deck[j];
      deck[j] = deck[ n-i-1 ];
      deck[ n-i-1 ] = tmp;
   }

   for( i = 0; i < n; i+=10){
      for( j = i; j < i+10 && j < n; j++ )
         printf("%*d ", k, j+1 );
      printf("\n");
      for( j = i; j < i+10 && j < n; j++ )
         printf("%*d ", k, deck[j] );
      printf("\n");
      printf("\n");
   }

   free(deck);
}

int main ( void ){
   srand(time(NULL));
   bingo(9);
   printf("\n");
   bingo(23);
   printf("\n");
   return 0;
}

Index

Feed

Other

Link

Pathtraq

loading...