• 締切済み

至急!教えてください。

#include <stdio.h> #include <windows.h> #define COUNT (3) struct Seiseki{ char name[20]; int score1; int score2; int score3; int score4; int score5; int average; }; int getValue(char str[], char temp[], int n){ memset(temp, 0, 19); while(*(str+n) == ' '){ n++; } int i = 0; while(*(str+n) != ' ' && *(str+n) != 0){ temp[i] = *(str+n); i++; n++; } return n; } void getAverage(Seiseki *seiseki){ int total = seiseki->score1 + seiseki->score2 + seiseki->score3 + seiseki->score4 + seiseki->score5; seiseki->average = total / 5; } void getSeiseki(Seiseki seiseki[]){ char temp[20]; char str[256]; for(int i = 0; i < COUNT; i++){ printf_s("%d 人目の点数と名前 > ", i+1); memset(str, 0, 255); gets(str); int n = 0; n = getValue(str, temp, n); strcpy(seiseki[i].name, temp); n = getValue(str, temp, n); seiseki[i].score1 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score2 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score3 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score4 = atoi(temp); n = getValue(str, temp, n); seiseki[i].score5 = atoi(temp); getAverage(&seiseki[i]); } } void showSeiseki(Seiseki seiseki[]){ for(int i = 0; i < COUNT; i++){ printf("%d %s %d %d %d %d %d\n", i+1, seiseki[i].name, seiseki[i].score1, seiseki[i].score2, seiseki[i].score3, seiseki[i].score4, seiseki[i].score5, seiseki[i].average); } } void showScoresAverage(Seiseki seiseki[]){ int total1 = 0; int total2 = 0; int total3 = 0; int total4 = 0; int total5 = 0; for(int i = 0; i < COUNT; i++){ total1+=seiseki[i].score1; total2+=seiseki[i].score2; total3+=seiseki[i].score3; total4+=seiseki[i].score4; total5+=seiseki[i].score5; } int ave1 = total1 / COUNT; int ave2 = total2 / COUNT; int ave3 = total3 / COUNT; int ave4 = total4 / COUNT; int ave5 = total5 / COUNT; printf_s("\naverage %d %d %d %d %d\n",ave1, ave2, ave3, ave4, ave5); } void main(){ Seiseki seiseki[COUNT]; printf_s("生徒 %d 名分の成績を入力してください:\n", COUNT); getSeiseki(seiseki); printf_s("\n成績表\n# NAME #1 #2 #3 #4 #5 average\n"); showSeiseki(seiseki); showScoresAverage(seiseki); } 間違っている点がありますか? ありましたらどこに入れるか教えてください。 改良点などありましたらお願いします。

みんなの回答

  • TT414
  • ベストアンサー率18% (72/384)
回答No.6

>int getValue(char str[], char temp[], int n){ >temp[i] = *(str+n); 間違っているわけではありませんが、strとtempの使い方に違いがあるのはなぜでしょうか?何か理由があるのでしょうか?

回答No.5

こっちのURLも書いた方がいいんじゃないの? http://okwave.jp/qa/q6751115.html まあ、答えさえわかればコピペして宿題終了なので、どーでもいいんだろうけど。 自分で考えたソースじゃないんだろうから、補足を求めても返答できないんだよね?

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.4

>10人の五教科の平均を関数を用いて出すプログラムです。 と、 >#define COUNT (3) との整合性は取れていますか? >int score1; >int score2; >int score3; >int score4; >int score5; 5教科だからこういう風に書いてるんでしょうけど、 教科の数が変わったらどうしますか? こういうときこそ配列を使った方がよほどシンプルに書けるんじゃないかなぁ、 なんて思ったりしてます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 間違っている点がありますか? 少なくとも私の手元の環境ではコンパイルできませんでした。 > ありましたらどこに入れるか教えてください。 入れるだけでは済まないかと... > 改良点などありましたらお願いします。 まずはコンパイルできるようにしましょう。 あと、処理系や言語、そして仕様を明確にしてください。

回答No.2

> 10人の五教科の平均を関数を用いて出すプログラムです。 「各教科の平均」を10人分? 「10人の平均」を教科ごとに? > 間違っている点がありますか? コンパイル/実行し結果を確認しましたか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

つっこみたい点はいくつかあるが.... 「間違っている」かどうかの判断基準をくれ.

interkiller
質問者

補足

10人の五教科の平均を関数を用いて出すプログラムです。

関連するQ&A

  • なぜかわかりませんscanf()の戻り値で迷ってます。

    ある本にscanf()の書き方が書いてあってそれを入力してもエラーが表示されてわかりませ。 使用ソフトはMicrosoft Visual c++です。どこが間違っているのか教えてください。 #include <stdio.h> #include <stdlib.h> int main (void) { int score[10]; int status; int temp_score; int score_count; int i; /*配列に位に入力*/ score_count = 0; while(1){ status=scanf("d",&score_count); if (status == EOF ){ break; }else if (status != 1){ fprintf(stderr ,"入力エラー\n"); exit(1); } if (score_count >= 10 ){ fprintf( stderr,"データ件数が多すぎます\n"); exit(1); } score[score_count] =temp_score; score_count++; } } /*配置の内容を表示する*/ for(i=0 ;i < score_count;i++){ printf("score[%d]..%d\n",i,score[i]); } return (0); }

  • C++のscanfについて

    今C++をやり始めたばかりの者です 下記のように打って、コンパイルして実行すると、数字はちゃんと出るんですが英語は入るとループがかかってしまいます。 英語のループを回避して、平均が出るように出来ないでしょうか。。。。 返答よろしくお願いします。。。。。 /********************************************** 平均を求める ***********************************************/ #include <stdio.h> #define END -1 //-1が入力されたら終わり void main() { //変数の宣言 int score; //得点 int total; //合計 double ave; //平均点 int i; //回数のカウント //入力と合計の計算 total = 0; //初期設定 i = 0; //最初の得点を入力 printf("%d科目めの得点を入力 : ", i+1); scanf("%d" , &score); //入力 while( score > END ) { total += score; i++; printf("%d科目目の得点を入力 : ", i+1); scanf("%d" , &score); //次を入力 } ave = (double)total / i; //平均を求める //表示 printf("合計:%5d点 平均:%7.1lf点\n" , total , ave); }

  • C言語の添削

    「C言語基礎課題1」 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h>                                       #include <string.h> #define MAX 100 /*点数*/ int flag; double avg(double t[],int n); int str_check(char s[]);                                        int main() { int number; //人数 double score[MAX]; //点数 char temp[MAX]; char str[MAX]; //名前 double ans; //平均成績 int i=0; //カウンタ変数 //人数の決める printf("人数を入力して下さい。\n"); scanf("%d",&number); //名前の入力 for(i=0;i<number;i++) { printf("%d番様の名前を入力して下さい。\n",i+1); scanf("%s",&str[i]); } //点数の入力 for(i=0;i<number;i++) { printf("%d番様の点数を入力して下さい。\n",i+1); scanf("%s",&temp); str_check(temp); if(flag==1) { score[i]=atoi(temp); //点数入力で有効範囲をチェック if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } if(flag==0) { printf("点数を数字で入力して下さい。\n"); i--; } } ans =avg(score,number); printf("\n=====入力内容一覧と成績平均値======\n"); for(i=0;i<number;i++) { printf("%d番の点数は%3.2lfです。\n",i+1,score[i]); } printf("平均点は%3.2lfです。\n",ans); printf("=====================================\n"); getch(); return 0; } /*avg関数の定義*/ double avg(double t[],int n) { int i; double sum; sum = 0.0; for(i=0;i<n;i++) { sum += t[i]; } return sum/n; } /*点数入力で文字か数字かチェック*/ int str_check(char s[]) { int i=0,n; //カウンタ変数 n=strlen(s); while(s!='\0') { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { i++; } else { break; } } if(i==n) { flag=1; } else { flag=0; } return flag; } [最初に組んだソースプログラム] #include<stdio.h> #include<stdio.h> #define NUM 3 /*点数*/ #define Name 3 /*人数*/ #include<conio.h> double avg(int t[]); struct stList{ char str[Name][100]; int score[NUM]; int i,j; }; int main(void) { int score[NUM]; //char str[Name]; char str[100]; int i,j; double ans; printf("名前を入力して下さい。\n",Name); for(i=0;i<Name;i++){ scanf("%s",&str[Name]); } // if(score[NUM]=0 || score[NUM]<=100) //{ // printf("点数を入力して下さい。\n",NUM); //} printf("点数を入力して下さい。\n",NUM); for(i=0;i<NUM;i++) { scanf("%d",&score[i]); if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,score[j]); } ans =avg(score); printf("平均点は%3.2lfです。\n",ans); getch(); return 0; } /* avg関数の定義 */ double avg(int t[]) { int i; double sum; sum = 0.0; for(i=0;i<3;i++){ sum += t[i]; } return sum/Name; } 「一人分のデータを保持する構造体(文字列と整数の変数をメンバに持つ)を用意し、3人分の名前と成績 (最大値100、最小値0)を入力でき、入力が終了したら、入力内容一覧と成績の平均値を表示する プログラムを作成せよ。 ※考えうる限りの異常系処理の導入、関数化を行うこと。」 研修で以下の指摘を受けました。 (1)compare関数が使われていない。 (2)名前入れる変数が3つ不明 (3)カウンタ変数がi,j,s,tになっている理由は? (4)名前を入力しなかった時の処理 (5)点数を処理しなかった時の処理 (6)定数NUMで人数3を指定できるようにしているのにプログラムはそれを利用仕切れていない(名前入力が固定3人)ので無意味 (7)if(tmp=0 || tmp<=100)←これなんでしょうか? (8)平均点表示の少数点以下有効桁数はどうなっているのか? (9)点数入力で文字を入れたときの処理 (10)点数入力で有効範囲外の数字を入れた時の処理 ちなみに最大値、最小値はdefineして欲しいです。理由は(2)に読めば分かる (11)変数名が謎なのが多い 課題のキーワードのどこにも出て来ないですし言葉だから 後、添付ファイルを添付します。 最初のソースプログラム名「最初に組んだもの」修正したものが「C言語基礎課題1」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?

  • atoi

    123と表示されたいんだけど、コンパイルエラーです。 この場合、atoiの引数して、str[3]の文字を入れる変数をもう1つ用意するしかないですか? キャストでうまくできる方法があったら教えてください。 strという変数の"abc123"という文字は変化させたくないんです。 #include <iostream.h> main(){  int i;  char str[] = "abc123";  i = atoi(str[3]);  printf("%d\n", i); }

  • 入力された2つの整数の差を絶対値を出力するプログラム

    2整数の差を絶対値を出力するプログラムをつくりました. 入力される数値は、正数の場合は最大8桁まで有効とし、9桁目以降を無視、負数の場合は '-'を含め、最大9桁まで有効とし,10桁目以降を無視するようにしたい。 2番目の数値入力で9桁以降に数字以外の文字を入力すると,うまく動きません.なぜ動かないかとどのように直したらよいか教えてください. お願いします. #include <stdio.h> #include <stdlib.h> #define BUFFERSIZE 10 #define PLUS_MAX 8 #define MINUS_MAX 9 #define C_NULL ('\0') #define RC_OK 0 #define RC_ND -1 #define RC_ID -2 #define RC_MD -3 int absolute( int n1, int n2 ) ; main() { char n[ 2 ][ BUFFERSIZE ]; int i ; int a[ 2 ] ; int ab ; int count ; int n_pos ; char c ; for( i = 0 ; i < 2 ; i ++ ){ printf( "%d番目の数値 :", i + 1 ) ; for( count = 0 ; count <= BUFFERSIZE ; count ++ ){ c = getchar() ; if( c >= '0' && c <= '9' || count == 0 && c == '-' ){ n[i][ count ] = c ; continue ; } if( c == '\n' ) break ; printf( "Error!\n" ) ; return( RC_ID ) ; } if( count == 0 ){ printf("Error!\n"); return( RC_ND ); } else if( n[ i ][ 0 ] == '-' && count < 2 ){ printf("Error!\n"); return( RC_ID ) ; } if( n[ i ][ 0 ] == '-' && count > MINUS_MAX ){ n_pos = MINUS_MAX ; }else{ if( count > PLUS_MAX ){ n_pos = PLUS_MAX ; }else{ n_pos = count ; } } n[ i ][ n_pos ] = '\0' ; a[ i ] = atoi( n[ i ] ) ; } ab = absolute( a[ 0 ], a[ 1 ] ) ; printf( "絶対値は %d \n", ab ) ; return( RC_OK ); } int absolute(int n1, int n2) { int i ; i = n1 - n2 ; return i >= 0 ? i : -i ; }

  • この間質問した内容です。

    この間質問した内容です。 #include <stdio.h> #include <stdlib.h> #include <string.h> int knum; int kNO; char **kstr; int *ans; int get_score(void) {  FILE *fp;  int best;  if((fp = fopen("score.txt","r")) == NULL)  {   printf("初回起動ですね。\nスコアファイルを新規作成します。\n");   best = 0;  }  else  {  fscanf(fp,"%d%d",&best,&knum);  printf("最高点は%d問中%d問です。\n",knum,best);  fclose(fp);  } } int read_kuizu(void) {  int i;  FILE *fp;  if((fp = fopen("kuizu.txt","r")) == NULL) return(-1);  fscanf(fp,"%d",&kNO);  if((kstr = (char **)calloc(kNO,sizeof(char *))) == NULL) return(-1);  if((ans = (int *)calloc(kNO,sizeof(int))) == NULL) return(-1);  for(i = 0; i<kNO; i++)  {   char temp[1024];   size_t len;   fscanf(fp,"%s",temp);   fscanf(fp,"%d",&ans[i]);   len = strlen(temp);   if((kstr[i] = (char *)malloc(len + 1)) == NULL) return(-1);   strcpy(kstr[i],temp);  }  fclose(fp);  return(0); } int kuizu_game(void) {  int i;  int score = 0;  for(i = 0; i<kNO; i++)  {   int unans;   printf("\nクイズ%d\n", i + 1);   printf("%s YES(0)/NO(1)\n",kstr[i]);   do   {    printf("答を選んで番号を入力して下さい。=>\n");    scanf("%d",&unans);   }   while(unans!=0 && unans!=1);   if(unans == ans[i])   {    score++;    printf("正解です!\n");   }   else   printf("残念ながら不正解・・・\n");   }   return(score); } void result(int best,int score) {  printf("\n今回%d問中%d問正解でした。\n",kNO,score);  printf("前回は%d問中%d問正解していました。\n",knum,best); } int main(void) {  int score;  int best;  best = get_score();  if(read_kuizu() == -1)  {   printf("エラー\n");   return(-1);  }  score = kuizu_game();  result(best,score);  if(score>best)  {   printf("最高点を更新!\n");   best = score;  }  FILE *fp;  fp = fopen("score.txt","w");  fclose(fp);  return(0); } 一応ここまでやってコンパイルしたのですが、クイズのファイルを読み込む事ができません。どこか間違ってるんでしょうか?

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • str[101]までしかないのに???

    #include<stdio.h> int main(void){ int str[101]; int *pt,i,a,count=0; pt=str; *pt=0; for(i=0;i<101;i++){ a=*pt+i; pt++; *pt=a; printf("%5d",*pt); count++; if(0==(count%10)){ putchar('\n'); } } return 0; } の答えが 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300 325 351 378 406 435 465 496 528 561 595 630 666 703 741 780 820 861 903 946 990 1035 1081 1128 1176 1225 1275 1326 1378 1431 1485 1540 1596 1653 1711 1770 1830 1891 1953 2016 2080 2145 2211 2278 2346 2415 2485 2556 2628 2701 2775 2850 2926 3003 3081 3160 3240 3321 3403 3486 3570 3655 3741 3828 3916 4005 4095 4186 4278 4371 4465 4560 4656 4753 4851 4950 5050 なんですが、str[101]までしかないのに最後の5050はstr[102]なので表示されないと思うんですが、何故表示されるのか分かりません。お願いします(_ _)

  • C言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • エラーの意味が…

    自分でプログラムを打ち、コンパイルしてみたんですけど 「c:10:警告:incompatible implicit declaration of built-in function 'printf'」とエラーが出てきました。 自分なりに10行目[ printf("%d :",b[i]); ]をいじってみたりは したのですが、上手くいきません。 いったいドコがおかしいのでしょうか? ご指導よろしくお願いします<(_ _)> ↓コレがそのプログラムです。 *************** int main(void){ int score[3][4]; int i,j,sum[3]={0}; score[0][0]=70; score[0][1]=80; score[0][2]=75; score[0][3]=60; score[1][0]=75; score[1][1]=83; score[1][2]=70; score[1][3]=70; score[2][0]=60; score[2][1]=76; score[2][2]=70; score[2][3]=55; char b[]="ABC"; for(i=0; i<3; i++){ printf("%d :",b[i]); for(j=0; j<4; j++){ printf("%3d",score[i][j]); sum[i]+=score[i][j];} printf(" : sum=%d, ave=%5.2f\n",sum[i],(float)sum[i]/4); } return 0; }