こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語で、文字の出現頻度を求める問題がわかりません

#include <stdio.h>

int main(void)
{
char ss[80],ascii[128];
int len,i;

for(i=0;i<128;i++){
ascii[i]=0;
}

printf("Input the string : ");
scanf("%s",ss);

len=strlen(ss);

for(i=0;i<len;i++){
???//その文字のアスキーコードがi番であればascii[i]の値をインクリメント;
}
for(i=0;i<128;i++){
if(ascii[i]>0){
printf("%c : %5.2f % \n",i,???);//???には出現割合の計算式
}
}

return 0;
}

結果例

入力
aaaa000bbT

出力
a : 40.00%
0 : 30.00%
b : 20.00%
T : 10.00%

???の部分がわかりません・・・
テストにでるとのことなので焦ってます;;

投稿日時 - 2012-09-23 02:51:03

QNo.7712316

すぐに回答ほしいです

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

テストに出る。
ということは、今までに習っている範囲のハズですが……。

>//その文字のアスキーコードがi番であればascii[i]の値をインクリメント

びみょ~に違う気がしますが…。

>len=strlen(ss);
>for(i=0;i<len;i++){

ということでこのループはssに入力された文字数分のループになっていて、iは先頭からの文字数のカウンタになっています。
ss[i]とすることで、i文字目の要素にアクセスできます。
ascii[]の配列はASCIIコードに対応した出現数を記憶していく領域ということになるでしょう。
# 128個(または256個)を越えるとおかしなコトになりますが…
# まぁ、その前の段階で問題になるコードなのでそこまでは期待されていないのでしょう。

ss[i]でアクセスできる内容はi文字目のASCIIコードに相当するはずなので、ascii[]配列の添え字として指定できます。
となれば、インクリメントする方法も出てくるでしょう。

ASCIIコードってなに?配列の添え字ってなに?インクリメントってどうやるの?
とかいうレベルなら復習してください。
そんな状態ならこのテストで点を取ることはできないでしょう。
# どっかの誰かがあなたの学習(復習)の機械を奪って、回答してくれるのを待つ。
# という、最小の労力で最大の効果を得る勝ち組式解決方法もあるでしょうが。(技術者としては採用したくないレベルの負け組になりますが)

>printf("%c : %5.2f % \n",i,???);//???には出現割合の計算式

数学…のレベルなんですかね……。

文字数はlen=strlen(ss);により求められています。

>for(i=0;i<128;i++){
>if(ascii[i]>0){

により、ascii[]の配列を先頭からチェックして1以上の場合にこのprintf()を実行することになります。
# ASCIIですから、最初の方のコントロールコード部分は結果的に無視されますが。

「aの出現回数」はascii['a']に記録されていることになります。
ssの文字数とaの出現回数が判っているのですから、後は計算の問題…ということになります。
(float)(ascii['a'] / len * 100)
でaのssに対する出現率…ということになるでしょう。

投稿日時 - 2012-09-23 03:23:41

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(7)

ANo.7

細かい突っ込みですけど、floatにキャストする意味ないですよ。
むしろdouble→float→doubleと無駄な変換が入ります。
可変長引数部分にはfloat渡せないですから。

投稿日時 - 2012-09-23 17:03:13

ANo.6

Wr5

>#1さん
>> (float)(ascii['a'] / len * 100)
>これ、0.0になりますよ

キャストが足りない…でしたね。
ascii[]かlenのどっちかをfloatでキャストするか…式自体を組み立て直すか…ってとこですかね。
(float)(ascii['a'] * 100.0 / len)
とか。
# サムいミスを積み重ねて経験としませう。
# 言い訳クサいですが。

投稿日時 - 2012-09-23 16:15:40

ANo.5

>ascii[i] / len * 100

ascii[i], len共に整数型で ascii[i] <= len なので、0か100にしかならないですね。

投稿日時 - 2012-09-23 08:20:03

ANo.4

百分率なので出た数/全体の数*100となります。
ascii[i]/len*100

投稿日時 - 2012-09-23 03:49:13

ANo.3

追記。

Cでは、整数 / 整数は整数(端数切り捨て)になります。
1/2 = 0 です。

floatやdouble等の浮動小数点数を使うと、小数まで計算します。
1.0/2.0 = 0.5 です。

この問題で、割合を計算するときには、整数→浮動小数点数に型変換する必要があります。
そのときの順番も重要です。


> printf("%c : %5.2f % \n",i,???);
printfのマニュアルで「書式」を調べてください。
%の後にくる文字と、後の引数が対応しています。
そして、%そのものを出力したいのなら、 %% と書く必要があります。



#1さん
> (float)(ascii['a'] / len * 100)
これ、0.0になりますよ

投稿日時 - 2012-09-23 03:40:46

ANo.2

> //その文字のアスキーコードがi番であればascii[i]の値をインクリメント;

これだと、期待通りにはならないと思います。
問題を間違えてないですか?
「i番目の文字のASCIIコードがaなら、ascii[a]の値をインクリメント」
なら書けますか?

> ???には出現割合の計算式

全文字数n のうち、m回出現する文字の出現率は、 m/n ですよね?(これはわかりますよね?)
では、プログラムで n,mにあたるのは、どの変数(他)でしょう?
あと、n/mで求まるのは比率(0~1)ですから、パーセントにするには、どうしたらいいでしょうか?

投稿日時 - 2012-09-23 03:28:24

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-