ファイルから読み込むC言語の問題

このQ&Aのポイント
  • C言語の問題: ファイルから読み込み、奇数と偶数の合計値・個数・平均値を出力する方法を教えてください。
  • C言語の問題: ファイルから読み込み、奇数と偶数のデータを分けて合計値・個数・平均値を出力する方法を教えてください。
  • C言語の問題: ファイルから読み込む方法と、奇数と偶数のデータを分ける方法を教えてください。
回答を見る
  • ベストアンサー

ファイルから読み込むC言語の問題

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 と一致しません。」というエラーが出てしまいます。 もうひとつ「奇数データの数・偶数データの数がゼロの場合は、平均値を求めない」というのはどのように表せば良いのでしょうか? ご指導よろしくお願いします。

  • tiom
  • お礼率72% (18/25)

質問者が選んだベストアンサー

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.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:}/* 対応する括弧が存在しません。× */ 閉じ括弧がありますが、対応する開く括弧がありません。 どこが間違っているのか、よく確認しましょう。 ●「奇数データの数・偶数データの数がゼロの場合は、平均値を求めない」 >もうひとつ「奇数データの数・偶数データの数がゼロの場合は、平均値を求めない」というのはどのように表せば良いのでしょうか? カウントを利用してあげると良いと思います。

tiom
質問者

お礼

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

関連するQ&A

  • C言語

    ファイルデータ(11,22,33,0,44)を読み込んで表示することを5回繰り返すプログラムを作りたいのですが分かりません。 さらに出来ればファイルデータが0でなければ表示し、0を読み込んだら終了するwhile文でのプログラムも教えてください。 途中経過 #include <stdlib.h> #include <stdio.h> int main(void) { int x = 0,i; FILE *infile; infile = fopen ("test.txt", "r"); if(infile == NULL) { fprintf(stderr, "test.txtが開けません\n"); exit(1); } i = 0 while(1){ i++; fscanf(infile, "%d", &x); printf("%d\n", x); if(i = 5)break; } fclose(infile); return 0; } ここまでで実行すると11しか表示されません。 これまでの質問分かるかたどなたか教えてくださいお願いします。

  • C言語の問題がわからないです。

    C言語のプログラムで、列数を自分で決めて、 (例)3列         ●(この行を最後として)   □● ●□● 上記のプログラムを作りたいのですが、 上手くいきません。途中まで作ったのですが、なかなか思うようにいかないです。どうすれば上記のようになりますでしょうか? #include <stdio.h> void disp(int x, int y); main() { int i,n; printf("表示する列:"); scanf("%d",&n); disp(3,3); for(i=1;i<=n;i++){ if(i%2==0){ disp(n-i,4); disp(i,2); } else{ disp(n-i,4); disp(i,1); } disp(1,3); } } void disp(int x, int y) { int i; for(i=0;i<x;i++){ if(y==1){ printf("●"); } else if(y==2){ printf("□"); } else if(y==3){ printf("\n"); } else{ printf("\0"); } } }

  • C言語の問題

    以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。

  • C言語のファイル操作についての質問です

    #include <stdio.h> #include<process.h> int main(void) { FILE *fp; int a[200], i, j, cnt, max, max_i; fp = fopen("data.txt", "r"); if (fp == NULL) { printf("file cannot open.\n"); exit(1); } for(i = 0; i < 200 && fscanf(fp, "%d", &a[i]) == 1; ++ i) ; fclose(fp); for(max = max_i = j = 0; j < i; ++ j){ int k; for(cnt = 0, k = j + 1; k < i; ++ k) cnt += (a[j] == a[k]); if(cnt > max) max = cnt; max_i = j; } printf("%d\n", a[max_i]); return 0; } これは「data.txt」というファイルから最頻値を探し出し、その値を表示するプログラムです。 しかし、このプログラムだと最頻値が1つしか表示できないので、 最頻値が複数ある場合でも、すべての最頻値の値を表示させるようなプログラムに書き換えてほしいです。 よろしくお願いします。 例)data.txt 30000 100 150 30000 30000 100 4320 100 出力↓ 30000 100

  • C言語で困っています...

    入力した数値の列だけ○と×を縦に、段々になるように表示する (最後の行は×にならなければいけない)プログラムを作成しています。 (実行例) ○と×を表示します。何列?:10            ×           ○×          ×○×         ○×○×         ×○×○×       ○×○×○×      ×○×○×○×    ○×○×○×○× ×○×○×○×○× ○×○×○×○×○× 途中までプログラミングできたのですが、 偶数の数値を入れたときはきちんと最後の行は×になっても 奇数の数値を入力すると○が最後の行になってしまい、うまくいきません。 どこがだめなのでしょうか? どなたか教えてください。 /* 入力した数値の列だけ、○と×を縦に、   段々になるように表示する(最後の行は×になる) */ #include <stdio.h> int main(void) { int i, j, n; printf("○と×を表示します。何列?:"); scanf("%d", &n); for (i=0; i<n; i++){ for (j=0; j<n; j++){ if (j >= (n - 1) - i){ if (j % 2 == 0) printf("○"); else printf("×"); } else printf(" ");//全角スペース } printf("\n"); } return 0; }

  • C言語!プログラム書いたのですがエラーです!

    課題内容 キーボードから数字を入力してその値までの合計を表示する。 さらに入力した値が偶数なら0から入力した値までのすべての偶数の和を 入力した値が奇数なら1から入力した値までのすべての奇数の和を表示するプログラム。 #include<stdio.h> int main(void) { int i, n, sum; sum=0; scanf("%d",&n); printf("入力値:%d\n", n); if(n%2 = 0) { for(i=0;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } else { for(i=1;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } return(0); } これでコンパイルすると10行目に左辺値が必要とでます。 どうすればよいでしょうか? 教えてください。よろしくお願いします。

  • C言語の問題について教えていただきたいのですが

    【身長デ一タを順次入力していき、160(cm)未満,160(cm)以上,170(cm)未満、170(cm)以上,180(cm)未満、180(cm)以上のデータがそれぞれいくつあったかを出力する(同時に全入力デ一タ数も出力する)プログラムを作成せよ。但し,データとして999 が入力された時点でプログラムの実行が終了するものとする.なお,999 というデータは,全入力データ数に入れないものとする.】 という問題が解けません・・・。わかる方いらっしゃいましたら教えてください。 一応私なりに #include <stdio.h> void main() { int n=0,i=0,j=0,k=0,l=0; double a; printf("身長を入力してください\n"); scanf("%lf",&a); while(a!=999){ scanf("%d",&n); n++; if(a<160){ i++; }else if(a>=160 && a<170){ j++; }else if(a>=170 && a<180){ k++; }else{ l++; } } printf("入力データ数 %d\n",n-1); printf("160cm未満 %d\n",i); printf("160cm以上170cm未満 %d\n",j); printf("170cm以上180cm未満 %d\n",k); printf("180cm以上 %d\n",l); } と作ってみたものの…;;; 正しいプログラムを教えていただけると嬉しいです。よろしくお願いします。

  • C言語(データ数の読み取り)

     input.txtというファイルの内容が 2 5 3 だとして、この3つの数字の最大値を求める以下のプログラムをコンパイルして実行すると、ファイルを読み込む前にデータ数「3」を入力しなければなりません。  データ数を入力することなくファイルからデータ数を読み取る方法を教えてください。大変お手数ですが、よろしくお願いします。 #include <stdio.h> main() { int i,max,max_no,N,a[1000]; FILE *fpi; printf("データ数を入力してください: "); scanf("%d",&N); if((fpi=fopen("input.txt","r"))==NULL) { fprintf(stderr,"ファイルを開けません\n"); exit(1); } for(i=0;i<N;i++) { fscanf(fpi,"%d",&a[i]); } max_no=0; max=a[max_no]; for(i=1;i<N;i++) { if(a[i]>max) { max=a[i]; max_no=i; } } printf("最大値は %d 番目のデータ %d です。\n",max_no+1,max); }

  • C言語の質問です。

    前にも質問したのですがなかなかうまくいかないのでよろしくお願いします。 データの書いてあるファイルを読み込んで処理するプログラムを書きたいと考えています。 読み込むデータ 0.012500 0.499167 1.382500 1.534444 2.489167 3.635000 3.775000 5.407500 5.705000 5.916667 6.115833 6.295278 6.825278 7.079722 . . . . この様な数値のかいてあるデータを使って0.5ずつに区切ってその中に何個データがあるか数えたいと考えています。(データは1万5千個以上あります) 例えば上のデータで考えると 0~0.5の範囲のデータは2個 0.5~1の範囲のデータは0個 1~1.5の範囲のデータは1個 1.5~2の範囲のデータは1個 2~2.5の範囲のデータは0個。。。 という風に数えるプログラムにしたいです。 僕が分からないところはどのように場合分けしていくか。。。です。 #include<stdio.h> //#include<process.h> int main(void) { FILE *fp; double n; int cnt,i,Cnt; fp=fopen("1.dat","r"); if(fp==NULL) { printf("file open error!!\n"); exit(1); } i=0; cnt=0; Cnt=0; while(fscanf(fp,"%lf\n",&n)!=EOF){ if(i<=n<(i+0.5)){ cnt++; printf("%lf %d\n",i,cnt); } else if((i+0.5)<=n<(i+1)){ Cnt++; printf("%lf %d\n",i,Cnt); } else{ i++; } } fclose(fp); return 0; } 僕の考えはデータを読み込む 変数 i を使って if文で i <= n <i+0.5の範囲のときはcntを足していく     i+0.5<= n <i+1の範囲のときはCntを足していく それ以外のときは i を+1して同じことを繰り返す というようなやり方を考えました。 しかしうまくいきませんでした。 どのようにすればよいでしょうか。 よろしくお願いします。

  • C言語のプログラムについて。

    #include <stdio.h> int main(void) {   int hoge,piyo;   printf("数値を入力せよ。:");   scanf("%d",&hoge);   piyo = hoge % 2;   if (piyo == 0) {     printf("%dは、偶数。\n",hoge);   } else {     printf("%dは、奇数。\n",hoge);   };   return 0; } という、プログラムが、実行できません。 といって、エラーメッセージがでてくれないので、困っています。 ひょっとして、非常に初歩的なミスという気もするのですが。 これはよかった!という、C言語に関する書籍、また、コンピュータのシステムに関する書籍がありましたら、合わせてご教授ください。