• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語で、文字の出現頻度を求める問題がわかりません)

C言語で文字の出現頻度を求める方法

このQ&Aのポイント
  • C言語で文字の出現頻度を求める方法を教えてください。プログラムには文字列が与えられるので、各文字の出現頻度を求める必要があります。
  • 具体的な方法として、与えられた文字列を1文字ずつ見ていき、その文字のアスキーコードを取得します。文字のアスキーコードがi番であれば、配列ascii[i]の値をインクリメントします。
  • 最後に、配列asciiを順番に見て、値が0より大きい要素(つまり、出現した文字)のアスキーコードと出現割合を表示します。出現割合は、出現した回数を文字列の長さで割ったものです。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答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に対する出現率…ということになるでしょう。

その他の回答 (6)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.7

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

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.6

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

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

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

  • anyhelp
  • ベストアンサー率43% (79/181)
回答No.4

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答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になりますよ

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> //その文字のアスキーコードがi番であればascii[i]の値をインクリメント; これだと、期待通りにはならないと思います。 問題を間違えてないですか? 「i番目の文字のASCIIコードがaなら、ascii[a]の値をインクリメント」 なら書けますか? > ???には出現割合の計算式 全文字数n のうち、m回出現する文字の出現率は、 m/n ですよね?(これはわかりますよね?) では、プログラムで n,mにあたるのは、どの変数(他)でしょう? あと、n/mで求まるのは比率(0~1)ですから、パーセントにするには、どうしたらいいでしょうか?

関連するQ&A