Compare commits

...

41 Commits

Author SHA1 Message Date
tong tong zhang 3f004dd374 0
2 years ago
tong tong zhang 7d4871e505 Merge branch 'ztt3'
2 years ago
tong tong zhang 41b37232c8 3456
2 years ago
tong tong zhang 6f1eaef355 1234
2 years ago
tong tong zhang f797df4109 123
2 years ago
pn8rjlxip 7450209960 Merge pull request 'buzhou' (#25) from pe4c6pn3v/System:456 into master
2 years ago
liyuxuan cc91065df4 buzhou
2 years ago
pn8rjlxip b72cef895e c6->c8
2 years ago
pe4c6pn3v a5b9d47b3a Add C6-C8
2 years ago
pn8rjlxip 5928b637df Merge pull request 'mty.' (#6) from pmsyf9xo4/System:mty into master
2 years ago
pn8rjlxip 13a13d8b08 Merge pull request 'C1C2' (#15) from pe4c6pn3v/System:lyx into master
2 years ago
pe4c6pn3v 15dd341ec5 Add C1C2
2 years ago
Tingyu Meng 6cdaf5da4e draw
2 years ago
tong tong zhang 83ce1f8a58 33
2 years ago
tong tong zhang 0d5c78588b 22
2 years ago
tong tong zhang ec3d93c83b 11
2 years ago
tong tong zhang e3902db475 0
2 years ago
tong tong zhang 014c6b0e77 函数0
2 years ago
tong tong zhang 0f1911479f 函数1
2 years ago
Tingyu Meng f6600e266e draw
2 years ago
Tingyu Meng 34a5c12453 mty12
2 years ago
Tingyu Meng 466c8f310f mty12
2 years ago
Tingyu Meng f07ad96457 mty8
2 years ago
Tingyu Meng d32363d097 mty4
2 years ago
tong tong zhang dc13e470a7
2 years ago
tong tong zhang 90762189f9 文件1
2 years ago
Tingyu Meng 8099ea26c5 12.mty
2 years ago
Tingyu Meng fd83dc7656 8.mty
2 years ago
Tingyu Meng 54c1b38d1d 4.mty
2 years ago
Tingyu Meng 06ce9ea4a7 4.mty
2 years ago
tong tong zhang 6231c08624 合并
2 years ago
pn8rjlxip 5e13f482ea Merge pull request '15' (#10) from p2pwza8cv/System:z15 into master
2 years ago
pn8rjlxip cb41f2ec67 Merge pull request '11' (#9) from p2pwza8cv/System:z11 into master
2 years ago
pn8rjlxip f45608a715 Merge pull request '5' (#8) from p2pwza8cv/System:z5 into master
2 years ago
pn8rjlxip 6b654089b8 Merge pull request '3' (#7) from p2pwza8cv/System:z3 into master
2 years ago
p2pwza8cv dc11a79d11 Add z15
2 years ago
p2pwza8cv 95cf00dcc9 Add z11
2 years ago
p2pwza8cv 17a0658da6 Add z5
2 years ago
p2pwza8cv 5823c67a60 Add z3
2 years ago
Tingyu Meng b170ba60a3 mty.
2 years ago
Tingyu Meng 9efea988c7 new commit_2
2 years ago

@ -8,8 +8,13 @@
"args": [],
"stopAtEntry": false,
"externalConsole": true,
<<<<<<< HEAD
"cwd": "c:/Users/孟婷玉/Desktop/zttSystem",
"program": "c:/Users/孟婷玉/Desktop/zttSystem/build/Debug/outDebug",
=======
"cwd": "c:/Users/孟婷玉/Desktop/学生成绩管理系统/System",
"program": "c:/Users/孟婷玉/Desktop/学生成绩管理系统/System/build/Debug/outDebug",
>>>>>>> master
"MIMode": "gdb",
"miDebuggerPath": "gdb",
"setupCommands": [

14
12.md

@ -0,0 +1,14 @@
// 12函数功能按学号查找学生成绩并显示查找结果
void SearchbyNum(STU stu[], int n, int m)
{
long number;
int i, j;
printf("Input the number you want to search:");
scanf("%ld", &number);
/* ---------- begain ---------- */
/* ----------- end ----------- */
printf("\nNot found!\n");
}

24
4.md

@ -0,0 +1,24 @@
//4 函数功能按选择法将数组sum的元素值排序
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b))
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
}
if (k != i)
{
for (t=0; t<m; t++) // m
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum); // 交换总分
SwapFloat(&stu[k].aver, &stu[i].aver); // 交换平均分
SwapLong(&stu[k].num, &stu[i].num); // 交换学号
SwapChar(stu[k].name, stu[i].name); // 交换姓名
}
}
}

16
8.md

@ -0,0 +1,16 @@
/// 8交换两个长整型数据
void SwapLong(long *x, long *y)
{
long temp;
temp = *x;
*x = *y;
*y = temp;
}
// 交换两个字符串
void SwapChar(char x[], char y[])
{
char temp[MAX_LEN];
strcpy(temp, x);
strcpy(x, y);
strcpy(y, temp);
}

39
C1C2

@ -0,0 +1,39 @@
C1: 启动程序
命令行中执行命令./app,系统启动,显示提示信息,然后显示功能菜单,等待用户输入命令。
学生成绩管理
1 输入分数
2 计算每个学生各门成绩的总分和平均分
3 计算每个课程的总分和平均分
4 按分数降序排序
5 按分数升序排序
6 按数据升序排序
7 按姓名的字典顺序排序
8 查找数据
9 查找姓名
10 统计分析
11 列表记录
12 写入文件
13 读取文件
0 退出
请输入你的选择:
C2: 显示命令菜单
调用 Menu() 函数显示命令菜单,用户输入选项后,将结果返回主函数
学生成绩管理
1 输入分数
2 计算每个学生各门成绩的总分和平均分
3 计算每个课程的总分和平均分
4 按分数降序排序
5 按分数升序排序
6 按数据升序排序
7 按姓名的字典顺序排序
8 查找数据
9 查找姓名
10 统计分析
11 列表记录
12 写入文件
13 读取文件
0 退出
请输入你的选择:

34
C6-C8

@ -0,0 +1,34 @@
c6:计算每门课程的总分和平均分
选择菜单命令 3计算每门课程的总分和平均分然后利用循环逐个输出每门课程的总分和平均分结果都取整数。
请输入你的选择: 3
课程 1 总分 = 337 平均分 = 84
课程 2 总分 = 364 平均分 = 91
课程 3 总分 = 383 平均分 = 95
c7学生总分排序
如果a < b,则按升序排序。 选择菜单命令 4按选择法将数组sum的元素值按升序进行排序显示提示信息最后打印出学生信息。
如果a > b则按降序排序。选择菜单命令 5按选择法将数组sum的元素值按降序进行排序显示提示信息最后打印出学生成绩。
请输入你的选择: 4
按分数降序排序:
2214111038 ZhangTongtong 100 95 86 281 93
2214111018 LiYuxuan 85 91 98 274 91
2214111026 MengTingyu 77 89 99 265 88
2214111022 ZhouYufan 75 89 100 264 88
请输入你的选择: 5
按分数升序排列:
2214111022 ZhouYufan 75 89 100 264 88
2214111026 MengTingyu 77 89 99 265 88
2214111018 LiYuxuan 85 91 98 274 91
2214111038 ZhangTongtong 100 95 86 281 93
c8学号顺序排序
选择菜单命令 6按学号从小到大进行排序显示提示信息最后打印学生信息。
请输入你的选择: 6
按学号降序排列:
2214111018 LiYuxuan 85 91 98 274 91
2214111022 ZhouYufan 75 89 100 264 88
2214111026 MengTingyu 77 89 99 265 88 2214111038 ZhangTongtong 100 95 86 281 93

@ -1,3 +1,442 @@
#学生成绩管理系统
2023年4月16日
组长:张桐桐
组员:孟婷玉 李玉璇 周羽凡
下载地址https://code.educoder.net/pn8rjlxip/System#readme
## 项目简介
本学生成绩管理系统是为教师提供管理班级成绩的工具,该系统可以实现的对学生的成绩进行增、删、改、查、信息保存和信息导入等基本功能,以及对学生成绩排序和分段的扩展功能,有利于对学生成绩管理。
项目开发过程中采用 Kanban看板进行任务管理和分工协作并使用 Git 对程序代码和文档进行版本管理。任务分工情况如下:
| 任务 | 设计 | 开发 | 测试 | 文档 |
| ---- | ---- | ---- | ---- | ---- |
| C1-C3 菜单驱动的用户界面 |张桐桐| 张桐桐 | 李玉璇 | 张桐桐 |
| C4 添加学生信息 | 李玉璇| 李玉璇 | 周羽凡 | 李玉璇|
|C5-C6 求和求平均 | 周羽凡 | 周羽凡 | 孟婷玉 | 周羽凡|
|C7-C9 排序 | 孟婷玉 | 孟婷玉 | 张桐桐 | 孟婷玉 |
| C10 学生信息查询 | 张桐桐 | 张桐桐 | 李玉璇 | 张桐桐 |
|C11 统计学生信息| 李玉璇 | 李玉璇 | 周羽凡 | 李玉璇 |
|C12 打印学生信息 | 周羽凡 | 周羽凡 | 孟婷玉 | 周羽凡 |
| C13 将学生信息读入文件| 孟婷玉 | 孟婷玉 | 张桐桐 | 孟婷玉 |
| C14 从文件中读取学生信息 | 张桐桐 李玉璇| 孟婷玉 | 周羽凡 |张桐桐|
每个成员的工作量(百分比):
| 张桐桐 | 李玉璇 | 周羽凡 |孟婷玉|
| ---- | ---- | ---- |----|
| 30 | 30 | 20 | 20 |
关于学生成绩管理系统
设计一个学生成绩管理系统要求采用行菜单界面进行交互具备读取、保存、打印、查询、插入和排序等基本功能能够以表格和图表形式展示数据采用CSV格式保存数据。
系统的功能性需求:
数据的读取、保存、打印、查询、插入、排序和图表展示。
系统的非功能性需求:
菜单驱动的命令行交互界面
需求分析
分析系统的功能需求和界面需求,编制用户手册如下。
C1: 启动程序
命令行中执行命令./app,系统启动,显示提示信息,然后显示功能菜单,等待用户输入命令。
````
学生成绩管理
1 输入分数
2 计算每个学生各门成绩的总分和平均分
3 计算每个课程的总分和平均分
4 按分数降序排序
5 按分数升序排序
6 按数据升序排序
7 按姓名的字典顺序排序
8 查找数据
9 查找姓名
10 统计分析
11 列表记录
12 写入文件
13 读取文件
0 退出
请输入你的选择:
````
C2: 显示命令菜单
调用 Menu() 函数显示命令菜单,用户输入选项后,将结果返回主函数
````
学生成绩管理
1 输入分数
2 计算每个学生各门成绩的总分和平均分
3 计算每个课程的总分和平均分
4 按分数降序排序
5 按分数升序排序
6 按数据升序排序
7 按姓名的字典顺序排序
8 查找数据
9 查找姓名
10 统计分析
11 列表记录
12 写入文件
13 读取文件
0 退出
请输入你的选择:
````
C3: 退出程序
选择菜单命令 0 ,再输入 y 确认,则退出程序。
````
请输入你的选择: 0
你确定你想进入吗?(确定/不确定): 确定
结束程序!
````
C4: 添加学生信息
选择菜单命令 1 假设n=4,m=3,提示输入学生的学号,姓名和成绩,然后利用循环逐个输入学生的学号和姓名以及各科成绩。
````
请输入你的选择1
输入学生的学号,名字和成绩:
2214111018 李玉璇 100 95 86
2214111038 张桐桐 77 89 99
2214111026 孟婷玉 85 91 98
2214111022 周羽凡 75 89 100
````
C5: 计算学生各门课程总分和平均分
选择菜单命令 2 ,计算学生各门课程总分和平均分,然后利用循环逐个输出学生的顺序,总成绩和平均分,结果都取整数。
````
请输入你的选择2
学生 李玉璇: 总分 = 281 平均分 = 93
学生 张桐桐: 总分 = 265 平均分 = 88
学生 孟婷玉: 总分 = 274 平均分 = 91
学生 周羽凡: 总分 = 264 平均分 = 88
````
c6:计算每门课程的总分和平均分
选择菜单命令 3计算每门课程的总分和平均分然后利用循环逐个输出每门课程的总分和平均分结果都取整数。
````
请输入你的选择: 3
课程 1 总分 = 337 平均分 = 84
课程 2 总分 = 364 平均分 = 91
课程 3 总分 = 383 平均分 = 95
````
c7学生总分排序
如果a < b, 4sum
如果a > b则按降序排序。选择菜单命令 5按选择法将数组sum的元素值按降序进行排序显示提示信息最后打印出学生成绩。
````
请输入你的选择: 4
按分数降序排序:
2214111038 ZhangTongtong 100 95 86 281 93
2214111018 LiYuxuan 85 91 98 274 91
2214111026 MengTingyu 77 89 99 265 88
2214111022 ZhouYufan 75 89 100 264 88
请输入你的选择: 5
按分数升序排列:
2214111022 ZhouYufan 75 89 100 264 88
2214111026 MengTingyu 77 89 99 265 88
2214111018 LiYuxuan 85 91 98 274 91
2214111038 ZhangTongtong 100 95 86 281 93
````
c8学号顺序排序
选择菜单命令 6按学号从小到大进行排序显示提示信息最后打印学生信息。
````
请输入你的选择: 6
按学号降序排列:
2214111018 LiYuxuan 85 91 98 274 91
2214111022 ZhouYufan 75 89 100 264 88
2214111026 MengTingyu 77 89 99 265 88
2214111038 ZhangTongtong 100 95 86 281 93
````
C9: 姓名顺序排序
选择菜单命令 7 ,按姓名的字典顺序进行排序,显示提示信息,最后打印学生信息。
````
请输入你的选择: 7
按名称按字典顺序排序:
2214111018 LiYuxuan 75 89 100 264 88
2214111022 ZhouYufan 77 89 99 265 88
2214111026 MengTingyu 100 95 86 281 93
2214111038 ZhangTongtong 85 91 98 274 91
````
C10: 学生信息查询
选择菜单命令 8 ,提示输入学生学号,若该学号存在,则输出学生信息;否则提示没有找到并结束。
````
请输入你的选择: 8
输入你想搜寻的学号:2214111018
2214111018 LiYuxuan 75 89 100 264 88
1 输入成绩
2 计算每门课程的总分和平均分
3 计算每名学生的总分和平均分
4 按分数降序排序
5 按分数升序排序
6 按学号升序排序
7 按名称按字典顺序排序
8 按数字搜索
9 按名字搜索
10 统计分析
11 列表记录
12 写一个文件
13 从文件中读取
0 退出
请输入你的选择: 8
输入你想搜寻的学号:2214111001
没有找到!
选择菜单命令 9 ,提示输入学生姓名,若该姓名存在,则输出学生信息;否则提示没有找到并结束。
请输入你的选择: 9
输入你想搜寻的名字:ZhangTongtong
2214111038 ZhangTongtong 85 91 98 274 91
1 输入分数
2 计算每门课程的总分和平均分
3 计算每名学生的总分和平均分
4 按分数降序排序
5 按分数升序排序
6 按学号升序排序
7 按名称按字典顺序排序
8 通过学号搜索
9 通过姓名搜素
10 统计分析
11 列表记录
12 写一个文件
13 从文件中读取
0 退出
请输入你的选择: 9
请输入你想搜索的名字:GuoJiahui
Not found!
````
C11: 统计各分数段学生人数及所占百分比
选择菜单命令 10提示输入学生成绩通过循环得出各分数段学生人数及所占百分比
````
请输入你的选择: 10
关于课程1:
<60 0 0.00%
60-70 0 0.00%
70-80 2 50.00%
80-90 1 25.00%
90-100 0 0.00%
100 1 25.00%
For course 2:
<60 0 0.00%
60-70 0 0.00%
70-80 0 00.00%
80-90 2 50.00%
90-100 2 50.00%
100 0 0.00%
For course 3:
<60 0 0.00%
60-70 0 0.00%
70-80 0 0.00%
80-90 1 25.00%
90-100 2 50.00%
100 1 25.00%
````
C12: 打印学生信息
选择菜单命令11打印
````
请输入你的选择11
2214111018 李玉璇 100 95 86 281 93
2214111038 张桐桐 77 89 99 265 88
2214111026 孟婷玉 85 91 98 274 91
2214111022 周羽凡 75 89 100 264 88
````
C13: 将学生信息保存在文件中
选择菜单命令 12 ,将学生信息保存在文件 student.txt 中。如果文件不存在,则给出错误信息并退出程序,否则逐个读入
````
请输入你的选择12
未能打开你的成绩!
1 输入成绩
2 计算所有课程的总分和平均值
3 计算所有学生的总分和平均值
4 按分数降序排列
5 按分数升序排列
6 按数字升序排列
7 按名字字母排列
8 按数字搜索
9 按名字搜索
10 统计分析
11 列表记录
12 写入文件
13 从文件中读取
0 退出
请输入你的选择12
2214111018 李玉璇 100 95 86 281 93
2214111038 张桐桐 77 89 99 265 88
2214111026 孟婷玉 85 91 98 274 91
2214111022 周羽凡 75 89 100 264 88
````
C14从文件中读取学生信息
选择菜单命令 13 ,从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组 stu 中。如果文件为空,则给出错误信息并退出程序,反之,逐个读入
````
请输入你的选择13
未能打开你的成绩!
1 输入成绩
2 计算所有课程的总分和平均值
3 计算所有学生的总分和平均值
4 按分数降序排列
5 按分数升序排列
6 按数字升序排列
7 按名字字母排列
8 按数字搜索
9 按名字搜索
10 统计分析
11 列表记录
12 写入文件
13 从文件中读取
0 退出
请输入你的选择12
2214111018 李玉璇 100 95 86 281 93
2214111038 张桐桐 77 89 99 265 88
2214111026 孟婷玉 85 91 98 274 91
2214111022 周羽凡 75 89 100 264 88
````
概要设计
系统主要分为用户界面和数据处理两大模块。
用户界面模块包括输入学生成绩ReadScore、计算学生总分和平均分AverSumofEveryStudent、计算总分和平均分AverSumofEveryCourse、按选择发将数组元素排序Sortbyscore、使数据按升序排序Ascending、使数据按降序排序Descending、交换单精度浮点数据SwapFloat、交换长整型数据SwapLong、交字符串SwapChar、按选择法将数组元素按从低到高排序、交换实现字符串按字典顺序排序SortbyName、按学号查找学生成绩并显示查找结果SearchbyNum、按姓名的字典顺序排出成绩表 、统计各分数段的学生人数及所占的百分比 、打印学生成绩 、输出学生的学号、姓名及课程的成绩到文件student.txt中 、从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组stu中
上述各模块通过主程序main进行调用系统模块图如下。
![添加库存记录流程图](ztt2.drawio.svg)
各模块的主要功能如下:
# main
系统主函数模块,显示菜单,根据用户选择的菜单命令,执行相关操作。
# init
系统初始化
#menu
显示菜单命令
#详细设计
针对概要设计
#main
Step 1:初始化
Step 2:根据用户选择的命令执行相应的操作
Step 2.1:显示菜单
Step 2.2:选择菜单命令 c
Step 2.3:if c == 1 then ReadScore
Step 2.4:if c == 2 then AverSumofEveryStudent
Step 2.5:if c == 3 then AverSumofEveryCourse
Step 2.6:if c == 4 then SortbyScore(Descending)
Step 2.7:if c == 5 then SortbyScore(Ascending)
Step 2.8:if c == 6 then AsSortbyNum
Step 2.9:if c == 7 then SortbyName
Step 2.10:if c == 8 then SearchbyNum
Step 2.11:if c == 9 then SearchbyName
Step 2.12:if c == 10 then StatisticAnalysis
Step 2.13:if c == 11 then PrintScore
Step 2.14:if c == 12 then WritetoFile
Step 2.15:if c == 13 then ReadfromFile
Step 2.16:if c == 0 then exit
![详细设计](lyx.drawio.svg)
````
系统模块图
1·输入n个学生的m门课成绩
ReadScore
Step 1:显示提示信息,要求输入学生的学号,姓名和成绩
Step 2利用循环输入学生的学号成绩和各科成绩
````
![信息存入](ztt4.drawio.svg)
2·计算每个学生各门课程的总分和平均分
AverSumofEveryStudent
step1输入一门学生的成绩
step2将学生成绩相加输出总分
step3输出课程平均值
step4输入下一门课程
![总分平均分](ztt1.drawio.svg)
````
3·计算每门课程的总分和平均分
AverSumofEveryCourse
step1输入第一门课程的所有学生的成绩
step2将成绩相加输出科目总分
step3总分/人数,输出课程平均分
step4输入下一个科目
````
![课程总分平均分](ztt5.drawio.svg)
````
4·按选择法将数组sum的元素值排序
SortbyScore
Step 1:利用循环将i赋值给k
Step 2:用循环从i+1到n-1比较,将较小的赋给k
Step 3:如果k与i不相等每一课的成绩交换总分平均分学号姓名依次交换
````
![排序](sortbyscore.drawio.svg)
````
5·按选择法将数组num的元素值按从低到高排序
AsSortbyNum
step 1:对前两元素进行比较
step 2:如果前一个数大于后一个数,则把前数放在前面
step 3:对上一操作进行循环,依次比较
step 4:最后依次罗列元素
````
![num排序](mty5.drawio.svg)
````
6·交换法实现字符串按字典顺序排序
SortbyName
step 1:对前两元素进行比较
step 2:如果前一个数大于后一个数,则把两数交换
step 3:对上一操作进行循环,交换位置的索引
step 4:最后依次罗列元素
````
![字符串排序](mty6.drawio.svg)
````
7.按学号查找学生成绩并显示查找结果
SearchbyNum
````
![字符串排序](mty7.drawio.svg)
8·按姓名的字典顺序排出成绩表
SearchbyName
````
````
![字符串排序](mty8.drawio.svg)
````
9·统计各分数段的学生人数及所占的百分比
StatisticAnalysis
step1:输入每个学生的成绩
step2:判断输入成绩所在的分数段
step3:将各个分数段的成绩个数除以学生总人数并乘以百分百
````
![百分百](zyf9.drawio.svg)
````
10·打印学生成绩
PrintScore
step1:输入学生的学号,姓名.
step2:查找该学生的成绩
step3:输出该学生的成绩
````
![打印](zyf10.drawio.svg)
````
11·输出n个学生的学号、姓名及m门课程的成绩到文件student.txt中
WritetoFile
step1:输入学生的学号和姓名
step2:查找该学生的所有课程成绩
step3:将成绩保存到文件student.txt中
````
![输出](zyf11.drawio.svg)
````
12·从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组stu中
ReadfromFile
step1:查找文件
step2:从文件中读取学生的学号姓名成绩
step3:将信息写入到数组stu中
````
![读取](zyf12.drawio.svg)
exit
代码实现
// 头文件的使用
# System
#学生成绩管理系统代码
@ -18,7 +457,7 @@ typedef struct student
long num; // 每个学生的学号
char name[MAX_LEN]; // 每个学生的姓名
float score[COURSE_NUM]; // 每个学生COURSE_NUM门功课的成绩
float sum; // 每个学生的总成绩
float sum; // 每个学生的总成绩
float aver; // 每个学生的平均成绩
}STU;
int Menu(void);
@ -144,8 +583,46 @@ i+1, stu[i].sum, stu[i].aver);
}
}
//3 函数功能:计算每门课程的总分和平均分
void AverSumofEveryCourse(STU stu[], int n, int m)
{
int i, j;
float sum[COURSE_NUM], aver[COURSE_NUM];
for (j=0; j<m; j++)
{
sum[j] = 0;
for (i=0; i<n; i++)
{
sum[j] += stu[i].score[j];
}
aver[j]=sum[j]/i;
printf("student %d: sum = %.0f, aver = %.0f\n",
j+1, sum[j], aver[j]);
}
}
//4 函数功能按选择法将数组sum的元素值排序
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b))
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
}
if (k != i)
{
for (t=0; t<m; t++) // m
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum); // 交换总分
SwapFloat(&stu[k].aver, &stu[i].aver); // 交换平均分
SwapLong(&stu[k].num, &stu[i].num); // 交换学号
SwapChar(stu[k].name, stu[i].name); // 交换姓名
}
}
}
// 5使数据按升序排序
int Ascending(float a, float b)
@ -158,9 +635,21 @@ int Descending(float a, float b)
return a > b;
}
// 7交换两个单精度浮点型数据
void SwapFloat(float *x, float *y)
{
float temp;
temp = *x;
*x = *y;
*y = temp;
}
// 8交换两个长整型数据
void SwapLong(long *x, long *y)
{
long temp;
temp = *x;
*x = *y;
*y = temp;
}
// 9交换两个字符串
void SwapChar(char x[], char y[])
{
@ -170,7 +659,19 @@ strcpy(x, y);
strcpy(y, temp);
}
// 10函数功能按选择法将数组num的元素值按从低到高排序
void AsSortbyNum(STU stu[], int n, int m)
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
K=i;
for(j=i+1;j<10;j++)
{
if((*compare)(stu[k]num.stu[j].num)) k=j;}
if(k!=i)
{t=stu[i].num;stu[i].num=stu[k].num;stu[k].num=t;}
}
}
// 11函数功能交换法实现字符串按字典顺序排序
void AsSortbyNum(STU stu[], int n, int m)
{
@ -196,7 +697,27 @@ SwapChar(stu[k].name, stu[i].name);
}
}
// 12函数功能按学号查找学生成绩并显示查找结果
void SearchbyNum(STU stu[], int n, int m)
{
long number;
int i, j;
printf("Input the number you want to search:");
scanf("%ld", &number);
for(i=0;i<n;i++)
{
if (stu[i].num==number)
{
printf("%ld\t%s\t", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
printf("%.0f\t", stu[i].score[j]);
}
printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
return;
}
printf("\nNot found!\n");
}
}
// 13函数功能按姓名的字典顺序排出成绩表
void SearchbyName(STU stu[], int n, int m)
{
@ -264,7 +785,28 @@ void PrintScore(STU stu[], int n, int m)
}
// 16输出n个学生的学号、姓名及m门课程的成绩到文件student.txt中
void WritetoFile(STU stu[], int n, int m)
{
FILE *fp;
int i, j;
if ((fp = fopen("student.txt","w")) == NULL)
{
printf("Failure to open score.txt!\n");
exit(0);
}
fprintf(fp, "%d\t%d\n", n, m); //将学生人数和课程门数写入文件
for (i=0; i<n; i++)
{
fprintf(fp, "%10ld%10s", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
fprintf(fp, "%10.0f", stu[i].score[j]);
}
fprintf(fp, "%10.0f%10.0f\n", stu[i].sum, stu[i].aver);
}
fclose(fp);
}
//17从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组stu中
void ReadfromFile(STU stu[],int *n, int *m)

@ -1,9 +1 @@
系统:
用户界面 数据处理
main系统主函数
用户界面:
系统初始化init、显示菜单display_menu、选择菜单命令make_choice)、确认confirm、退出quit
数据处理:
读取数据read _data、保存数据save_data、打印数据print_data、查询数据query_data、添加数据add_data、更新数据update_data、删除数据delete_data、数据排序sort_data、生成图表make_chart
查询数据:
find
输入学生成绩ReadScore)、计算学生总分和平均分AverSumofEveryStudent、计算总分和平均分AverSumofEveryCourse、按选择发将数组元素排序Sortbyscore、使数据按升序排序Ascending、使数据按降序排序Descending、交换单精度浮点数据SwapFloat、交换长整型数据SwapLong、交字符串SwapChar、按选择法将数组元素按从低到高排序、交换实现字符串按字典顺序排序SortbyName、按学号查找学生成绩并显示查找结果SearchbyNum、按姓名的字典顺序排出成绩表 、统计各分数段的学生人数及所占的百分比 、打印学生成绩 、输出学生的学号、姓名及课程的成绩到文件student.txt中 、从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组stu中

@ -0,0 +1,762 @@
项目简介
本成绩管理系统是为教师提供管理班级成绩的工具该系统可以实现的对学生的成绩进行增、删、改、查、信息保存和信息导入等基本信息以及对学生成绩排序和分段的扩展功能有利于对学生成绩管理。项目采用C语言编程实现在VS Code 集成开发环境IDE中使用GCC进行编译。系统采用模块化设计程序结构清晰采用菜单驱动的命令行界面操作便捷能够用CSV格式读取和保存数据通用性强能够用图表展示数据直观清楚。
下载地址https://bdgit.educoder.net/pvfj5ugro/text1.git
项目开发过程中采用 Kanban看板进行任务管理和分工协作并使用 Git 对程序代码和文档进行版本管理。任务分工情况如下:
任务 设计 开发 测试 文档
C1-C3 菜单驱动的用户界面 许子林 许子林 李雨佳 张宇 徐子贵
C4 添加学生信息 张宇 张宇 徐子贵 许子林 李雨佳
C5-C6 求和求平均 徐子贵 徐子贵 李雨佳 许子林 张宇
C7-C9 排序 李雨佳 李雨佳 张宇 徐子贵 许子林
C10 学生信息查询 张宇 张宇 李雨佳 徐子贵 许子林
C11 统计学生信息 徐子贵 徐子贵 许子林 张宇 李雨佳
C12 打印学生信息 许子林 许子林 李雨佳 张宇 徐子贵
C13 将学生信息读入文件 李雨佳 李雨佳 许子林 徐子贵 张宇
C14 从文件中读取学生信息 李雨佳 李雨佳 张宇 徐子贵 许子林
每个成员的工作量(百分比):
李雨佳 徐子贵 许子林 张宇
30 30 20 20
关于学生成绩管理系统
设计一个学生成绩管理系统要求采用行菜单界面进行交互具备读取、保存、打印、查询、插入和排序等基本功能能够以表格和图表形式展示数据采用CSV格式保存数据。
系统的功能性需求:
数据的读取、保存、打印、查询、插入、排序和图表展示。
系统的非功能性需求:
菜单驱动的命令行交互界面
需求分析
分析系统的功能需求和界面需求,编制用户手册如下。
C1: 启动程序
命令行中执行命令./app,系统启动,显示提示信息,然后显示功能菜单,等待用户输入命令。
Management for Students'scores
1 Input record
2 Calculate total and average score of every course
3 Calculate total and average score of every student
4 Sort in descending order by score
5 Sort in ascending order by score
6 Sort in ascending order by number
7 Sort in dictionary order by name
8 Search by number
9 Search by name
10 Statistic analysis
11 List record
12 Write to a file
13 Read from a file
0 Exit
Please Input your choice:
C2: 显示命令菜单
调用 Menu() 函数显示命令菜单,用户输入选项后,将结果返回主函数
Management for Students'scores
1 Input record
2 Calculate total and average score of every course
3 Calculate total and average score of every student
4 Sort in descending order by score
5 Sort in ascending order by score
6 Sort in ascending order by number
7 Sort in dictionary order by name
8 Search by number
9 Search by name
10 Statistic analysis
11 List record
12 Write to a file
13 Read from a file
0 Exit
Please Input your choice:
C3: 退出程序
选择菜单命令 0 ,再输入 y 确认,则退出程序。
Please Input your choice: 0
Are you sure you want to exit?(Y/N): y
End of program!
C4: 添加学生信息
选择菜单命令 1 假设n=4,m=3,提示输入学生的学号,姓名和成绩,然后利用循环逐个输入学生的学号和姓名以及各科成绩。
Please Input your choice: 1
Input student's ID, name and score:
2214111006 XuZilin 100 95 86
2214111009 XuZigui 77 89 99
2214111011 ZhangYu 85 91 98
2214111025 LiYujia 75 89 100
C5: 计算学生各门课程总分和平均分
选择菜单命令 2 ,计算学生各门课程总分和平均分,然后利用循环逐个输出学生的顺序,总成绩和平均分,结果都取整数。
Please Input your choice: 2
student 1: sum = 281, aver = 93
student 2: sum = 265, aver = 88
student 3: sum = 274, aver = 91
student 4: sum = 264, aver = 88
C6: 计算每门课程的总分和平均分
选择菜单命令 3 ,计算每门课程的总分和平均分,然后利用循环逐个输出每门课程的总分和平均分,结果都取整数。
Please Input your choice: 3
course 1: sum = 337, aver = 84
course 2: sum = 364, aver = 91
course 3: sum = 383, aver = 95
C7: 学生总分排序
如果a < b, 4 sum
如果a > b,则按降序排序。选择菜单命令 5 ,按选择法将数组 sum 的元素值按降序进行排序,显示提示信息,最后打印出学生成绩。
Please Input your choice: 4
Sort in descending order by score:
2214111006 XuZilin 100 95 86 281 93
2214111011 ZhangYu 85 91 98 274 91
2214111009 XuZigui 77 89 99 265 88
2214111025 LiYujia 75 89 100 264 88
Please Input your choice: 5
Sort in ascending order by score:
2214111025 LiYujia 75 89 100 264 88
2214111009 XuZigui 77 89 99 265 88
2214111011 ZhangYu 85 91 98 274 91
2214111006 XuZilin 100 95 86 281 93
C8: 学号顺序排序
选择菜单命令 6 ,按学号从小到大进行排序,显示提示信息,最后打印学生信息。
Please Input your choice: 6
Sort in ascending order by number:
2214111006 XuZilin 100 95 86 281 93
2214111009 XuZigui 77 89 99 265 88
2214111011 ZhangYu 85 91 98 274 91
2214111025 LiYujia 75 89 100 264 88
C9: 姓名顺序排序
选择菜单命令 7 ,按姓名的字典顺序进行排序,显示提示信息,最后打印学生信息。
Please Input your choice: 7
Sort in dictionary order by name:
2214111025 LiYujia 75 89 100 264 88
2214111009 XuZigui 77 89 99 265 88
2214111006 XuZilin 100 95 86 281 93
2214111011 ZhangYu 85 91 98 274 91
C10: 学生信息查询
选择菜单命令 8 ,提示输入学生学号,若该学号存在,则输出学生信息;否则提示没有找到并结束。
Please Input your choice: 8
Input the number you want to search:2214111011
2214111011 ZhangYu 85 91 98 274 91
1 Input record
2 Calculate total and average score of every course
3 Calculate total and average score of every student
4 Sort in descending order by score
5 Sort in ascending order by score
6 Sort in ascending order by number
7 Sort in dictionary order by name
8 Search by number
9 Search by name
10 Statistic analysis
11 List record
12 Write to a file
13 Read from a file
0 Exit
Please Input your choice: 8
Input the number you want to search:2214111001
Not found!
选择菜单命令 9 ,提示输入学生姓名,若该姓名存在,则输出学生信息;否则提示没有找到并结束。
Please Input your choice: 9
Input the name you want to search:LiYujia
2214111025 LiYujia 75 89 100 264 88
1 Input record
2 Calculate total and average score of every course
3 Calculate total and average score of every student
4 Sort in descending order by score
5 Sort in ascending order by score
6 Sort in ascending order by number
7 Sort in dictionary order by name
8 Search by number
9 Search by name
10 Statistic analysis
11 List record
12 Write to a file
13 Read from a file
0 Exit
Please Input your choice: 9
Input the name you want to search:SunYizhe
Not found!
C11: 统计各分数段学生人数及所占百分比
选择菜单命令 10提示输入学生成绩通过循环得出各分数段学生人数及所占百分比
Please Input your choice: 10
For course 1:
<60 0 0.00%
60-70 0 0.00%
70-80 2 50.00%
80-90 1 25.00%
90-100 0 0.00%
100 1 25.00%
For course 2:
<60 0 0.00%
60-70 0 0.00%
70-80 0 00.00%
80-90 2 50.00%
90-100 2 50.00%
100 0 0.00%
For course 3:
<60 0 0.00%
60-70 0 0.00%
70-80 0 0.00%
80-90 1 25.00%
90-100 2 50.00%
100 1 25.00%
C12: 打印学生信息
选择菜单命令11打印
Please Input your choice: 11
2214111006 XuZilin 100 95 86 281 93
2214111009 XuZigui 77 89 99 265 88
2214111011 ZhangYu 85 91 98 274 91
2214111025 LiYujia 75 89 100 264 88
C13: 将学生信息保存在文件中
选择菜单命令 12 ,将学生信息保存在文件 student.txt 中。如果文件不存在,则给出错误信息并退出程序,否则逐个读入
Please Input your choice: 12
Failure to open score.txt!
1 Input record
2 Calculate total and average score of every course
3 Calculate total and average score of every student
4 Sort in descending order by score
5 Sort in ascending order by score
6 Sort in ascending order by number
7 Sort in dictionary order by name
8 Search by number
9 Search by name
10 Statistic analysis
11 List record
12 Write to a file
13 Read from a file
0 Exit
Please Input your choice: 12
2214111006 XuZilin 100 95 86 281 93
2214111009 XuZigui 77 89 99 265 88
2214111011 ZhangYu 85 91 98 274 91
2214111025 LiYujia 75 89 100 264 88
C14从文件中读取学生信息
选择菜单命令 13 ,从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组 stu 中。如果文件为空,则给出错误信息并退出程序,反之,逐个读入
Please Input your choice: 13
Failure to open score.txt!
1 Input record
2 Calculate total and average score of every course
3 Calculate total and average score of every student
4 Sort in descending order by score
5 Sort in ascending order by score
6 Sort in ascending order by number
7 Sort in dictionary order by name
8 Search by number
9 Search by name
10 Statistic analysis
11 List record
12 Write to a file
13 Read from a file
0 Exit
Please Input your choice: 13
2214111006 XuZilin 100 95 86 281 93
2214111009 XuZigui 77 89 99 265 88
2214111011 ZhangYu 85 91 98 274 91
2214111025 LiYujia 75 89 100 264 88
概要设计
系统主要分为用户界面和数据处理两大模块。
用户界面模块包括系统初始化init显示菜单display_menu选择菜单命令make_choice、确认confirm、退出quit等子模块。
数据处理模块包括读取数据read_data、保存数据save_data、打印数据print_data、查询数据query_data、添加数据add_data、更新数据update_data、删除数据delete_data、数据排序sort_data和生成图表make_chart等子模块。其中查询、添加、更
新和删除数据还会用到根据编号查询数据的方法find
上述各模块通过主程序main进行调用系统模块图如下。
系统模块图
各模块的主要功能如下:
main
系统主函数模块,显示菜单,根据用户选择的菜单命令,执行相关操作。
init
系统初始化
menu
显示菜单命令
详细设计
针对概要设计
main
Step 1:初始化
Step 2:根据用户选择的命令执行相应的操作
Step 2.1:显示菜单
Step 2.2:选择菜单命令 c
Step 2.3:if c == 1 then ReadScore
Step 2.4:if c == 2 then AverSumofEveryStudent
Step 2.5:if c == 3 then AverSumofEveryCourse
Step 2.6:if c == 4 then SortbyScore(Descending)
Step 2.7:if c == 5 then SortbyScore(Ascending)
Step 2.8:if c == 6 then AsSortbyNum
Step 2.9:if c == 7 then SortbyName
Step 2.10:if c == 8 then SearchbyNum
Step 2.11:if c == 9 then SearchbyName
Step 2.12:if c == 10 then StatisticAnalysis
Step 2.13:if c == 11 then PrintScore
Step 2.14:if c == 12 then WritetoFile
Step 2.15:if c == 13 then ReadfromFile
Step 2.16:if c == 0 then exit
系统模块图
ReadScore
Step 1:显示提示信息,要求输入学生的学号,姓名和成绩
Step 2利用循环输入学生的学号成绩和各科成绩
学生信息输入
AverSumofEveryStudent
Step 1:利用for循环给 sum 赋初值为 0
Step 2:利用第二重循环重新计算每个学生的总分
Step 3:计算每个学生的平均分
Step 4:将结果按照舒徐,总分和平均分的顺序进行输出
计算每个学生各门课程的总分和平均分
AverSumofEveryCourse
SortbyScore
SortbyScore
AsSortbyNum
SortbyName
SearchbyNum
SearchbyName
StatisticAnalysis
PrintScore
WritetoFile
ReadfromFile
exit
代码实现
// 头文件的使用
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// define定义的全局变量
#define MAX_LEN 10 //字符串最大长度
#define STU_NUM 30 //最多的考试人数
#define COURSE_NUM 6 //最多的考试科目
// 结构体的定义
typedef struct student{
long num; //每个学生的学号
char name[MAX_LEN]; //每个学生的姓名
float score[COURSE_NUM]; //每个学生COURSE_NUM门功课的成绩
float sum; //每个学生的总成绩
float aver; //每个学生的平均成绩
}STU;
// 函数声明
int Menu(void); //菜单显示、用户输入函数
void ReadScore(STU stu[],int n,int m); //学生成绩录入函数
void AverSumofEveryStudent(STU stu[],int n,int m); //求每个学生总分和平均分的函数
void AverSumofEveryCourse(STU stu[],int n,int m); //求每门课程总分和平均分的函数
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b)); //选择法将数组 sum 的元素排序的函数
int Ascending(float a,float b); //使数据按升序排序的函数
int Descending(float a,float b); //使数据按降序排序的函数
void SwapFloat(float *x,float *y); //用于交换两个单精度浮点数的函数
void SwapLong(long *x,long *y); //用于交换两个长整型数据的函数
void SwapChar(char x[],char y[]); //用于交换两个字符串的函数
void AsSortbyNum(STU stu[],int n,int m); //选择法将数组 num 的元素值从低到高排序的函数
void SortbyName(STU stu[],int n,int m); //交换法实现字符串按字典顺序排序的函数
void SearchbyNum(STU stu[],int n,int m); //按学号查找学生成绩并显示查找结果的函数
void SearchbyName(STU stu[],int n,int m); //按姓名的字典顺序排出成绩表的函数
void StatisticAnalysis(STU stu[],int n,int m); //统计各分数段的学生人数及所占的百分比的函数
void PrintScore(STU stu[],int n,int m); //打印学生成绩的函数
void WritetoFile(STU record[],int n,int m); //输出学生信息到文件中的函数
void ReadfromFile(STU record[],int *n,int *m); //从文件中读取学生信息的函数
// 主函数
int main(void)
{
char ch;
int n = 0,m = 0;
STU stu[STU_NUM];
printf("Input student number(n<%d):",STU_NUM);
scnaf("%d",&n);
printf("Input course number(m<=%d):",COURSE_NUM);
scanf("%d",&m);
while(1)
{
ch = Menu(); //显示菜单,并读取用户输入
switch(ch)
{
case 1:ReadScore(stu,n,m);
break;
case 2:AverSumofEveryCourse(stu,n,m);
break;
case 3:AverSumofEveryStudent(stu,n,m);
break;
case 4:SortbyScore(stu,n,m,Descending);
printf("\nSort in descending order by score:\n");
PrintScore(stu,n,m);
break;
case 5:SortbyScore(stu,n,m,Ascending);
printf("\nSort in ascending order by number:\n");
PrintScore(stu,n,m);
break;
case 6:AsSortbyNum(stu,n,m);
printf("\nSort in ascending order by number:\n");
PrintScore(stu,n,m);
break;
case 7:SortbyName(stu,n,m);
printf("\nSort in dictionary order by name:\n");
PrintScore(stu,n,m);
break;
case 8:SearchbyNum(stu,n,m);
break;
case 9:SearchbyName(stu,n,m);
break;
case 10:StatisticAnalysis(stu,n,m);
break;
case 11:PrintScore(stu,n,m);
break;
case 12:WritetoFile(stu,n,m);
break;
case 13:ReadfromFile(stu,&n,&m);
break;
case 0: printf("Are you sure you want to exit?(Y/N):");
printf("End of program!);
exit(0);
default:printf("Input error!");
}
}
return 0;
}
// 函数功能:显示菜单并获得用户键盘输入的选项
int Menu(void)
{
int itemSelected;
printf("Management for Students' scores\n");
printf("1 Input record\n");
printf("2 Calculate total and average score of every course\n");
printf("3 Calculate total and average score of every student\n");
printf("4 Sort in descending order by score\n");
printf("5 Sort in ascending order by score\n");
printf("6 Sort in ascending order by number\n");
printf("7 Sort in dictionary order by name\n");
printf("8 Search by number\n");
printf("9 Search by name\n");
printf("10 Statistic analysis\n");
printf("11 List record\n");
printf("12 Write to a file\n");
printf("13 Read from a file\n");
printf("0 Exit\n");
printf("Please Input your choice:");
scanf("%d",&itemSelected); //读入用户输入
return itemSelected;
}
// 函数功能:输入 n 个学生的 m 门课成绩
void ReadScore(STU stu[],int n,int m)
{
int i,j;
printf("Input student's ID ,name and score:\n");
for(i=0,i<n;i++) //n
{
scanf("%ld%s",&stu[i].num,stu[i].name);
for(j=0;j<m;j++) //m
scanf("%f",&stu[i].score[j]);
}
}
//函数功能:计算每个学生各门课程的总分和平均分
void AverSumofEveryStudent(STU stu[],int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
stu[i].sum = 0; //初始化每个学生总分为0
for(j=0;j<m;j++)
{
stu[i].sum = stu[i].sum + stu[i].score[j]; //累加分数
}
stu[i].aver = m>0 ? stu[i].sum /m : -1;
printf("student %d: sum = %.0f,aver = %.0f\n",i+1,stu[i].sum,stu[i].aver);
}
}
//函数功能:计算每门课程的总分和平均分
void AverSumofEveryCourse(STU stu[],int n,int m)
{
int i,j;
float sum[COURSE_NUM],aver[COURSE_NUM];
for(j=0;j<m;j++)
{
sum[j] = 0;
for(i=0;i<n;i++)
{
sum[j]+= stu[i].score[j]; //计算n个同学每门课程的总分
}
aver[j] = sum[j]/i;
printf("course %d: sum = %.0f,aver = %.0f\n",j+1, sum[j], aver[j]);
}
}
//函数功能:按选择法将数组 sum 的元素值排序
voidSortbyScore(STU stu[],int n,int m,int(*compare)(float a,float b))
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
}
if (k != i)
{
for (t=0; t<m; t++) //m
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum); //交换总分
SwapFloat(&stu[k].aver, &stu[i].aver); //交换平均分
SwapLong(&stu[k].num, &stu[i].num); //交换学号
SwapChar(stu[k].name, stu[i].name); //交换姓名
}
}
}
//使数据按升序排序
int Ascending(float a,float b)
{
return a < b; //a<b
}
//使数据按降序排序
int Descending(float a,float b)
{
return a > b; // 这样比较决定了按降序排序,如果 a>b则交换
}
//交换两个单精度浮点型数据
void SwapFloat(float *x,float *y)
{
float temp;
temp = *x;
*x = *y;
*y = temp;
}
//交换两个长整型数据
void SwapLong(long *x,long *y)
{
long temp;
temp = *x;
*x = *y;
*y = temp;
}
//交换两个字符串
void SwapChar(char x[],chary[])
{
char temp[MAX_LEN];
strcpy(temp, x);
strcpy(x, y);
strcpy(y, temp);
}
//函数功能:按选择法将数组 num 的元素从低到高排序
void AsSortbyNum(STU stu[],int n,int m)
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
int i, j, k, t;
k = i;
for (j=i+1; j<n; j++)
{
if (stu[j].num < stu[k].num) k = j;
}
if (k != i)
{
for (t=0; t<m; t++) //m
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum); //交换总分
SwapFloat(&stu[k].aver, &stu[i].aver); //交换平均分
SwapLong(&stu[k].num, &stu[i].num); //交换学号
SwapChar(stu[k].name, stu[i].name); //交换姓名
}
}
}
//函数功能:交换法实现字符串按字典顺序排序
void SortbyName(STU stu[],int n,int m)
{
int i, j, t;
for (i=0; i<n-1; i++)
{
for (j = i+1; j<n; j++)
{
if (strcmp(stu[j].name, stu[i].name) < 0)
{
for (t=0; t<m; t++) //m
{
SwapFloat(&stu[i].score[t], &stu[j].score[t]);
}
SwapFloat(&stu[i].sum, &stu[j].sum); //交换总分
SwapFloat(&stu[i].aver, &stu[j].aver); //交换平均分
SwapLong(&stu[i].num, &stu[j].num); //交换学号
SwapChar(stu[i].name, stu[j].name); //交换姓名
}
}
}
}
//函数功能:按学号查找学生成绩并显示查找结果
void SearchbyNum(STU stu[],int n,int m)
{
long number;
int i,j;
printf("Input the number you want to search:");
scanf("%ld",&number);
for(i=0;i<n;i++)
if(stu[i].num==number)
{
printf("\n");
for(j=0;j<m;j++)
printf("%d\t",stu[i].score[j]);
printf("\n");
break;
}
if(i==n)
printf("\nNot found!\n");
}
//函数功能:按姓名查找学生成绩并显示查找结果
void SearchbyName(STU stu[],int n,int m)
{
char x[MAX_LEN];
int i,j;
printf("Input the name you want to search:");
scanf("%s", x);
for(i=0;i<n;i++)
{
if(strcmp(stu[i].name,x)==0)
{
printf("%ld\t%s\t",stu[i].num,stu[i].name);
for(j=0;j<m;j++)
{
printf("%.0f\t",stu[i].score[j]);
}
printf(".0f\t%.0f\n",stu[i].sum,stu[i].aver);
return;
}
}
printf("\nNot found!\n);
}
//函数功能:统计各分数段的学生人数及所占的百分比
void StatisticAnalysis(STU stu[],int n,int m)
{
int i,j,t[6];
for(j=0;j<m;j++)
{
printf("For course %d:\n",j+1);
memset(t,0,sizeof(t)); //将数组 t 的全部元素初始化为0
for(i=0;i<n;i++)
{
if(stu[i].score[j]>=0&&stu[i].score[j]<60) t[0]++;
else if(stu[i].score[j]<70) t[1]++;
else if(stu[i].score[j]<80) t[2]++;
else if(stu[i].score[j]<90) t[3]++;
else if(stu[i].score[j]<100) t[4]++;
else if(stu[i].score[j]==100) t[5]++;
}
for(i=0;i<=5;i++)
{
if(i==0) printf("<60\t%d\t%.2f%%\n",t[i],(float)t[i]/n*100);
else if(i==5) printf("%d\t%d\t%.2f%%\n",(i+5)*10,t[i],(float)t[i]/n*100);
else printf("%d-%d\t%d\t%.2f%%\n",(i+5)*10,(i+5)*10+9,t[i],(float)t[i]/n*100);
}
}
}
//函数功能:打印学生成绩
void PrintScore(STU stu[],int n,int m)
{
int i,j;
for (i=0; i<n; i++)
{
printf("%ld\t%s\t", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
printf("%.0f\t", stu[i].score[j]);
}
printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
}
}
//输出 n 个学生的学号、姓名及 m 门课程的成绩到文件 student.txt 中
void WritetoFile(STU stu[],int n,int m)
{
FILE *fp;
int i, j;
if((fp = fopen("student.txt","w")) == NULL)
{
printf("Failure to open score.txt!\n");
exit(0);
}
fprintf(fp, "%d\t%d\n", n, m); //将学生人数和课程门数写入文件
for (i=0; i<n; i++)
{
fprintf(fp, "%10ld%10s", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
fprintf(fp, "%10.0f", stu[i].score[j]);
}
fprintf(fp, "%10.0f%10.0f\n", stu[i].sum, stu[i].aver);
}
fclose(fp);
}
//从文件中读取学生的学号、姓名及成绩等信息写入到结构体 stu 中
void ReadfromFile(STU stu[],int *n,int *m)
{
FILE *fp;
int i, j;
if ((fp = fopen("student.txt","r")) == NULL)
{
printf("Failure to open score.txt!\n");
exit(0);
}
fscanf(fp, "%d\t%d", n, m); //从文件中读出学生人数,课程门数
for (i=0; i<*n; i++) //学生人数保存在n指向的储存单元
{
fscanf(fp, "%10ld", &stu[i].num);
fscanf(fp, "%10s", stu[i].name);
for (j=0; j<*m; j++) //课程门数保存在m指向的储存单元
{
fscanf(fp, "%10f", &stu[i].score[j]); //不能用%10.0f
}
fscanf(fp, "%10f%10f", &stu[i].sum, &stu[i].aver); //不能用%10.0f
}
fclose(fp);
}
关于
学习 git 和 markdown
README.md
405.0 KB
MulanPSL-2.0
邀请码
4ReAHE
发行版
您暂未发布任何版本
贡献者
4
开发语言
C100.0%

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 98 KiB

@ -1,89 +0,0 @@
<svg host="65bd71144e" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="181px" height="511px" viewBox="-0.5 -0.5 181 511" content="&lt;mxfile&gt;&lt;diagram id=&quot;wo5jVe5_veYJWB7CKM0g&quot; name=&quot;Page-1&quot;&gt;xZbLjpswFIafxstKXIbbMmSYdlOpUhZdW8EBSwZTYwbSp6/BxyEOZDKTKjObYP8+Nsf/+RyD/G01fBe4KX/ynDDkOfmA/GfkeWEUqt9ROGohCGMtFILmWnJnYUf/EhAdUDuak9YKlJwzSRtb3PO6JntpaVgI3tthB87stza4IAtht8dsqf6muSy1GgfOrP8gtCjNm10HRipsgkFoS5zz/kzyM+RvBedSt6phS9jonfFFz3u5MnpKTJBavmfCE6Qhj2ZvJFdbhW7Na/VIS1kx1XNV88BrCfVwI9XX08c5VxMAqeWd2EOUDzXDoiAQFZw2r6AhvCJSHFWIIAxL+mqvjqF8xSnuNPUXp+q9ngOkeTH4DKB5T469hE4BZs0+qcZZGrM0ubfuJOzpFbMOskVeyCR4Znkc/um4GfjWTm5uVIAbNcNkqRlXrWJ6ZgFKt0jtRTU2EYpTs7RKSq8OgYtiMqbOxFjDvqSS7Bo8laBXp9KuKyRPhCTD25Vc1sh47dleG6v7+YS4JqQ8Px2Oc72sVkHecD/8Eo6DJcfRp3Dshw/jOFhynMUozVDij/jFisBgYbbgXZ2TcQXnNmvr3v8Xe25ycc6dFfjiFfgufbyHvfhL2IuW7CWfwl7gPoy96AZ7EUo3C7Nv0IbbRn8CHOgwEvoI/E6nxhxPbwU/d+2/79LLe/hLVlxTTqWTayFKnlHycv/N8BC7Lm6K6J1XRfxxt1R3/prSSM6fpH72Dw==&lt;/diagram&gt;&lt;/mxfile&gt;">
<defs/>
<g>
<path d="M 90 100 L 90 153.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 90 158.88 L 86.5 151.88 L 90 153.63 L 93.5 151.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="90" cy="50" rx="60" ry="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 50px; margin-left: 31px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<font style="font-size: 17px;">
开始
</font>
</div>
</div>
</div>
</foreignObject>
<text x="90" y="54" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
开始
</text>
</switch>
</g>
<path d="M 90 220 L 90 273.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 90 278.88 L 86.5 271.88 L 90 273.63 L 93.5 271.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="160" width="180" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 178px; height: 1px; padding-top: 190px; margin-left: 1px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
输入
</div>
</div>
</div>
</foreignObject>
<text x="90" y="195" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="17px" text-anchor="middle">
输入
</text>
</switch>
</g>
<path d="M 90 390 L 90 423.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 90 428.88 L 86.5 421.88 L 90 423.63 L 93.5 421.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="35" y="280" width="110" height="110" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 108px; height: 1px; padding-top: 335px; margin-left: 36px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
输出
</div>
</div>
</div>
</foreignObject>
<text x="90" y="340" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="17px" text-anchor="middle">
输出
</text>
</switch>
</g>
<ellipse cx="90" cy="470" rx="60" ry="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 470px; margin-left: 31px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 17px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
结束
</div>
</div>
</div>
</foreignObject>
<text x="90" y="475" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="17px" text-anchor="middle">
结束
</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">
Text is not SVG - cannot display
</text>
</a>
</switch>
</svg>

Before

Width:  |  Height:  |  Size: 7.5 KiB

119
mty.md

@ -0,0 +1,119 @@
//1 函数功能输入n个学生的m门课成绩
void ReadScore(STU stu[], int n, int m)
//2 函数功能:计算每个学生各门课程的总分和平均分
void AverSumofEveryStudent(STU stu[], int n, int m)
//3 函数功能:计算每门课程的总分和平均分
void AverSumofEveryCourse(STU stu[], int n, int m)
//4 函数功能按选择法将数组sum的元素值排序
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b))
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
}
if (k != i)
{
for (t=0; t<m; t++) // m
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum); // 交换总分
SwapFloat(&stu[k].aver, &stu[i].aver); // 交换平均分
SwapLong(&stu[k].num, &stu[i].num); // 交换学号
SwapChar(stu[k].name, stu[i].name); // 交换姓名
}
}
}
// 5使数据按升序排序
int Ascending(float a, float b)
// 6使数据按降序排序
int Descending(float a, float b)
// 7交换两个单精度浮点型数据
void SwapFloat(float *x, float *y)
// 8交换两个长整型数据
void SwapLong(long *x, long *y)
{
long temp;
temp = *x;
*x = *y;
*y = temp;
}
// 交换两个字符串
void SwapChar(char x[], char y[])
{
char temp[MAX_LEN];
strcpy(temp, x);
strcpy(x, y);
strcpy(y, temp);
}
// 9交换两个字符串
void SwapChar(char x[], char y[])
// 10函数功能按选择法将数组num的元素值按从低到高排序
// 11函数功能交换法实现字符串按字典顺序排序
void SortbyName(STU stu[], int n, int m)
// 12函数功能按学号查找学生成绩并显示查找结果
void SearchbyNum(STU stu[], int n, int m)
{
long number;
int i, j;
printf("Input the number you want to search:");
scanf("%ld", &number);
/* ---------- begain ---------- */
/* ----------- end ----------- */
printf("\nNot found!\n");
}
// 13函数功能按姓名的字典顺序排出成绩表
void SearchbyName(STU stu[], int n, int m)
// 14函数功能统计各分数段的学生人数及所占的百分比
void StatisticAnalysis(STU stu[], int n, int m)
// 15函数功能 打印学生成绩
// 16输出n个学生的学号、姓名及m门课程的成绩到文件student.txt中
void WritetoFile(STU stu[], int n, int m)
{
FILE *fp;
int i, j;
if ((fp = fopen("student.txt","w")) == NULL)
{
printf("Failure to open score.txt!\n");
exit(0);
}
fprintf(fp, "%d\t%d\n", n, m); //将学生人数和课程门数写入文件
for (i=0; i<n; i++)
{
fprintf(fp, "%10ld%10s", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
fprintf(fp, "%10.0f", stu[i].score[j]);
}
fprintf(fp, "%10.0f%10.0f\n", stu[i].sum, stu[i].aver);
}
fclose(fp);
}
//17从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组stu中
void ReadfromFile(STU stu[],int *n, int *m)

@ -0,0 +1,27 @@
// 函数功能:按学号查找学生成绩并显示查找结果
void SearchbyNum(STU stu[], int n, int m)
{
long number;
int i, j;
printf("Input the number you want to search:");
scanf("%ld", &number);
/* ---------- begain ---------- */
for(i=0;i<n;i++)
{
if (stu[i].num==number)
{
printf("%ld\t%s\t", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
printf("%.0f\t", stu[i].score[j]);
}
printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
return;
}
/* ----------- end ----------- */
printf("\nNot found!\n");
}
}

@ -0,0 +1,24 @@
// 函数功能按选择法将数组sum的元素值排序
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b))
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
}
if (k != i)
{
for (t=0; t<m; t++) // m
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum); // 交换总分
SwapFloat(&stu[k].aver, &stu[i].aver); // 交换平均分
SwapLong(&stu[k].num, &stu[i].num); // 交换学号
SwapChar(stu[k].name, stu[i].name); // 交换姓名
}
}
}

@ -0,0 +1,8 @@
// 交换两个长整型数据
void SwapLong(long *x, long *y)
{
long temp;
temp = *x;
*x = *y;
*y = temp;
}

@ -1,3 +1,4 @@
<<<<<<< HEAD
C1: 启动程序
命令行中执行命令./app,系统启动,显示提示信息,然后显示功能菜单,等待用户输入命令。
@ -36,4 +37,401 @@ C2: 显示命令菜单
12 写入文件
13 读取文件
0 退出
请输入你的选择:
请输入你的选择:
=======
# System
#学生成绩管理系统代码
## 多个函数的使用
## 利用结构体
下面是代码库
````c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 10 // 字符串最大长度
#define STU_NUM 30 // 最多的学生人数
#define COURSE_NUM 6 // 最多的考试科目数
typedef struct student
{
long num; // 每个学生的学号
char name[MAX_LEN]; // 每个学生的姓名
float score[COURSE_NUM]; // 每个学生COURSE_NUM门功课的成绩
float sum; // 每个学生的总成绩
float aver; // 每个学生的平均成绩
}STU;
int Menu(void);
void ReadScore(STU stu[], int n, int m);
void AverSumofEveryStudent(STU stu[], int n, int m);
void AverSumofEveryCourse(STU stu[], int n, int m);
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b));
int Ascending(float a, float b);
int Descending(float a, float b);
void SwapFloat(float *x, float *y);
void SwapLong(long *x, long *y);
void SwapChar(char x[], char y[]);
void AsSortbyNum(STU stu[], int n, int m);
void SortbyName(STU stu[], int n, int m);
void SearchbyNum(STU stu[], int n, int m);
void SearchbyName(STU stu[], int n, int m);
void StatisticAnalysis(STU stu[], int n, int m);
void PrintScore(STU stu[], int n, int m);
void WritetoFile(STU record[], int n, int m);
void ReadfromFile(STU record[], int *n, int *m);
int main(void)
{
char ch;
int n = 0, m = 0;
STU stu[STU_NUM];
printf("Input student number(n<%d):", STU_NUM);
scanf("%d", &n);
printf("Input course number(m<=%d):",COURSE_NUM);
scanf("%d", &m);
while (1)
{
ch = Menu(); // 显示菜单,并读取用户输入
switch (ch)
{
case 1:ReadScore(stu, n, m);
break;
case 2: AverSumofEveryCourse(stu, n, m);
break;
case 3: AverSumofEveryStudent(stu, n, m);
break;
case 4: SortbyScore(stu, n, m, Descending);
printf("\nSort in descending order by score:\n");
PrintScore(stu, n, m);
break;
case 5: SortbyScore(stu, n, m, Ascending);
printf("\nSort in ascending order by score:\n");
PrintScore(stu, n, m);
break;
case 6: AsSortbyNum(stu, n, m);
printf("\nSort in ascending order by number:\n");
PrintScore(stu, n, m);
break;
case 7: SortbyName(stu, n, m);
printf("\nSort in dictionary order by name:\n");
PrintScore(stu, n, m);
break;
case 8: SearchbyNum(stu, n, m);
break;
case 9: SearchbyName(stu, n, m);
break;
case 10: StatisticAnalysis(stu, n, m);
break;
case 11:PrintScore(stu, n, m);
break;
case 12:WritetoFile(stu, n, m);
break;
case 13:ReadfromFile(stu, &n, &m);
break;
case 0: printf("End of program!");
exit(0);
default:printf("Input error!");
}
}
return 0;}
// 函数功能:显示菜单并获得用户键盘输入的选项
int Menu(void)
{
int itemSelected;
printf("Management for Students' scores\n");
printf("1.Input record\n");
printf("2.Calculate total and average score of every course\n");
printf("3.Calculate total and average score of every student\n");
printf("4.Sort in descending order by score\n");
printf("5.Sort in ascending order by score\n");
printf("6.Sort in ascending order by number\n");
printf("7.Sort in dictionary order by name\n");
printf("8.Search by number\n");
printf("9.Search by name\n");
printf("10.Statistic analysis\n");
printf("11.List record\n");
printf("12.Write to a file\n");
printf("13.Read from a file\n");
printf("0.Exit\n");
printf("Please Input your choice:");
scanf("%d", &itemSelected); // 读入用户输入
return itemSelected;
}
//1 函数功能输入n个学生的m门课成绩
void ReadScore(STU stu[], int n, int m)
{
int i, j;
printf("Input student's ID, name and score:\n");
for(i=0;i<n;i++)
{scanf("%ld%s",&stu[i].num,stu[i].name);
for (j=0; j<m; j++)
scanf("%f",&stu[i].score[j]);
}
}
//2 函数功能:计算每个学生各门课程的总分和平均分
void AverSumofEveryStudent(STU stu[], int n, int m)
{
int i, j;
for (i=0; i<n; i++)
{
stu[i].sum = 0;
for (j=0; j<m; j++)
{
stu[i].sum = stu[i].sum + stu[i].score[j];
}
stu[i].aver = m>0 ? stu[i].sum / m : -1;
printf("student %d: sum = %.0f, aver = %.0f\n",
i+1, stu[i].sum, stu[i].aver);
}
}
//3 函数功能:计算每门课程的总分和平均分
void AverSumofEveryCourse(STU stu[], int n, int m)
{
int i, j;
float sum[COURSE_NUM], aver[COURSE_NUM];
for (j=0; j<m; j++)
{
sum[j] = 0;
for (i=0; i<n; i++)
{
sum[j] += stu[i].score[j];
}
aver[j]=sum[j]/i;
printf("student %d: sum = %.0f, aver = %.0f\n",
j+1, sum[j], aver[j]);
}
}
//4 函数功能按选择法将数组sum的元素值排序
void SortbyScore(STU stu[],int n,int m,int (*compare)(float a,float b))
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
}
if (k != i)
{
for (t=0; t<m; t++) // m
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum); // 交换总分
SwapFloat(&stu[k].aver, &stu[i].aver); // 交换平均分
SwapLong(&stu[k].num, &stu[i].num); // 交换学号
SwapChar(stu[k].name, stu[i].name); // 交换姓名
}
}
}
// 5使数据按升序排序
int Ascending(float a, float b)
{
return a < b; // a<b
}
// 6使数据按降序排序
int Descending(float a, float b)
{
return a > b;
}
// 7交换两个单精度浮点型数据
void SwapFloat(float *x, float *y)
{
float temp;
temp = *x;
*x = *y;
*y = temp;
}
// 8交换两个长整型数据
void SwapLong(long *x, long *y)
{
long temp;
temp = *x;
*x = *y;
*y = temp;
}
// 9交换两个字符串
void SwapChar(char x[], char y[])
{
char temp[MAX_LEN];
strcpy(temp, x);
strcpy(x, y);
strcpy(y, temp);
}
// 10函数功能按选择法将数组num的元素值按从低到高排序
void AsSortbyNum(STU stu[], int n, int m)
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
K=i;
for(j=i+1;j<10;j++)
{
if((*compare)(stu[k]num.stu[j].num)) k=j;}
if(k!=i)
{t=stu[i].num;stu[i].num=stu[k].num;stu[k].num=t;}
}
}
// 11函数功能交换法实现字符串按字典顺序排序
void AsSortbyNum(STU stu[], int n, int m)
{
int i, j, k, t;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i+1; j<n; j++)
{
if (stu[j].num < stu[k].num) k = j;
}
if (k != i)
{
for (t=0; t<m; t++)
{
SwapFloat(&stu[k].score[t], &stu[i].score[t]);
}
SwapFloat(&stu[k].sum, &stu[i].sum);
SwapFloat(&stu[k].aver, &stu[i].aver);
SwapLong(&stu[k].num, &stu[i].num);
SwapChar(stu[k].name, stu[i].name);
}
}
}
// 12函数功能按学号查找学生成绩并显示查找结果
void SearchbyNum(STU stu[], int n, int m)
{
long number;
int i, j;
printf("Input the number you want to search:");
scanf("%ld", &number);
for(i=0;i<n;i++)
{
if (stu[i].num==number)
{
printf("%ld\t%s\t", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
printf("%.0f\t", stu[i].score[j]);
}
printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
return;
}
printf("\nNot found!\n");
}
}
// 13函数功能按姓名的字典顺序排出成绩表
void SearchbyName(STU stu[], int n, int m)
{
char x[MAX_LEN];
int i, j;
printf("Input the name you want to search:");
scanf("%s", x);
for (i=0; i<n; i++)
{
if (strcmp(stu[i].name, x) == 0)
{
printf("%ld\t%s\t", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
printf("%.0f\t", stu[i].score[j]);
}
printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
return;
}
}
printf("\nNot found!\n");
}
// 14函数功能统计各分数段的学生人数及所占的百分比
void StatisticAnalysis(STU stu[], int n, int m)
{
int i, j, t[6];
for (j=0; j<m; j++)
{
printf("For course %d:\n", j+1);
memset(t, 0, sizeof(t));
for (i=0; i<n; i++)
{
if (stu[i].score[j]>=0 && stu[i].score[j]<60)t[0]++;
else if (stu[i].score[j]<70) t[1]++;
else if (stu[i].score[j]<80) t[2]++;
else if (stu[i].score[j]<90) t[3]++;
else if (stu[i].score[j]<100) t[4]++;
else if (stu[i].score[j] == 100) t[5]++;
}
for (i=0; i<=5; i++)
{
if (i==0) printf("<60\t%d\t%.2f%%\n",t[i],(float)t[i]/n*100);
else if (i==5) printf("%d\t%d\t%.2f%%\n",
(i+5)*10,t[i],(float)t[i]/n*100);
else printf("%d-%d\t%d\t%.2f%%\n",
(i+5)*10, (i+5)*10+9, t[i], (float)t[i]/n*100);
}
}
}
// 15函数功能 打印学生成绩
void PrintScore(STU stu[], int n, int m)
{
int i, j;
for (i=0; i<n; i++)
{
printf("%ld\t%s\t", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
printf("%.0f\t", stu[i].score[j]);
}
printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
}
}
// 16输出n个学生的学号、姓名及m门课程的成绩到文件student.txt中
void WritetoFile(STU stu[], int n, int m)
{
FILE *fp;
int i, j;
if ((fp = fopen("student.txt","w")) == NULL)
{
printf("Failure to open score.txt!\n");
exit(0);
}
fprintf(fp, "%d\t%d\n", n, m); //将学生人数和课程门数写入文件
for (i=0; i<n; i++)
{
fprintf(fp, "%10ld%10s", stu[i].num, stu[i].name);
for (j=0; j<m; j++)
{
fprintf(fp, "%10.0f", stu[i].score[j]);
}
fprintf(fp, "%10.0f%10.0f\n", stu[i].sum, stu[i].aver);
}
fclose(fp);
}
//17从文件中读取学生的学号、姓名及成绩等信息写入到结构体数组stu中
void ReadfromFile(STU stu[],int *n, int *m)
{
FILE *fp;
int i, j;
if ((fp = fopen("student.txt","r")) == NULL)
{
printf("Failure to open score.txt!\n");
exit(0);
}
fscanf(fp, "%d\t%d", n, m); // 从文件中读出学生人数和课程门数
for (i=0; i<*n; i++) //学生人数保存在n指向的存储单元
{
fscanf(fp, "%10ld", &stu[i].num);
fscanf(fp, "%10s", stu[i].name);
for (j=0; j<*m; j++)//课程门数保存在m指向的存储单元
{
fscanf(fp, "%10f", &stu[i].score[j]); //不能用%10.0f
}
fscanf(fp, "%10f%10f", &stu[i].sum, &stu[i].aver);//不能用%10.0f
}
fclose(fp);
}
````
>>>>>>> master

@ -0,0 +1,11 @@
#### C1: 启动程序
输入n个学生的m门课成绩
```
库存管理系统启动
1 读取 | 2 保存 | 3 打印 | 4 查询 | 5 添加
6 修改 | 7 删除 | 8 排序 | 9 图表 | 0 退出
请选择:
```

@ -0,0 +1 @@
/* I love China*/

22
z11

@ -0,0 +1,22 @@
// 11函数功能交换法实现字符串按字典顺序排序
void SortbyName(STU stu[], int n, int m)
{
int i, j, t;
for (i = e; i <n - 1; i++)
{
for (j = i + 1; j <n; j++)
{
if (strcmp(name[j],name[i]) < 0)
{
for (t =e; t<m;t++) /*交换m门课程的成绩*/
{
SwapFloat(&score[i][t]&score[j][t]);
}
SwapFloat(&sum[i]&sum[j]); /*交换总分*/
SwapFloat(&aver[i]&aver[j]); /*交换平均分 */
SwapLong(&num[i]&num[j]); /*交换学号 */
SwapChar(name[i]name[j]); /*交换姓名 */
}
}
}
}

11
z15

@ -0,0 +1,11 @@
// 15函数功能 打印学生成绩
void Printscore(STU stu[],int n, int m)
{int i, j;
for (i = e; i < n; i++)
{
printf("%ld\t%s\t",num[i],name[i]);
for (j = e; j < m; j++)
{
printf("%.ef\t", score[i][j]);}
printf("%.ef\t%.ef\n"sum[i],aver[i]);}
}

12
z3

@ -0,0 +1,12 @@
// 3函数功能:计算每门课程的总分和平均分
void AverSumofEveryCourse(STU stu[], int n, int m){
int i, j;
float sum[COURSE NUM], aver[COURSE_NUM];/* ---------- begain -----_-___ */ for (j=0; j<m; j++){
sum[j] = 0;
for (i=0; i<n; i++){
sum[j] += stu[i].score[j];}
aver[j]=sum[j]/i;
printf("student %d: sum = %.0f, aver = %.0f\n",
j+1 sum[j]aver[j]);
}
* end --________ */

8
z5

@ -0,0 +1,8 @@
// 7交换两个单精度浮点型数据
void SwapFloat(float *x, float *y)
{
float temp;
temp = *x;
*x = *y;
*y = temp;
}
Loading…
Cancel
Save