「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」と名付けています。
いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
結局、何がいいたいのかわかりません。
(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]の意味がありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
Eclipseコンソール表示を、リセ...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
C言語について
-
プログラミングC言語について
-
cout関数を使っているのですが...
-
C言語でつるかめ算をするにはど...
-
switch文 defaultについて
-
至急教えてください!プログラ...
-
java初心者です。入力されたの...
-
Userformの入力順序をタブオー...
-
WindowsでEOF
-
C言語
-
MinGWのC言語でCTRL+Zで処理が...
-
C言語scanf_sで何故か2回入力に...
-
C++のcinの動作
-
プログラムの進行が一時ストッ...
-
漢字のソートについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
プログラミングの問題です 「金...
-
Linuxで入力待ちなしkeyread関...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報