我正在制作一个程序,用于计算用户输入的测试的平均值,在用户输入了测试数量之后,用户必须输入所输入测试数量的每个等级,之后程序将读取进入输入的等级数组,然后获得最低等级,此后程序将计算平均值,然后输出平均值,然后输出最低等级,然后调用函数“ 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");
}
}
答案 0 :(得分:3)
我看到的问题是
for (i = 0; i < num; i++)
在这里,num
是不经初始化使用的。如果您尝试使用哪个变量的值
解决方案::您想使用test
作为循环计数器。
而且,在您的代码中,您从未调用过letter()
。
A modified version of your code which prints the expected output.
答案 1 :(得分:3)
变量num
分配在堆栈上,并且没有初始化,因此将具有垃圾值。
您正在for
循环下面使用它。因此,如果num
任意大于或等于100,您将尝试访问数组a[num]
,该数组超出了访问范围,会会导致崩溃。您应该在下面的for循环中使用test
而不是num
。
for (i = 0; i < num; i++)
{
if (a[i] < lowest)
{
lowest = a[i];
}
}
答案 2 :(得分:2)
变量num
未初始化,并在for
循环中使用
for (i = 0; i < num; i++)
这导致undefined behavior。分段错误可能是由于以下事实引起的:num
的未初始化值用作数组a
的索引,导致在以下检查中超出范围的内存访问。
if (a[i] < lowest)
答案 3 :(得分:2)
您进入循环
for (i = 0; i < num; i++) {
if (a[i] < lowest)
您的变量num
未初始化。这是不确定的行为,可能是由于i
的值大于99
导致的段错误。
改为写for (i = 0; i < test; i++)
。