文章目录
- 一、设计任务与目标
- 二、实现功能
- 三、程序源码
- 四、效果展示
一、设计任务与目标
对一个有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”文件中


按照课程将录入的成绩进行排序(分数从高到低)


修改已经录入的学生成绩


找出每个课程成绩最高的学生,统计出平均成绩和超过平均成绩的人数















