0

次のコードは、入力された数値が特定の範囲内にあるかどうかを確認する方法の例です。

たとえば、数値を入力すると N と入力すると、次の範囲内にあるかどうかを示すインクリメント カウンターが必要になります。

1-10 11-20 ... 91-100

Here is the code snip from one of the text book:


#define MAXVAL 50
#define COUNTER 11
main ()
{
float value[MAXVAL];
int i, low, high;
static group[COUNTER] = {0,0,0,0,0,0,0,0,0,0,0}

*/READING AND COUNTING*/

for(i=0; i<MAXVAL; i++)
{
/* READING OF VALUES*/

scanf("%f", &value[i]);

/* COUNTING FREQUENCY OF GROUPS */

++group[ (int) (value[i]+0.5)/10]  <<< I would like to understand how this will find if number is in specific ranges?

/* PRINTING OF FREQUENCY TABLE */

printf("\n");
printf(" GROUP RANGE FREQUENCY\N\N");

for(i=0; i< COUNTER; i++)
{
low = i*10;
if (i==10)
high =100;
else 
high=low + 9;
printf( " %2d %3dto%3d %d)\n", i+1, low,high,group[i]);

}

}

これは上記の C プログラムで何をしますか: ++group[ (int) (value[i]+0.5)/10]

ありがとう

4

4 に答える 4

1

グループ配列のインデックスを調べます。

[(int) (value[i]+0.5)/10]

これは、コンソール入力からスキャンされた値を効果的に取得し、.50 を加算し、合計を 10 で割り、int に変換します。より良い質問は、なぜこれを行うのかということです。

0.50 の追加は、丸めを考慮したものです。value[i]が 0.50 以上の場合(1.51, 2.50, 3.99など)、強制的に次の整数 ( 2.01, 3.00, 4.49) になります。

次に、10 で除算します。これは、入力される値が 0.00 から 109.50 未満の範囲にあることを前提としているようです。10 で割ると、これらの値は 0.00 から 10.00 の間になります。これはもちろん、コンソール入力が 109.50 を超えるとすぐには機能しません。

次に、(int) にキャストします。十分に簡単です。フロートから分数を削除し、int を製造します。

最後に、入力実際には 0.00 から排他的に 109.50 未満であると仮定すると、group[] 配列内の必要な範囲に一致するカウンターが 1 つインクリメントされます。

要するに、入力値をグループにまとめて適切な範囲内でカウンターを更新しようとするメカニズムは貧弱であり、入力値が 109.50 を超えるとすぐに停止します。

于 2012-10-29T17:02:36.770 に答える
0

ええと、このようなもの:

group[0] = 0->10, group[1] = 11->20, group[2] = 21->30.. float の例を考えると:10.3

そこに式を適用すると、10.8/10 ~= 1. したがって、その範囲は10->20です。

別の例を見てみましょう: 22.4

そこに式を適用すると、(22.4 + 0.5)/10 ~= 22.9/10 = 2. したがって、範囲内20->30です。等々。と で機能しhigh = 100ますlow = 0

于 2012-10-29T16:54:49.120 に答える
0

それを理解するために分解してみましょう。

読み方++group[ (int) (value[i]+0.5)/10]: グループ配列のインデックスを 1 増やしたいのですが、どのインデックスですか? どういうわけか、ユーザーが入力した値 (value[i]) に依存します なぜそれに 0.5 を追加するのですか? 浮動小数点数を丸めます。より具体的には、その数値の ceil() を取る なぜ 10 で割るのか? グループのサイズは 10 であるためです。

例: ユーザーは 11 を入力します。 value[i] = 11 (float) 11 + 0.5 = 11.5 (float) 11.5 / 10 = 1.15 (float) typecast 1.15 to int = 1 (int) ++group[1]、インクリメント group[ 1] は 1 であり、11 がグループ 1、つまり 10 - 19 に分類されることを示します

別の例: ユーザーが 9 を入力します。 value[i] = 9 (float) 9 + 0.5 = 9.5 (float) 9.5 / 10 = 0.95 (float) typecast 0.95 to int = 0 (int) ++group[0]、グループをインクリメントします[0] は 1 で、9 がグループ 0、つまり 0 - 9 に分類されることを示します

別の例: ユーザーが 9.1 を入力します。value[i] = 9.1 (float) 9.1 + 0.5 = 9.6 (float) 9.6 / 10 = 0.96 (float) 0.95 を int = 1 (int) に型キャスト ++group[1]、group[1] を 1 ずつ増やして表示9.1 がグループ 1、つまり 10 - 19 に該当すること

注: コードによると、グループは 0-9、10 - 19 ... であり、1 - 10、11 - 20 ではありません

于 2012-10-29T17:11:59.653 に答える
0

++group[ (int) (value[i]+0.5)/10]

  • float 入力値を取得value[i]し、
  • intに丸める(int) (value[i]+0.5)
  • それを 10 で割ってグループ インデックスを取得し、
  • ++group[...]所属するグループに1 を追加します。

つまり、0..9、10..19、20..29、... 100..109、110..119 の間の値の数を計算しています。

このコードは完全に安全ではありません。入力値が COUNTER * 10 より大きいか負の場合、メモリのランダムなバイトが書き込まれます。このコードを破棄するか、いくつかの安全チェックを入れてください。

編集

安全性チェック。範囲外の入力値を無視します。

int g = (int) (value[i]+0.5) /10]
if (0 <= g && g < COUNT)
  ++group[g];
于 2012-10-29T17:04:38.487 に答える