実現したいこと
頻度の高い順に文字と個数を表示したい
前提
c言語で作っています。
テキストファイルから読み込んで、a-zと空白の出現回数を数えたいです。
そして、下記の理想のように出力したいです。
該当のソースコード
c
1#include <stdio.h> 2 3int main(void){ 4 FILE *fp; //ファイルポインタ 5 6 int moji[27] = {0}; 7 int i, j, tmp; 8 float num = 0; //全文字数num 9 char c; 10 11 if((fp = fopen("/home/NumCom1/report/book1", "r")) != NULL) 12 { 13 while ((c = fgetc(fp)) != EOF) 14 { 15 16 if (c >= 97 && c <= 122) //小文字の場合 17 { 18 moji[(int)c-97]++; 19 num++; 20 } 21 if (c >= 65 && c <= 90) //大文字の場合 22 { 23 moji[(int)c - 65]++; 24 num++; 25 } 26 if(c = 32); 27 moji[26]++; 28 num++; 29 30 31 } 32 33 for(i=0; i<26; i++) 34 { 35 printf("%c : %d \t%.3f%% \n", i+97, moji[i], moji[i]*100/num); 36 } 37 printf("%c : %d \t%.3f%%\n",32, moji[26], moji[26]*100/num); 38 39 40 } 41 42 else // エラーメッセージを出力 43 { 44 printf("File open error!\n"); 45 return (-1); 46 } 47 48 return 0; 49}
出力結果
c
1a : 49997 3.594% 2b : 9570 0.688% 3c : 16719 1.202% 4d : 26713 1.920% 5e : 78174 5.619% 6f : 15180 1.091% 7g : 11532 0.829% 8h : 39562 2.844% 9i : 41124 2.956% 10j : 896 0.064% 11k : 3872 0.278% 12l : 24624 1.770% 13m : 14583 1.048% 14n : 41205 2.962% 15o : 46708 3.357% 16p : 11524 0.828% 17q : 794 0.057% 18r : 37849 2.721% 19s : 40137 2.885% 20t : 55584 3.995% 21u : 16377 1.177% 22v : 5926 0.426% 23w : 13784 0.991% 24x : 1155 0.083% 25y : 10744 0.772% 26z : 449 0.032% 27 : 776435 55.810%
理想
c
1 : 776435 55.810% 2e : 78174 5.619% 3t : 55584 3.995% 4a : 49997 3.594% 5o : 46708 3.357% 6n : 41205 2.962% 7以下略
発生している問題
バブルソートを使ってやってみましたが個数だけ昇順になり、文字のほうはどうやって多い順に出力するのかわかりませんでした。
どうすれば理想のように出力されるでしょうか?
また、提示したソースコードを変えるべきところがありましたらそちらもお願いします。
>if(c = 32);
これは c に 32 を入れているだけです。 '=' 1つは代入です。 同じかという判断をするなら '=' 2つです。従って何の判断もしていません。
さらに ';' で終わっているため if の効果はこの行だけです。後の(複数)処理を成立時にのみ行わせるなら ';' を消して '{' '}' 対で囲わなければなりません。従って後続の
>moji[26]++;
>num++;
は(インデントはそれっぽくなっていますが) if に関係無く常に実行しています。
結果は正しいですか? /home/NumCom1/report/book1 ファイルは本当に半分以上スペースだったのでしょうか?
勘違いしていました^^;
20%程でした。ありがとうございます。

回答3件
あなたの回答
tips
プレビュー