我正在制作一个程序来计算用户输入测试的平均值,在用户输入测试数量后,用户必须输入输入测试数量的每个等级,之后程序将读取输入的等级数组,然后得到最低成绩,之后程序将计算平均值, 然后输出该,然后输出最低等级,然后调用函数"letter();"以根据平均值获得字母等级。但是当它从数组中获取最低数字时,它会给我一个我无法修复的分段错误
我试图重做那部分代码,但无济于事
#include <stdio.h>
void letter();
int average;
int main()
{
int a[100], i, sum = 0, num, lowest, test;
printf("Enter the numbers of tests: ");
scanf("%d", &test);
while (test > 100 || test <= 0)
{
printf("Error! The number of tests should be in range of (1 to 100).n");
printf("Enter the number again: ");
scanf("%d", &test);
}
for(i = 0; i < test; ++i)
{
printf("%d. Enter grade for this test: ", i+1);
scanf("%d", &a[i]);
sum += a[i];
}
lowest = a[0];
for (i = 0; i < num; i++)
{
if (a[i] < lowest)
{
lowest = a[i];
}
}
average = sum / test;
printf("Average = %d", average);
return (0);
}
void letter()
{
if (average == 0 || average <= 60)
{
printf("Your average is a F. n");
}
else if (average <= 70 || average >= 61)
{
printf("Your average is a D. n");
}
else if (average <= 80 || average >= 71)
{
printf("Your average is a C. n");
}
else if (average <= 90 || average >= 81)
{
printf("Your average is a B. n");
}
else if (average <= 100 || average >= 91)
{
printf("Your average is a A. n");
}
}
编辑
我添加了
printf("Your average is: %d n", average);
printf("The lowest grade is: %d n", lowest);
letter();
后
average = sum / test;
并将字母功能更改为此,但没有给我正确的字母等级
void letter()
{
if (average >= 0 || average <= 59)
{
printf("Your average is a F. n");
}
else if (average >= 60 || average <= 69)
{
printf("Your average is a D. n");
}
else if (average >= 70 || average <= 79)
{
printf("Your average is a C. n");
}
else if (average >= 80 || average <= 89)
{
printf("Your average is a B. n");
}
else if (average >= 90 || average <= 99)
{
printf("Your average is a A. n");
}
}
编辑#2将字母功能更改为此,现在可以工作了,感谢大家的帮助,并花时间帮助我。
void letter()
{
if (average == 0 && average <= 60)
{
printf("Your average is a F. n");
}
else if (average <= 70 && average >= 61)
{
printf("Your average is a D. n");
}
else if (average <= 80 && average >= 71)
{
printf("Your average is a C. n");
}
else if (average <= 90 && average >= 81)
{
printf("Your average is a B. n");
}
else if (average <= 100 && average >= 91)
{
printf("Your average is a A. n");
}
}
我看到的问题是
for (i = 0; i < num; i++)
在这里,num
是未初始化使用的。如果您尝试使用变量的值
- 从不初始化
- 可以有陷阱表示
- 地址从未被占用
它调用未定义的行为。
解决方案:您希望使用test
作为循环计数器。
而且,在您的代码中,您从未调用过letter()
。
打印预期输出的代码的修改版本。
变量num
在堆栈上分配,并且未初始化,因此它将具有垃圾值。 您在下面的循环中使用它for
。因此,如果num
任意大于或等于 100,您将尝试访问a[num]
数组超出界外访问并可能导致崩溃。您应该在下面的 for 循环中使用test
而不是num
。
for (i = 0; i < num; i++)
{
if (a[i] < lowest)
{
lowest = a[i];
}
}
变量num
未初始化,在for
循环中使用
for (i = 0; i < num; i++)
这会导致未定义的行为。分段错误可能是由于以下检查中用作数组索引的未初始化值num
a
导致越界内存访问。
if (a[i] < lowest)
在你进入循环的时候
for (i = 0; i < num; i++) {
if (a[i] < lowest)
您的变量num
未初始化。这是未定义的行为,由于当时的值大于99
i
,可能会导致段错误。
改为写for (i = 0; i < test; i++)
。