0

次のコードはすべての正の入力に対して正しく機能しますが、負の値は偽物です。負の値は加算されるため、最初に 0 に設定すると機能します。例を最後に。

#include <stdio.h>                                                             /* Necessary header */
#define MAX_RESPONDENTS 6
#define MIN_RESPONSE_VALUE -100                                                /* Abbreviated MiRV */
#define MAX_RESPONSE_VALUE 86                                                   /* Abbreviated MaRV */
#define RESPONSE_VALUE 187                                                      /* Equals |(MiRV)| + or - |(MaRV)| + 1 */
#define STOP 3
#define BREAK 1

int main(void)
{
    CountRating();

    return 0;
}

CountRating()
{
    int ratingCounters, rating[RESPONSE_VALUE] = {0}, Counter, response;

    for (ratingCounters = 0; ratingCounters < MAX_RESPONDENTS;)
    {
        int response = ratingCounters, stop = STOP;
        printf("Enter a integer rating between %d and %d for the product: ", MIN_RESPONSE_VALUE, MAX_RESPONSE_VALUE);
        scanf("%d", &response);

        if (response <= MAX_RESPONSE_VALUE && response >= MIN_RESPONSE_VALUE)
            stop = STOP;
        else
        {
            int stopElse = stop;
            if (stopElse < BREAK)
                break;
            else
            {
                do
                {
                    printf("\nNot within range. Try again.\nYou have %d more attempts before program outputs total:", stop);
                    scanf("%d", &response);
                    printf("\n");
                    --stop;
                    if (stop < BREAK)
                    break;
                } while (response > MAX_RESPONSE_VALUE || response < MIN_RESPONSE_VALUE);
            }   if (stop < BREAK)
                break;
        }
        ++rating[response];
        ++ratingCounters;

    }
    printf("\nRating            Number of Responses\n");
    printf("------            -------------------");

    for (Counter = MAX_RESPONSE_VALUE; Counter >= MIN_RESPONSE_VALUE; --Counter)
    {
        printf("\n%3d%24d", Counter, rating[Counter]);
    }
}

出力例:

Enter a integer rating between -100 and 86 for the product: 66
Enter a integer rating between -100 and 86 for the product: 66
Enter a integer rating between -100 and 86 for the product: 66
Enter a integer rating between -100 and 86 for the product: 66
Enter a integer rating between -100 and 86 for the product: 66
Enter a integer rating between -100 and 86 for the product: 55

Rating            Number of Responses
------            -------------------
 86                       0
 85                       0
 84                       0
 83                       0
 82                       0
 81                       0
 80                       0
 79                       0
 78                       0
 77                       0
 76                       0
 75                       0
 74                       0
 73                       0
 72                       0
 71                       0
 70                       0
 69                       0
 68                       0
 67                       0
 66                       5
 65                       0
 64                       0
 63                       0
 62                       0
 61                       0
 60                       0
 59                       0
 58                       0
 57                       0
 56                       0
 55                       1
 54                       0
 53                       0
 52                       0
 51                       0
 50                       0
 49                       0
 48                       0
 47                       0
 46                       0
 45                       0
 44                       0
 43                       0
 42                       0
 41                       0
 40                       0
 39                       0
 38                       0
 37                       0
 36                       0
 35                       0
 34                       0
 33                       0
 32                       0
 31                       0
 30                       0
 29                       0
 28                       0
 27                       0
 26                       0
 25                       0
 24                       0
 23                       0
 22                       0
 21                       0
 20                       0
 19                       0
 18                       0
 17                       0
 16                       0
 15                       0
 14                       0
 13                       0
 12                       0
 11                       0
 10                       0
  9                       0
  8                       0
  7                       0
  6                       0
  5                       0
  4                       0
  3                       0
  2                       0
  1                       0
  0                       0
 -1                      55
 -2                 2686244
 -3                 2686244
 -4                      -3
 -5                 4206858
 -6                 4199517
 -7              1965606432
 -8                      -2
 -9              -533773290
-10              1965657301
-11                 2686916
-12              1965975817
-13                 2685900
-14                      28
-15                 2685972
-16                       0
-17                 2686720
-18             -1792050746
-19              1965606432
-20              1966156064
-21                       1
-22              1965606483
-23                 2685944
-24                      17
-25              1965552124
-26                 2685880
-27              1966146752
-28              1965532226
-29                 2685868
-30              1966156064
-31                       1
-32                       0
-33              1966156064
-34                       0
-35                      28
-36                 6105760
-37                       1
-38              1965551966
-39              1965572357
-40                      -2
-41              -533740746
-42              1965657301
-43                 2685928
-44              1966156064
-45                 2685768
-46                      28
-47              1965572357
-48                       0
-49              1966156064
-50                      28
-51             -1792050874
-52              1965572357
-53                       1
-54              1965572401
-55                 2685816
-56                 6097440
-57              1965552169
-58                 2685752
-59                      36
-60              1966146816
-61                       0
-62              1966146816
-63                      36
-64                       0
-65             -1792050942
-66              1965552271
-67              1965552263
-68                 2685756
-69                 6105754
-70                    4104
-71                    4096
-72                 6097428
-73                      36
-74                      -2
-75               358724962
-76              1999401429
-77                 2685928
-78                      -1
-79                 2685472
-80                16777216
-81                 6094848
-82                       1
-83                       0
-84                 6105755
-85                 6105760
-86                 6095044
-87                       8
-88                       2
-89              1999167428
-90                       1
-91                 6095044
-92              -218103565
-93                 2685640
-94              -254549010
-95                       0
-96              1136989510
-97              -503245737
-98                 2752512
-99                 6098688
-100                       0
Process returned 0 (0x0)   execution time : 9.734 s
Press any key to continue.
4

5 に答える 5

3

Rating はサイズ 187 の配列です。負の値にインデックスを付けています。これは、C が配列の先頭の前にメモリにアクセスし、そこに格納されているガベージ値を出力していることを意味します。合法的にアクセスできるのは 0 から 186 までの値だけなので、評価にアクセスして保存するときは常にインデックスに 100 を追加する必要があります。このように、数値 -100 はインデックス 0 に対応し、-99 はインデックス 1 などに対応します。

于 2012-10-29T03:51:03.793 に答える
2

配列のインデックスは常にゼロから始まります。配列に負のインデックスを渡すべきではありません。負のインデックスが必要な場合は、定数をインデックスに追加します。

コード例では、 -MIN_RESPONSE_VALUE をインデックスに追加できるため、 index にアクセスするrating[k - MIN_RESPONSE]場合はアクセスしますk

于 2012-10-29T03:50:57.300 に答える
1

あなたのコードは配列の負のインデックスに割り当てています。これは一般的に良くありません-0:RESPONSE_VALUE-1からのメモリしか予約しておらず、その範囲外の何かに書き込むと、予測できない結果になります。2つの一般的なオプションがあります。1つは、範囲MIN_RESPONSE_VALUE:MAX_RESPONSE_VALUEを0:(MAX_RESPONSE_VALUE-MIN_RESPONSE_VALUE)にマップすることです。つまり、評価にインデックスを付けるたびにMIN_RESPONSE_VALUEを減算します。

++rating[response-MIN_RESPONSE_VALUE];

もう1つは、応答を再ポイントして、新しいゼロポイントを与えることです。これにより、常にMIN_RESPONSE_VALUEを減算する必要がなくなりますが、読者を混乱させる可能性があります。

rating -= MIN_RESPONSE_VALUE;

forループの前にこれを実行します。これを行った後、rating [MIN_RESPONSE_VALUE]は負の値ですが、有効なインデックスです。

于 2012-10-29T03:54:15.777 に答える
1

実際には、負のインデックスは完全に許容されます。問題は、インデックスがスタック上の配列専用のメモリ外の領域に入るということです。変更rating[-1]すると、スタックがアレイの外に変更され、破損します。そこにある値がゼロに初期化されていないのも不思議ではありません。rating[RESPONSE_VALUE] = {0}これらも配列の外側にあり、スタック上のデータを表示します。

于 2012-10-29T03:55:30.997 に答える
0

しばらく時間がかかりましたが、わかりました。ありがとう。

#include <stdio.h>                                                             /* Necessary header */
#define MAX_RESPONDENTS 6
#define MIN_RESPONSE_VALUE -100                                                /* Abbreviated MiRV */
#define MAX_RESPONSE_VALUE 86                                                   /* Abbreviated MaRV */
#define RESPONSE_VALUE 187                                                      /* Equals |(MiRV)| + or - |(MaRV)| + 1 */
#define STOP 3
#define BREAK 1
#define DOUBLE_RESPONSE_VALUE 374

int main(void)
{
    CountRating();

    return 0;
}

CountRating()
{
    int ratingCounters, rating[DOUBLE_RESPONSE_VALUE] = {0}, Counter, response;

    for (ratingCounters = 0; ratingCounters < MAX_RESPONDENTS;)
    {
        int response = ratingCounters, stop = STOP;
        printf("Enter a integer rating between %d and %d for the product: ", MIN_RESPONSE_VALUE, MAX_RESPONSE_VALUE);
        scanf("%d", &response);

        if (response <= MAX_RESPONSE_VALUE && response >= MIN_RESPONSE_VALUE)
            stop = STOP;
        else
        {
            int stopElse = stop;
            if (stopElse < BREAK)
                break;
            else
            {
                do
                {
                    printf("\nNot within range. Try again.\nYou have %d more attempts before program outputs total:", stop);
                    scanf("%d", &response);
                    printf("\n");
                    --stop;
                    if (stop < BREAK)
                    break;
                } while (response > MAX_RESPONSE_VALUE || response < MIN_RESPONSE_VALUE);
            }   if (stop < BREAK)
                break;
        }
        if (response < 0)
            ++rating[response + abs(RESPONSE_VALUE)];
        else
            ++rating[response + abs(RESPONSE_VALUE)];
        ++ratingCounters;

    }
    printf("\nRating            Number of Responses\n");
    printf("------            -------------------");

    for (Counter = MAX_RESPONSE_VALUE; Counter >= MIN_RESPONSE_VALUE; --Counter)
    {
        printf("\n%3d%24d", Counter, rating[Counter + (RESPONSE_VALUE)]);
    }
}
于 2012-10-29T04:48:09.637 に答える