アプリ版:「スタンプのみでお礼する」機能のリリースについて

#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

A 回答 (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;
}

これだけの話でした。
    • good
    • 0

No2 さっそく間違ってることに気が付きましたので訂正



>cnt[j] += cnt[k];  //cnt[j] ++でも同じだと思う
cnt[j] ++;  //cnt[k]は未初期化だから ++じゃないとダメ
    • good
    • 0

なるべく元の形を残して


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;
}

で動くんじゃないかな
ただし確認などは一切してないので間違ってたらゴメン
(参考程度にしてほかのまともな回答待ったほうがいいかも)
    • good
    • 0

#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;
}
    • good
    • 0

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