无法将负输入设置为零。负数组如何设置?

时间:2012-10-29 03:43:23

标签: c

以下代码适用于所有正输入,但负值是伪造的。如果负值最初设置为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.

5 个答案:

答案 0 :(得分:3)

Rating是一个大小为187的数组。您正在索引负值,这意味着C在数组开始之前访问内存并打印存储在那里的任何垃圾值。您只能合法地访问0到186之间的值,因此您只需在访问和存储评级时向索引添加100即可。这样,数字-100对应于索引0,-99对应于索引1,等等。

答案 1 :(得分:2)

数组的索引始终从零开始。您不应传递数组的负索引。如果要使用负索引,请在索引中添加常量。

在您的示例代码中,您可以将-MIN_RESPONSE_VALUE添加到索引中,以便在您要访问索引rating[k - MIN_RESPONSE]时访问k

答案 2 :(得分: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循环之前执行此操作。执行此操作后,等级[MIN_RESPONSE_VALUE]是一个有效的索引,即使它是负数。

答案 3 :(得分:1)

实际上负面指数是完全可以接受的。问题是你的索引会进入专用于堆栈数组的内存之外的区域。更改rating[-1]您在堆栈外更改堆栈并因此破坏它。难怪那些值没有用rating[RESPONSE_VALUE] = {0}初始化为零,再次它们在数组之外并在堆栈上显示一些数据。

答案 4 :(得分: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)]);
    }
}