- ベストアンサー
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文がどういう動作で表示しているのかが分かりません。 未熟者の私ですが、どなたか教えていただけないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
じゃ1だけ。 A~Zまで数えるといくつになる? あとは文字コード表とにらめっこすれば幸せになれるかも。
その他の回答 (2)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >こういうことなんですね? 解釈は合っていますよ。 >未熟者の私ですが、どなたか教えていただけないでしょうか? 未熟者でも説明されて直ぐに理解できる人、出来ない人がいます。 Guchiken さんはプログラミングのセンスがありそうです。 ・以上。頑張って下さい。
お礼
お褒めのお言葉…ありがとうございますっ!! なんか泣きそうです(うれしくて)。 ますますプログラミングの勉強に気合が入りそうです! 回答ありがとうございました。
- koko_u_
- ベストアンサー率18% (459/2509)
>なぜ26なのかが分かりません。 A から Z までのアルファベットの数ですね。 >count[ch-'A']++; はどういう動作をするのか > 詳しく教えてほしいです。 A から Z までの文字に応じて、カウンタ count[0] から count[25] をカウントアップする
お礼
さっそくの回答どうもありがとうございます! 自分なりに調べてみたんですが、 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]まで繰り返す。 こういうことなんですね?
お礼
さっそくの回答どうもありがとうございます! ご指摘のとおり文字コード表を見ながら、考えました。 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]まで繰り返す。 乱雑な文ですみませんが、こういうことなんですね?