プロが教えるわが家の防犯対策術!

#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%

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

A 回答 (7件)

テストに出る。


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

>//その文字のアスキーコードが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に対する出現率…ということになるでしょう。
    • good
    • 0

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



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

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

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

追記。



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になりますよ
    • good
    • 0

百分率なので出た数/全体の数*100となります。


ascii[i]/len*100
    • good
    • 0

>ascii[i] / len * 100



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

>#1さん


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

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

細かい突っ込みですけど、floatにキャストする意味ないですよ。


むしろdouble→float→doubleと無駄な変換が入ります。
可変長引数部分にはfloat渡せないですから。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!