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

解決済みの質問

C言語の質問です

下記のプログラムはテキストファイルを読み込み、AからZまでの文字(小文字、大文字は区別しない)がそれぞれ何回

現れたかを数えるプログラムです。

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

int count[26];

int main(int argc, char *argv[])
{
FILE *fp;
char ch;
int i;

/* ファイル名の指定を調べる */
if(argc!=2) {
printf("ファイル名の指定がありません\n");
exit(1);
}

if((fp = fopen(argv[1], "r"))==NULL) {
printf("ファイルを開くことができません\n");
exit(1);
}

while((ch=fgetc(fp))!=EOF) {
ch = toupper(ch);
if(ch>='A' && ch<='Z') count[ch-'A']++;
}

for(i=0; i<26; i++)
printf("%c は %d 回出現\n", i+'A', count[i]);

fclose(fp);

return 0;
}

1)int count[26]; で、なぜ26なのかが分かりません。
2)count[ch-'A']++; はどういう動作をするのか詳しく教えてほしいです。
3)よって、for文がどういう動作で表示しているのかが分かりません。
未熟者の私ですが、どなたか教えていただけないでしょうか?

投稿日時 - 2007-12-09 16:40:21

QNo.3584087

すぐに回答ほしいです

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

じゃ1だけ。
A~Zまで数えるといくつになる?
あとは文字コード表とにらめっこすれば幸せになれるかも。

投稿日時 - 2007-12-09 16:50:52

お礼

さっそくの回答どうもありがとうございます!
ご指摘のとおり文字コード表を見ながら、考えました。

int count[26]; はAからZまでのそれぞれの出現回数を加算していくために26個必要なんですね?
そして、ch=fgetc(fp) で、例えば最初にAという文字に出合ったとすると、
文字コード表ではAは65で、count[ch-'A']++; で、65マイナス'A'だから、
65マイナス65で、count[0]++; と同じことになるんですね?
そして、
Bに出会うたびに66マイナス'A'でcount[1]++;
Cに出会うたびに67マイナス'A'でcount[2]++;
(以下略)
それで、
Aの出現回数がcount[0]に入っていて、
Bの出現回数がcount[1]に入っていて、
(以下略)
for文でi=0;のとき、引数のi+'A'は0プラス65で文字コードに戻して%cで表示して、
count[i]で、Aの出現回数を表示する。
これをZの出現回数が入っている、count[25]まで繰り返す。

乱雑な文ですみませんが、こういうことなんですね?

投稿日時 - 2007-12-09 18:02:07

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

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

回答(3)

ANo.3

★アドバイス
>こういうことなんですね?
 解釈は合っていますよ。
>未熟者の私ですが、どなたか教えていただけないでしょうか?
 未熟者でも説明されて直ぐに理解できる人、出来ない人がいます。
 Guchiken さんはプログラミングのセンスがありそうです。
・以上。頑張って下さい。

投稿日時 - 2007-12-09 18:25:46

お礼

お褒めのお言葉…ありがとうございますっ!!
なんか泣きそうです(うれしくて)。
ますますプログラミングの勉強に気合が入りそうです!
回答ありがとうございました。

投稿日時 - 2007-12-09 18:42:30

ANo.1

>なぜ26なのかが分かりません。
A から Z までのアルファベットの数ですね。

>count[ch-'A']++; はどういう動作をするのか
> 詳しく教えてほしいです。
A から Z までの文字に応じて、カウンタ
count[0] から count[25] をカウントアップする

投稿日時 - 2007-12-09 16:46:24

お礼

さっそくの回答どうもありがとうございます!
自分なりに調べてみたんですが、

int count[26]; はAからZまでのそれぞれの出現回数を加算していくために26個必要なんですね?
そして、ch=fgetc(fp) で、例えば最初にAという文字に出合ったとすると、
文字コード表ではAは65で、count[ch-'A']++; で、65マイナス'A'だから、
65マイナス65で、count[0]++; と同じことになるんですね?
そして、
Bに出会うたびに66マイナス'A'でcount[1]++;
Cに出会うたびに67マイナス'A'でcount[2]++;
(以下略)
それで、
Aの出現回数がcount[0]に入っていて、
Bの出現回数がcount[1]に入っていて、
(以下略)
for文でi=0;のとき、引数のi+'A'は0プラス65で文字コードに戻して%cで表示して、
count[i]で、Aの出現回数を表示する。
これをZの出現回数が入っている、count[25]まで繰り返す。

こういうことなんですね?

投稿日時 - 2007-12-09 17:59:45

あなたにオススメの質問