プロが教える店舗&オフィスのセキュリティ対策術

C言語の問題です。

file.txtを読み込む。
データの値を奇数と偶数に分け、それぞれ合計値・個数・平均値を出力せよ。
奇数データの数・偶数データの数がゼロの場合は、平均値を求めないようにしなさい。

file.txtの中身は「10 11 8 21 6 8 13 26 9 3」です。

#include <stdio.h>
#define SIZE 10
int main(void)
{

FILE *infile;
int i, data[SIZE];
int ksum, knum, gsum, gnum;
ksum = 0;
gsum = 0;
infile = fopen("file.txt", "r");

if(infile == NULL) {
printf("入力ファイルを開くことができません\n");

else{

fscanf(infile, "%d");

if(data[i]%2){
ksum += data[i];
knum += 1;
}

else if(data[i]/2==0){
gsum += data[i];
gnum += 1;
}
}
return 0;
}

for(i = 0; i < SIZE; i ++ ) {
fscanf(infile, "%d", &data[i]);
}
for(i = 0; i < SIZE; i ++ ) {
printf(" %3d", data[i]);
}

printf("%d %d %f", ksum, knum, (double)ksum/knum);
printf("%d %d %f", gsum, gnum, (double)gsum/gnum);

return 0;
}

このように考えたのですが、うまく実行できません。
間違っている箇所やその修正方法などを教えていただけたら嬉しいです。
ちなみに16行目で「else 文が if と一致しません。」というエラーが出てしまいます。

もうひとつ「奇数データの数・偶数データの数がゼロの場合は、平均値を求めない」というのはどのように表せば良いのでしょうか?

ご指導よろしくお願いします。

A 回答 (1件)

解説は下の方です。


----------------------------------------------------------------------
1:#include <stdio.h>
2:
3:#define SIZE 10
4:
5:int main(void)
6:{
7:  FILE *infile;
8:  int i, data[SIZE];
9:  int ksum, knum, gsum, gnum;
10:  ksum = 0;
11:  gsum = 0;
12:  infile = fopen("file.txt", "r");/* ここでファイルをオープンしているが、クローズする処理がない。 */
13:
14:  if(infile == NULL) {
15:    printf("入力ファイルを開くことができません\n");
16:  else{
17:    fscanf(infile, "%d");
18:
19:    if(data[i]%2){/* 変数iをここで参照しているが、初期化されていないのは良くない× */
20:      ksum += data[i];
21:      knum += 1;/* 初期化されてない変数knumに加算している。のは良くない× */
22:    }
23:    else if(data[i]/2==0){/* 偶数であるか調べる判定はこれではない、× */
24:      gsum += data[i];
25:      gnum += 1;/* 初期化されてない変数gnumに加算している。のは良くない× */
26:    }
27:  }
28:  
29:  return 0;
30:}
31:
32:/* ↓ここから下がmain()関数の外になっている。のは良くない× */
33:for(i = 0; i < SIZE; i ++ ) {
34:  fscanf(infile, "%d", &data[i]);
35:}
36:
37:for(i = 0; i < SIZE; i ++ ) {
38:  printf(" %3d", data[i]);
39:}
40:
41:printf("%d %d %f", ksum, knum, (double)ksum/knum);
42:printf("%d %d %f", gsum, gnum, (double)gsum/gnum);
43:
44:return 0;
45:}/* 対応する括弧が存在しません。× */
46:
----------------------------------------------------------------------
●初期化せずに使用している変数があります。変数は使用前に初期化しましょう。
i, knum, gnum

●ファイルをオープンしている処理はあるが、クローズしていない。
ファイルはオープンしたら、クローズしましょう。


>17:    fscanf(infile, "%d");
この処理を、ループの外に書いちゃうのは、アルゴリズムを理解していないのではないですか?
これでは、10件のデータは読み込めません。

●main()関数が途中で、終わっている。
途中から、ソースコードが関数の外に書いてある。


>45:}/* 対応する括弧が存在しません。× */
閉じ括弧がありますが、対応する開く括弧がありません。
どこが間違っているのか、よく確認しましょう。

●「奇数データの数・偶数データの数がゼロの場合は、平均値を求めない」
>もうひとつ「奇数データの数・偶数データの数がゼロの場合は、平均値を求めない」というのはどのように表せば良いのでしょうか?
カウントを利用してあげると良いと思います。
    • good
    • 0
この回答へのお礼

丁寧な解説をありがとうございます。
いただいた解説を元に修正していったところ、うまく実行することができました。
とてもわかりやすく、本当に助かりました。
もう一度、ありがとうございました。

お礼日時:2008/11/10 14:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!