• 締切済み

【C言語】入力された文字種別ごとにカウント

以下のように実行したいのですが、 どのように組んだら良いのでしょうか? 宜しくお願いします。 言語はC言語で、環境はVisual C++ 2010 Express Editionを使っています。 ちなみに最後の方に現在のコードがあります。 ///////////////////////////////////////////// 文字を入力しなさい(終了条件:Ctrl+Z) abcdef678ABCDEFopuKLH ghtJK+ghjBBBdgjk ^Z a : 1個入力 b : 1個入力 c : 1個入力 d : 2個入力 e : 1個入力 f : 1個入力 g : 3個入力 h : 2個入力 i : 0個入力 j : 2個入力 k : 1個入力 l : 0個入力 m : 0個入力 n : 0個入力 o : 1個入力 p : 1個入力 q : 0個入力 r : 0個入力 s : 0個入力 t : 1個入力 u : 1個入力 v : 0個入力 w : 0個入力 x : 0個入力 y : 0個入力 z : 0個入力 A : 1個入力 B : 4個入力 C : 1個入力 D : 1個入力 E : 1個入力 F : 1個入力 G : 0個入力 H : 1個入力 I : 0個入力 J : 1個入力 K : 2個入力 L : 1個入力 M : 0個入力 N : 0個入力 O : 0個入力 P : 0個入力 Q : 0個入力 R : 0個入力 S : 0個入力 T : 0個入力 U : 0個入力 V : 0個入力 W : 0個入力 X : 0個入力 Y : 0個入力 Z : 0個入力 /////////////////////////////////////// #include <stdio.h> #include <conio.h> #define ALPHABET_COUNT 52 int main(void) { // 入力アルファベットの個数を数えるカウンタは大きさ 52 の配列で用意。 int counter[ALPHABET_COUNT]; int c; int i; // 最初に、配列の 52個の要素すべてを0クリアする for(i=0;i<52;i++){ counter[i] = 0; } printf("文字を入力しなさい(終了条件:Ctrl+Z)\n"); while(1){ c = getchar(); if(c == EOF){ break; } if(c >= 'a' && c <= 'z'){ //65<90 counter[c-'a']++; } else if(c >= 'A' && c <= 'Z'){ //97<122 counter[c-'A']++; } } // 文字種別の個数表示する c = 'a'; for(i=0;i<ALPHABET_COUNT;i++){ if(i<26){ printf("\t%c : %3d個入力",c++,counter[i]); if(((i+1)%3) == 0){ printf("\n"); } } else{ if(i==26){ printf("\n"); c = 'A'; } printf("\t%c : %3d個入力",c++,counter[i]); if(((i+2)%3) == 0){ printf("\n"); } } } printf("\n"); /* c = 'a'; for(i=1;i<=26;i++){ printf("\t%c : %3d個入力",c++,counter[i-1]); if(i%3 == 0){ printf("\n"); } } printf("\n"); */ }

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

main関数で何でもかんでも仕事をしようとすると プログラム全体の見通しが悪くなるので、 こんな風に役割分担させることをおすすめします。 #include <stdio.h> #include <ctype.h> #define ALPHABET (26) void input(int *lower, int *upper) { int c; printf("文字を入力しなさい(終了条件:Ctrl+Z)\n"); while ((c = getchar()) != EOF) { if (islower(c)) { lower[c - 'a']++; } if (isupper(c)) { upper[c - 'A']++; } } } void output(int *lower, int *upper) { int i; for (i = 0; i < ALPHABET; i++) { printf("%c:%d個入力%c", 'a' + i, lower[i], (i % 3 == 2) ? '\n' : ' '); } putchar('\n'); for (i = 0; i < ALPHABET; i++) { printf("%c:%d個入力%c", 'A' + i, upper[i], (i % 3 == 2) ? '\n' : ' '); } putchar('\n'); } int main(void) { int lower[ALPHABET] = { 0 }; int upper[ALPHABET] = { 0 }; input(lower, upper); output(lower, upper); return 0; }

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

#include <stdio.h> #include <ctype.h> #define ALPHABET (26) int main(void) { int lower[ALPHABET] = { 0 }; int upper[ALPHABET] = { 0 }; int c, i; printf("文字を入力しなさい(終了条件:Ctrl+Z)\n"); while ((c = getchar()) != EOF) { if (islower(c)) { lower[c - 'a']++; } if (isupper(c)) { upper[c - 'A']++; } } for (i = 0; i < ALPHABET; i++) { printf("%c:%d個入力%c", 'a' + i, lower[i], (i % 3 == 2) ? '\n' : ' '); } putchar('\n'); for (i = 0; i < ALPHABET; i++) { printf("%c:%d個入力%c", 'A' + i, upper[i], (i % 3 == 2) ? '\n' : ' '); } putchar('\n'); return 0; }

関連するQ&A

  • C言語初心者です。

    #include <stdio.h> int main() { int b[100]; int i, n; int a, r, data; int count=0; printf("Please input two integers:"); fflush(0); scanf("%d %d", &a, &r); if(a<=0 || r<=1){ printf("Error\n"); } else{ for(n=0; b[n]<=80.0; n++){ if(n==0){ b[0]=0; count++; } else { for(i=0; i<=n-1; i++){ data*=r; } b[n]=a*data; printf("%d ", b[n]); count++; } } printf("\n"); for(; count>0; count--){ printf("%d ", b[count]); } } return 0; } windows8でeclipseを使ってC言語を書いてます。 eclipse上だと何もエラーが表示されてないのですが、実行し、 Please input two integers: と表示された後、適当な数字2つを入力しても何も反応しません。 稚拙な質問ですいません。どなたか原因を教えてください。

  • C言語文字数4つカウント

    こんにちは。大学の課題で「キーボードから入力した文字数に含まれる'h''o''g''e'の4つの文字数をカウントする関数を含むプログラムを完成させよ」という課題がありました。なかなかできず現段階では以下のようになっています。どうすれば問題文のように実行できますか? #include <stdio.h> char str_chnum(const char str[], int ch) { int count = 0; int i; for(i = 0; str[i] != '\0'; i++) { if(str[i] == ch) count++; } return(count); } int main(void) { char str[128]; int ch; printf("文字列を入力してください:"); scanf("%s", str); printf("検索する文字を入力してください:"); scanf(" %c", &ch); printf("%cは%d個ありました。\n", ch, str_chnum(str, ch)); return(0); }

  • 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文がどういう動作で表示しているのかが分かりません。 未熟者の私ですが、どなたか教えていただけないでしょうか?

  • 任意の文字列のアルファベットのカウント

    任意の入力された文字列に対し、出現頻度の表示をしようと思って以下のように考えました。 #include<stdio.h> int main(){ int count[26]; char c; while((c=getchar())!='\n'){ if(c>='a'&&c<='z'||c>='A'&&c<='Z'){ count[c]++; } } printf("%c:%d\n",c,count[c]); } まだc初めて2週間くらいなので問題点を解決できません。どなたか教えてください。よろしくお願いします。

  • C アルファベットのカウント

    #include<stdio.h> #define N 97 #define M 122 int main(void) { char str[ ]="national university"; int i,h,count; char check; for(h=N-1;h<=M;h++){ h++; char check = (char)h; for(i=0;str[i] != '\0';i++){ if(str[i] = check){ count++; } } printf("%c:%d\n",check,count); } } というコードで、アルファベットをそれぞれ何文字使用しているか調べるつもりだったのですが、結果は次のようになってしまいました。解説お願いします。 a:28 c:56 e:84 g:112 i:140 k:168 m:196 o:224 q:252 s:280 u:308 w:336 y:364 {:392

  • 標準ライブラリ関数で入力する時にEORが未定義と表示される

    #include <stdio.h> int main(void) { int i, c, counter[10] = {0}, n; printf("数字を入力してください。(終了条件:Ctrl+Z)\n"); while ((c = getchar()) != EOF) { n = c - '0'; if (n >= 0 && n <= 9) { counter[n]++; } } printf("\n入力した数字の個数\n"); for (i = 0; i < 10; i++) { printf("%d : %d個入力\t", i, counter[i]); } return 0; } 上のように入力した場合になぜかEORは未定義と表示されます・ これはどうしてなのでしょうか? この式でいけるはずなのですが。 よろしくお願いします。

  • c言語で分からないところがあるので教えてください。

    http://www9.plala.or.jp/sgwr-t/c/Q/ens06-61.html の問題がわかりません。 回答の #include <stdio.h> int main( void ) { int kekka[51]; int a, b, i; int amari; printf( "整数値を2つ入力してください " ); scanf( "%d%d", &a, &b ); if( b == 0 ){ printf( "処理終了\n" ); return 0; } printf( "%d / %d = ", a, b ); kekka[0] = a/b; for ( i = 1; i < 51;i++ ) { amari = a%b; if ( amari == 0 ) break; a = amari * 10; kekka[i] = a/b; } printf( "%d.", kekka[0] ); ここまでの部分はわかったのですが、 下の for ( a = 1; a < i; a++ ) { printf( "%d", kekka[a] ); } の部分がわかりません。 この部分は何を表わしているのか 教えてください。

  • C言語で 数字を配列に入力し,q Qで終了させたい

    O.reillyのC実践プログラミング第3版で、勉強しています。 p105の 実習7-6 「いくつかの数字が入力されたとき、正の数がいくつあるか、負の数がいくつあるかを  数えるプログラムを作成せよ」に取り組んでみました。    例えば 「1 -1 2 -2 3 -3 -4 -5 で8つの数があり、正が3 負が5を出力させたい」のです。  入力の終わりは、q,Qで、終了させたいと考えました。  でも、「8個の数字を配列に入力させq、Qで入力終了」のところがうまくいきません。  次のようなプログラムで行き詰まっています。  どこを手直しすればいいのか教えて下さい。 #include <stdio.h> #include <math.h> #define KOSU 10 /*入力できる個数*/ char line[10];/*入力した数を受けるためのバッファ*/ int plus_count = 0;/*プラスカウンター*/ int minus_count = 0;/*マイナスカウンター*/ int number[20]; int given_number; int i; int main(void) { printf("+、ーの数を 入れなさい。(最大20まで)\n 終わるときは、qを入れる\n"); { for(i = 0; i < KOSU; i++) { fgets(line, sizeof(line), stdin); sscanf(line, "%d", &given_number); number[i] = given_number; /*ここからした、qを入れるとそこで終了のはずがうまく動きません 10個入れたらちゃんと終わるのですが。*/ if ( (given_number == 'q') || (given_number == 'Q') ) break; } } for(i = 0;i < KOSU;i++) { printf("number[%d] = %d \n", i, number[i]); } /*正負の数を数えることにする。*/ for(i = 0;i < KOSU;i++) { if(number[i] > 0) plus_count++; else minus_count++; } printf("plus is %d\n",plus_count); printf("minus or zero is %d\n",minus_count); }

  • C言語 

    #include <stdio.h> int main(void) { int ch; int count = 1; while( (ch = getchar()) != EOF) { if(ch == '\n') count++; } printf("行数は%dです。", count); return(0); } このコードの if(ch == '\n') count++; の部分がわかりません。 aを入力したとしてchにaが入っても、a=='\n'にはならないと思うのですが、実行して見ると行数がカウントされます。 (ch=='\n')というのはchと改行が同じなら行数を1増やすと言う事になると思うのですがよくわかりません。 教えてくださいm(_ _ )m

  • C言語

    ストップウォッチの一時停止の機能をもつプログラムを作成しているのですが、上手く動作しません。 (一時停止し、再開してもその状態から再開できない状態) #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main(void) { int command;//キーボード入力の文字判別用変数 int quit_flag = 1;//プログラム終了フラグ 0で停止 int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中 int h,m,s,ms;//左から,時間,分,秒,ミリ秒 int b,c,d,e; int a; int f,g,i; DWORD start,cur; printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n"); printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n"); printf("使い方:qでプログラム終了\n\n"); printf("使い方:tを押すと一時停止.一時停止中,tで計測再開\n"); h=m=s=ms=0; b=c=d=e=0; while(quit_flag != 0)//quit_flagが0以外ならループ { while(!_kbhit())//何かキーが押されるまでループ { if(c_flag != 0)//c_flagが0以外であればカウント中ということ. { h=m=s=ms = timeGetTime() - start; b=h/3600000; c=(m/60000)%60; d=(s/1000)%60; e=ms%1000; cur=timeGetTime(); ms=(cur-g); f=ms; } printf("%02d:%02d:%02d:%03d\r",b,c,d,e); } command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入. if(command=='s' && c_flag == 0) { printf("\n計測開始\n"); c_flag = 1; start = timeGetTime() ; h=m=s=ms=0; } else if(command=='t' && c_flag != 0) { printf("\n一時停止\n"); c_flag = 0; a=c_flag; //計測開始時にtを押すとバグが発生するため } else if(command=='t' && a==0) { printf("\n計測再開\n"); c_flag = 1; f=timeGetTime(); } else if(command=='s') { printf("\n計測中止\n"); c_flag = 0; } else if(command=='r') { printf("\nカウンタリセット,停止\n"); c_flag = 0; h=m=s=ms=0; } else if(command=='q') { printf("\n終了\n"); quit_flag = 0; } else if(command=='l' && c_flag==1) { c_flag=0; printf("\nラップ\n"); printf("%02d:%02d:%02d:%03d\n",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000); c_flag=1; } } return 0; } 差分をとれば良いと聞いたのですが、どのようにとれば良いか全く分からなくて困っています。 ソースコードを修正または適宣追加をしてくだされば幸いです。

専門家に質問してみよう