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」と名付けています。
いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?
お礼
kmee さんの言うとおり、まずif(num1<num2)のところが{}でくくれてなかったのでif文の中身が常に実行されてしまうようになっていました。 あと、出力するものも間違えてました。 if(num1<num2)のときにansにc[i]の値を代入させてansを出力したらできました。 助かりました。 ありがとうございました。