プロが教えるわが家の防犯対策術!

以下のTEST.csvの2列目の「年月日」が一致したものの中で1列目の値の最頻値を求めたいのですが、上手くできません。独学で学び始めたため、上手く理解できていない部分が多々あると思いますが、訂正箇所を指摘して頂ければ幸いです。

TEST.csv(10000行)
----------------
284,1990/3/1
360,1990/3/1
360,1990/3/1
361,1990/3/1
360,1990/3/2
360,1990/3/2
360,1990/3/2
360,1990/3/2
350,1990/3/3
350,1990/3/3
379,1990/3/4
379,1990/3/4
379,1990/3/4
360,1990/3/4
379,1990/3/5
360,1990/3/5
379,1990/3/5
379,1990/3/5
360,1990/3/5



----------------

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
FILE *fp;

int p[200];
char year[15];
int i, j, cnt, max, max_i;
int r;

fp = fopen("TEST.csv", "r");
if (fp == NULL) {
printf("file cannot open.\n");
exit(1);
}
i=0;
while(fscanf(fp,"%d,%s",&p[i],year)!=EOF ) {
++i;
}
fclose(fp);

for(r=0;year[r]<10000;r++)
if(year[r]==0){

for(max = max_i = j = 0; j < i; ++ j){
int k;

for(cnt = 0, k = j + 1; k < i; ++ k)
cnt += (p[j] == p[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 += (p[j] == p[k]);
if(cnt == max)
printf("%d\n", p[j]);
}

}

return 0;

}

改善しなけらばならない部分が多いと思います・・・。
理想としては
1990/3/1,360
1990/3/2,360



という風にしたいのですが、まずは「年月日」が一致するものとおしの中で最頻値を求められるようにしないとですね。

A 回答 (1件)

char year[15];


とchar15個分しか取ってないのに
> for(r=0;year[r]<10000;r++)
> if(year[r]==0){
なんて r>=15に成り得る操作しているのですから、この時点でいろいろとおかしいです。
「文字」と「文字列」と「配列」との関係がまだ理解しきれてないのではないでしょうか。


C言語での文字列の扱いは、他の言語に比べて難しいところがあります。
独習するのなら、文字列、配列、ポインタは特に重点的にやりましょう。



別解:
わざわざ面倒なCを使う積極的な理由が無いのなら、他の方法を使いましょう。
例えば、この程度なら、 Excelでも十分です。
    • good
    • 0

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