引自免费微信小程序:皆我百晓生
从你提供的代码来看,存在几个问题导致你的程序未能按预期工作。主要问题在于scanf
的使用方式以及在ReadScore
函数中的逻辑处理。以下是修改后的代码,它应该能解决你遇到的问题:
#include <stdio.h>
#define ARR_SIZE 30
int ReadScore(long num[], float score[]);
void PrintFailures(long num[], float score[], int n);
int main(void) {
int n;
float score[ARR_SIZE];
long num[ARR_SIZE];
printf("Please enter num and score until score<0:\n");
n = ReadScore(num, score);
printf("Total students:%d\n", n);
// 打印不及格的学生名单
PrintFailures(num, score, n);
return 0;
}
// 函数功能:从键盘输入一个班学生某门课的成绩及其学号
// 当输入成绩为负值时,输入结束,函数返回学生总数
int ReadScore(long num[], float score[]) {
int i = 0;
while(i < ARR_SIZE) {
// 使用空格分隔输入
if(scanf("%ld %f", &num[i], &score[i]) != 2) {
printf("Invalid input format.\n");
break;
}
if(score[i] < 0) {
break; // 结束输入
}
i++;
}
return i; // 返回实际输入的学生数
}
// 打印不及格学生名单
void PrintFailures(long num[], float score[], int n) {
int failCount = 0;
printf("Failures:\n");
for(int i = 0; i < n; i++) {
if(score[i] < 60) {
printf("Student %ld with score %.2f\n", num[i], score[i]);
failCount++;
}
}
printf("Total failures: %d\n", failCount);
}
这里的关键更改包括:
- 修改了
scanf
的使用,现在使用%ld %f
来正确读取学号和分数,并确保输入是两个值。 - 使用
while
循环而非for
循环,以便在达到数组大小前可以灵活地结束输入。 - 添加了一个额外的函数
PrintFailures
用于打印不及格的学生名单,这使得代码更清晰且易于维护。
通过这些修改,你的程序应该能够正确读取学号和分数,计算不及格的学生数量,并打印出不及格的学生列表。