按要求定义结构体数据类型,包括num(学号),name(姓名),score[5](5门课成绩),aver(5门课平均成绩),和sum(5门课总成绩),要求将下面功能都编写成独立的函数。
1.输入n个学生5门成绩的函数。
2.计算每个学生5门课程总成绩和平均成绩的函数。
3.计算n个学生中最高总分和最高平均分的函数。
4.输入一个学号,输出该学生的学号、姓名和总分的函数。
5.编写主函数集成上面4项功能。
6.程序能够进行异常处理,检查用户输入数据的有效性,在用户输入数据有错误(如类型错误)或无效时,不会中断程序的执行,程序具有一定的健壮性。
完整代码实现:
#include <stdio.h>
#include <string.h>
#define NUM 100
typedef struct Student {
char id[10]; //学号
char name[20]; //姓名
int score[5]; //5门课程分数
double sum; //总成绩
} Student;
typedef struct Com {
int count;
Student student[NUM];
} Com;
void menu() {
printf("~~~学生成绩管理系统~~~\n");
printf(" 1.添加学生信息\n");
printf(" 2.计算总成绩和平均分\n");
printf(" 3.显示最高总分和最高平均分\n");
printf(" 4.查找学生信息\n");
printf(" 0.退出\n");
}
//添加学生信息
void addStudent(Com *pCom) {
//判断是否已满
if (pCom->count == NUM) {
printf("已满无法添加\n");
//直接结束该函数
return;
}
int num = 0; //添加学生个数
printf("请输入添加学生的个数->");
scanf("%d", &num);
//判断是否存得下
if (pCom->count + num > NUM) {
printf("添加学生个数较多,无法存下!\n");
return;
}
//添加学生信息
int i = 0;
for (i = 0; i < num; i++) {
//输入学号是可是适当发挥,对学号进行唯一性判断,此处省略
printf("请输入第%d个学生的学号->", pCom->count + 1);
scanf("%s", pCom->student[pCom->count].id);
printf("请输入第%d个学生的姓名->", pCom->count + 1);
scanf("%s", pCom->student[pCom->count].name);
printf("请输入第%d个学生的5门课程分数->", pCom->count + 1);
int sum = 0;
int j = 0;
for (j = 0; j < 5; j++) {
scanf("%d", &(pCom->student[pCom->count].score[j]));
sum += pCom->student[pCom->count].score[j];
}
pCom->student[pCom->count].sum = sum;
pCom->count++;
}
printf("添加成功\n");
}
//初始化结构体
void initCom(Com *pCom) {
pCom->count = 0;
}
//显示函数
//添加const防止误修改数据
void showStudent(const Com *pCom) {
if (pCom->count == 0) {
printf("列表为空");
return;
}
int i = 0;
printf("%11s %20s %3s %3s %3s %3s %3s %6s %4s\n",
"学号", "姓名", "分数1", "分数2", "分数3", "分数4", "分数5", "总分", "平均分");
for (i = 0; i < pCom->count; i++) {
printf("%11s %20s %3d %3d %3d %3d %3d %4.2lf %2.2lf\n", pCom->student[i].id, pCom->student[i].name,
pCom->student[i].score[0], pCom->student[i].score[1], pCom->student[i].score[2],
pCom->student[i].score[3], pCom->student[i].score[4], pCom->student[i].sum, pCom->student[i].sum / 5);
}
}
//显示最高分
void showHighScore(const Com *pCom) {
if (pCom->count == 0) {
printf("列表为空!\n");
return;
}
int maxIndex = 0;//记录小标
int i = 0;
for (i = 1; i < pCom->count; i++) {
if (pCom->student[maxIndex].sum < pCom->student[i].sum) {
maxIndex = i;
}
}
//显示最高分
printf("~~~~最高总分和最高平均分~~~~\n");
printf("%11s %20s %3s %3s %3s %3s %3s %6s %4s\n",
"学号", "姓名", "分数1", "分数2", "分数3", "分数4", "分数5", "总分", "平均分");
printf("%11s %20s %3d %3d %3d %3d %3d %4.2lf %2.2lf\n", pCom->student[maxIndex].id, pCom->student[maxIndex].name,
pCom->student[maxIndex].score[0], pCom->student[maxIndex].score[1], pCom->student[maxIndex].score[2],
pCom->student[maxIndex].score[3], pCom->student[maxIndex].score[4], pCom->student[maxIndex].sum,
pCom->student[maxIndex].sum / 5);
}
int getIndex(const Com *pCom, char id[10]) {
int i = 0;
for (i = 0; i < pCom->count; i++) {
if(strcmp(pCom->student[i].id,id)==0){
return i;
}
}
return -1;
}
//查找学生信息
void searchStudent(const Com *pCom) {
//根据学号查找信息
char id[10];
printf("请输入要查找的学生的学号->");
scanf("%s", id);
//判断是否存在,如果存在获取下表
int index = getIndex(pCom, id);
if(index>=0){
printf("~~~~最高总分和最高平均分~~~~\n");
printf("%11s %20s %3s %3s %3s %3s %3s %6s %4s\n",
"学号", "姓名", "分数1", "分数2", "分数3", "分数4", "分数5", "总分", "平均分");
printf("%11s %20s %3d %3d %3d %3d %3d %4.2lf %2.2lf\n", pCom->student[index].id, pCom->student[index].name,
pCom->student[index].score[0], pCom->student[index].score[1], pCom->student[index].score[2],
pCom->student[index].score[3], pCom->student[index].score[4], pCom->student[index].sum,
pCom->student[index].sum / 5);
}else{
printf("不存在");
}
}
int main() {
//定义结构体
Com com;
//初始化结构体
initCom(&com);
char choice[10];
do {
menu();
//异常处理
while (1) {
//为了防止输入字符串获取掉多余的字符串
printf("请选择->");
scanf("%s", choice);
if (strlen(choice) != 1) {
printf("输入异常,请重新输入\n");
continue;
}
break;
}
//选择语句
switch (choice[0]) {
case '1':
addStudent(&com);
break;
case '2':
showStudent(&com);
break;
case '3':
showHighScore(&com);
break;
case '4':
searchStudent(&com);
break;
case '0':
printf("退出\n");
break;
default:
printf("输入无效,请重新输入\n");
break;
}
} while (choice[0] != '0'); //输入的不是0就不退出
return 0;
}
tips:
1.在学习编程的路上有什么问题,欢迎留言讨论或私信我呦。
2.祝您学习愉快,如果有什么问题乐意和您探讨。