在此代码中,用户必须输入他/她在某个科目上的成绩 (1-10) 以及他/她的缺勤 (0-14)。如果他/她的成绩 >=5 且缺勤 <=2 次,则学生通过。
我对成绩和缺勤人数可能超出该计划的限制有疑问。哪些是“正确的”逻辑运算符:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int gr, ap;
printf("GIVE YOUR SUBJECT GRADE:\n");
scanf("%d", &gr);
printf("GIVE YOUR SUBJECT ABSENCES\n");
scanf("%d", &ap);
if (ap >= 0 && ap <= 14 && gr >= 0 && gr <= 10)
{
if (gr >= 5 && ap <= 2)
printf("YOU PASSED!\n");
else if (gr < 5 && ap <=2)
printf("FAILED DUE TO YOUR GRADE\n");
else if (gr >= 5 && ap > 2)
printf("FAILED DUE TO YOUR ABSENCES\n");
else if (gr < 5 && ap > 2)
printf("FAILED DUE TO YOUR GRADE AND ABSENCES\n");
}
else
{
if (ap >= 0 && ap <= 14 && gr < 0 || gr > 10)
printf("FALSE GRADE NUMBER\n");
else if (gr >= 0 && gr <= 10 && ap < 0 || ap > 14)
printf("FALSE ABSENCES NUMBER\n");
//here is the problem
else if (gr < 0 || gr > 10 && ap < 0 || ap > 14)
printf("FALSE ABSENCES AND GRADE NUMBERS\n");
}
system("pause");
return 0;
}
最佳答案
由于 &&
优先于 ||
,因此此处需要括号:
ap >= 0 && ap <= 14 && (gr < 0 || gr > 10)
// ^ ^
否则,条件被解释为
(ap >= 0 && ap <= 14 && gr < 0) || (gr > 10)
这会导致问题。
其他两个条件也是如此 - 它们应该如下:
(gr >= 0 && gr <= 10) && (ap < 0 || ap > 14)
(gr < 0 || gr > 10) && (ap < 0 || ap > 14)
请注意,当您一遍又一遍地评估相同的条件时,最好创建一个变量来存储一次结果,然后再使用该变量:
int validGrade = gr > 0 && gr <= 10;
int validAbsences = ap >= 0 && ap < 14;
现在你可以编写如下代码:
if (validGrade && validAbsences) {
...
} else {
if (validAbsences && !validGrade) {
...
} else if (!validAbsences && validGrade) {
...
} else {
...
}
}
关于C:逻辑运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34108817/