• ベストアンサー
  • すぐに回答を!

ファイルを読み込むプログラム

氏名、英語、数学が保存されているファイル(記入されている人数は不明とし100人まで読み込めるとする)を関数内で読み込んで個人の点数の平均値と、皆の数学の平均値、英語の平均値を関数内で定義して出力するプログラムを作りましたが、コンパイルはできても実行するとエラーが出ます。どこがおかしいか分かる人教えてください。 #include <stdio.h> #include<stdlib.h> #include<string.h> #define number 100 int n=0; //構造体を宣言する struct student {char Name[6]; double Math; double Eng; }; struct student *sset_student(char *buffer) { struct student *pss[number]; int ret; ret=sscanf(&buffer[0],"%s %lf %lf",&pss[0]->Name,&pss[0]->Math,&pss[0]->Eng); if(ret!=3) { puts("代入された入力項目の個数が3でありません"); return NULL; } return pss[0]; } struct student *fset_all_student(void) { int i; struct student *pss[number]; FILE *fpin; char buffer[20]; fpin=fopen("input.txt","r"); if(fpin==NULL) { fprintf(stderr, "入力するファイルが開きません"); return NULL; } while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { pss[i]=sset_student(&buffer[0]); i++; } n=i; fclose(fpin); return pss[0]; } void get_student_average(struct student *pss) { double heikin; heikin=(pss->Math+pss->Eng)/2.0; printf("%sの平均点は%dです\n",pss->Name,heikin); } void get_average(struct student *pss) { int i; double msum=0; double esum=0; for(i=0;i<3;i++) { msum+=pss[i].Math; esum+=pss[i].Eng; } printf("数学の平均点は%dです\n",msum/n); printf("英語の平均点は%dです\n",esum/n); } int main(void) { int i; struct student *a[number]; for(i=0;i<n;i++) { a[i]=fset_all_student(); } for(i=0;i<n;i++) get_student_average(a[i]); get_average(a); return 0; }

共感・応援の気持ちを伝えよう!

  • 回答数9
  • 閲覧数313
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.7
  • tig33
  • ベストアンサー率50% (6/12)

構造体配列と、構造体へのポインタの配列を混同しているようですね。 struct student *pss[number]; struct student *a[number]; は、ポインタの配列なので、実体がありません。 ここに、名前、英語の点数、数学の点数を代入するだけで、 メモリー(この場合はスタック)が破壊されてしまいます。 それで、強制終了しちゃうんですね。 グローバル変数で、 struct student StudentTable[number]; として、定義し、ここに、読みこんだ名前,英語の点数、数学 の点数を代入していけばOKになるんじゃないかな・・ #include <stdio.h> #include <string.h> #define number 100 struct student {   char name[80];   float Math;   float Eng;   float MEAve; }; struct student StudentTable[number]; char readbuf[256]; /* 文字列(text)からカンマで区切られた文字列を取り出す */ char *ExtractToken(char *cp, char *text) {   while(*text !='\0') {     if( *text == ',' ) {       text++;       break;     }     *cp++ = *text++;   }   *cp = "\0";      return( text ); } /*  指定されたカンマで区切られた文字列から、  生徒の名前、英語の点数、数学の点数をセットする */ void SetResult(char *readstr, struct student *stp) {   char buf[128], *cp;      cp = readstr;      /*名前の抽出*/   cp = ExtractToken( buf, cp );   strcpy( stp->name, buf );      /* 英語の点数の抽出 */   cp = ExtractToken( buf, cp );   stp->Eng = atof(buf);      /* 数学の点数の抽出 */   cp = ExtractToken( buf, cp );   stp->Math = atof(buf); } /*  ファイルから生徒の名前、点数を読み出して、  テーブル(最大100名)を作成する  関数の戻り値:読み込んだ生徒数 */ int SetAllResults(char *filename) {   FILE *fp;   int i;   struct student *stp;   char *rstr;      fp = fopen(filename, "rt");   if( fp == NULL ) {     fprintf(stderr,"ファイルがオープンできません\n");     return(0);   }      stp = StudentTable; /* stp=&StudentTable[0];と同じ*/   for(i=0; i<number i++) {     rstr = fgets(readbuf,sizeof(readbuf),fp);     if( rstr == NULL ) break;          SetResult(readbuf, stp);     stp++;   }      fclose(fp);      /* 読み込んだ人数 */   return( i ); } /*  個人の平均点 */ float GetStudentAve( struct student *stp ) {   stp->MEAve = (stp->Math + stp->Eng) / 2.0;      return( stp->MEAve ); } /*  全体の数学の平均 */ float GetMathAve(int Count) {   struct student *stp;   int i;   float = sum;      stp = StudentTabe;   sum = 0.0;   for(i=0; i<Count; i++) {     sum += stp->Math;     stp++;   }      return( sum / (float)Count ); } /*  英語の平均 */ float GetMathAve(int Count) {   /* 省略 */ } int main() {   int n, i;   struct student *stp;   float ave;      n = SetAllResults("input.txt");   if( n == 0 ) {     return(1);   }      stp = StudentTable; /* stp=&StudentTable[0];と同じ*/   for(i=0; i<n; i++) {     ave = GetStudentAve( stp );     printf("%sさんの平均点は、%4.1fです\n", ave);   }   printf("\n"); /*1行空ける*/   printf("数学の平均は、%4.1fです\n", GetMathAve(n));   printf("英語の平均は、%4.1fです\n", GetEngAve(n)); }

共感・感謝の気持ちを伝えよう!

質問者からの補足

ほんと回答ありがとうございます!! float GetMathAve(int Count) のstp = StudentTabe;が未定義のシンボル char *ExtractToken(char *cp, char *text)   *cp = "\0";の移植性のないポインタ変換 とエラーがでてしまいます… この場合すればいいですか?

関連するQ&A

  • このプログラムどこがおかしいですか?

    コンパイルはできますが実行できません… どこがおかしいか分かる人教えてください。 このプログラムはファイルから名前 数学の点数、英語の点数を読み込んで文字データに入れた後構造体に入れて探し出す値の項目(キー)を入力して(何番目にあるか)探し出すというプログラムです。 #include <stdio.h> #include <string.h> #define NUMBER 10 //構造体を宣言する struct student { //名前、身長、体重を構造体オブジェクトのメンバに格納する関数の定義 char name[10]; char math[4]; char eng[4]; }; /*--- 要素数nの配列aからkeyと一致する要素を線形探索(番兵法) ---*/ int search(struct student *b, int n, char key) { int i=0; b[i].name[0]=key; // 番兵を追加 while (1) { if (b[i].name[0] == key) break; /* 見つけた */ i++; } return (i == n ? -1 : i); } int main(void) { FILE *fpin; struct student a[NUMBER]; int i=0, idx,ret; char buffer[20],ky; int nx=sizeof(buffer) / sizeof(buffer[0]); fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { if(i>=100) break;//読み込む人数が100人を超えてる時の処理 ret=sscanf(&buffer[0],"%s %s %s",&a[i].name,&a[i].math,&a[i].eng); //データ文字列を3分割 if(ret!=3) //3に分割できなかったときの処理 { puts("代入された入力項目の個数が3でありません"); goto END; } printf("%s %s %s\n",&a[i].name,&a[i].math,&a[i].eng); i++; } printf("探す値:"); scanf("%s", &ky); idx = search(a, nx - 1, ky); /* 配列xから値がkyである要素を線形探索 */ if (idx == -1) puts("探索に失敗しました。"); else printf("%dは%d番目にあります。\n", ky, idx + 1); END: fclose(fpin); return 0; }

  • 質問ですが

    教えていただきたいのですが、C言語で名前と点数を入力して合計と平均を求めるというプログラムを作ったのですが、 main関数の中で情報入力、合計と平均の計算をしているのでそれぞれ入力関数、合計を求める関数、平均を求める関数というものを作ってmain関数をすっきりとさせたいのですがどうすればいいですか? #include <stdio.h> typedef struct{ char name[15]; int jpn; int eng; int math; int sum; } stdent; typedef struct{ double sum; double jpn; double eng; double math; } Score; void maxmin(stdent *, int); main() { int i, n; n = 5; stdent person[n]; Score average; average.jpn = 0; average.eng = 0; average.math = 0; average.sum = 0; for(i = 0; i < n; i++) { printf("Student No.%d \n",i + 1); printf("Name? "); scanf("%s", person[i].name); printf("Japanese? "); scanf("%d", &(person[i].jpn)); printf("English? "); scanf("%d", &(person[i].eng)); printf("Math? "); scanf("%d", &(person[i].math)); printf("\n"); person[i].sum = person[i].jpn + person[i].eng + person[i].math; average.jpn += person[i].jpn; average.eng += person[i].eng; average.math += person[i].math; average.sum += person[i].sum; } average.jpn /= n; average.eng /= n; average.math /= n; average.sum /= n; printf(" 名前 国語 英語 数学 \n"); printf("------------------------------------\n"); for(i = 0; i < n; i++) { printf("%8s %3d %3d %3d %3d\n", person[i].name, person[i].jpn, person[i].eng, person[i].math, person[i].sum); } printf("------------------------------------\n"); printf("平均 %.1lf %.1lf %.1lf %.1lf\n\n", average.jpn,average.eng,average.math,average.sum); return 0; }

  • C言語について

    #include <stdlib.h > #include <stdio.h> double sum ( double data[] , int number) { double result; int a ; result = 0; for (a = 0; a < number; a+1){ result += data[a]; } return (result); } double average ( double data[] , int number) { double result; result = sum(data,number)/number; return (result); } int main ( void ) { double heikin; double data[9]; double average; int number,i; printf("数値の数を入力(1~10) = "); scanf("%d",&number); printf("データを入力 "); for( i=0;i<number;i++ ) { printf("%d個目 = ",i+1); scanf("%d",&data[i]); } heikin = average(data,number); printf("平均は%lfです\n",heikin);//文を使って平均値(heikin)を出力 return(EXIT_SUCCESS); } というプログラムがありエラーで 「35行目」で記述エラーを発見しました。 「function pointer」を付け忘れています。 と出てきます。ほかのサイト様で写真とかありえないといわれましたのでテキストで再度質問させていただきました。 よろしくお願いします。 前投稿から編集もしているので少しプログラムが違います。

その他の回答 (8)

  • 回答No.9
  • tig33
  • ベストアンサー率50% (6/12)

>ほんと回答ありがとうございます!! >float GetMathAve(int Count) >のstp = StudentTabe;が未定義のシンボル >char *ExtractToken(char *cp, char *text) >  *cp = "\0";の移植性のないポインタ変換 >とエラーがでてしまいます… >この場合すればいいですか? 未定義のシンボル→ stp = StudentTable; *cp = "\0"; → *cp = '\0'; と修正してください。

共感・感謝の気持ちを伝えよう!

質問者からの補足

なおりました。 回答ありがとうございます!!!

  • 回答No.8
  • tig33
  • ベストアンサー率50% (6/12)

GetMathAve関数の中で定義している float = sum は、間違いです。 float sum; が正解です。 失礼しました。 他にもケアレスミスがあるかも。。。大目に見てやってくださいm(__)m

共感・感謝の気持ちを伝えよう!

  • 回答No.6

☆設計上の根本的な誤り:人数分ファイルを開閉して、先頭レコード( yuki 65 70 )の情報のみを利用しようとしています。 ☆構造体を、struct student *a[number]; のように * 付きで宣言してますが・・。 ☆最初の関数で、struct student *pss[number]; としてるけど、[0] しか使っていないのだから・・。 ☆ n が、最初に使われるのは?。 ☆printf("%sの平均点は%dです\n",pss->Name,heikin); 【 %d 】?      (他にも) ☆ &buffer[0] は単に、buffer でいいと思うけど。 ---------------------------------------- 暇な年寄りが、関数間で構造体をやりとりしない方法で、整形してみました。 こんなんもあるよ、程度にご覧下さい。 #include <stdio.h> #include <stdlib.h> #define NUMBER 100 typedef struct{  char cName[8]; // 8, 16, 32・・, 趣味の世界  float fMth;  float fEng; }STUDENT; STUDENT sSeit[NUMBER]; // グローバル void Error( char *cMess ) {  fprintf( stderr, cMess );  exit( 0 ); } int fset_all_student( void ) {  int iNo = 0, iRet;  FILE *fp;  char cBuf[32]; // 32, 64, 128・・  fp = fopen( "input.txt", "r" );  if( NULL == fp ) Error( "input.txt をオープンできない\n" );  while( NULL != fgets( cBuf, 32, fp ) ){   iRet = sscanf( cBuf, "%s %f %f", &sSeit[ iNo ].cName, &sSeit[ iNo ].fMth, &sSeit[ iNo ].fEng );   printf( "%2d %-6s %5.1f %5.1f\n", iNo, sSeit[ iNo ].cName, sSeit[ iNo ].fMth, sSeit[ iNo ].fEng );   if( 3 != iRet ) Error( "入力項目数異常\n" );   if( NUMBER <= ++iNo ) Error( "お腹いっぱい\n" );  }  fclose( fp );  return( iNo ); // 人数を返す ≠ 0 } void get_student_average( int iii ) {  float fHeikin;  fHeikin = ( sSeit[ iii ].fMth + sSeit[ iii ].fEng ) / 2.0;  printf( "%-6sの平均点は %5.1f です\n", sSeit[ iii ].cName, fHeikin ); } void get_average( int iNo ) // iNo ≠ 0 {  int i;  float fMsum = 0.0, fEsum = 0.0;  for( i = 0; i < iNo; i++ ){   fMsum += sSeit[ i ].fMth;   fEsum += sSeit[ i ].fEng;  }  printf( "数学の平均点は %5.1f です\n", ( fMsum / (float)iNo ) );  printf( "英語の平均点は %5.1f です\n", ( fEsum / (float)iNo ) ); } void main() {  int iNo, i;  iNo = fset_all_student(); // 全員分を1回で読み込む  for( i = 0; i < iNo; i++ ) get_student_average( i );  get_average( iNo ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございました。 おかげで分かりました!!

  • 回答No.5
  • asuncion
  • ベストアンサー率32% (1748/5401)

> ループ条件がnumberだと実行すると強制終了になってしまいます・・ 入力ファイル件数が100件未満の場合を考慮した コードを書かれていますか? > struct student *fset_all_student(void)の関数の > n=i(この場合は3) この場合は3、の意味がわかりません。 入力データの件数が3件なのですか? 名前、数学、英語の3項目の話とごっちゃになっていませんか? 入力ファイルの行数は何行ですか?

共感・感謝の気持ちを伝えよう!

質問者からの補足

また回答ありがとうございます。 ファイルの読み込みが 関数*fset_all_student(void)の while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) なのでi++で読み込んだ行数をn=iで記録してにして他の関数やmain関数でこのnの値を使いたいということです。そうすれば100件未満でも読み込むことができるので。 この場合3というのは入力ファイルが3行なので input.txt yuki 65 70 rika 78 90 eri 30 60 3と言う意味です。

  • 回答No.4
  • asuncion
  • ベストアンサー率32% (1748/5401)

おっと失礼。 > ループの終了条件は i < number でないとまずいです。 ループの終了条件、ではなくて、ループの継続条件、でした。

共感・感謝の気持ちを伝えよう!

  • 回答No.3
  • asuncion
  • ベストアンサー率32% (1748/5401)

> for文のところのnを実数に変えても実行できません 最大100件までデータを扱えるのですから、 ループの終了条件は i < number でないとまずいです。 また、100件読まないうちに入力が終わることがあり得ますので、 それを考慮するコードでないとまずいです。 とりあえず、外部変数 n を使わなくてすむように、 設計変更してみてはいかがでしょう。

共感・感謝の気持ちを伝えよう!

質問者からの補足

また回答ありがとうございます ループ条件がnumberだと実行すると強制終了になってしまいます・・ struct student *fset_all_student(void)の関数の n=i(この場合は3)の値を他の関数やmain関数で扱いたいんですがどうすればいいですか?

  • 回答No.2
  • asuncion
  • ベストアンサー率32% (1748/5401)

#1の者です。 コンパイルすると警告が出ますよね。 まず、その警告が出ないようにすることから始めてみてはいかがでしょうか。 なお、警告が出なくなったとしても、外部変数nの値がゼロであるため、 main関数における2つのfor文によるループは、どちらも実行しません。 その状態で平均値を求めようとするので、ゼロ割りか何かの エラーが出てしまうのではないでしょうか。

共感・感謝の気持ちを伝えよう!

質問者からの補足

回答ありがとうございます。 警告をなくしてもfor文のところのnを実数に変えても実行できません(泣)

  • 回答No.1
  • asuncion
  • ベストアンサー率32% (1748/5401)

> コンパイルはできても実行するとエラーが出ます。 どんなエラーですか?

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • プログラムについて

    今スタっクのファイルから読み込んだ文字列をスタっクへプっシュしたりポっプしたりする過程がわかるプログラムを作ってます 。 作りかけのプログラムですがどこをどうすればいいか教えてください!! 一応コンパイルできます。 使ってない関数があるかもしれません。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUMBER 100 /*--- スタックを実現する構造体 ---*/ typedef struct { int max; /* スタックのサイズ */ int ptr; /* スタックポインタ */ char *stk; /* スタック(の先頭要素へのポインタ) */ } Stack; /*--- スタックの初期化 ---*/ int StackAlloc(Stack *s, int max) { s->ptr = 0; if ((s->stk = calloc(max, sizeof(int))) == NULL) { s->max = 0; /* 配列の確保に失敗 */ return (-1); } s->max = max; return (0); } /*--- スタックの後始末 ---*/ void StackFree(Stack *s) { if (s->stk != NULL) { free(s->stk); s->max = s->ptr = 0; } } /*--- スタックにデータをプッシュ ---*/ int StackPush(Stack *s, int x, int i,char *a[]) { if (s->ptr >= s->max) return (-1); if(x>=i) { puts("プッシュできる文字データはありません。"); return (-1); } strcpy(&s->stk[s->ptr++],&(*a)[x]); x++; return x; } /*--- スタックからデータをポップ ---*/ int StackPop(Stack *s, int x,char *a[]) { if (s->ptr <= 0) /* スタックは空 */ return (-1); strcpy(&s->stk[--s->ptr],&(*a)[x]); return (0); } /*--- スタックからデータをピーク ---*/ int StackPeek(const Stack *s, int *x) { if (s->ptr <= 0) /* スタックは空 */ return (-1); *x = s->stk[s->ptr - 1]; return (0); } /*--- スタックの大きさ ---*/ int StackSize(const Stack *s) { return (s->max); } /*--- スタックに積まれているデータ数 ---*/ int StackNo(const Stack *s) { return (s->ptr); } /*--- スタックは空か ---*/ int StackIsEmpty(const Stack *s) { return (s->ptr <= 0); } /*--- スタックは満杯か ---*/ int StackIsFull(const Stack *s) { return (s->ptr >= s->max); } /*--- スタックを空にする ---*/ void StackClear(Stack *s) { s->ptr = 0; } int main(void) { int i=0,j,ret,x=0; char *a[NUMBER]; char buffer[20]; FILE *fpin; Stack s; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く while(fgets(&buffer[0],sizeof(buffer),fpin) !=NULL ) { if(i>=NUMBER)//読み込む人数がNUMBERを超えてる時の処理 { puts("人数が100人を超えています"); goto END; } strcpy(&a[i][0],&buffer[0]); /*ret=sscanf(&buffer[0],"%s",&a[i][0]); //データ文字列を3分割 if(ret!=1) //1に分割できなかったときの処理 { puts("代入された入力項目の個数が3でありません"); goto END; }*/ i++; } for(j=0; j<i; j++) printf("%s\n",&(*a)[j]); if (StackAlloc(&s, 100) == -1) { puts("スタックの確保に失敗しました。"); return (1); } while (1) { int m; printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s)); printf("(1) プッシュ (2) ポップ (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: printf("データ:"); puts("こんちくしょ~"); if(StackPush(&s, x,i,&(*a)) == -1) puts("スタックへのプッシュに失敗しました。"); break; case 2: if(StackPop(&s, x,&(*a)) == -1) puts("ポップできません。"); else printf("ポップしたデータは%sです。\n", &s.stk[s.ptr]); break; } } StackFree(&s); END: fclose(fpin); return (0); }

  • 関数で算出した値を他の関数で使いたい。

    こんにちは。「平均点を出す関数」と「数学の点数のベスト3を出す関数」を使って、「1.平均点」と「2.数学の点数のベスト3の名前とその点数と、各々の点数と平均点との差」を求めるプログラムを作っています。平均点とベスト3の名前とその点数は出せるのですが、「平均点を出す関数」で求めた値をもって来れず、「平均点との差」がうまく表示できません。ソースは下記のようになっております。簡単な修正で直せる方法を教えていただきたいのですが。宜しくお願い致します。 #define STUDENT 4 #include <stdio.h> struct SEISEKI_T {  char name[20]; /* 生徒名を格納する配列。40バイト格納化。 */ int math; /* 数学の点数 */}; typedef struct SEISEKI_T SEISEKI; int average(SEISEKI *sp, int num, int *p); int rank_math(SEISEKI *sp, int num, int *p); int main( ) { SEISEKI seito[STUDENT] = { /* 生徒名と数学の点数のデータ */ { "佐藤", 63},{ "鈴木", 68},{ "高橋", 61},{ "田中", 40}, }; SEISEKI *sp; sp = seito; static int avg[0] = {0}; average(seito, SUBJECT, avg); rank_math(seito, SUBJECT, avg); printf("\n"); return 0; } int average(SEISEKI *sp, int num, int *p) { int i; /* ループ変数 */ static int avg[0] ={0}; for (i = 0; i < 4 ; i++) { avg[0] += (sp + i)->math; } avg[0] = avg[0] / 4 ; printf( "数学 = %3d \n", avg[0]); printf("\n\n"); } int rank_math(SEISEKI *sp, int num, int *p) { int i; /* ループ変数1 */ int j; /* ループ変数2 */ int sa_m = 0; /* 数学の上位成績者の点数と平均点との差。*/ SEISEKI dumy; /* struct SEISEKI_T 型の構造体 dumy */ for ( i = 0 ; i < STUDENT - 1 ; i++ ) { for ( j = 0 ; j < STUDENT - i - 1 ; j++ ) { if( ((sp + j)->math) < ((sp + j + 1)->math) ) { dumy = *(sp + j); *(sp + j) = *(sp + j + 1); *(sp + j + 1) = dumy; } } } printf( "■数学上位成績者\n" ); printf( "----------------------------------\n" ); printf( "順位 名前 点数 平均+\n" ); printf( "----------------------------------\n" ); for ( j = 0 ; j < 3 ; j++ ) { sa_m = (sp + j)->math - *p; printf( " %d %6s %3d %2d\n" , j + 1 , (sp + j)->name , (sp + j)->math , sa_m); } return 0; }

  • スタックで成績表を作るプログラム。

    成績表を作りたい。Studentのクラスを要素とするクラスStackを完成させてプログラムが動作するようにせよという問題なのですがprivateの物をどうやって要素にすればよいのでしょうか? class Student { private int id; private String name; private int eng; private int math; private int kokugo; Student(int i,String nm,int e,int m,int k) { id=i;name=nm;eng=e;math=m;kokugo=k; } void show(){ System.out.println("("+id+","+name+","+ eng+","+ math+","+ kokugo+")"); } } class Stack { } class Sample { public static void main(String[] args) { Stack ss=new Stack(3); ss.push(new Student(1,"A",10,10,10)); ss.push(new Student(2,"B",20,10,10)); ss.push(new Student(3,"C",30,10,10)); ss.push(new Student(4,"D",40,10,10)); ss.pop(); ss.pop(); ss.pop(); ss.pop(); } }

    • ベストアンサー
    • Java
  • C言語のポインタorアロー演算子について質問です。

    はじめまして。 今回が初質問となります。 お時間がある方はぜひご回答をよろしくお願いいたしますm(_ _)m C言語を独学で学んでいるため無知なところが多いです... やさしく、わかりやすく教えて頂ければ幸いです(>_<) #include<stdio.h> typedef struct grades { int number; char name[20]; double average; }record; int main(void) { int i; record student1 = {6,"NODA",52.5}; record student2[5] = { {1,"CHIAKI",78.6},{2,"MINE",57.3},{3,"MIKI",66.4},{4,"OKUYAMA",91.4},{5,"SAKU",89.2} }; record *p; record *s; p = &student1; s = &student2[5]; printf("%d %s %5.1f\n\n", p->number, p->name, p->average); for(i=0; i<5; i++) { printf("%d %s %5.1f\n", s->number, s->name, s->average); } return 0; } 上記プログラムを実行しますと以下の結果で出力されてしまいます。 6 NODA 52.5 6 NODA 52.5 6 NODA 52.5 6 NODA 52.5 6 NODA 52.5 6 NODA 52.5 ポインタのとこでつまずいている気がするのですが 具体的にどこが悪いのかが分からずに進めずにいます。 (もしポインタでないならすいません...もしかしたらアロー演算子?) どうか優しい方、ご回答のほどお願いいたします。

  • 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が関数宣言と一致しません。」と出ます。 どこがおかしいのでしょうか、どなたか教えてください。

  • このプログラムについて。

    #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <string.h> #define NVALUE 30 #define MAXSIZE NVALUE struct City{ float x; float y; }; struct Country{ struct City cities[MAXSIZE]; int size; }; struct Itine{ float quality; int route[MAXSIZE]; int noc; }; float plength(struct Itine *tour,struct Country *pcountry) { int i,j; double dy; double dx; float length=0.0; for(i=0;i<tour->noc;i++){ j=i+1; if(j==tour->noc) j=0; struct City &c1=pcountry->cities[tour->route[i]-1]; struct City &c2=pcountry->cities[tour->route[j]-1]; double dx = c1.x-c2.x; double dy = c1.y-c2.y; length+=(float)sqrt(dx*dx+dy*dy); } return length; } なんか間違っていますか? エラーメッセージは、この部分 struct City &c1=pcountry->cities[tour->route[i]-1]; struct City &c2=pcountry->cities[tour->route[j]-1]; double dx = c1.x-c2.x; double dy = c1.y-c2.y; が、 ';'が'型'の前にありません と出ています。Visual Express 2005です。

  • 配列 平均値と分散値

    #include <stdio.h> void mean_vari(int *s, int n, double *mean, double *variance); int main(void) { int i, n; int a[]={34, 54, 21, 80, 60, 90, 15, 24, 100}; double heikin, bunsan; mean_vari(&i,n,&heikin,&bunsan); printf("平均=%f 分散=%f\n",heikin,bunsan); return (0); } /* 合計を求める関数 */ void mean_vari(int *s, int n, double *mean, double *variance) { int i; int sum=0; /* 合計の初期化 */ double sum2=0; for (i = 0; i < n; i++) sum += s[i]; ????=sum/(double)????; for (i = 0; i < n; i++){ sum2 +=????; } ????=????; } 平均値と分散値を求めたいのですが、????の部分になりをいれていいかわかりません。 教えてください。

  • 文字列の構造体キャスト

    文字列を構造体にキャストした際に、メンバ変数は以下のようには、 取得できないのでしょうか? typedef struct { int year; /* 学年 */ int clas; /* クラス */ int number; /* 出席番号 */ char name[64]; /* 名前 */ } student; int main(void) { student *data=NULL; char c[] = "123456789012abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234"; char* tmp; tmp = &c[0]; student_print(data, tmp); return 0; } void student_print(student *data, char *mkg) { void* buff = NULL;    buff = (student*)mkg; printf("[year]:%s\n", buff ->year);←ここ return; }

  • fpus:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • fputs:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }