按要求定义结构体数据类型,包括num(学号),name(姓名),score[5](5门课成绩),aver(5门课平均成绩),和sum(5门课总成绩),要求将下面功能都编写成独立的函数。 1.输入n个学生5门成绩的函数。 2.计算每个学生的5门课的总成绩和平均成绩。 3.计算n个学生的最高总分和最高平均分。 4.输入一个学号,输出该学生的学号、姓名和总分。 5.编写主函数集成上面4项功能。 6.程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。
时间: 2024-02-20 17:02:32 浏览: 79
好的,以下是结构体和函数的定义:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最大学生数
#define COURSE_NUM 5 // 课程数
typedef struct {
char num[20]; // 学号
char name[20]; // 姓名
int score[COURSE_NUM]; // 5门课成绩
double aver[COURSE_NUM]; // 5门课平均成绩
int sum[COURSE_NUM]; // 5门课总成绩
} Student;
void inputScores(Student students[], int n);
void calculateSumAndAver(Student *student);
void calculateMaxSumAndAver(Student students[], int n, int *maxSumIndex, int *maxAverIndex);
void printStudentInfo(Student student);
void mainFunction();
int main() {
mainFunction();
return 0;
}
```
接下来按照题目要求依次实现上述函数。
1.输入n个学生5门成绩的函数。
```c
void inputScores(Student students[], int n) {
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的信息:\n", i + 1);
printf("学号:");
scanf("%s", students[i].num);
printf("姓名:");
scanf("%s", students[i].name);
for (int j = 0; j < COURSE_NUM; j++) {
printf("请输入第%d门课的成绩:", j + 1);
scanf("%d", &students[i].score[j]);
}
}
}
```
2.计算每个学生的5门课的总成绩和平均成绩。
```c
void calculateSumAndAver(Student *student) {
int sum = 0;
for (int i = 0; i < COURSE_NUM; i++) {
sum += student->score[i];
student->aver[i] = student->score[i] / 5.0;
student->sum[i] = sum;
}
}
```
3.计算n个学生的最高总分和最高平均分。
```c
void calculateMaxSumAndAver(Student students[], int n, int *maxSumIndex, int *maxAverIndex) {
int maxSum = -1, maxAver = -1;
for (int i = 0; i < n; i++) {
int sum = 0;
double aver = 0;
for (int j = 0; j < COURSE_NUM; j++) {
sum += students[i].score[j];
aver += students[i].aver[j];
}
if (sum > maxSum) {
maxSum = sum;
*maxSumIndex = i;
}
if (aver > maxAver) {
maxAver = aver;
*maxAverIndex = i;
}
}
}
```
4.输入一个学号,输出该学生的学号、姓名和总分。
```c
void printStudentInfo(Student student) {
printf("学号:%s\n", student.num);
printf("姓名:%s\n", student.name);
printf("总成绩:");
for (int i = 0; i < COURSE_NUM; i++) {
printf("%d ", student.sum[i]);
}
printf("\n");
}
```
5.编写主函数集成上面4项功能。
```c
void mainFunction() {
Student students[MAX_STUDENT_NUM];
int n, maxSumIndex, maxAverIndex;
printf("请输入学生数:");
scanf("%d", &n);
inputScores(students, n);
for (int i = 0; i < n; i++) {
calculateSumAndAver(&students[i]);
}
calculateMaxSumAndAver(students, n, &maxSumIndex, &maxAverIndex);
printf("总成绩最高的学生信息:\n");
printStudentInfo(students[maxSumIndex]);
printf("平均成绩最高的学生信息:\n");
printStudentInfo(students[maxAverIndex]);
char searchNum[20];
printf("请输入要查询的学号:");
scanf("%s", searchNum);
for (int i = 0; i < n; i++) {
if (strcmp(students[i].num, searchNum) == 0) {
printf("查询结果如下:\n");
printStudentInfo(students[i]);
return;
}
}
printf("未找到该学号对应的学生信息。\n");
}
```
6.程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。
为了保证程序的健壮性,需要在输入数据时进行异常处理。以下是修改后的输入函数:
```c
void inputScores(Student students[], int n) {
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的信息:\n", i + 1);
printf("学号:");
while (scanf("%s", students[i].num) != 1) {
printf("输入有误,请重新输入学号:");
while (getchar() != '\n'); // 清空缓冲区
}
printf("姓名:");
while (scanf("%s", students[i].name) != 1) {
printf("输入有误,请重新输入姓名:");
while (getchar() != '\n'); // 清空缓冲区
}
for (int j = 0; j < COURSE_NUM; j++) {
printf("请输入第%d门课的成绩:", j + 1);
while (scanf("%d", &students[i].score[j]) != 1) {
printf("输入有误,请重新输入第%d门课的成绩:", j + 1);
while (getchar() != '\n'); // 清空缓冲区
}
}
}
}
```
阅读全文