Can';t将负输入设置为零。如何设置负数组?
以下代码适用于所有正输入,但负值是假的。如果最初将负值设置为0,则会起作用,因为它们确实会相加。最后举例说明Can';t将负输入设置为零。如何设置负数组?,c,C,以下代码适用于所有正输入,但负值是假的。如果最初将负值设置为0,则会起作用,因为它们确实会相加。最后举例说明 #include <stdio.h> /* Necessary header */ #define MAX_RESPONDENTS 6 #define MIN_RESPONSE_VALUE -100
#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]);
}
}
数组的索引始终从零开始。不应为数组传递负索引。如果希望有负索引,请在索引中添加一个常量
在示例代码中,可以将-MIN\u RESPONSE\u值添加到索引中,因此如果要访问索引
k
,则访问评级[k-MIN\u RESPONSE]
,评级是一个大小为187的数组。您正在索引负值,这意味着C在数组开始之前访问内存,并打印存储在那里的任何垃圾值。您只能合法地访问0到186之间的值,因此只要在访问和存储评级时向索引中添加100即可。这样,数字-100对应于索引0,-99对应于索引1,等等。您的代码分配给数组的负索引。这通常是不好的-您只有0:RESPONSE_VALUE-1的保留内存,写入该范围之外的任何内容都将产生不可预测的后果。您有两个常规选项。一种是将您的范围MIN\u RESPONSE\u VALUE:MAX\u RESPONSE\u VALUE映射为0:(MAX\u RESPONSE\u VALUE-MIN\u RESPONSE\u VALUE)。也就是说,每当你对以下情况进行评级时,减去最小响应值:
++rating[response-MIN_RESPONSE_VALUE];
另一个是重新定位响应,给它一个新的零点。这将使您无需一直减去MIN_RESPONSE_值,但可能会让读者感到困惑:
rating -= MIN_RESPONSE_VALUE;
在for循环之前执行此操作。这样做之后,评级[MIN\u RESPONSE\u VALUE]是一个有效的指标,即使它是负的。实际上,负的指标是完全可以接受的。问题是索引进入了堆栈上专用于数组的内存之外的区域。更改
分级[-1]
会更改阵列外部的堆栈,从而损坏它。难怪那里的值没有用评级[RESPONSE_VALUE]={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)]);
}
}
#包含/*必要的标题*/
#定义最大值为6
#定义最小响应值-100/*缩写为MiRV*/
#定义最大响应值86/*缩写MaRV*/
#定义响应_值187/*等于|(MiRV)|+或-|(MaRV)|+1*/
#定义停止3
#定义中断1
#定义双_响应_值374
内部主(空)
{
计数();
返回0;
}
计数()
{
int评级计数器,评级[双_响应_值]={0},计数器,响应;
对于(评级计数器=0;评级计数器<最大值;)
{
int响应=额定计数器,停止=停止;
printf(“为产品输入介于%d和%d之间的整数评级:”,最小响应值,最大响应值);
scanf(“%d”,响应(&R));
如果(响应=最小响应值)
停止=停止;
其他的
{
int stopElse=stop;
if(stoppelse最大响应|值|响应<最小响应|值);
}如果(停止<中断)
打破
}
如果(响应<0)
++评级[响应+abs(响应值)];
其他的
++评级[响应+abs(响应值)];
++分级计数器;
}
printf(“\n额定响应数\n”);
printf(“--------------”);
用于(计数器=最大响应值;计数器>=最小响应值;--计数器)
{
printf(“\n%3d%24d”,计数器,评级[计数器+(响应值)];
}
}
它失败了,因为C中没有负数组索引。评级[0]
是数组中的第一个元素。您需要将值映射到正数组索引。如果范围为-100到100,则需要将其移动100,以便索引的范围为0-200。你所做的就像是要买一本书之前的100页纸。无论出于何种目的,它们都不存在。他们是其他人的页面0-100,当然不是您的页面-100-->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)]);
}
}