文章目录
- 一、设计任务与目标
- 二、实现功能
- 三、程序源码
- 四、效果展示
一、设计任务与目标
对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
二、实现功能
(1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。
(2)本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
1)显示每门课程成绩最高的学生的基本信息
2)显示每门课程的平均成绩
3)显示超过某门课程平均成绩的学生人数
g、退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生成绩保存到文件中。
三、程序源码
菜单
void menu()//菜单 {printf("========================================\n");printf("|欢迎来到班级成绩管理系统!\n");printf("| a:成绩录入\n");printf("| b:成绩显示\n");printf("| c:成绩保存\n");printf("| d:成绩排序\n");printf("| e:成绩修改\n");printf("| f:成绩统计\n");printf("| g:退出系统\n");printf("========================================\n");printf("请输入你的选择: ");}
录入学生成绩
void inputScores()//成绩录入 {if (courseCount == 0){printf("请输入课程数量:");scanf("%d", &courseCount);//输入课程数量 for (int i = 0; i < courseCount; i++)//输入课程名字 {Course course;printf("请输入第 %d 门课程名字:", i+1);scanf("%s", course.name);courses[i] = course;}}Student stu;printf("请输入学生学号:");scanf("%s", stu.id);//输入学生学号 printf("请输入学生名字:");scanf("%s", stu.name);//输入学生姓名 for (int j = 0; j < courseCount; j++)//输入课程成绩 {printf("请输入 %s 课程成绩:", courses[j].name);scanf("%d", &stu.scores[j]);}students[studentCount++] = stu;}
显示所录入的学生成绩
void displayScores()//成绩显示 {if (studentCount == 0){printf("No student\n");return;}printf(" 学号姓名 ");for (int i = 0; i < courseCount; i++)//输出课程名字 {printf(" %s", courses[i].name);}printf("\n");for (int i = 0; i < studentCount; i++)//输出学生信息 {printf("%s %s", students[i].id, students[i].name);//输出学生学号,姓名 for (int j = 0; j < courseCount; j++)//输出学生成绩 {printf(" %d", students[i].scores[j]);}printf("\n");}}
保存录入的学生成绩
void saveScores()//成绩保存 {FILE* fp;fp = fopen("scores.txt", "w");//打开文件 if (fp == NULL){printf("open scores.txt failed!\n");return;}fprintf(fp, "%d\n", courseCount);//输出文件信息 for (int i = 0; i < courseCount; i++)//输出课程名字 {fprintf(fp, "%s\n", courses[i].name);}fprintf(fp, "%d\n", studentCount);//输出学生信息 for (int i = 0; i < studentCount; i++) {fprintf(fp, "%s\n%s\n", students[i].id, students[i].name);//输出学生学号,姓名 for (int j = 0; j < courseCount; j++)//输出学生成绩 {fprintf(fp, "%d ", students[i].scores[j]);}fprintf(fp, "\n");}fclose(fp);//关闭文件 }
对录入的课程成绩进行排序
void sort(int l,int r, int pos)//对课程的成绩进行排序 {if (r <= l)return;int i = l, j = r;int key = students[l].scores[pos];while (i <= j){while (students[i].scores[pos] > key)i++;while (students[j].scores[pos] < key)j--;if (i <= j){Student temp = students[i];students[i] = students[j];students[j] = temp;i++;j--;}}sort(l, j, pos);sort(i, r, pos);}
比较学生成绩
int compare(char a[], char b[])//比较学生的成绩 {int la = strlen(a);int lb = strlen(b);if (la < lb) return -1;if (la > lb) return 1;int len = 0;while (len < la){if (a[len] < b[len]) return -1;if (a[len] > b[len]) return 1;len++;}return 0;}
对程序进行排序
void orderScores()//成绩排序 {printf("Enter course name:");//输入需要进行成绩排序的课程名字 char name[PROFILE_LENGTH];scanf("%s", name);int i = courseCount;for (i = 0; i < courseCount; i++){if (compare(courses[i].name, name) == 0)break;}if (i == courseCount){printf("No course %s\n", name);return;}sort(0, studentCount - 1, i);}
修改已经录入但录入出错的学生成绩
void changeScores()//成绩修改 {printf("Enter password:");//输入密码 char pwd[PROFILE_LENGTH];scanf("%s", pwd);//输入密码 if (compare(password, pwd) != 0){printf("密码错误!\n");return;}printf("Enter student id:"); char id[PROFILE_LENGTH];scanf("%s", id);//输入学生学号 int i = studentCount;for (i = 0; i < studentCount; i++){if (compare(students[i].id, id) == 0)break;}if (i == studentCount){printf("No student %s\n", id);return;}printf("Courses: ");for (int j = 0; j < courseCount; j++)//输出课程名字 {printf(" %s", courses[j].name);}printf("\nEnter the scores:"); for (int j = 0; j < courseCount; j++)//输入更改后的成绩 {scanf("%d", &students[i].scores[j]);}}
统计已经录入的学生成绩
void statisticScores()//成绩统计 {for (int j = 0; j < courseCount; j++){printf("%s:\n", courses[j].name);int max = 0;int pos = studentCount;double aver = 0.0;for (int i = 0; i < studentCount; i++)//比较学生成绩,找出成绩最高的学生 {aver = aver + students[i].scores[j];if (students[i].scores[j] > max){max = students[i].scores[j];pos = i;}}aver /= studentCount;//计算平均成绩 int count = 0;for (int i = 0; i < studentCount; i++)//计算超过平均成绩的人数 {if (students[i].scores[j] > aver){count ++;}}if (pos == studentCount){printf("No student\n");break;}else{printf("成绩最高学生:");printf("%s%s%d\n", students[pos].id, students[pos].name, max);printf("平均成绩:");printf("%.2lf\n", aver);printf("超过平均成绩的人数:");printf("%d\n", count);}}}
四、效果展示
菜单
录入学生成绩(这里录入了6位学生的成绩,录入完毕后进行保存)
显示已经录入的学生成绩
保存已经录入的成绩,保存后的成绩存放在“scores.txt”文件中
按照课程将录入的成绩进行排序(分数从高到低)
修改已经录入的学生成绩
找出每个课程成绩最高的学生,统计出平均成绩和超过平均成绩的人数