• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のファイル操作についての質問です)

C言語のファイル操作で最頻値を複数表示するプログラム

このQ&Aのポイント
  • C言語のファイル操作を使用して、指定されたファイルから最頻値を探し出し、その値を表示するプログラムです。
  • ただし、元のプログラムでは最頻値が1つしか表示されないため、最頻値が複数ある場合でもすべての最頻値を表示するようにプログラムを書き換える必要があります。
  • このプログラムでは、指定されたファイルからデータを読み取り、最頻値を計算し、最頻値を持つすべての値を表示します。

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

  • ベストアンサー
  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.4

難しく考えすぎていたようです。 #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; } //ここから追加 for(j = 0; j < i; ++ j){ int k; for(cnt = 0, k = j + 1; k < i; ++ k) cnt += (a[j] == a[k]); if(cnt == max) printf("%d\n", a[j]); } //ここまで追加 // printf("%d\n", a[max_i]); return 0; } これだけの話でした。

その他の回答 (3)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.3

No2 さっそく間違ってることに気が付きましたので訂正 >cnt[j] += cnt[k];  //cnt[j] ++でも同じだと思う cnt[j] ++;  //cnt[k]は未初期化だから ++じゃないとダメ

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

なるべく元の形を残して for(cnt = 0, k = j + 1; k < i; ++ k)  以降と一部変数型変更 データ最大個数は200件 としています(元のソースがそうだから) -------------実際の変更部分 int cnt[200]; for(cnt[j] = 1, k = j + 1; k < i; ++ k) if(a[j] == a[k]) cnt[j] += cnt[k];  //cnt[j] ++でも同じだと思う cnt[k] = 0;     //なくてもいい気がする } for(j = 0; j < i; ++ j) if(cnt[j] > max) max = cnt[j]; for(j = 0; j < i; ++ j) if(cnt[j] = max) printf("%d\n", a[j]); ----------------------ここまで return 0; } で動くんじゃないかな ただし確認などは一切してないので間違ってたらゴメン (参考程度にしてほかのまともな回答待ったほうがいいかも)

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.1

#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]); int b[200],c[200]; int k,m,n,p; k=1;b[0]=a[0];c[0]=0; for(j=0;j<i;j++){ for(p=0;p<k;p++){ if(a[j]==b[p]){ c[p]=c[p]+1; break; } } if(p==k){ b[k]=a[j]; c[k]=1; k++; } } for(m=0;m<k;m++){ for(n=m;n<k;n++){ if(c[m]<c[n]){ j=b[m]; b[m]=b[n]; b[n]=j; j=c[m]; c[m]=c[n]; c[n]=j; } } } for(j=0;j<k;j++){ if(c[j]==c[0]) printf("%d-%d個\n", b[j],c[j]); } return 0; }

関連するQ&A