ページ 1 / 1
int型関数を用いた テスト点数の計算
Posted: 2022年6月20日(月) 18:26
by c言語初心者
コード:
#include <stdio.h>
int sum(int x[], int y[], int z[]);
int main(void)
{
int eng[3];
int math[3];
int total[3];
int alltotal;
int i;
printf("3人の英語の点数を入力してください\n");
for(i=0; i<3; i++){
scanf("%d", &eng[i]);
}
printf("3人の数学の点数を入力してください\n");
for(i=0; i<3; i++){
scanf("%d", &math[i]);
}
alltotal = sum(eng, math, total); ///計算部分
printf("合計点を表示します\n");
for(i=0; i<3; i++){
printf("%d番目の人の合計点数は %d です\n", i+1, total[i]);
}
printf("3人の合計点は %d です。\n", alltotal); ///ここのalltotalの数値表示がバグります
return 0;
}
int sum(int x[], int y[], int z[]){
int i,sum;
for(i=0; i<3; i++){
z[i] = x[i] + y[i];
}
for(i=0; i<3; i++){ ///ここから下が間違っていると思われます
sum += z[i];
}
return sum;
}
%d番目の数学の点数と英語の点数を足したのをtotal
totalを全部足したのをalltotalとし、int型関数のみ変更可能でmain型関数の部分をいじってはいけないです。
計算部分のint型関数が間違っていると思うのですが、何かいい方法はあるでしょうか?
出力結果
3人の英語の点数を入力してください
100
200
300
3人の数学の点数を入�してください
100
200
300
合計点を表示します
1番目の人の合計点数は 200 です
2番目の人の合計点数は 400 です
3番目の人の合計点数は 600 です
3人の合計点は 33967 です。
Re: int型関数を用いた テスト点数の計算
Posted: 2022年6月20日(月) 18:54
by usao
怪しい部分の想像が付くのであれば,そこら辺に変数値を確認するための printf を入れてみるとかして,実際に何が起こっているのかを確認してみれば良いのではないでしょうか.
(真っ先にそういう確認作業をしないのは何故か? こうやって質問文を書いて投下する方がよっぽど手間だと思うが…)
まぁ,ぱっと見で
> int i,sum;
で sum の初期値が与えられていないのが原因かと見えますが.
Re: int型関数を用いた テスト点数の計算
Posted: 2022年6月20日(月) 19:31
by c言語初心者
初期値の設定忘れが原因でしたか、、、
回答のほうありがとうございます。
これからは回答者さんのおっしゃる通りエラーの原因確認をしてみたいと思います。
Re: int型関数を用いた テスト点数の計算
Posted: 2022年6月20日(月) 21:56
by box
ちょっとした手直し。
ポイント:
main()は全体の司令塔に徹し、「データを入力しろ」「計算しろ」「出力しろ」という
指示を出すのみ。
必要な処理は呼ばれた側で行なう。
科目数や人数が変わった場合にも、コンパイルし直せば対応できる。
コード:
#include <stdio.h>
#define NINZUU (3)
#define KAMOKU (2)
void inputData(int (*score)[NINZUU])
{
char *kamoku[KAMOKU] = { "英語", "数学" };
int i, j;
for (i = 0; i < KAMOKU; i++) {
printf("%d人の%sの点数を入力\n", NINZUU, kamoku[i]);
for (j = 0; j < NINZUU; j++) {
scanf("%d", &score[i][j]);
}
}
}
void calcData(int (*score)[NINZUU], int total[NINZUU], int *alltotal)
{
int i, j;
for (i = 0; i < NINZUU; i++) {
for (j = 0; j < KAMOKU; j++) {
total[i] += score[j][i];
*alltotal += score[j][i];
}
}
}
void printData(int (*score)[NINZUU], int total[NINZUU], int alltotal)
{
int i, j;
printf("合計点を出力します\n");
for (i = 0; i < NINZUU; i++) {
printf("%d番目の人の合計点数は%d\n", i + 1, total[i]);
}
printf("%d人の合計点数は%d\n", NINZUU, alltotal);
}
int main(void)
{
int score[KAMOKU][NINZUU], total[NINZUU] = { 0 }, alltotal = 0;
inputData(score);
calcData(score, total, &alltotal);
printData(score, total, alltotal);
return 0;
}
Re: int型関数を用いた テスト点数の計算
Posted: 2022年6月20日(月) 22:04
by box
printData()のローカル変数jはいらんかった。
Re: int型関数を用いた テスト点数の計算
Posted: 2022年6月20日(月) 22:22
by box
要は、どうせプログラム書くんやったら
ちょっとでも汎用性持たせた方が何かと便利ですやろ
ってことです。
使い捨てでええんやったら知らんけど。
Re: int型関数を用いた テスト点数の計算
Posted: 2022年6月21日(火) 00:48
by box
printData()
に
score
を渡す必要もなかった。