设计一个学生成绩查询统计系统,要求如下:
(1)分析数据的逻辑结构,(2)设计数据的存储结构,
(3)可以根据学生姓名进行字典排序,(4)可以根据成绩进行由高到低排序,(5)可以根据学号或姓名查找学生成绩,
(6)统计及格、中、良、优秀和不及格学生人数及其所占比例,
(7)编写主要的C语言代码,尤其是对函数头部涉及的主要参数要进行注释说明
学生成绩查询统计系统
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注 - 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/731918
- 这篇博客你也可以参考下:算法设计-用选择排序按从小到大的顺序排列数 C代码
- 除此之外, 这篇博客: C语言中主函数调用另外一个函数,汇编代码理解中的 调用被调函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
call proc@PLT
调用被调函数前,会把调用代码的的下一条执行指令压栈,方便从被调函数中返回到主函数时候,还能往下执行。
- 您还可以看一下 朱有鹏老师的宏定义与预处理、函数和函数库-C语言专题第6部分课程中的 4.6.2.C语言预处理代码实战小节, 巩固相关知识点
- 以下回答由chatgpt基于相关博客总结生成:
-
数据逻辑结构: 学生成绩系统应包含学生信息和学生成绩两部分。学生信息包括学号、姓名、班级等,学生成绩包括每个学生每门课程的成绩。因此,可以采用关系型数据库的方式,将学生信息和学生成绩两个部分以表格的形式进行存储。其中学生信息可以作为两个表的主键进行关联,形成一个一对多的关系,具体而言,应分别建立学生和成绩两张表,且成绩表的每个学生应当对应一条或多条记录,反之亦然。 数据的存储结构: 可以采用关系型数据库或文件存储的方式。采用文件存储的方式需用一定的存储格式规范,例如采用逗号、制表符或json格式等进行存储。
-
根据学生姓名进行字典排序可以采用快速排序或归并排序等,具体方法如下:
快速排序:
/* @param s[] 待排序的学生信息 l 序列起始位置 r 序列终止位置 */ void QuickSort(Student s[], int l, int r) { if (l < r) { int i = l, j = r; Student x = s[l]; while (i < j) { while (i < j && strcmp(s[j].name,x.name) >= 0) j--; if (i < j) s[i++] = s[j]; while (i < j && strcmp(s[i].name,x.name) < 0) i++; if (i < j) s[j--] = s[i]; } s[i] = x; QuickSort(s, l, i - 1); QuickSort(s, i + 1, r); } }
根据成绩进行由高到低排序同样也可以采用快速排序或归并排序等,具体方法如下:
快速排序:
/* @param s[] 待排序的学生信息 l 序列起始位置 r 序列终止位置 */ void QuickSort(Student s[], int l, int r) { if (l < r) { int i = l, j = r; Student x = s[l]; while (i < j) { while (i < j && s[j].score >= x.score) j--; if (i < j) s[i++] = s[j]; while (i < j && s[i].score < x.score) i++; if (i < j) s[j--] = s[i]; } s[i] = x; QuickSort(s, l, i - 1); QuickSort(s, i + 1, r); } }
- 根据学号或姓名查找学生成绩,输入参数应当包括学生信息或成绩表以及学生的姓名或学号,如:
typedef struct Student { int num; char name[20]; float score; } Student; /* @param s[] 待查找的学生信息/成绩 len 学生信息/成绩的数量 x 待查找学生姓名或学号 */ void find(Student s[], int len, char* x) { for (int i = 0; i < len; i++) { if (strcmp(s[i].name, x) == 0 || s[i].num == atoi(x)) { printf("%d %s %.2f\n", s[i].num, s[i].name, s[i].score); return; } } printf("Not Found\n"); }
其中 atoi 可以将输入的字符串转换为相应的整数。
- 统计及格、中、良、优秀和不及格学生的人数以及其所占比例,可以先设置五个计数器,分别记录及格、中、良、优秀和不及格的人数,遍历成绩表,对每个学生的成绩进行分类,最后计算比例,具体实现如下:
void statistic(Student s[], int len, int *pass, int *average, int *good, int *excellent, int *fail) { *pass = *average = *good = *excellent = *fail = 0; for (int i = 0; i < len; i++) { if (s[i].score >= 60 && s[i].score < 70) { (*pass)++; }else if (s[i].score >= 70 && s[i].score < 80) { (*average)++; }else if (s[i].score >= 80 && s[i].score < 90) { (*good)++; }else if (s[i].score >= 90) { (*excellent)++; }else { (*fail)++; } } printf("及格人数:%d,占比%f%%\n", *pass, (float)*pass / len * 100); printf("中等人数:%d,占比%f%%\n", *average, (float)*average / len * 100); printf("良好人数:%d,占比%f%%\n", *good, (float)*good / len * 100); printf("优秀人数:%d,占比%f%%\n", *excellent, (float)*excellent / len * 100); printf("不及格人数:%d,占比%f%%\n", *fail, (float)*fail / len * 100); }
- 编写主要的C语言代码:
```c
include
include
include
/ 定义学生结构体 / typedef struct Student { int num; char name[20]; float score[5]; float avg;//平均成绩 } Student;
/ 输入学生信息,包括学号、姓名和成绩 / void input(Student* s, int n) { printf("请按以下格式输入学生信息:学号 姓名 成绩1 成绩2 成绩3 成绩4 成绩5\n"); for (int i = 0; i < n; i++) { scanf("%d %s %f %f %f %f %f", &s[i].num, s[i].name, &s[i].score[0], &s[i].score[1], &s[i].score[2], &s[i].score[3], &s[i].score[4]); s[i].avg = (s[i].score[0] + s[i].score[1] + s[i].score[2] + s[i].score[3] + s[i].score[4]) / 5; } }
/ 根据姓名进行字典排序 / void QuickSortByName(Student* s, int l, int r) { if (l < r) { int i = l, j = r; Student x = s[l]; while (i < j) { while (i < j && strcmp(s[j].name, x.name) >= 0) j--; if (i < j) s[i++] = s[j]; while (i < j && strcmp(s[i].name, x.name) < 0) i++; if (i < j) s[j--] = s[i]; } s[i] = x; QuickSortByName(s, l, i - 1); QuickSortByName(s, i + 1, r); } }
/ 根据平均成绩进行排序,由高到低 / void QuickSortByScore(Student* s, int l, int r) { if (l < r) { int i = l, j = r; Student x = s[l]; while (i < j) { while (i < j && s[j].avg >= x.avg) j--; if (i < j) s[i++] = s[j]; while (i < j && s[i].avg < x.avg) i++; if (i < j) s[j--] = s[i]; } s[i] = x; QuickSortByScore(s, l, i - 1); QuickSortByScore(s, i + 1, r); } }
/ 根据学号或姓名查找学生成绩 / void search(Student s, int n, char name_or_num) { int flag = 0;//查找标志 for (int i = 0; i < n; i++) { if (strcmp(s[i].name, name_or_num) == 0 || s[i].num == atoi(name_or_num)) { printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", s[i].num, s[i].name, s[i].score[0], s[i].score[1], s[i].score[2], s[i].score[3], s[i].score[4]); flag = 1; } } if (!flag) printf("没有找到该学生信息\n"); }
/ 统计及格、中、良、优秀和不及格学生的人数以及其所占比例 / void statistic(Student s, int n, int pass, int general_pass, int good, int excellent, int fail) { pass = general_pass = good = excellent = fail = 0; for (int i = 0; i < n; i++) { float sum = 0; for (int j = 0; j < 5; j++) { sum += s[i].score[j]; } s[i].avg = sum / 5; if (s[i].avg >= 90) { (excellent)++; }else if (s[i].avg >= 80) { (good)++; }else if (s[i].avg >= 70) { (general_pass)++; }else if (s[i].avg >= 60) { (pass)++; }else { (fail)++; } } printf("及格人数:%d,占比%.2f%%\n", pass, (float)pass / n * 100); printf("中等人数:%d,占比%.2f%%\n", general_pass, (float)general_pass / n * 100); printf("良好人数:%d,占比%.2f%%\n", good, (float)good / n * 100); printf("优秀人数:%d,占比%.2f%%\n", excellent, (float)excellent / n
-
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 程序实在不会写,要秃了
- ¥15 pycharm导入不了自己的包
- ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
- ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
- ¥15 关于R语言单因素与多因素线性回归的平均值
- ¥15 服务器清除BIOS之后引导不了
- ¥15 CPLEX用OPL编写的混合整数线性优化问题。
- ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
- ¥15 前端预览docx文件,文件从后端传送过来。
- ¥15 层次聚类和蛋白质相似度