アルファベットの出現回数を数えるプログラム

この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]); }

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

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.1

こんにちは。itohhといいます。 まずは、""と''の違いですが、文字列を指定したい場合""にします、''のときは、文字の値 そのものを扱う場合です。 配列(a)の中には、半角英小文字のみ設定されているという条件でサンプルを載せます。 void main(void) {   static char a[100]="adhfdfhhlljyerhcvcjhljeyruqqruqruietyiucvnasqasdjh"; // (1)   static int count[26]; // (2)   int idx;   char *alpha;   int suu;      memset( count, 0x00, sizeof(int)*26 ); // (3)      // 文字列の最後まで出現頻度をカウントします。   for( alpha=a; *alpha!='\0'; alpha++ ) // (4)   {     // 'a'を配列の0番目に'z'を25番目としてカウントします。     idx = *alpha - 'a'; // (5)     count[idx]++;   }   // 'a'から'z'までの件数を出力します。   for(suu='a',idx=0; suu<='z' ; idx++,suu++) printf("%cの出で来た回数は%d\n",suu,count[idx]); } 注意:各行の先頭に全角スペースを入れていますのでカット&コピーするときは気を付けてください。 説明: (1)配列に初期設定する場合、""で囲みます。 (2)アルファベットは26文字なので... (3)件数のカウンタをまとめてzeroクリアします。 (4)alphaの指すアドレスが0x00になるまでループします。 (5)上記でも書きましたが「''」で囲む場合は、文字の値となります、この場合、「'a'」    ですから、0x61という値と同じです。    配列「a」のはじめの文字は「'a'」ですから引き算すると「0」になり、idxに設定されます。    配列「a」の2番目の文字は「'd'」ですから引き算すると「3」になり、idxに設定されます。    これを最後まで繰り返すと「a」から「z」までの配列「count」に出現頻度がカウントされます。 如何でしょうか? もし、判らないところがあれば、補足してください。

chikako-imagawa
質問者

補足

アドバイスありがとうございます。 >memset( count, 0x00, sizeof(int)*26 ); これはmemsetという関数」なのでしょうか(無知ですいません。)? >idx = *alpha - 'a'; // (5) *alphaはchar型ではないのでしょうか?値をもつのですか? すいませんが教えてください。     

その他の回答 (3)

  • itohh
  • ベストアンサー率45% (210/459)
回答No.4

こんにちは。itohhといいます。 >>memset( count, 0x00, sizeof(int)*26 ); >これはmemsetという関数」なのでしょうか(無知ですいません。)? そのとおりです。 文字列を操作するのに良く使用する関数は。 memset関数:指定の文字で埋める memcpy関数:文字列をコピーする memcmp関数:文字列を比較する strcpy関数:文字列をコピーする(自動的に文字列の最後に「¥0」を代入する) などです。一度、関数マニュアルを見てください。 >>idx = *alpha - 'a'; // (5) >*alphaはchar型ではないのでしょうか?値をもつのですか? alphaは、char型のポインタです。 しかし、*alphaは、char型です。ですから、1バイトを参照することになります。 char型とは、ASCIIコードが設定されていると言うことです。 'a'なら0x61が'b'なら0x62が'z'なら0x7Aが設定されています。ASCIIコード一覧を確認してみてください。 例えば。 *alphaに入っている1バイト目のASCIIコードは、'a'=0x61で、2バイト目は、'd'=0x64です。 (5)では、ASCIIコード同士で引き算をしているということです。 c言語の場合、足し算したからといって文字列が連結されるというわけでもないし、引き算した からといって文字列が分割されるわけではないのです。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.3

こんにちは。itohhといいます。 すみません、chikako-imagawaさんが考えたソースのアドバイスを忘れていました。 >#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’) suuは、charポインタです、実態がないところには、「'a'」は設定できません。 suuは、int型にするべきでしょう。 >    { >      if(*alpha==*suu) ++count[I]; >      ++I; >    } このループは、「'a'」から「'z'」まで行いますが、「I」カウンタがalphaの2文字目以降も どんどんカウントアップされ続けてしまいます。 「*suu+=’b’-‘a’」で1づつカウントアップするということが、お判りなのですから forループを使わない方法(わたしが示したサンプルのように)を考えられるのではないですか? もし、forループを使うのでしたら、「for(suu='a' ,I=0;」のように行うべきでしょう。 >  } このwhileループでは、「alpha」をカウントアップしていません。 >  for(*suu=’a’,I=0;*suu<=’z’;++I,*suu+=’b’-‘a’;) printf(“%c の出で来た回数は %d\n”,*suu,count[I]); これも、suuは、charポインタです、実態がないところには、「'a'」は設定できません。 >}

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

C&C++は門外漢なんですが、考え方の参考になりましたら。 配列aの要素を先頭から終端まで見ていく際、出現するのはa-zですよね。 最後に出現回数をa-zの順で表示することでもあるし、 判定対象の文字毎にa-zのループを回すのではなく、 「文字コードからカウント用の配列の添え字を求める」のが簡単では? (カウント用の配列countは26あれば良い)

関連するQ&A

  • 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

  • アルファベットの出現頻度求めるプログラム

    こんにちは、独学でC言語を勉強しているゆみころです。 とある例文(This is a pen. )などを入力し(制限:256字まで Ctl+Zで入力終了)、そのアルファベットの出現頻度求めるプログラムを作っています。 (アウトプットとして A=0回、B=2回、C=1回などでてくるようです) またもや2日考えましたが、解決が見つからず困っております。 すみませんがどなたかお助け下さいませんか? よろしくお願いします。 質問(1) コメントで/*このソースの意味がわからない*/ といる行の説明をお願いできますでしょうか? 質問(2) エラーで沢山アポストロディーがIllegalだとでてきました。私の使用しているアポストロフィーは使えないのでしょうか? ノートパッドで作成し、その後Borlandでコンパイルしています。 お礼コメントは絶対します!しかし、On timeにできない場合があります、すみませんがよろしくお願いします。 ★ゆみころ★ *********勉強している本からの例をそのままコンパイルしようとしました************** #include<stdio.h> #include<ctype.h> #include<string.h> #define MAX 256 /*Max input data*/ #define ALPHA 26/*Alpha nubmer a - z*/ void main(void) { char str[MAX]; int alpha[ALPHA]; int i; memset(&alpha[0],'\0',sizeof alpha);/*アルファの0配列からalphaの配列分だけ0で埋めてくれる->0で初期化*/ for(;scanf("%s",&str[0]!=EOF;) /*continue till EOF(Ctl+z) */ { for(i=0;str[i]!='0';i++) { if(isalpha(str[i]))/*アルファベットか?*/ { str[i]=(char)toupper(str[i]);/*このソースの意味がわからない。Capitalへ conversionできるのは理解できましたが、なぜ(char)がいるのですか?*/ (alpha[str[i]-'A'])++;/*このソースの意味がわからない 該当文字出現回数を更新しているそうです*/ } } } for(i=0;i<ALPHA;i++)/*alphabet 26回分繰り返す*/ { if((i%5)==0)/*横に5こづずならべる*/ { putchar('\n'); } printf(" %c=%5d",i+'A',alpha[i]); } putchar('/n'); } *********エラーメッセージ************************* C:\Practice>bcc32 alph2.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland alph2.cpp: Error E2206 alph2.cpp 10: Illegal character ' ' (0x8140) in function main() Error E2206 alph2.cpp 14: Illegal character '[' (0x816d) in function main() Error E2121 alph2.cpp 14: Function call missing ) in function main() Error E2206 alph2.cpp 14: Illegal character ']' (0x816e) in function main() Error E2034 alph2.cpp 15: Cannot convert 'int' to 'char *' in function main() Error E2121 alph2.cpp 15: Function call missing ) in function main() *** 6 errors in Compile ***

  • 再起呼び出しの回数をカウントするプログラム

    現在学校の課題で プログラムを組んでるんですが ちょっとよくわからないことがあるので教えてください 再起呼び出しの回数をカウントして その回数を返したいのですが 例えば coid honoi(int n,char a,char b,char c)  {     int count=0;     if (n>0)  {         hanoi(n-1,a,c,b);         count++;     } } のようなプログラムを組むと hanoi(n-1,a,c,b) を呼び出すと、countが再度 0 に戻され count=1 になってしまいます。 同様に if()  {     int count=0;     hanoi();     count++ } としても、count=1のままでした。 再起呼び出しをするたびに、この count値を増やしていくには どのようにプログラムを書けばよいのでしょうか? まだCは初心者レベルなので 易しめにご説明ください。 よろしくお願いします。

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

    文章の中のアルファベットの種類の出現頻度 をカウントするプログラムをつくっているのですが、 わかりません。 まず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でどうにか表示しようかと思っているのですが、、、 お願いします。

  • 加算、減算、乗算、除算について

    // 加算、減算、乗算、除算について // 記号と数値にそれぞれ別の配列に分けました。 // そこから、どうすれば計算ができるのか // 悩んでいます。よろしくお願いします。 #include<iostream> using namespace std; char **tokei(char *str1,char *str2,int *count,char *kigouX); int main() { int count; int *num; char **www; char kigo[12]; char str1[30],str2[]="+-*/"; strcpy(str1,"123+45-6*789/"); www=tokei(str1,str2,&count,kigo); num=new int[count]; for(int n=0;n<count;n++) { num[n]=atoi(www[n]); } // 数値に変換num[]、記号を順番に抽出kigo[] -->OK // 記号に沿って、数値を演算すればよい。 // ここがやり方(理屈)がわからない。 getchar();{}return 0; } char **tokei(char *str1,char *str2,int *count,char *kigouX) { int cnt=0; int m=0; for(int a=0;*(str1+a)!='\0';a++){} for(int b=0;*(str2+b)!='\0';b++){} for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { if(*(str1+i)==*(str2+j)) { *(kigouX+m)=*(str1+i);m++; *(str1+i)='\0'; cnt++; } } } *(kigouX+m)='\0'; char **c; c=new char*[cnt]; *count=cnt; for(int m=0;m<cnt;m++) { c[m]=str1; while(*str1!='\0'){str1++;}str1++; } return c; }

  • if・・・break文について教えて下さい♪

    ---------------------------------------------------------------- public class A { static int prime(int number){ int count=0; for(int i=1; i<=number; i+=2){ if(number%i==0) count++; } return count; } } ----------------------------------------------------------------  上に書いたプログラムのprime()メソッド内に、if…break文を使いたいのですが、どう書いたらイイのですか??  上のプログラムをコピーしてからif…break文を付け加えて欲しいです★

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

  • アルファベットを入力するとすべてのアルファベットを小文字に変換して出力

    アルファベットを入力するとすべてのアルファベットを小文字に変換して出力するプログラムを作成しました。2度以上同じ処理を行う場合はその部分を関数としなければいけないのですが、実行結果のように出力できませんでした。。どこが間違っているのでしょうか? 実行結果↓ ************ AOmori ==>aomori iwate ==>iwate AKITA ==>akita ************ #include <stdio.h> #include <string.h> #include <ctype.h> int henkan(void); int main(void) { char str[100]; int j,len; for(j=0;j<6;j++){ gets(str); printf("==>"); } henkan(); return 0; } int henkan(void) { char str[100]; int i, chk,len; for(i=0;i<len;i++){ chk=isupper(str[i]); if(chk!=0)str[i]=tolower(str[i]); { printf("%c",str[i]); } } printf("\n"); return chk; }

  • javaのRandomで『a~z』までの乱数を表示させたいですが・・・。

    『a~z』の英小文字をランダムで表示させ、さらにint型変数countを『0~9』までランダムに発生させて取得した数だけ『a~z』をランダムに表示させたいのですが、表示結果が(例)aaaaa・・・ となってしまいます。本当は、acyxd・・・とランダムに表示させたいのですがどうすれば、よいでしょうか? import java.util.*; import java.io.*; class CharCheck{  public char charRandom(){ int n; char c = ' '; Random ran = new Random(); while(true){  n = ran.nextInt(123); if(n >= 97 && n <= 122){  c = (char)n;    break; }  }  return c; } public class RandomTest extends CharCheck{  public static void main(String args[]){   char ch[] = new char[10]; int count = 0; CharCheck ChChk = new CharCheck(); Random ran = new Random();   komoji = ran.nextInt(9);//英小文字をいくつ表示するかランダムで決める? (1以上とする) if(count == 0){    count++; } for(int i=0; i<count; i++){ ch[i] = ChChk.charRandom();    System.out.println(ch[i]); } } }

    • ベストアンサー
    • Java
  • 構造体と配列の関係

    #include<stdio.h> typedef struct stat { char alph; int count; }Stat; int main(void) { Stat al[26]; al.alphにアルファベットaからzを、al.countを全て0とし、各アルファベットに対するカウントを取れるようにしたいのですが、どのように書けば良いでしょうか?

専門家に質問してみよう