int型関数を用いた テスト点数の計算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
c言語初心者

int型関数を用いた テスト点数の計算

#1

投稿記事 by c言語初心者 » 1年前

コード:

#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 です。

アバター
usao
記事: 1887
登録日時: 11年前

Re: int型関数を用いた テスト点数の計算

#2

投稿記事 by usao » 1年前

怪しい部分の想像が付くのであれば,そこら辺に変数値を確認するための printf を入れてみるとかして,実際に何が起こっているのかを確認してみれば良いのではないでしょうか.
(真っ先にそういう確認作業をしないのは何故か? こうやって質問文を書いて投下する方がよっぽど手間だと思うが…)

まぁ,ぱっと見で

> int i,sum;

で sum の初期値が与えられていないのが原因かと見えますが.

c言語初心者

Re: int型関数を用いた テスト点数の計算

#3

投稿記事 by c言語初心者 » 1年前

初期値の設定忘れが原因でしたか、、、
回答のほうありがとうございます。
これからは回答者さんのおっしゃる通りエラーの原因確認をしてみたいと思います。

box
記事: 2002
登録日時: 13年前

Re: int型関数を用いた テスト点数の計算

#4

投稿記事 by box » 1年前

ちょっとした手直し。
ポイント:
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;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: int型関数を用いた テスト点数の計算

#5

投稿記事 by box » 1年前

printData()のローカル変数jはいらんかった。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: int型関数を用いた テスト点数の計算

#6

投稿記事 by box » 1年前

要は、どうせプログラム書くんやったら
ちょっとでも汎用性持たせた方が何かと便利ですやろ
ってことです。
使い捨てでええんやったら知らんけど。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: int型関数を用いた テスト点数の計算

#7

投稿記事 by box » 1年前

printData()

score
を渡す必要もなかった。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る