我应该编写一个程序,询问用户课堂上有多少学生。然后,它要求每个学生的GPA。最后,它应该显示每个GPA分数的学生数量。到目前为止,这就是我所拥有的,但它似乎没有正确计算。
#include <stdio.h>
int main(void){
int cnt1, cnt2, cnt3, cnt4, student, numofsdts, GPA, GPAFreq[4];
printf("Enter number of students: ");
scanf("%d", &numofsdts);
student = 1;
while(student <= numofsdts){
printf("GPA of student number %d: ", student);
scanf("%d", &GPA);
if(GPA < 1 || GPA > 4){
printf("invalid number \n");
}
else{
student++;
}
if(student == numofsdts + 1)
break;
if(GPAFreq[1])
cnt1++;
else if(GPAFreq[2])
cnt2++;
else if(GPAFreq[3])
cnt3++;
else if(GPAFreq[4])
cnt4++;
}
printf("GPA 1: %d students \n", cnt1);
printf("GPA 2: %d students \n", cnt2);
printf("GPA 3: %d students \n", cnt3);
printf("GPA 4: %d students \n", cnt4);
}
答案 0 :(得分:3)
设置int cnt1 = 0, cnt2 = 0
等(默认情况下它们不会无效,只是有一些垃圾[就像租来的房间没有明确清理......]。)
此外:
if(GPA < 1 || GPA > 4){
printf("invalid number \n");
continue; // skip the rest of the loop body
}
或略微更清洁的方法(完整):
#include <stdio.h>
int main(void){
int cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0;
int numofsdts, GPA;
printf("Enter number of students: ");
scanf("%d", &numofsdts);
students = 0;
while(students <= numofsdts){
printf("GPA of student number %d: ", students + 1);
scanf("%d", &GPA);
if(GPA < 1 || GPA > 4){
printf("invalid number \n");
continue;
}
if(GPA == 1)
cnt1++;
else if(GPA == 2)
cnt2++;
else if(GPA == 3)
cnt3++;
else if(GPA == 4)
cnt4++;
students++;
}
printf("GPA 1: %d students \n", cnt1);
printf("GPA 2: %d students \n", cnt2);
printf("GPA 3: %d students \n", cnt3);
printf("GPA 4: %d students \n", cnt4);
}
答案 1 :(得分:1)
这里有多个错误。首先,cnt1-4
必须在添加之前进行初始化。第二个是C使用零索引,因此GPAFreq[4]
不访问数组的第四个元素(GPAFreq[3]
。
第三是你的if
声明没有按照你的想法行事。它将数组内部的值作为布尔变量进行评估,即0为false
,其他任何内容为true
。更好的方法是这样做:
GPAFreq[GPA - 1] += 1;
这将计算阵列的每个索引中的频率。然后要打印它们,您只需访问GPAFreq
,不再需要cnt
变量。