🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: C/C++/Java课程设计100例 优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
一、需求分析
二、设计思路
三、功能实现
3.1 计算每个课程的总分和平均分
3.2 按分数降序排序
3.3 按学号升序排序
3.4 通过学号查询
3.5 统计分析
3.6 从文件读取
本篇文章对「学生成绩管理系统」进行详细讲解, 更多「课程设计/大作业」请点击『 C/C++/Java课程设计100例 』获取!
一、需求分析
1. 使用 C 语言实现学生成绩管理系统;
2. 支持计算每个课程的总分和平均分;
3. 支持计算每个学生的总分和平均分;
4. 支持按分数降序排序、按分数升序排序、按学号升序排序、按姓名字典序排序;
5. 支持通过学号查询;
6. 支持通过姓名查询;
7. 支持统计分析、列表展示;
8. 支持从文件中读取和保存。
二、设计思路
通过菜单列出「学生成绩管理系统」支持的所有功能,并将功能标号,用户可以根据标号选择功能,然后根据对应标号执行对应的功能,「学生成绩管理系统」流程如下所示。
三、功能实现
下面将针对程序的主要功能进行详细介绍,包括:计算每个课程的总分和平均分、按分数降序排序、按学号升序排序、通过学号查询、统计分析以及从文件读取。
3.1 计算每个课程的总分和平均分
对所有学生的具体课程进行遍历,统计当前课程的总分,最后计算出平均分,代码实现如下所示。
// 计算每门课程的总分和平均分
void averageSumOfEveryCourse(STU *head)
{
int x = 20, y = 3;
getCoord(x, y++); printf("******************************************************************************");
if (head->next != NULL) {
int j = 1;
for (int i = 0; i < m; i++) {
STU *p = head->next;
float sum = 0.0;
do {
sum += p->score[i];
p = p->next;
} while (p != NULL);
getCoord(x, y++); printf("\t\t\t课程 %d: 总分 = %.0f , 平局分 = %.0f\n", j++, sum, sum/n);
}
} else {
getCoord(x, y++); printf("没有学生信息");
}
getCoord(x, y++); printf("******************************************************************************");
char ch = ' ';
while (ch != 'Q') {
getCoord(x, y); printf("请输入 Q 退出:");
scanf("%c", &ch);
}
}
3.2 按分数降序排序
对数据排序通过一个单独的函数来处理,具体排序规则只需要传入排序类型即可实现对应的排序,这里 type = 1 表示按分数降序排序,代码实现如下所示。
// type = 1
void sortbyScoreDescending(STU *head)
{
int x = 20, y = 3;
getCoord(x, y++); printf("******************************************************************************");
getCoord(x, y++); printf("按分数降序排列");
sortCommon(head, 1);
}
3.3 按学号升序排序
同理,type = 3 表示按照学号进行升序排序,代码实现如下所示。
// type = 3
void sortbyNum(STU *head)
{
int x = 20, y = 3;
getCoord(x, y++); printf("******************************************************************************");
getCoord(x, y++); printf("按学号升序排列");
sortCommon(head, 3);
}
3.4 通过学号查询
首先,用户输入学号,根据用户输入的学号遍历所有学生,查找对应学号的学生并进行输出,代码实现如下所示。
void searchbyNum(STU *head)
{
int x = 20, y = 3;
getCoord(x, y++); printf("******************************************************************************");
getCoord(x, y++); printf("通过学号进行查询");
long num;
bool flag = true;
getCoord(x, y++); printf("请输入学号:");
scanf("%ld", &num);
STU *p = head->next;
if (p != NULL) {
do {
if (p->num == num) {
getCoord(x, y++); printf("学号:"); printf("%ld", p->num);
getCoord(x, y++); printf("姓名:"); printf("%s", p->name);
for (int i = 0; i < m; i++) {
getCoord(x, y++); printf("课程 %d: %.0f\t", i+1, p->score[i]);
}
getCoord(x, y++); printf("总分:%.0f\n", p->sum);
getCoord(x, y++); printf("平均分:%.0f\n", p->sum/m);
flag = false;
break;
}
p = p->next;
} while (p != NULL && flag);
if (flag) {
getCoord(x, y++); printf("没有发现!\n");
}
}
getCoord(x, y++); printf("******************************************************************************");
returnMenu(x, y+1);
}
3.5 统计分析
对所有学生的成绩进行分析,输出各个成绩段的学生情况,包括:< 60、60 - 69、70 - 79、80 - 89、90 - 99、100,代码实现如下所示。
void statisticAnalysis(STU *head)
{
int a[6];
int x = 20, y = 3;
getCoord(x, y++); printf("******************************************************************************");
for (int i = 0; i < m; i++) {
STU *p = head->next;
memset(a, 0, sizeof(a));
do {
if (p->score[i] < 60) {
a[0]++;
} else if (p->score[i] < 70) {
a[1]++;
} else if (p->score[i] < 80) {
a[2]++;
} else if (p->score[i] < 90) {
a[3]++;
} else if (p->score[i] < 100) {
a[4]++;
} else {
a[5]++;
}
p = p->next;
} while (p != NULL);
getCoord(x, y++); printf("课程 %d:\n", i + 1);
getCoord(x, y++); printf("* < 60\t%d\t%.2f%%\n", a[0], 100 * a[0] / 6.0);
getCoord(x, y++); printf("* %d - %d\t%d\t%.2f%%\n", 60, 69, a[1], 100 * a[1] / 6.0);
getCoord(x, y++); printf("* %d - %d\t%d\t%.2f%%\n", 70, 79, a[2], 100 * a[2] / 6.0);
getCoord(x, y++); printf("* %d - %d\t%d\t%.2f%%\n", 80, 89, a[3], 100 * a[3] / 6.0);
getCoord(x, y++); printf("* %d - %d\t%d\t%.2f%%\n", 90, 99, a[4], 100 * a[4] / 6.0);
getCoord(x, y++); printf("* %d\t%d\t%.2f%%\n", 100, a[5], 100 * a[5] / 6.0);
}
getCoord(x, y++); printf("******************************************************************************\n");
returnMenu(x, y+1);
}
3.6 从文件读取
数据存储在 student.txt 中,按照指定格式,读取文件内容,将其存储到结构中,代码实现如下所示。
void readfromFile(STU *head)
{
int x = 20, y = 3;
getCoord(x, y++); printf("******************************************************************************");
STU *pre = head;
FILE *fp;
if ((fp = fopen("student.txt", "r")) == NULL) {
getCoord(x, y++); printf("打开文件 student.txt 失败!\n");
} else {
fscanf(fp, "%d\t%d\n", &n, &m);
for (int i = 0; i < n; i++) {
STU *p = (STU *)malloc(LEN);
pre->next = p;
p->next = NULL;
fscanf(fp, "%12ld", &p->num);
fscanf(fp, "%12s", p->name);
for (int j = 0; j < m; j++)
{
fscanf(fp, "%12f", &p->score[j]);
}
fscanf(fp, "%12f%12f", &p->sum, &p->aver);
pre = p;
}
}
fclose(fp);
getCoord(x, y++); printf("导入数据成功!\n");
print(head, x, y);
}
🍓🍓🍓 更多「课程设计/大作业」请点击『 C/C++/Java课程设计100例 』获取!🎉🎉🎉
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞