- 締切済み
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」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
結局、何がいいたいのかわかりません。 (1)から(11)の指摘内容と「最初に組んだもの」と一致してない項目もあるし、compareとかこの質問にまったく出てこない単語も入ってるし、と、これだけ見せられてもわかりません。 「修正したもの」も、かえって改悪されてる点も見られます。 添削するなら ・実際に実行してみましたか?仕様通りに動かなかったのではないですか? ・「scanf("%s",&temp);」警告が出なかったですか?結果として正常に動作しているようには見えますが。 ・「scanf("%s",&str[i]);」これがどうなるか、考えてみましょう。charは「文字列」ではありません。上のと合せて、ポインタや配列について、もうちょっと勉強する必要があると思います。 ・構造体は、関連のある複数の値(例えば、学生の名前と成績とか)を一つにまとめて扱うための仕組みです。このプログラムのうち、まとめて扱うような「関連のある複数の値」とな何か考えて、構造体をデザインしましょう。 逆に、関連のないもの(i,jのようなループカウンタ)は入れないのが普通です。 ・また、同じものが複数あるときは、構造体に配列を入れるのではなく、構造体を配列にします。 ・(10)の指摘に従って「最大得点」を#define MAX 100 と指摘通りにしたのに、このMAXを「最大人数」に使っています。そのわりに、肝心の「最大得点」としては使っていません。それではdefineを使った意味がありません。 ・str_check なにをどう判定してるかよくわかりません。 ・「考えうる限りの異常系処理の導入」とあるのに、ほとんど入っていません。少なくとも、全てのscanfについて何らかの処理が必要です。 ・「printf("平均点は%3.2lfです。\n",ans);」 printf でdoubleには %lf なんて教えている講習なら、講師の実力があやしいです。 ・「%3.2f」 これの数字の意味わかってますか?これでは、[3]の意味がありません。