我无法解释它,只是scanf()
只读取第一个值,然后计算基于此。
int main() {
int i, students = 0;
char name[20];
int tests;
float test_score;
int test_sum = 0;
char letter_grade;
double test_average;
printf("Number of students: ");
scanf("%d", &students);
for (i = 0; i < students; i++) {
printf("\nStudent name %d: ", i + 1);
scanf(" %s", &name);
fflush(stdin);
printf("Number of test(s) for %s: ", name);
scanf("%d", &tests);
fflush(stdin);
printf("Enter %d test score(s) for %s: ", tests, name);
if (i < students) {
scanf("%f", &test_score);
test_sum += test_score;
test_average = test_sum / (float)tests;
}
printf("Average test score: %.2f", test_average);
fflush(stdin);
}
return 0;
}
假设我输入2名学生,第一名学生有2个考试成绩,然后输入45 87.我应该得到66.00,但我得到22.50。对于第二个学生,我输入3个测试分数100 55 87,我得到48.33。 Waaayyy关闭。
我知道我做错了什么,但我无法弄明白,因为我之前已经开始工作了,但循环不会继续给第二个学生。
答案 0 :(得分:1)
您始终需要检查scanf()
的返回值,以查看它读取的令牌数量。如果无法阅读,则需要采取纠正措施。
不清楚为什么每次都需要fflush(stdin)
。
答案 1 :(得分:1)
if (i < students) {
scanf("%f", &test_score);
test_sum += test_score;
test_average = test_sum / (float)tests;
}
应该是:
test_sum = 0;
for (int j = 0; j < tests; j++) {
scanf("%f", &test_score);
test_sum += test_score;
}
test_average = test_sum / (float)tests;
答案 2 :(得分:1)
发布的代码包含几个问题,包括
int
和float
以及double
变量scanf()
scanf()
fflush(stdin)
在C标准中特别列为未定义的行为以下提议的代码修复了上述所有问题并完全编译
#include <stdio.h>
#include <stdlib.h> // exit(), EXIT_FAILURE
// prototypes
void flushStdin( void );
int main( void )
{
int numStudents = 0;
char studentName[20];
int numTests;
double test_score;
double test_sum = 0.0;
//char letter_grade;
double test_average;
printf("Number of students: ");
if( 1 != scanf("%d", &numStudents) )
{ // then scanf failed
perror( "scanf for number of students failed" );
exit( EXIT_FAILURE );
}
// implied else, scanf successful
flushStdin();
for (int i = 0; i < numStudents; i++)
{
printf("\nStudent name %d: ", i + 1);
if( 1 != scanf(" %s", studentName) )
{ // then scanf failed
perror( "scanf for student name failed" );
exit( EXIT_FAILURE );
}
// implied else, scanf successful
flushStdin();
printf("Number of test(s) for %s: ", studentName);
if( 1 != scanf("%d", &numTests) )
{ // scanf failed
perror( "scanf for number of tests failed" );
exit( EXIT_FAILURE );
}
// implied else, scanf successful
test_sum = 0.0;
printf("Enter %d test score(s) for %s: ", numTests, studentName);
for( int j=0; j<numTests; j++ )
{
if( 1 != scanf("%lf", &test_score) )
{ // then scanf failed
perror( "scanf for test score failed");
exit( EXIT_FAILURE );
}
// implied else, scanf successful
flushStdin();
test_sum += test_score;
}
test_average = test_sum / numTests;
printf("Average test score: %.2lf", test_average);
}
return 0;
} // end function: main
void flushStdin()
{
int ch;
while( (ch = getchar() ) != EOF && '\n' != ch);
}