• 締切済み

最頻出文字(複数個の場合はすべて表示)プログラム

最頻出文字(複数個の場合はすべて表示)するプログラムを作っています。 以下のプログラムをベースに作成しています。 英数字の個数を数えることはできましたが、 最頻出文字の表示を与えるソースがわかりません。 ASCIIコード毎の登場回数をカウントし 最頻度のASCIIコードをmax_countにしようと としましたが全く表示されません。 もし可能であればどのようなコードにすれば以下例のような出力がでるのかご存じの方よろしくお願い致します。 =作成したいプログラムの入力出力例========= (入力例) I went to the house. It was hot. (出力例) 最頻出文字 o t ←複数ある場合は全部表示 ========================= include <stdio.h> include <ctype.h> include <string.h> int main() { int ch='\0'; printf("英文を入力してください\n"); int alnum_count = 0; while((ch=getchar())!=EOF){ if(isalnum(ch)!=0){alnum_count = alnum_count + 1;} else if( max_count < count[ch] ) max_count = count[ch]; } printf("最大個数%d\n",max_count); printf("英数字数 %d\n", alnum_count); return 0; }

みんなの回答

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

本題と直接関係はないと思いますが >if (ch>=65 && ch<=90||ch>=97&&ch<=122) これは if ('a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z') と書く方が精神衛生上よいのではないか、などといらぬ妄想をしてしまいます。

bunkoryo
質問者

お礼

コメントありがとうございます。感謝です。

  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.1

128個の32bit-int配列にASCIIコードをポインタとしてカウントを入れる。 すべて入れ終わったらカウントでインデックスをソートする。 トップと同じ頻度のインデックスをASCIIに変換して表示。 でどうでしょうか?

bunkoryo
質問者

お礼

コメントありがとうございます。 以下のプログラムで英文入力後 各ASCIIコードと頻度は表示され最大頻度も表示されました。 後は最大頻度の時のASCIIコードと最大頻度を表示し、ASCIIコードを英文字に変換し表示できればいいのですが、ご教示いただけると幸いです。 よろしくお願い致します。 #include <stdio.h> int main() { int i,ch; int cnt[150] ={0}; while(1){ ch =getchar(); if (ch==EOF) break; if (ch>=65 && ch<=90||ch>=97&&ch<=122) cnt[ch]++; } int max_count = 0; for ( i = 0; i < 150; ++i ) { if ( max_count < cnt[i] ) max_count = cnt[i]; } puts("文字の出現回数"); for(i=65; i<123; i++) printf("'ASCII=%d';%d\n",i,cnt[i]); printf("Max count[%d]=%d",i,max_count); return 0; }

関連するQ&A

  • 直角三角形を表示するプログラム

    下記のプログラムを実行するとコマンドプロントになにも表示されず、強制終了しなければならなくなってしまいます。 whileのところがおかしいのはわかったのですが、この書き方の何がいけないのかが分かりません。 初歩的な質問で申し訳ありませんが、回答していただけると有難いです。 #include <stdio.h> int main(void){ int count, i; printf("何段ですか?"); scanf("%d", &count); for(i = 1; i <= count; i++){ while(i-- > 0){ putchar('*'); } putchar('\n'); } return 0; }

  • 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言語の質問です

    下記のプログラムはテキストファイルを読み込み、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文がどういう動作で表示しているのかが分かりません。 未熟者の私ですが、どなたか教えていただけないでしょうか?

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

    良い質問のタイトルが思い浮かばず、分かりづらいタイトルで申し訳ありません、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を代入するということなのでしょうか・・・? お時間がある時にでも、教えて頂けると助かります、よろしくお願いします。

  • 文字列中に含まれる文字の個数をカウントするプログラムについて…

    文字列、1文字が与えられたとき、これをポインタで入力し文字列中に含まれる文字の個数を計算するプログラムを作成せよ。 と、いう課題がだされたんですけど、ユーザが任意の文字列と1文字を入力できるようにすることができません…。 多分main関数の部分をちょっといじくればよいと思うのですが…。 どなたかアドバイスをお願いします。 #include <stdio.h> int count(const char *str, const char ch) { int cnt=0; while (*str!='\0') { if (*str==ch) cnt++; str++; } return cnt; } int main() { const char *str="hello,world!"; const ch='o'; int cnt; cnt=count(str, ch); printf("%s中に%cは%d個です\n", str, ch, cnt); return 0; }

  • getchar()マクロによる空白文字カウント

    C&C++初心者、BCC5.5の環境です。 表題の通り、当初getcharマクロを使って、標準入力の空白 文字数をカウントするプログラムを作りました。ところが 理解の出来ない結果が出るため、下記リストのように、 getc(stdin)に変更しましたが、同じ結果で困っています。  リストの最後に4行同じ出力を求めていますが、当初は 一番下の1行だけでした。ところがまったく出力されませんので順次、上3行を加えていったためにこのようになりまし た。このリストの状態では、下から3行目の'*'以降が出力 されます。  上1行と2行目の一部が出力されない理由が良く分かりま せん。ご教授願えませんでしょうか。 #include <stdio.h> int main() { int ch,count=0; printf("文字を入力して下さい。\n"); while(1) { ch=getc(stdin); if(ch==EOF) { break; } else if(ch==' ') { count++; } } printf("123456789012345678901234567890"); printf("1234567890123456789*01234567890"); printf("空白の数は %d です。\n",count); printf("空白の数は %d です。\n",count); }

  • abcが、入力された文字列内にあるかどうかを表示するプログラム

    文字列strの中にabcが含まれていれば、1を返し、含まれていなければ0を返すプログラムが分かりません。 C言語の問題で下記のものが分かりません。どなたか知恵を貸してください。 ユーザが文字を入力し、CTRL+Zが押されるまで、半角英数字の入力(最大でも1000文字)を受け付ける。文字列「abc」が、入力された文字列内にあるかどうかを表示するプログラムを作成する。ユーザが入力した文字列が3文字未満はabcがありませんと表示させる。 そのプログラム内で以下の関数を完成させる。 int str_srch_abc(char str []) 文字列strの中にabcが含まれていれば、1を返し、含まれていなければ0を返す関数とする。 (例えばabcは連続でabcの時だけ1を返し、asbscなどはoを返します。) ちなみに自分なりにやってみたのですが、ここまでしかできませんでした。 #include<stdio.h> int main() { int str_srch_abc(char str []); char str[1000]; int ch=0, j=0; printf("半角英数字を入力してください"); scanf("%s",str); while((ch=getchar())!=EOF){ str[j]=ch; j++; } str[j]='\0'; printf("%s",str); return(0); }

  • getcによる空白文字カウントでの問題

    下記リストをWindows98、BCC5.5及び、MinGWでコンパイルして実行 する場合、/*注*/の1行をコメントアウトしますとその下のcountが 画面に表示されません。私にはこれは理解の出来ないことで、かな り悩んでいます。どなたかお分かりになる方いらしゃいましたら、 ご教授願います。 #include <stdio.h> int main() { int ch,count=0; printf("文字を入力して下さい。\n"); while((ch=getc(stdin))!=EOF) { if(ch==' ') { count++; } } /*注*/ printf("\n"); printf("count of space = %d \n",count); return 0; }

  • ファイル

    AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); 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; }

  • ピラミッド表示プログラム。

    ピラミッドを表示させるプログラムを考えています。 例えば3段の場合   *  *** ***** っというような表示です。 #include <stdio.h> void spira(int n); main() { int a; printf("段数は:"); scanf("%d",&a); spira(a); } void spira(int n) { int i,j=1,a,b,k; for(a=n;a>0;a--){ for(b=a-1;b<=n;b--){ printf(" "); } k=(j-1)*2+1; for(i=1;i<=k;i++){ printf("*"); } j++; printf("\n"); } } このように考えてみたのですが、無限ループになって表示できません。 どこが悪いでしょうか? 無限ループの原因はどうやったら解消されるでしょうか?