最近几天我一直在努力解决这个问题,但是没有运气。目的是找到总和,平均,最低和最高等级并显示它们。
这是我的代码,除最小,最大和等级输入外的所有内容似乎都有效
// Includes printf and scanf functions
#include <stdio.h>
int main(void) {
unsigned int counter; // number of grade to be entered next
int grade; // grade value
int total; // sum of grades entered by user
float average; // average of grades
int maxi; // Max grade
int mini; // min grade
int i;
int max;
int min;
maxi = 1;
mini = 1;
printf("Enter number of grades: "); // User enters number of grades
scanf("%d", &counter); // Countss number of grades
//scanf("%d%d", &min, &max);
for (i = 1; i <= counter; i++) {
printf("Enter grade %d: ", i); // User enters grade
scanf("%d", &grade); // Counts grades
//scanf("%d",&counter);
if (grade < 0 || grade > 100) {
printf("Please enter a number between 0 and 100!\n"); // Lets user know if input is invalid
i--;
break;
}
else {
total = total + grade;
average = (float)total / counter; // NOTE: integer division, not decimal
}
}
max = (grade < maxi) ? maxi : grade;
min = (grade > mini) ? mini : grade;
printf("Class average is: %.3f\n", average); // Displays average
printf("Your maximum grade is %d\n", max); // Displays Max
printf("Your minimum grade is %d\n", min); // Displays minimum
printf("Sum: %d\n", total); // Displays total
}
输出:
Enter number of grades: 2
5
7
Enter grade 1: 4
Enter grade 2: 3
Class average is: 3.500
Your maximum grade is 3
Your minimum grade is 1
Sum: 7
由于某种原因,当我启动程序时,我必须输入一些数字,在本例中为5和7,然后它才提示我“输入成绩”,然后从那里计算出所有内容。此外,似乎最大值始终是我输入的最后一个等级,并且当输入中的任何地方都不为1时,最小值显示为1。我应该使用条件运算符作为最大/最小值,我尝试查找并阅读这本书,但他们只是使用a,b,c等字母,这让我感到困惑,所以我不确定自己做错了什么。
那会是什么弄乱了一切吗?如果不是,那我做错了吗?
另一件事是,我想如果要使计数器具有1-100的输入,就需要一个 循环,对吗?
编辑:刚意识到我必须删除max和min的scanf。这就是为什么我必须首先插入2个数字游戏的原因
答案 0 :(得分:1)
我认为有两个主要问题
变量total
未初始化,因此第一次出现的total = total + grade;
会调用未定义的行为。
您必须将其显式初始化为0
。
相同的变量grade
用于保存重复的输入。循环后,grade
仅保留最后一个输入值。
您需要使用一个数组来存储输入和比较,或者在循环内随便比较和更新最小值和最大值。
答案 1 :(得分:1)
对于将来的参考,请分析不同功能的代码或添加注释,因为分析不熟悉的代码通常会花费很多时间。
min:问题出在这里,您正在用1初始化min值。在大多数情况下,该值低于输入等级。如果要初始化它,则应使用较高的数字。 例如:
#include <limits.h>
int min = INT_MAX;
max:您的“成绩”将始终是您扫描的最后输入的成绩。那不是你想要的。保存所有作为数组或列表输入的值将是很好的。
也是您的代码段结尾
max = (grade<maxi) ? maxi : grade;
min = (grade>mini) ? mini : grade;
只会比较一个年级。您需要比较所有输入的值。 您可以将它们放在for循环中。
gradeinput:您需要将输入内容临时保存在数组/列表之类的数据结构中,以便在程序中使用它们。
int x[counter];
for (i = 1; i <= counter; i++) {
printf("Enter grade %d: ", i);
x[i]=scanf("%d", &grade);
}
答案 2 :(得分:1)
..必须输入一些数字,在本例中为5和7,然后提示我“输入成绩”
之所以发生这种情况,是因为OP的stdout
被缓冲了,而不是一次没有一个字符。
要确保在scanf()
之前可以看到输出,请使用fflush()
。
参见What are the rules of automatic flushing stdout buffer in C?
printf("Enter number of grades: ");
fflush(stdout); // add
scanf("%d", &counter);
将其设置为较大的值,而不是设置min = 1
maxi = 1;
mini = 1;
maxi = 0;
mini = 100;
// or
maxi = INT_MIN;
mini = INT_MAX;
将测试中的最小值/最大值移动到循环中以测试每个值,并将maxi, max
折叠到同一变量中。
if (max > grade) max = grade;
if (min < grade) min = grade;
第一个total + grade
是个问题,因为total
尚未初始化。
// int total; // sum of grades entered by user
int total = 0; // sum of grades entered by user
每次通过循环都不必计算average
。之后就足够了。
样式:在break;
之后不需要else
。
该代码可以测试用户输入范围。但是i--
是不正确的。如果代码要破解,只需break
。如果将其编码为重试,则i--
是有意义的,但是编码应为continue
。
注释// NOTE: integer division, not decimal
不正确,因为(float) total / counter
是FP部门。
if (grade < 0 || grade > 100) {
printf("Please enter a number between 0 and 100!\n");
i--;
continue;
}
total = total + grade;
} // end for
average = (float) total / counter;
通常应避免进行投射。
高级问题:请考虑以下情况,如果稍后对代码进行改进以处理更大范围的整数并使用更高精度的FP数学。
第一种形式使total
变成float
(这可能会失去精度),甚至可能使用float
来计算商,即使average
是{{ 1}}。当然,在升级过程中,double
强制转换可以编辑为(float)
,但这是更新的常见故障。类型可以更改,但是它们的受影响对象使用未完全经过审查。
下面的第二种形式使(double)
成为与total
相同的类型,并对类型使用匹配的数学运算。减少因类型更改而需要的更改。 review 这种表单也更容易,因为不需要返回并检查FP类型average
来查看是否强制转换为average
,float
甚至需要double
。
long double
答案 3 :(得分:0)
由于某种原因,当我启动程序时,我必须输入一些数字,在本例中为5和7,然后它才提示我“输入成绩”
“输入成绩”前有两个scanf
scanf("%d", &counter);
scanf("%d%d", &min, &max);
答案 4 :(得分:0)
#include <stdio.h>
int main(void) {
int counter; // number of grade to be entered next
int grade; // grade value
int total=0; // sum of grades entered by user
float average; // average of grades
int i;
int max;
int min;
printf("Enter number of grades: "); // User enters number of grades
scanf("%d", &counter); // Countss number of grades
for (i = 1; i <= counter; i++) {
printf("Enter grade %d: ", i); // User enters grade
scanf("%d", &grade); // Counts grades
if (grade < 0 || grade > 100) {
printf("Please enter a number between 0 and 100!\n"); // Lets user know if input is invalid
i--;
} else {
if(i==1){
max = grade;
min = grade;
}
else{
max = (grade < max) ? max : grade;
min = (grade > min) ? min : grade;
}
total = total + grade;
average = (float) total / counter; // NOTE: integer division, not decimal
}
}
printf("Class average is: %.3f\n", average); // Displays average
printf("Your maximum grade is %d\n", max); // Displays Max
printf("Your minimum grade is %d\n", min); // Displays minimum
printf("Sum: %d\n", total); // Displays total
}
由于某些错误,我已经编辑了您的代码。首先,您没有初始化总数,这可能会使它产生一些垃圾值。第二个是减少 i 的值时不需要使用 break 。第三个是更新 min 和for循环之外的 max ,其中 grade 的值将是最后输入的成绩。而且根本不需要 maxi 和 mini 。代码运行完美,无需等待伪值。干杯!