• 締切済み

ポインタと構造体の利用について

samplefile.txtの中身 c03888 工大八郎 90 a03111 工大一郎 100 a03222 工大二郎 30 b03666 工大六郎 70 b03555 工大五郎 60 a03333 工大三郎 80 c03777 工大七郎 40 c03999 工大九郎 20 b03444 工大四郎 50 このデータをfscanfで取り込んで構造体に代入 typedef struct { char code[7]; char name[21]; int score; }REC; そしてこのデータを昇順にソートして結果を出力したいのですが 問題はここから work52.cというファイルとbubble.cというファイルとmy_sort.hというファイルがあり、work52.cからmy_sortという関数(バブルソート)を使いたい。 work52.cの中身 #include <stdio.h> #include "my_sort.h" #define MAX_NUM 500 int main(int argc, char *argv[]){ FILE *fp; REC rec[MAX_NUM]; int i, sum , min, max , n; if (argc != 2) { printf("ファイル名を指定してください\n"); return(-1); } if ((fp = fopen(argv[1], "r")) == NULL) { printf("ファイルを開けませんでした\n"); return(-1); } i = 0; while (fscanf(fp, "%s %s %d", rec[i].code, rec[i].name, &rec[i].score) != EOF){ i++; } fclose(fp); n = i; /* 初期値の設定 */ min = rec[0].score; max = rec[0].score; sum = rec[0].score; for (i = 1; i < n; i++){ sum += rec[i].score; if (rec[i].score < min) { min = rec[i].score; } if (rec[i].score > max) { max = rec[i].score; } } my_sort(rec, n); printf("最高点:%3d\n", max); printf("最低点:%3d\n", min); printf("平均点:%5.1f\n", (double) sum / n); for (i = 0; i < n; i++){ printf("%3d\t%s\t%s\n", rec[i].score, rec[i].code, rec[i].name); } return(0); } my_sort.hの中身 typedef struct { char code[7]; char name[21]; int score; }REC; void my_sort(REC *rec,int n); バブルソートで整列 #include <stdio.h> #include "my_sort.h" #define MAX 50 void my_sort(REC *rec, int n){ for(i = 0;i < n - 1; i++){ for(j = n - 1;j > i;j--){ /*この中身が問題----1*/ } } } 1の部分でchar codeとchar nameとint scoreの値を交換するときにどうすればいけるでしょうか?ご教授ください。

みんなの回答

noname#42542
noname#42542
回答No.6

No.2で回答したものです。 構造体の値の交換の部分をいちいちメンバ変数を指定してますが、これはNo.3の方が書いたように a = b; で、構造体変数に直接代入できます。 (私がC言語を覚えた20年以上前には構造体変数の代入が出来ないコンパイラが結構あったのです。いつの間にかそのスタイルで書いてしまいました)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★また、寝ぼけていた。本当にごめんなさい。 ・(1)code で昇順ソートするならば  間違い⇒if ( strcmp( rec[i].code, rec[j].code ) ){  正しい⇒if ( strcmp( rec[i].code, rec[j].code ) < 0 ){  としてください。 ・(2)name で昇順ソートするならば  間違い⇒if ( strcmp( rec[i].name, rec[j].name ) ){  正しい⇒if ( strcmp( rec[i].name, rec[j].name ) < 0 ){  としてください。 ・寝起きでボケてしまった(恥)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★あっ、寝ぼけていた。→比較部分を追加修正します。 ・交換部分の  tmp = rec[ i ];  rec[ i ] = rec[ j ];  rec[ j ] = tmp;  を  if ( 条件式 ){   tmp = rec[ i ];   rec[ i ] = rec[ j ];   rec[ j ] = tmp;  }  に修正して下さい。 ・また『条件式』はソートする項目により3タイプあります。  回答者 No.1 さんのアドバイスにあるようにどのデータで『昇順』ソートしますか?  (1)code で昇順ソート…strcmp( rec[i].code, rec[j].code )  (2)name で昇順ソート…strcmp( rec[i].name, rec[j].name )  (3)score で昇順ソート…rec[i].score <rec[j].score  どの項目で昇順ソートするか分からないため、上記に3つ条件式を用意しました。  下のようになります。 ・(1)code で昇順ソートするならば、  if ( strcmp( rec[i].code, rec[j].code ) ){   tmp = rec[ i ];   rec[ i ] = rec[ j ];   rec[ j ] = tmp;  } ・(2)name で昇順ソートするならば、  if ( strcmp( rec[i].name, rec[j].name ) ){   tmp = rec[ i ];   rec[ i ] = rec[ j ];   rec[ j ] = tmp;  } ・(3)score で昇順ソートするならば、  if ( rec[i].score <rec[j].score ){   tmp = rec[ i ];   rec[ i ] = rec[ j ];   rec[ j ] = tmp;  } ・以上。おわり。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★交換の部分だけアドバイス ・一般にデータの交換は、一時変数(配列、構造体)などを1つ用意して代入を3回  行うことで交換できます。 ・つまり、  (1)一時変数←交換値1  (2)交換値1←交換値2  (3)交換値2←一時変数  この3ステップです。 ・一時変数は入れ替えるデータと同じ型を1つ宣言すればよい。  つまり、my_sort() 関数の最初に『REC tmp;』を1つ宣言します。  そして、  tmp = rec[ i ];  rec[ i ] = rec[ j ];  rec[ j ] = tmp;  の3ステップで rec[i] と rec[j] の2つのデータが交換できます。 ・下に my_sort() 関数を提示します。 サンプル: void my_sort( REC *rec, int n ) {  REC tmp; ←これを宣言。    for ( i = 0 ; i < n - 1 ; i++ ){   for( j = n - 1 ; j > i ; j-- ){    /*この中身が問題----1*/    tmp = rec[ i ];    rec[ i ] = rec[ j ];    rec[ j ] = tmp;    ↑ここに3ステップを記述。   }  } } その他: ・バブルソートのアルゴリズムは理解しているようですね。  データの交換は一時変数 tmp を1つ用意して代入ステップを3回行うことで出来ます。 ・私は配列の交換を行うときに一時変数 tmp を tmp[ 1 ] として宣言します。  これは交換部分を  tmp[ 0 ] = rec[ i ];  rec[ i ] = rec[ j ];  rec[ j ] = tmp[ 0 ];  と桁をそろえて、見やすくする意味で行っています。→私流です。まねるかどうかは自由です。 ・以上。おわり。

noname#42542
noname#42542
回答No.2

まず、rec[j - 1]とrec[j]の大小を比較しますよね。 scoreでソートする場合、 if (rec[j - 1].score > rec[j].score) {   入れ替え処理 } codeやnameでソートする場合、 if (strcmp(rec[j - 1].code, rec[j].code) > 0) {   交換処理 } そして、値を交換するとき、   rec[j - 1].score = rec[j].score; だとj - 1のほうの内容が消えてしまいますので、一時的にj - 1の内容を退避する変数を用意します。my_sort()に   REC temp; を宣言し、   /* 退避する */   temp.score = rec[j - 1].score;   strcpy(temp.code, rec[j - 1].code);   strcpy(temp.name, rec[j - 1].name);   /* j - 1にjをコピーする */   rec[j - 1].score = rec[j].score;   strcpy(rec[j - 1].code, rec[j].code);   strcpy(rec[j - 1].name, rec[j].name);   /* jに退避したデータ(j - 1)をコピーする */   rec[j].score = temp.score;   strcpy(rec[j].code, temp.code);   strcpy(rec[j].name, temp.name); とします。 1. j - 1を退避 2. j - 1にjをコピー 3. jに退避データをコピー のセットで値の交換ができます。 バブルソートは、ソートする際にデータが泡のように移動していくことからそう呼ばれます。 外側のループが1回実行されるたびに内側のループでの最小値が確定します。 i = 0のときに内側ループが n - 1回実行され、rec[0]が確定(rec[0]~rec[n - 1]を比較) i = 1のときに内側ループが n - 2回実行され、rec[1]が確定(rec[1]~rec[n - 1]を比較) i = 2のときに内側ループが n - 3回実行され、rec[2]が確定(rec[2]~rec[n - 1]を比較) : : i = n - 2のときに内側ループが1回実行され、rec[n - 1]が確定(rec[n - 2]~rec[n - 1]を比較)

参考URL:
http://www1.cts.ne.jp/~clab/hsample/Sort/Sort1.html
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

> データを昇順にソートして結果を出力したい データには ・コード ・名前 ・点数 の3種類があります。 どれの昇順ですか?

関連するQ&A

  • ポインターを使った並べ替え

    ポインタを用いてソートを行うプログラムを作成しています しかし、関数部分が悪いのか、上手く作動されません よろしければ、アドバイスをいただけると嬉しいです #include <stdio.h> #define MAX 10 #define RandMax 1000 void select_sort(int *a, int n){ int *i, *min, *last, t; last=a+n; for(i=a; i<last; i++){ min=a; for(i=a+1; i<last; i++) if(*i<*min) min=i; t=*min; *min=*i; *i=t; } } main(){ int *a, i; a=(int*)calloc(MAX,sizeof(int)); for(i=0; i<MAX; i++) a[i]=rand()%RandMax; select_sort(a, MAX); printf("data size=%d \n", MAX); for(i=0; i<MAX; i++){ printf("%5d", a[i]); if(i%10==9) printf("\n"); } } 以上が私の作成したプログラムです よろしくお願いします

  • プログラミングのポインタの所の課題で、途中までやったのですが・・・

    プログラミングのポインタの所の課題で、途中までやったのですが・・・ どうしてもとけません。どなたか解けるかた、ご指導お願いします。。。 課題は以下の通りです。 1.文字配列の先頭文字でソートを行って出力するプログラムを完成させよ。ただし、my_sort_stringsはポインタ配列とその要素数を引数として、登録されている文字配列を昇順に並べ替える関数である。 #include<stdio.h> #include<string.h> void print_strings(char **p, int n); void swap_strings(char **p, int i, int j); int min_index(); void my_sort_strings(); int main() { char*p[100]; char Orange[] = "orange"; char Apple[] = "apple"; char Peach[] = "peach"; char Grape[] = "grape"; char Melon[] = "melon"; int i; p[0] = Orange; p[1] = Apple; p[2] = Peach; p[3] = Grape; p[4] = Melon; print_strings(p, 5); my_sort_strings(); print_strings(p, 5); return 0; } void print_strings(char **s, int n) { int i; printf("-----------begin: print_string ----------\n"); printf("print_string: s's value: %08x\n", s); for(i = 0; i < n; i++) { printf("(s[%d])'s value: %08x\n", i, s[i]); printf("(s[%d])'s address: %08x\n", i, &s[i]); } for(i = 0; i < n; i++) printf("%d: %s\n, i, s[i]"); printf("-----------end: print_strings-----------\n"); } void swap_strings(char **p, int i, int j) { char *tmp; tmp = p[i]; p[i] = p[j]; p[j] = tmp; } int min_index(char **a, int n) { } void my_sort_strings( ) { } 2.課題1を元に文字配列の2文字目以降の順序まで考慮した辞書式順序でソートを行うプログラムを作成せよ。関数名はlexicographic_sortとする。

  • ポインタで…

    (a,b,c):10 20 30 (a,b,c)=(10,20,30) 最大値 : 30 最小値 : 10 ↑のように実行例にしたいのですが関数の部分がわかりません 。 3つの変数のポインタ(n1, n2, n3)と求めたい値を指定する整数rank(最大値を求めるなら1を、最小値なら3を指定する)を引数として指定し、返り値として最大値(最小値)を持つ変数のポインタを返す関数 int * ranking(int *n1, int *n2, int *n3, int rank) を作成し、以下のプログラムを完成させなさい。 #define MAX 1 #define MIN 3 int * ranking(int *n1, int *n2, int *n3, int rank) { /* rankが1なら最大値、3なら最小値を返す */ /* 関数を作成 */ } int main() { int a, b, c, i; printf("(a,b,c):"); scanf("%d %d %d", &a, &b, &c); printf("(a,b,c)=(%d,%d,%d)\n", a, b, c); printf("最大値 : %d\n", *ranking(&a, &b, &c, MAX)); printf("最小値 : %d\n", *ranking(&a, &b, &c, MIN));

  • n人の教科ごとの最高点、最低点を求めるプログラム

    n人の教科ごとの最高点、最低点を求めるプログラム C言語で、タイトルのようなプログラムを作成しています。(n≦100) 教科は国語、数学、英語の3教科です。 作る際の条件として、最高点と最低点を同時に求める関数minmaxを一つだけしか作れません。 入力例) % ./a.out number of persons: 3 Japanese Math English No.1: 90 80 70 No.2: 71 91 81 No.3: 82 72 92 min score: 71 72 70 max score: 90 91 92 現在、構造まで習いました。その知識をもとに以下のようにプログラムしました。(ただ、教科ごとの最高、最低点を求める部分は代表して国語の点の最低点を求める部分だけ載せました) #include <stdio.h> #define MAX 100 struct score{     int jpn;     int math;     int eng; }; void minmax(struct score, int, struct score *, struct score *); main(){     struct score s[MAX], min, max;     int n, i;     printf("number of persons: ");     scanf("%d", &n);     printf("Japanese, Math, English\n");     for (i = 0; i < n; i++) {         printf("No.%d: ", i+1);         scanf("%d %d %d", &(s[i].jpn), &(s[i].math), &(s[i].eng));     }     minmax(s[MAX], n, &min, &max); <------------(☆)     printf("min score: %3d%3d%3d\n", min.jpn, min.math, min.eng);     printf("max score: %3d%3d%3d\n", max.jpn, max.math, max.eng); } void minmax(struct score s[], int n, struct score *minscore, struct score *maxscore) {     int i, max, min;     for (i = 1, min = s[0].jpn; i < n; i++) {         if (min > s[i].jpn) {             min = s[i].jpn;         }     }     minscore->jpn = min; (以下略) } しかし、これをコンパイルすると、 「(☆):パラメータの型1が関数宣言と一致しません。」と出ます。 どこがおかしいのでしょうか、どなたか教えてください。

  • 構造体

    下記プログラムの2次元配列を構造体の配列に作り変え,構造体を利用して生年月日の項目を追加し,形式は日を除いたYYYY/MMで持ち,生年月日の入出力は,YYYY/MM形式で行い,西暦が数字4桁で,西暦と月の間に'/'があり,月が01~12の範囲の数字の2桁になっている7文字の入力のみ受け付け,正しく入力されるまでそれ以外は再入力させたい。あとdo-while文をつかっている箇所をwhile文に直したいです.自力でやったのですが,わかりませんでした. どのようにしたらよいか教えてください. お願いします. include <stdio.h> #define BUFFERSIZE 11 #define MAX_PERSON 10 #define MAX_CHARS 10 int main(void) { char name[10][BUFFERSIZE]; int c; int count = 0; int i; int j; for (i = 0; i < MAX_PERSON; i++) { printf("氏名入力 : "); j = 0; /* 氏名の1文字目が'0'なら入力を終了 */ if ((c= getchar()) == '0'){ break; } if (c == '\n') { /* 改行のみの入力は再入力 */ do { printf( "再入力\n" ); /*再入力*/ printf("氏名入力 : "); } while ((c = getchar()) == '\n'); } name[i][j++] = c; /*1文字目を格納*/ if (name[i][0] == '0') { break; } while ((c = getchar()) != '\n' && c != EOF) { if (j < BUFFERSIZE - 1) { name[i][j++] = c; } } name[i][j] = '\0'; count++; /* 実際に入力した人数を記録*/ printf("累計 : %d \n", count); } /* 氏名と生年月日を出力したいです */ for (i = 0; i < count; i++) { for (j = 0; j < MAX_CHARS; j++) { if (name[i][j] == '\0'){ break; } putchar(name[i][j]); } putchar('\n'); } return 0; }

  • 構造体へのポインタ

    すみません、構造体へのポインタの配列の扱いに困っています。 下記ソースの struct list *hashtable[HASHSIZE]; の箇所をmain部に入れた場合の 他の関数内での使用の仕方が全くわかりません。 どのように修正すれば良いのでしょうか。 申し訳ありませんが教えてください。 --------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #define HASHSIZE 40 #define MAX_KW_LEN 256 #define NUM_KW 23 #define TRUE 1 #define FALSE 0 struct list {  char keyword[MAX_KW_LEN];  struct list *next;   /* 次の list へのポインタ */ }; struct list *hashtable[HASHSIZE]; /* ハッシュテーブル */ /* キーワード ( Cの予約語 ) */ static char kw[NUM_KW][MAX_KW_LEN] = {   "auto", "break", "double",   "enum", "char", "continue", "extern", "float", "for", "int",   "long", "register", "short", "signed", "static",   "struct", "typedef", "union", "unsigned", "return",   "void", "volatile", "while" }; int Hash(char *key); void InitHTable(void); int FindKeyWord(char *key); void ListKeyWord(void); void FreeKeyWord(void); int main(void); int Hash(char *key) {  int hashval = 0;  while (*key != '\0')   hashval += *key++;  return (hashval % HASHSIZE); } void InitHTable(void) {  int i;  struct list *p, *q;  int hashval;  for (i = 0; i < NUM_KW; i++) {   printf("%d\n",i);   if ((FindKeyWord(kw[i])) == FALSE) { /* 登録されていなかったら */             /* メモリを割り付ける */    if ((p = (struct list *)malloc(sizeof(struct list))) == NULL) {     fprintf(stderr, "メモリ不足です。\n");     exit(2);    }    strcpy((*p).keyword, kw[i]);    hashval = Hash(kw[i]);    /* ハッシュ値を求めて */        if (hashtable[hashval] == NULL) { /* 未登録なら */     hashtable[hashval] = p;  /* p の指すアドレスを登録 */     p->next = NULL;    /* リストの末尾に NULL を追加 */    }    else {        /* 既に登録していたら */     q = hashtable[hashval];     while (q->next != NULL) {  /* データがなくなるまで */      q = q->next;    /* リストをたどる */     }     q->next = p;     /* リストの末尾に p の指すアドレスを登録 */     p->next = NULL;    /* その末尾に NULL を追加 */    }   }  } } int FindKeyWord(char *key) {  struct list *p;  for (p = hashtable[Hash(key)]; p != NULL; p = p->next)   if (!strcmp(key, (*p).keyword))  /* 登録済みなら */    return (TRUE);     /* TRUE を返す */   return (FALSE);      /* 未登録ならFALSE を返す */ } void ListKeyWord(void) {  int i;  struct list *p;  for (i = 0; i < HASHSIZE; i++)   for (p = hashtable[i]; p != NULL; p = p->next) /* p が NULL でなければ */               /* ハッシュ値とキーワードを表示 */    printf("予約語:%s ハッシュ値:%d:\n", (*p).keyword, Hash((*p).keyword)); } /* malloc( ) で割り付けたメモリを解放 */ void FreeKeyWord(void) {  int i;  struct list *p, *q;  for (i = 0; i < HASHSIZE; i++)   for (p = hashtable[i]; p != NULL; ) { /* p が NULL でなければ */    q = p->next;      /* p->next を保存 */    free(p);       /* メモリを解放 */    p = q;        /* p->next を p に代入 */   } } int main(void) {  char word[MAX_KW_LEN];  int i;  InitHTable( );  ListKeyWord( );  for (i = 0; i < 4; i++) {   printf("Cの予約語を入力して下さい ");   fgets(word, 128, stdin);   if ((FindKeyWord(word)) == TRUE)    printf("%s は登録済みです。\n", word);   else    printf("%s は未登録です。\n", word);  }  FreeKeyWord( ); }

  • 上手くいかない

    QNo.2985174で質問したものです 皆さんからいろいろなアイデアを頂きましたが、やはり並び替えを行ってはくれません どんなコトでも良いので、アドバイスをいただけると嬉しいです>< 前回の質問…http://oshiete1.goo.ne.jp/qa2985174.html?ans_count_asc=0 以下が現在のプログラムです #include <stdio.h> #define MAX 10 #define RandMax 1000 void select_sort(int *a, int n){ int *i, *min, last, t; for(last=(a+n); a<last; a++){ min=a; for(i=a+1; i<last; i++) if(*i<*min) min=i; t=*min; *min=*i; *i=t; } } main(){ int *a, i; a=(int*)calloc(MAX,sizeof(int)); for(i=0; i<MAX; i++) a[i]=rand()%RandMax; select_sort(a, MAX); printf("data size=%d \n", MAX); for(i=0; i<MAX; i++){ printf("%5d", a[i]); if(i%10==9) printf("\n"); } }

  • 構造体を動的変数とポインタを使い表を作る

    学校の改題で「人数を入力して、その人数分の名前と点数を入力して一覧にしろ」という課題がでたのですが、どこから手を付けていいのか解りません。 内容は「任意の人数を設定して、その分ループして名前と点数をいれ、その構造体を頭からループして一覧を作れ」ということなので以下のようにやってみたのですが、結果が「(null) 0」としかなりません。 手の打ちようがないので助言お願いします。 #include <stdio.h> #include <stdlib.h> struct ty_i{ char *name; int point; }; int main(void){ int n,i; struct ty_i *main_ty,*copy_ty; printf("n = ");scanf("%d",&n); main_ty=(struct ty_i *)malloc(sizeof(struct ty_i)*n); if(main_ty==NULL){ printf("Error\n"); exit(1); } for(i=0;i<n;i++){ printf("%d:",i);scanf("%s,%d",&main_ty++->name,&main_ty++->point); } copy_ty=main_ty; for(i=0;i<n;i++){ printf("%s\t%d\n",copy_ty++->name,copy_ty++->point); } exit(0); }

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

  • C言語のプログラムでおかしな動作をするのですが教えて頂けないでしょうか?

    VisualStudio2008使用しています。 問題は、サイコロを200回振ってその出た目の数の個数分*を表示するプログラムです。 サイコロの目はランダムで出しています。 次のプログラムは正常に動作するものです。 /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; int y[7]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } */ 次のプログラムが問題で、授業で先生が配列にはstaticをおまじないとしてつけないと暴走すると言われたので、つけて見ると明らかに間違ってると思われるプログラムで動作するのですが原因を教えて頂けないでしょうか? 以下問題のプログラム! 配列の前にstaticをつけたら、添え字をいくつにしても正常に動作します。普通は添え自分しか領域って確保されないですよね??? /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; //以下が問題の配列宣言 static int y[2]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } 質問の意味が正確に伝わらなかった場合は補足しますので、ご回答よろしくお願いします。