こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の質問です

#include <stdio.h>

int main(void)
{
int stats[20], i, j;
int mode, count, oldcount, oldmode;

printf("20個の数字を入力してください: \n");
for(i=0; i<20; i++) scanf("%d", &stats[i]);

oldcount = 0;
/* モードを調べる */
for(i=0; i<20; i++) {
mode = stats[i];
count = 1;

/* この値の発生頻度を数える */
for(j=i+1; j<20; j++)
if(mode==stats[j]) count++;

/* 以前の数より多ければ、新しいモードを使用する */
if(count>oldcount) {
oldmode = mode;
oldcount = count;
}
}
printf("モードは %d です\n", oldmode);

return 0;
}

上記のコードはユーザーに20個の数値を入力させ、
そのモード(最も頻繁に現れる数値)を調べて表示するプログラムです。

1番目のfor文までは分かります。そのあとが、どうしても分かりません!!
特に、oldcount = 0; とする所、count = 1; とする所、for文で j=i+1; とする所。
他、if文内が分かりません。
課題の丸投げではなく、本当に分からなくて困っています。
どなたか詳しく解説してくれないでしょうか?よろしくお願いします。

投稿日時 - 2007-11-19 12:12:40

QNo.3530218

すぐに回答ほしいです

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

Debugしましょう。

oldcount = 0;
/* モードを調べる */
for(i=0; i<20; i++) {
mode = stats[i];
count = 1;
modeとしてi=0一番最初の情報とする。
かつ、その数は1つはあるのでcount=1


/* この値の発生頻度を数える */
for(j=i+1; j<20; j++)
if(mode==stats[j]) count++;
i番目より後に同じ数がいくつあるか調べる。
みつかったら、count++する


/* 以前の数より多ければ、新しいモードを使用する */
if(count>oldcount) {
oldmode = mode;
oldcount = count;
}
もし、countがoldcountを上回ったら現在のmode、countをoldを付けて保存しておく

}
これをjに関して繰り返す


printf("モードは %d です\n", oldmode);
oldmodeが幾つかを返す
return 0;
}

01234567
15676545
今私が適当に打った7個の番号で、答えは5となる事が期待されます。
i=0でmode=1 , count=1
j=i+1(=1),i+2(=2)...と数えていくと、1はこれ以上ないのでcount=1
今までで最多なのでoldmode=1、oldcount=1としておきます。
次にiのFor文が動き、i=1でmode=5,count=1
j=i+1(=2)...と数えていくと、5は合計2回出てくるので、最初の一回とあわせて3回count=3
oldcount<countなので、oldcount=3,oldmode=5として、次のiに向かう。
(以下略

投稿日時 - 2007-11-19 13:36:28

お礼

回答ありがとうございます!!
コードが何をしているか、ひとつひとつは分かるんですが、
全体で何をしているか分からなかったので質問しました。
回答末尾の具体例がとても分かりやすく、参考になりました。
回答ありがとうございました。

投稿日時 - 2007-11-19 16:54:32

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)