#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%
???の部分がわかりません・・・
テストにでるとのことなので焦ってます;;
No.1ベストアンサー
- 回答日時:
テストに出る。
ということは、今までに習っている範囲のハズですが……。
>//その文字のアスキーコードが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に対する出現率…ということになるでしょう。
No.2
- 回答日時:
> //その文字のアスキーコードがi番であればascii[i]の値をインクリメント;
これだと、期待通りにはならないと思います。
問題を間違えてないですか?
「i番目の文字のASCIIコードがaなら、ascii[a]の値をインクリメント」
なら書けますか?
> ???には出現割合の計算式
全文字数n のうち、m回出現する文字の出現率は、 m/n ですよね?(これはわかりますよね?)
では、プログラムで n,mにあたるのは、どの変数(他)でしょう?
あと、n/mで求まるのは比率(0~1)ですから、パーセントにするには、どうしたらいいでしょうか?
No.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になりますよ
No.6
- 回答日時:
>#1さん
>> (float)(ascii['a'] / len * 100)
>これ、0.0になりますよ
キャストが足りない…でしたね。
ascii[]かlenのどっちかをfloatでキャストするか…式自体を組み立て直すか…ってとこですかね。
(float)(ascii['a'] * 100.0 / len)
とか。
# サムいミスを積み重ねて経験としませう。
# 言い訳クサいですが。
No.7
- 回答日時:
細かい突っ込みですけど、floatにキャストする意味ないですよ。
むしろdouble→float→doubleと無駄な変換が入ります。
可変長引数部分にはfloat渡せないですから。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列中に含まれる文字の個数...
-
反転した数値を表示させるやり方
-
文の意味
-
C言語 配列 文字列
-
fgets関数を使用したときの文字...
-
c言語のプログラミングでキーボ...
-
Cで「大文字、小文字の判定」は...
-
2÷3などの余りについて
-
C言語で%を使わない余りの出し方
-
比較回数と交換回数表示について
-
信頼区間の1.96や1.65ってどこ...
-
nCmの関数
-
複数桁10進数の*桁目だけを抽出...
-
Notepad++の関数リスト表示の変...
-
C言語のfor文です。 繰り返しの...
-
break文でループを一気に抜ける...
-
正負を反転させて出力するプロ...
-
#define _CRT_SECURE_NO_WARNIN...
-
error C2143: 構文エラー : ';'...
-
プログラムでの数字につく”f”の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
fgets関数を使用したときの文字...
-
C言語 空白の行(改行のみ)が...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
fgetsで拾われる改行文字を削除...
-
itoaわかりません
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
Cで「大文字、小文字の判定」は...
-
1行の文字列を時間差で表示する...
-
エディットボックスに入力され...
-
[Java]文字列分割
-
文字列の途中に「0」がある場...
-
教えていただけませんか?C言語...
-
atoiでの文字列以外のエラー処...
-
fgetsでバッファ残留文字列を無...
おすすめ情報