c语言编程实现:输入10个学生5门课的成绩,分别用函数实现下列功能: 功能1:计算每个学生的平均分; 功能2:计算每门课的平均分; 功能3:找出所有50个分数中最高的分数对应的学生和课程。
时间: 2025-07-05 10:06:51 浏览: 13
### C语言程序实现
为了满足需求,可以设计如下结构体来存储学生的成绩信息:
```c
#include <stdio.h>
#include <string.h>
#define STUDENT_COUNT 10
#define COURSE_COUNT 5
#define NAME_LENGTH 20
typedef struct {
char name[NAME_LENGTH];
float scores[COURSE_COUNT];
} Student;
```
定义全局变量用于保存数据以及辅助计算:
```c
Student students[STUDENT_COUNT]; // 定义数组保存学生信息
float courseAverages[COURSE_COUNT] = {0}; // 初始化各科目的平均分为零
int highestScoreIndex[COURSE_COUNT][STUDENT_COUNT]; // 记录每门课获得最高分的学生索引
int highestScoreCount[COURSE_COUNT] = {0}; // 统计每门课有多少个最高分
float maxScores[COURSE_COUNT] = {-1, -1, -1, -1, -1}; // 初始设置最大分数为负数以便比较
```
编写输入函数读取学生成绩:
```c
void inputGrades() {
printf("请输入%d位同学的名字及其五门功课的成绩:\n", STUDENT_COUNT);
for (int i = 0; i < STUDENT_COUNT; ++i) {
printf("\n第 %d 名学生的信息\n", i + 1);
// 获取姓名
printf("名字:");
scanf("%s", &students[i].name);
// 获取成绩并更新最高分记录
for (int j = 0; j < COURSE_COUNT; ++j) {
printf("科目%d 成绩:", j + 1);
scanf("%f", &students[i].scores[j]);
if (students[i].scores[j] > maxScores[j]) {
maxScores[j] = students[i].scores[j];
highestScoreCount[j] = 0; // 清除之前的最高分统计
// 更新当前最高分对应的第一个学生位置
highestScoreIndex[j][highestScoreCount[j]] = i;
highestScoreCount[j]++;
} else if (students[i].scores[j] == maxScores[j]) {
// 如果有相同最高分,则追加到列表中
highestScoreIndex[j][highestScoreCount[j]] = i;
highestScoreCount[j]++;
}
// 累积总分准备后续计算平均值
courseAverages[j] += students[i].scores[j];
}
}
}
```
编写输出函数展示结果:
```c
void outputResults() {
// 输出每位学生的平均分
printf("\n-- 学生个人平均分 ---\n");
for (int i = 0; i < STUDENT_COUNT; ++i) {
float sum = 0;
for (int j = 0; j < COURSE_COUNT; ++j)
sum += students[i].scores[j];
printf("%s 的平均分=%.2f\n", students[i].name, sum / COURSE_COUNT);
}
// 输出各科目的平均分
printf("\n--- 各科目平均分 ---\n");
for (int j = 0; j < COURSE_COUNT; ++j)
printf("科目%d 平均分=%.2f\n", j + 1, courseAverages[j] / STUDENT_COUNT);
// 查找并打印所有达到最高分的同学名单
printf("\n-- 最高分情况 ---\n");
for (int c = 0; c < COURSE_COUNT; ++c) {
printf("科目%d 中得到 %.2f 分的人有 ", c + 1, maxScores[c]);
int firstFlag = 1;
for (int s = 0; s < highestScoreCount[c]; ++s) {
if (!firstFlag) printf(", ");
printf("%s", students[highestScoreIndex[c][s]].name);
firstFlag = 0;
}
putchar('\n');
}
}
```
最后,在`main()`函数里调用上述两个方法完成整个流程。
```c
int main(void){
inputGrades();
outputResults();
return 0;
}
```
通过这种方式,不仅能够处理单个最高分的情况,还能正确识别多个相同的最高分,并且给出相应的学生名称[^1]。
阅读全文
相关推荐

















