標準入力から英小文字の出現回数をカウントするプログラムの修正方法

このQ&Aのポイント
  • 標準入力から入力された文字列中の英小文字(a~z)の出現回数をカウントするプログラムで、正しく動作しない問題が発生しています。
  • プログラムを実行すると、カウント結果が '0':4 と表示されてしまい、'a' のカウントが正しく行われていません。
  • 問題の原因は、配列の添字が誤っているためです。'a' の添字は 0 ではなく、1 としなければなりません。修正する際には、配列の添字を正しく指定するように変更する必要があります。
回答を見る
  • ベストアンサー

教えてください。

標準入力から文字を入力し、その中の英小文字( a ~ z )の出現回数を文字ごとにカウントし、表示せよ。英小文字以外の文字は無視する。 という課題が出てうまく表示されません。 プログラムはこんな風です。 #include <stdio.h> int main(void) { int i,ch; int cnt[23] = {0}; while (1) { ch = getchar(); if (ch == EOF) break; switch (ch) { case 'a': cnt[0]++; break; ・      ・        ・   case 'z' :cnt[22]++; break; } } puts(" 英字の出現回数"); for(i=0;i<23;i++) printf("'%d': %d\n",i,cnt[i]) return 0; } で実行すると '0':4となってしまい'a'にしたいのですがどのようにかえればいいのでしょうか?

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

  • ベストアンサー
noname#30727
noname#30727
回答No.1

a~zは26文字なので、cnt[26]とする。 >for(i=0;i<23;i++) >printf("'%d': %d\n",i,cnt[i]) ↓ for (i = 0; i < 26; i++) printf("'%c': %d\n", 'a' + i, cnt[i]); あと、switch-case全体も2行くらいで書くことが出来ます。

tadashi1111
質問者

お礼

うまく表示できました☆また困ったときはよろしくお願いいたします。

関連するQ&A

  • 数字文字をカウントするプログラムの動作について

    良い質問のタイトルが思い浮かばず、分かりづらいタイトルで申し訳ありません、C言語について質問させて頂きます。 C言語の参考書を買って夏休み中にプログラムの勉強をしているのですが、何故動作するのかがわからない例があります、ソースは以下の通りです。 #include <stdio.h> int main(void) { int i,ch; int cnt[10] = {0}; while(1) { ch = getchar(); if (ch==EOF) break; switch(ch) { case '0' : cnt[0]++;printf("%d\n",ch);break;/* printfは確認の為 */ case '1' : cnt[1]++;printf("%d\n",ch);break; case '2' : cnt[2]++;printf("%d\n",ch);break; case '3' : cnt[3]++;printf("%d\n",ch);break; case '4' : cnt[4]++;printf("%d\n",ch);break; case '5' : cnt[5]++;printf("%d\n",ch);break; case '6' : cnt[6]++;printf("%d\n",ch);break; case '7' : cnt[7]++;printf("%d\n",ch);break; case '8' : cnt[8]++;printf("%d\n",ch);break; case '9' : cnt[9]++;printf("%d\n",ch);break; } } puts("数字文字の出現回数"); for(i=0;i<10;i++) printf("'%d':%d\n",i,cnt[i]); getchar();getchar(); return(0); } といったプログラムです。 実行し、数値を入力、CTRL+Zで入力を終了し、出現回数を表示させる、という動作自体は無事にできるのですが、何故chの値が変更していくのかがわかりません、数値を入力した時点で51や49といったそれぞれ違う数値が表示されるのですが、chの値を変更させる命令を、何が引き起こしているのかが理解できません、3(51)と判定されて同じ数が無限にカウントされないのは何故なのでしょうか・・・・? また、その後の無限ループからの脱出をCTRL+Zがどうして引き起こすのかも理解できず困っています、教科書には「CTRL+Zは入力の終了を意味する」とあるのですが、これは一体どういう意味なのでしょうか、強制的に割り込んでEOFを代入するということなのでしょうか・・・? お時間がある時にでも、教えて頂けると助かります、よろしくお願いします。

  • C初心者です。どうかお助けを

    独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。

  • cのプログラミング

    //ユーザーが入力した文字の個数をカウントする #include<stdio.h> int main() { char ch; int moji; int s_cunt=0, a_cunt=0, k_cunt=0; printf(\"文字を入力してください-->\"); do{ ch = getchar(); if(\'0\'<=ch && ch<=\'9\') moji = 1; else if(\'a\'<=ch && ch<=\'z\') moji = 2; switch(moji){ case 1: s_cunt++; break; case 2: a_cunt++; break; default: k_cunt++; break; } }while(ch != \'\\n\'); printf(\"数字の入力数:%d\\n\",s_cunt); printf(\"英字の入力数:%d\\n\",a_cunt); printf(\"区切りの入力数:%d\\n\",k_cunt); return 0; } 数字、英字、区切り文字をそれぞれリターンキーが押されるまでカウントして出力したいのですが上手く出力されません。このプログラミングは全然違いますか?

  • do - while 文

    以下のコードをコンパイル後実行すると、0~9までの出現回数がわかるのですが、処理を続けますか?と出た後yを入力するともう一度 do 以降を実行するようにしたいのですが、yを入力する前にプログラムが終了してしまいます。何がいけないんでしょうか? #include <iostream> using namespace std; int main (void) { int i; char cont; char c; int count[10] = {0}; do{ while (cin.get(c)){ switch (c){ case '0': count[0]++; break; case '1': count[1]++; break; case '2': count[2]++; break; case '3': count[3]++; break; case '4': count[4]++; break; case '5': count[5]++; break; case '6': count[6]++; break; case '7': count[7]++; break; case '8': count[8]++; break; case '9': count[9]++; break; } } for (i =0; i < 10; i++) cout << i << "の出現回数は" << count[i] << "\n"; cout <<"処理を続けますか?(y/N)"; cin >>cont; }while (cont == 'y'); }

  • getcharの働きについて

     1文字入出力関数getchar()、putchar()の働きを調べるため、次のソースを作って動かしてみました。'>'を使って、実行結果をテキストファイルに出力してみました。 ★ソース1(□はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> int main(void) { □int ch; □printf("何か文字を入力して下さい。\n"); □printf("(Ctrl+Zが入力されたら終了します。)\n"); □while ((ch = getchar()) != EOF) □□putchar(ch); □ □return EXIT_SUCCESS; } ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ★実行結果 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 何か文字を入力して下さい。 (Ctrl+Zが入力されたら終了します。) a abcde ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆  上のように、遊びで文字列を入力してみましたところ、1文字と同様に、入力したとおりに出力されました。そこで、入力したものを確認するために、printf()で出力する行を一つ次のように入れましたところ、次の実行結果のようになりました。 ★ソース2(□はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> int main(void) { □int ch; □printf("何か文字を入力して下さい。\n"); □printf("(Ctrl+Zが入力されたら終了します。)\n"); □while ((ch = getchar()) != EOF) □□printf("入力は%c\n", ch); □□putchar(ch); □ □return EXIT_SUCCESS; } ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ★実行結果 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 何か文字を入力して下さい。 (Ctrl+Zが入力されたら終了します。) 入力はa 入力は 入力はa 入力はb 入力はc 入力はd 入力はe 入力は  ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆  getchar()で上のように文字列を入力した場合、異常終了にはならないのでしょうか。また、2バイト文字('あ')とか、その文字列("あいうえお")を入力して実行してみましたが、異常にはなりませんでした。getchar()に文字列を入力した場合、どのように処理されるのでしょうか。実用的ではないかもしれませんが、コンピュータの動きをちゃんと理解したいと思いますので、よろしくお願い致します。

  • 教えてください

    入力した文字列のスペースをすべて取り除く関数を返すのですが、分かりません。(例)a s d fと入力したら、asdfと表示します。途中まで考えたのですが、どうしてもできません。教えてください。宜しくお願いします。(このソースは、コンパイルエラーです。) 14: 移植性のないポインタ変換(関数a) #include <stdio.h> char a(char *st) { char *ptr=st; while(*st!='\0') { if (*st != ' ') { *ptr++=*st; } } *ptr='\0'; return(ptr); } int main(void) { char str[21]={'\0'}; int i=0; char ch; printf("文字列を入力してください:"); while(i<21) { ch=getchar(); if (ch=='\n') {break; } else if (ch != '\0' && ch != '\n') { str[i] =ch; i++; } } str[i] = '\0'; printf("%s",a(str)); return(0); }

  • c言語 プログラミング

    以下のプログラムで分からないところがあります。 数式をxpyの形式で入力して、(x,y:整数、p:x,-,*,/のいずれかの演算記号) 答えを表示するというプログラムなのですが、 5行目と9行目にある”-'0'”の意味が分からないので教えてください。 01: int x=0,y=0,z,i;char a[30],p; 02: printf("式を入力してください。:);gets(a); 03: for(i=0;a[i];i++) 04:  if('0'<=a[i] && a[i]<='9') 05:   x=10*x+a[i]-'0'; 06:  else{p=a[i]-'0';break;} 07: for(i++;a[i];i++) 08:  if('0'<=a[i] && a[i]<='9') 09:   y=10*y+a[i]-'0'; 010: switch(p){ 11:  case '+':z=x+y;break; 12:  case '-':z=x+y;break; 13:  case '*':z=x*y;break; 14:  case '/':z=x/y;break; 15:  default:puts("入力エラーです。");return 0; 16: } 17: printf("%d%c%d=%d\n",x,p,y,z); よろしくお願いします。(読みにくかったらメモ帳などにコピペしてください)

  • 困っています

    前に質問したのですが、a s d fと入力すると、asdfと表示されます。(スペースを取り除きます)何回やってもa s d fと入力すると、すぐ終了してしまいます。本当に分からないので教えてください。宜しくお願いします。 #include <stdio.h> char *str_del(char *st) { char *ptr=st; while(*st!='\0') { if (*st != ' ') { *ptr++=*st; } } *st='\0'; return(ptr); } int main(void) { char str[21]={'\0'}; int i=0; char ch; printf("文字列を入力してください:"); while(i<21) { ch=getchar(); if (ch=='\n') {break; } else if (ch != '\0' && ch != '\n') { str[i] =ch; i++; } } str[i] = '\0'; printf("%s",str_del(str)); return(0); }

  • 明解C言語 入門編 P219 について

    以下のプログラムの理解について、質問です。 入力した文字列に、0 ~ 9 の数字がそれぞれ何度含まれていたかをカウントするプログラムです。 (明解C言語 入門編 P219) ========== プログラム ========== #include <stdio.h> void str_dcount(const char str[], int cnt[]) { unsigned i = 0; while(str[i]) { // str に '\0' が現れるまで繰り返し if(str[i] >= '0' && str[i] <= '9') cnt[str[i] - '0']++; // !!!! ココです !!!! i++; } } int main(void) { int i; int dcnt[10] = {0}; char str[100]; printf("文字列を入力してください : " ); scanf("%s", str); // 文字列を str へ str_dcount(str, dcnt); // 引数  str = 入力した文字列, dcnt = すべて '0' puts("数字文字の出現回数 "); for(i = 0; i < 10; i++) printf("'%d' : %d\n", i, dcnt[i]); return 0; } ========= 実行結果 ========= 文字列を入力してください : 3.14159 数字文字の出現回数 '0' : 0 '1' : 2 '2' : 0 '3' : 1 '4' : 1 '5' : 1 '6' : 0 '7' : 0 '8' : 0 '9' : 1 ========== 質問内容 ========== 関数 str_dcount 内の 『 cnt[str[i] - '0']++; 』 がどのような処理を行っているのか、理解ができません。 以下のように考えたのですが、それでは上手く動かないとの結論に至りました。 たとえば、i = 0 で、str[100] = 3.14159 であるとき、 /* ループ1回目 */ cnt[0] = str[0] - 0; /* 3 - 0 で cnt[0] には 3 が入る。 */ cnt[0++]; /* ループ2回目 */ cnt[1] = str[1] - 1; /* "." - 1 となる。 数字ではないので減算できずエラーになるのでは? */ cnt[1++]; /* ループ3回目 */ cnt[2] = str[2] - 2; /* 1 - 2 なので、なぜか負の数になってしまう。。 */ cnt[2++]; 配列の添え字が、配列になっている cnt[str[i]] までは理解できますが、 以下の2点が解っていないために理解ができていないようです。 1) cnt[str[i] - '0']++ ; の - '0' が何を行っているのか 配列には数字が入っており、そこから文字 '0' を減算しているのでしょうか? 数字から文字を減算できるのでしょうか? 2)  ++  はどの値を増加させているのでしょうか? 宜しくお願いします。

  • C言語

    入力した文字列と文字列'x'を受け取り、'x'の位置のポインタを返すのですが、例えば、saxcvと入力すると、xcvと表示されるのですが、このソースだと、saxcvと全部表示されてしまいます。分からないので、教えてください。宜しくお願いします。 #include <stdio.h> char *a(char *sew) { char *p=sew; while (*sew != 'x') { sew++; } return(p); } int main(void) { char str[21] ={'\0'}; int i=0,no=0; char ch; printf("文字を入力してください:"); while (i<21) { ch=getchar(); if (ch=='\n') {break;} else if (ch != '\0' && ch != '\0') { str[i] =ch; i++; } } for(i=0; i<20; i++) { if(str[i]=='x') { printf("'x'以降は%sです。\n", a(str)); no=1; break; } } if (no==0) printf("'x'は見つかりませんでした。"); return (0); }

専門家に質問してみよう