🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1887閲覧

文字の出現率について

退会済みユーザー

退会済みユーザー

総合スコア0

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2019/10/06 04:05

編集2019/10/07 05:35

###質問内容
c言語でアルファベットの出現率を求めるプログラムを作っています。
テキストファイルを読み込んだ後、アルファベットの大文字と小文字を区別せずに出現率を求めるのですが、一文字ごとの処理や配列の使い方などが分かりません。

発生している問題・エラーメッセージ

###ソースプログラム

C

1include<stdio.h> 2include<string.h> 3 4int main(void) 5{ 6 char line[100]; 7 int i[26],x; 8 9 while (gets(line) != NULL) 10 { 11 x = 0; 12 while (line[x] != '\0') 13 { 14 if (i >= 'a' && i <= 'z' || i >= 'A' && i <= 'Z') 15 x++; 16 } 17 } 18} 19

試したこと

一文字ずつ処理をするプログラムを入力してみましたが、この後、どのようにカウントして割合を求めていけば良いのでしょうか。 

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/06 07:37

コード修正いたしました。すみませんでした。m(><)m
guest

回答2

0

ベストアンサー

c

1#include <stdio.h> 2#include <ctype.h> 3 4int main(void) 5{ 6 // 7 int cnt[128] = {0}; 8 char buf[256]; 9 10 while (fgets(buf, sizeof buf, stdin) != NULL) { 11 for (size_t pos = 0; buf[pos] != '\0'; pos++) { 12 int ch = buf[pos]; 13 if (isalpha(ch)) { 14 ch = toupper(ch); 15 cnt[ch]++; 16 } 17 } 18 } 19 // 20 int sum = 0; 21 for (int i = 'A'; i <= 'Z'; i++) { 22 sum += cnt[i]; 23 } 24 // 25 for (int i = 'A'; i <= 'Z'; i++) { 26 printf("%c= %3d(%8.3f%%)\n", i, cnt[i], (double)cnt[i] / sum * 100.0); 27 } 28 // 29 return 0; 30}

結果

text

1usr ~/Project/test % ./a.out 2So she was considering in her own mind (as well as she could, for the 3day made her feel very sleepy and stupid), whether the pleasure of 4making a daisy-chain would be worth the trouble of getting up and 5picking the daisies, when suddenly a White Rabbit with pink eyes ran 6close by her. 7A= 16( 7.111%) 8B= 5( 2.222%) 9C= 5( 2.222%) 10D= 13( 5.778%) 11E= 31( 13.778%) 12F= 4( 1.778%) 13G= 5( 2.222%) 14H= 16( 7.111%) 15I= 17( 7.556%) 16J= 0( 0.000%) 17K= 3( 1.333%) 18L= 10( 4.444%) 19M= 3( 1.333%) 20N= 15( 6.667%) 21O= 11( 4.889%) 22P= 6( 2.667%) 23Q= 0( 0.000%) 24R= 12( 5.333%) 25S= 16( 7.111%) 26T= 13( 5.778%) 27U= 7( 3.111%) 28V= 1( 0.444%) 29W= 9( 4.000%) 30X= 0( 0.000%) 31Y= 7( 3.111%) 32Z= 0( 0.000%) 33usr ~/Project/test % 34

投稿2019/10/06 06:21

編集2019/10/06 07:34
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/10/06 07:08 編集

デバッグしてません^^;・・・問題有ったらご容赦mm 今気づいた・・・割合出してない・・・修正しました。 ・・・いまいちソースが・・・ごめん
退会済みユーザー

退会済みユーザー

2019/10/06 07:26

丁寧な回答ありがとうございます。 参考にしたいと思います! 修正で、割合まで出していただき本当にありがとうございました!m(_ _)m
cateye

2019/10/06 09:25 編集

蛇足・・・ 文字列は「不思議の国のアリス」からの引用ですが、やっぱり'E'が多いですね。 この辺は、コナン・ドイルの「踊る人形」の暗号解読の古典的解法に出てきます。 →https://www.komazawa-u.ac.jp/~kazov/Nis/lecture/security/cryptanalysis.html
guest

0

C

1#include <stdio.h> 2#include <ctype.h> 3 4int main() { 5 char line[100]; 6 int chr[26]; // 出現回数 7 int chars = 0; // 英文字総数 8 int i; 9 10 // 前準備: 0で埋める 11 for ( i = 0; i < 26; ++i ) chr[i] = 0; 12 13 while (gets(line)) { 14 int x = 0; 15 char ch; 16 while ( (ch = line[x]) != '\0') { 17 if ( isalpha(ch) ) { // 英文字なら 18 ++chars; // 総数+1 19 ch = toupper(ch); // 大文字化し 20 ++chr[ch-'A']; // 出現回数+1 21 } 22 ++x; 23 } 24 } 25 26 for ( i = 0; i < 26; ++i ) { 27 printf("%c : %4d %f\n", i+'A', chr[i], (float)chr[i]/chars); 28 } 29}

投稿2019/10/06 06:17

編集2019/10/06 07:31
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/06 07:28

丁寧な回答ありがとうございます。 ソースプログラムのなかに解説を入れていただき、詳しくてわかりやすかったです!m(_ _)m 参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問