-1

私は初心者向けの C++ コースに参加しています。現在、アルファベットの各文字がユーザーが入力したフレーズに含まれる回数を数えるプロジェクトに取り組んでいます。プログラムはすべてを表に出力します (左から右へ: 文字 | 出現数 | 特定の文字がフレーズ全体に占める割合 | 最も近いパーセントに対する割合を表すヒストグラム )

This is THE most pernicious,
puzzling programming project yet,
but at least we can work in pairs.
^D
A         5       6.4%   ******
B         1       1.3%   *
C         3       3.8%   ****
D         0       0.0%

などなど。

'double' および 'double' 型の無効なオペランドを二項演算子% に指定すると、エラーが発生します。

コード内の % 演算子に関係していることは理解していますが、それをどのように間違って使用しているか、また何らかの説明が得られるかどうかを完全には理解していません。

以下は、それに関する機能です。

void printchar ( const char s[], int length, double freq[], const char letters[ )
    int j = 0;
    int i = 0;
    double percent = freq[i]/length;
    for ( i = 0; i < 26; i++ )
    {
          cout << letters[i] << setw(5) << freq[i] << setw(5)
               << setprecision(1) << fixed << percent;
          if(percent % 1.0 < .5)
                cout << "*";
          for( j = 0; j <= percent; j++)
                cout << "*";
     }

やるべきことがたくさんあることはわかっていますが、% オペランドをどのように間違って使用しているかを理解しようとしています。有益な回答をいただければ幸いです。

ありがとう

4

2 に答える 2

0

percentとして宣言/計算されるモジュロ (剰余) を取得しようとしていdoubleます。モジュロ '%' 記号では、オペランドが整数である必要があります。

op1 % op2- op1 と op2 の両方が整数である必要があります。私の知る限り、それは巧妙に2倍に丸められません(おそらく期待していたように)。代わりに整数型/代替方法を試してみてください。

于 2014-11-19T00:29:02.690 に答える
0

%モジュロ演算子は整数型に対してのみ定義され、浮動小数点型に対しては定義されていません。したがって

percent % 1.0 < .5

動作しません。この場合、おそらく次の方法で回避できます。

percent - (unsigned) percent < .5

への変換unsignedでは、小数部分が取り除かれます。これを元の double から差し引くと、必要な小数部分のみが得られます。

注:これは完璧ではなく、percent前向きである必要があります (または、もう少し作業が必要です)。

于 2014-11-19T00:30:32.667 に答える