> # ♻️ 资源
> **大小:** 19.9KB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010227**](https://www.yuque.com/sxbn/ks/100010227)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87354164**](https://download.csdn.net/download/s1t16/87354164)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 学生管理系统
## 整体思路:
用单向链表实现学生管理系统,通过 malloc 动态分配内存。主要完成的是对学生成绩的录入以及对学生数据的修改,增添,删除,查看,对学生的成绩进行单科排序,对学生的整体成绩进行排序并生成成绩单。
## 具体步骤:
以下以 c 为例
1:通过 Creat 函数对学生的数据进行录入。
```c
void Creat(Node *List, int people_sum); //实现对链表的创建和链接
```
2:通过 Check1 函数对单独的一个学生的成绩进行单独查看
```c
void Check1(Node *List); //查看一名同学的整体成绩
```
3:通过 View 函数对单独的一个学科的整体成绩进行查看
```c
void View(Node *List); //对班级里面的具体科目成绩进行查看
```
4:同过 Set 函数对学生成绩的标准进行设立(优秀,及格,不及格)并对不及格的成绩进行统计。
```c
void Set(Node *List); //对各科的标准进行设立
```
5:通过 Check2 函数来查看不及格超过两科的学生都有谁
```c
void Check2(Node *List); //查看挂科超过两科的同学有哪些
```
6:通过 Delete 函数对学生的数据进行删除
```c
void Delete(Node *List); //对某位同学的数据进行删除
```
7:通过 Insert 函数来增添学生的数据
```c
void Insert(Node *List); //将某个同学的数据进行插入
```
8:通过 Revise 函数对学生的数据进行修改
```c
void Revise(Node *List); //对某个同学的数据进行修改
```
9:通过 Generate 函数对学生的整体成绩进行排名,并生成成绩单
```c
void Generate(Node *List); //对学生的总体成绩进行排名并汇总成成绩单
```
10:退出程序
## 具体流程图
![8fa833e4d955511de3fce54e5450be6d.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705978608105-c40d7294-0cb1-451f-9356-8af29888e220.png#averageHue=%23f5f5f5&clientId=udd5c0208-00e4-4&from=paste&height=642&id=u5e3ee60e&originHeight=803&originWidth=1049&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=64712&status=done&style=none&taskId=uc59e550a-ffb8-48c3-9053-f893fb96a3f&title=&width=839.2)
## 对文件的分离操作
main.cpp 负责主函数和基本框架
list.cpp 和 list.h 负责对链表进行操作以及函数的声明
struct.h 负责对结构体进行声明
## 需要注意的事项:
1.在指针变量进去函数之前要对指针变量进行判定,判定该指针是否为无效指针
2.用 malloc 分配内存之后要对分配内存是否成功进行判定,如果没有分配成功则结束程序
3.删除函数在进行时要考虑特殊情况(如果将第一个数据删除就要判断当前遍历到的数据的前一个数据是否为空)
4.在排序函数中对数据进行交换不能直接将地址进行交换(因为链表存在链接的关系)因此要对数据进行交换
5.对字符串输入要用 fgets 函数防止造成缓冲区溢出和数组越界的现象发生(当然在输入字符串没有空格的情况下也可以用 %20s 对输入的字符进行限制也可以防止缓冲区溢出)。其次是当 fgets 函数读入的数据小于 len-1 是会保留换行符,因此还需要对该函数进行设计从头遍历对末尾的换行符进行处理
代码实现(参考 c primer plus)
```c
char *s_gets (char *st , int n)
{
char *ret_val;
int i=0;
ret_val = fgets(st , n , stdin); //防止缓冲区溢出
if (ret_val)
{
while(st[i] != '\n' && st[i] != '\0')
i++;
if(st[i] == '\n') //将结尾的换行符改成'\0'
st[i] = '\0';
else
while(getchar() != '\n')
continue;
}
return ret_val;
}
```
6.在读取整形变量之后还要查看后面有没有进行读取字符或者字符串的操作,如果有要刷新缓冲区或用 getchar()读取换行符,防止换行符进入下一个字符串的读入。
7.最后还要记住将该程序申请的内存进行释放
对于一些核心的代码进行一些介绍
对于一个学生管理系统来说最重要的便是对学生的成绩进行排序,这也是我完成整个学生管理系统思考最多的地方,对于排序的算法来说就有许多种,最后我选择了"选择排序",首先它是一个可以从头遍历到尾的排序,而且它传入的参数较少,因此使用起来相对容易一些。
代码实现
```c
for(Student *p = List->head ; p ;p = p->next)
{
for(Student *q = p->next ; q ; q = q->next)
{
//这里进行数据的比较和数据的交换
}
}
```
其实还可以对链表进行解链操作然后完成排序的,但由于解链操作需要知道两个交换数据的前驱节点和后继节点,因此用双向链表实现更加容易一些,单向链表较为复杂交换可以直接对数据进行交换而不解链就可以了。
还有就是该学生管理系统实现了对学生成绩单进行打印,这就需要对表格的空间进行计算了。对于名字来说可以用表格的空间减去名字字符串的长度就是剩余空格的长度了,而对于学生的成绩来说,首先这是一个整形变量并且这个整形变量可能是 1 位也可以是两位甚至更多,这就需要将整行变量转化为字符型对于 c 语言来说可以调用 c 函数 sprintf(string,"%d",n)进行转化然后进行和名字一样的操作就可以了
实现之后的效果就是这样了
![](https://www.writebug.com/myres/static/uploads/2022/1/19/14a7a093b536571b6b18625273cbe9ac.writebug#id=k1tQK&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)![14a7a093b536571b6b18625273cbe9ac.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705978656063-b5b528b2-0e8e-489f-b9ab-0adff7d30827.png#averageHue=%23141211&clientId=udd5c0208-00e4-4&from=paste&height=224&id=ekKvE&originHeight=280&originWidth=946&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=25144&status=done&style=none&taskId=u0d4b0f4d-d800-4843-935c-9d5a038e68d&title=&width=756.8)
该学生管理系统还对输入的用户以及输入的学生的信息进行了文件处理,将数据进行了保存。其中用户以文本的形式进行保存,学生的数据以二进制文件的形式进行了保存(二进制文件可以通过 Notepad++ 对文件进行打开,虽然什么也看不懂但能够说明数据确实保存了)
![51def0932afcdf11d82530aeef768e05.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705978673125-ac071b00-9dfe-4855-a3f3-866ca2d3c605.png#averageHue=%23d6d3d0&clientId=udd5c0208-00e4-4&from=paste&height=210&id=u3a864a03&originHeight=263&originWidth=955&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=40945&status=done&style=none&taskId=u9ab9481a-6c74-4ba0-8382-a7d03390d0f&title=&width=764)
还有一些对链表进行删除,添加,修改等基本操作。许多书籍以及网上的教程都进行了介绍,因此就不再进行赘述了
#### 以下为该学生管理系统的操作成果
这是用户的注册登录界面
![a5ee0009c899d45d14583e503bfefec2.
没有合适的资源?快使用搜索试试~ 我知道了~
基于C++实现(控制台)学生管理系统【100010227】
共9个文件
cpp:2个
go:2个
h:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 130 浏览量
2022-12-30
11:12:36
上传
评论
收藏 21KB RAR 举报
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010227 用单向链表实现学生管理系统,通过 malloc 动态分配内存。主要完成的是对学生成绩的录入以及对学生数据的修改,增添,删除,查看,对学生的成绩进行单科排序,对学生的整体成绩进行排序并生成成绩单。
资源推荐
资源详情
资源评论
收起资源包目录
100010227-基于C++实现(控制台)学生管理系统.rar (9个子文件)
stumanage-master
stumanage
LICENSE 10KB
c++_code
list.h 2KB
main.cpp 584B
list.cpp 21KB
struct.h 880B
go_code
list.go 13KB
main.go 659B
classes.py 11KB
README.md 11KB
共 9 条
- 1
资源评论
神仙别闹
- 粉丝: 2687
- 资源: 7649
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功