• ベストアンサー

アルファベットをカウント、

文章の中のアルファベットの種類の出現頻度 をカウントするプログラムをつくっているのですが、 わかりません。 まずcpというポインタで動的メモリを確保し そこの中に文章の全文字を格納するところまで はできました。そして、cpを ループカウンタで回して aならa、bならbの数のカウントがしたいのですが、 そこの部分がよくわかりません。 まずchar kind_character[26]; とかにして、aからzまでを格納して 比べたいのです。問題はどうやって aからz、AからZを格納するのか わからないのです。 char kind_character[26]と比較して、 aからAならint number_of_A_to_Z[26]の0番目 の配列に数字を格納したいのです。 またaとAというのは、別に扱われるのでしょうか_ そして、あとはprintfでどうにか表示しようかと思っているのですが、、、 お願いします。

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

  • ベストアンサー
  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

こんにちは 難しく考えすぎていませんか? とりあえずフィルタプログラムでサンプルを書いて見ました。 シフトJIS環境であれば、うまく動くと思います。 Aもaも同じとしてカウントしています。 また、2バイト文字は検査していません。 #include <stdio.h> main() {   int i ;   unsigned count[26] ;   for (i=0 ;i<26 ;i++){     count[i] = 0 ;   }   do {     i = getchar();     if ( i >= 'A' && i <= 'Z' ){       count[i-'A'] ++ ;     } else if ( i >= 'a' && i <= 'z' ){       count[i-'a'] ++ ;     } else if ( ( i >= 0x81 && i <= 0xa0 ) || ( i >= 0xe0 && i <= 0xfd ) ){       getchar();     }   } while ( i != EOF ) ;   for (i=0 ;i<26 ;i++){     printf("%c : %5d\t",'A'+i,count[i]);   } }

amuro_78
質問者

お礼

ありがとうございます。

その他の回答 (2)

  • x_devi_x
  • ベストアンサー率27% (5/18)
回答No.3

とりあえず、下記のプログラムを見る為の参考程度に。 コンピュータ内部で文字を扱う場合、文字は文字コード(すなわち数値)で処理されます。 その為、別のコードで扱われる「a」と「A」は異なる物です。 実際の文字コードについては、参考URLのページ内にある、「JISローマ字(ASCII)・文字コード表」のところを参照するといいと思います。 尚、全角(「a」や「A」等)の場合は、また違うコードになりますので、ご注意下さい。 それから、amuro_78さんのやり方で考える場合、配列に a~z,A~Z の文字を初期値として設定する場合は、 char kind_character_s[]="abc~略~xyz"; //小文字 char kind_character_l[]="ABC~略~XYZ"; //大文字 とするといいと思います。

参考URL:
http://www.ash.or.jp/code/unitbl1.htm
amuro_78
質問者

お礼

ありがとうございます。 aとAは違うのですか、それはしりませんでした。

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.2

char c; for(;;) {  if (*cp == null) break;  c = *cp++;  if (c < 'A') contnue;  if (c > 'Z') contune;  number_of_A_to_Z[c-'A']++; } 未テストです

amuro_78
質問者

お礼

ありがとうございます。 ifのところのcpのアスタリスクはいるのでしょうか?

関連するQ&A

  • アルファベットの出て来た回数

     自分で考えてみようと思って考えたプログラムなのですが、ポインタを用いてabc・・・・・とアルファベットをどう進めて行けばいいか分かりません。  出来れば見本のプログラムを書いて頂ければうれしいです。    それと、””と’’と{}の使い分けは何ですか?  私が今考えているのは  「a[100]という数列にランダムに入っているアルファベットはそれぞれ何回出て  きているかabcd・・・・・・zの順に出力する」   プログラムです。    下が考えてみたものです。 #include<stdio.h> main(void) { static char a[100]=’adhfdfhhlljyerhcvcjhljeyruqqruqruietyiucvnasqasdjh’; static int count[100]; int I; char *alpha,*suu; alpha=a; I=0; while(*alpha!=’\0’) { for(*suu=’a’;*suu<=’z’;*suu+=’b’-‘a’) { if(*alpha==*suu) ++count[I]; ++I; } } for(*suu=’a’,I=0;*suu<=’z’;++I,*suu+=’b’-‘a’;) printf(“%c の出で来た回数は %d\n”,*suu,count[I]); }

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

    任意の入力された文字列に対し、出現頻度の表示をしようと思って以下のように考えました。 #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

  • 【エクセル】重複を除いたカウント

    例えば以下のようなリストのなかで、BがZである列の 数をカウントしたいのですが、 Aの値が等しい列はダブルカウントしないように集計 したいと考えています。 以下の例ではBがZの列の内、Aが3、6、8の3種類が あるので、答えとしては「3」となります。 A  B ------- 1  X 2  Y 3  Z 3  Z 3  Z 4  Y 5  Y 6  Z 6  Z 7  X 8  Z 9  Y このような場合、どのような計算式(関数)を使えば良いでしょうか?

  • アルファベットで始まる言葉

    アルファベットで始まる言葉といえば? Aだったら英検、Zならゼットンとか Aは多いのでB~Zの間ではじめにアルファベットが使われている日本語(単語なら名詞人名詞なんでも可)でお願いします。

  • cshで、文字をアルファベット順に並べかえたい

    cshellで配列に格納した文字を、アルファベット順に並べ替えたいのですが、いい方法はないでしょうか? array[1] = 'T'; array[2] = 'B'; array[3] = 'A'; のように文字の格納された配列があるのですが、 これを、アルファベット順に、 array[1] = 'A'; array[2] = 'B'; array[3] = 'T' このように並べ替えたいのです。 printfを使って、文字コードを比較し、並べ替えようとしたのですが、cshでは、エラーになってしまいます。 また、LINUXのsortコマンドを使う方法もためしてみたのですが、cshスクリプト内で、コマンドが実行されません。 別の方法があるのでしょうか?それとも上記の2つの方法で実装できるのでしょうか? どうか皆さまの知恵を貸して下さい。 よろしくお願い致します。

  • エクセルのカウントについて

    たとえばA列にa~zのアルファベットが入力してありB列にもa~zのアルファベットが入力してあるとします。A列がfでB列がkである行を数えるにはどうすればいいでしょうか?C列に文字を結合してかぞえればできるのでしょうがなるべくほかのセルに結合などで使いたくなくまたVBAを使いたくないのですが、なにかよい方法はありますか?よろしくお願いいたします。

  • 英文字の出現頻度

    英語で書かれているファイルを読み込んで英文字の出現頻度を調べるプログラムを作ったのですが、ところどころ正確な数が表示されません。どなたか教えてもらえませんか?欲を言えばスペースや改行もカウントできれば良いのですが・・・よろしくお願いしますm(_ _)m #include <stdio.h> #define N 500 int main(int argc, char *argv[]) { int c,i=0; int X[N]; FILE *fp; char ch[N]; if( argc != 2) { printf("使い方:コマンド名に続きファイル名を入れてください\n"); return -1; } fp = fopen( argv[1],"rb"); while(fgets(ch,500,fp) != NULL ) { printf("%sファイルにおけるアルファベットの出現頻度\n",argv[1],ch); { while ((c = getc(fp)) != EOF) if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') X[c]++; { for (c = 'a'; c <= 'z'; c++) printf("%c:%d\n",c, X[c]); printf("\n"); for (c = 'A'; c <= 'Z'; c++) printf("%c:%d\n",c, X[c] ); printf("\n"); } } } fclose(fp); return 0; }

  • 恥ずかしながらC言語解析中のプログラムで!?

    練習問題 5-20 列数を示す数値を入力し、'a'~'z'の文字を指定された列数に従って表示するプログラムを作成しなさい。  以下のプログラムを解析中で、まだ素人で基本的な質問ですがご了承ください。 1) int col; /* 2) char i;/*文字列関数*/ 3) scanf( "%d", &col ); /*英数文字の行に並ぶアルファベットの個数を1~26までの任意の数字を一件入力する。*/ 4) for( i = 0 ; i < 26 ; i++ ){ /*アルファベットは26個はa b c・・・の順番でループする命令*/ 5) if( i > 0 && ( i % col ) == 0 )/*アルファベットのループ範囲はa~です。アルファベット26文字÷3)で入力した数の余りが0・・・? 6) printf( "\n" ); /*結果がでたら改行する。*/ 7) printf( "%c", 'a' + i ); /* 現在解析中*/ 8) } -----------------------------------------------------------------  以上ですが、  5)の==0で、このプログラムでの役割は何ですか?  よろしくお願いいたします。

  • 全角数字、アルファベット大小を認識させたいのですが上手くいきません

    入力文字列が、全角数字なのか、全角アルファベットなのか、或いはそれ以外なのかを判断させたいのですが、 以下の「testfunc」では、全角数字、全角アルファベットの大文字のみ判断可能で、全角アルファベットの小文字が、全角英数以外と認識されてしまいます。 どうすれば、全角アルファベットの小文字も認識できるようになるでしょうか? どなたかよいアドバイスをください。 #include <stdio.h> int testfunc (char *c) { unsigned a, b; a = c[0];//上位バイト b = c[1];//下位バイト if ((a >= 0x82) && ((b >= 0x4f) && (b <= 0x58))){//全角0~9 return 2; } else if ((a >= 0x82) && ((b >= 0x60) && (b <= 0x9a))){//全角A~z return 1; } else { return 0; } }

専門家に質問してみよう