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 添加到索引中,因此rating[k - MIN_RESPONSE]如果您想访问 index ,请访问k

于 2012-10-29T03:50:57.300 回答
1

您的代码正在分配给数组的负索引。这通常不好 - 您只保留了 0:RESPONSE_VALUE-1 的内存,写入该范围之外的任何内容都会产生不可预知的后果。您有两个通用选项。一种是将您的范围 MIN_RESPONSE_VALUE:MAX_RESPONSE_VALUE 映射到 0:(MAX_RESPONSE_VALUE-MIN_RESPONSE_VALUE)。即每当您索引评级时减去 MIN_RESPONSE_VALUE :

++rating[response-MIN_RESPONSE_VALUE];

另一种是重新指向响应,给它一个新的零点。这将使您不必一直减去 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 回答