当前位置: 首页 > news >正文

基于C++实现(控制台)学生程序管理系统

♻️ 资源

大小:49.3KB

➡️资源下载:https://download.csdn.net/download/s1t16/87430324

学生程序管理系统

一、学生程序管理系统程序设计报告

团队成员:

黄继升

朱伯翰

完成时间 2019 年 12 月

二、学生成绩管理系统设计报告

2.1 人员组成及分工

2.1.1 人员组成及分工

2.2 开发背景

为了更好的了解学生的学习情况,以对学生进行更详细的了解,对未来的教学有相应的规划,同时为了便于期末总结,我们设计了一套学生成绩管理系统。

在本次课程设计中,操作者根据清单上的提示对于不同的学生进行分数的录入、修改、查询以及获取相应的统计结果,并支持数据的输出。

2.3 系统功能设计

2.3.1 系统功能模块图

图 3-1 系统功能模块图

2.3.2 系统业务流程图

图 3-2 业务流程图

2.4 项目创建

2.4.1 系统开发环境要求

本项目的开发及运行环境要求:

  • 操作系统:windows 7, windows 10
  • 开发工具:Code Blocks 17.12, Visual Studio Code
  • 开发语言:C 语言

2.4.2 项目创建过程

打开 Code Block

图 4-1 Code Block 使用界面

2.4.2 点击“open an existing project”,并选中“Console application”

图 4-2 工程创建界面

选择 C,并点击 next

图 4-3 创建 C 工程

填写项目名称以及路径。

图 4-4 填写项目名称和工程路径

直点击 next 默认配置,最后点击 Finish 完成工程创建。

图 4-4 完成工程创建

点击 File->Empty file,创建并命名第一个 C 文件并编写代码

图 4-4 创建 C 文件

2.5 预处理模块设计

2.5.1 文件引用

# include <stdio.h> # include <string.h> # include <math.h> # include <malloc.h> # include <stdlib.h>

2.5.2 宏定义

# define true 1 # define false 0 # define MAX_LEN 12 /* 字符串最大长度 */ # define STU_NUM 30 /* 最大的学生人数 */ # define COURSE_NUM 6 /* 最大的考试科目数 */ # define LEN sizeof(struct Student) /* 学生结构体所占的字节大小*/

2.5.3 定义全局变量

int n, m; //输入的学生人数以及考试科目数 int i; //输入菜单选项编号 STU *head; //定义内存中的学生链表头节点

2.5.4 函数声明

  • void Print(STU *head, int n, int m)
  • 输入参数:学生链表,学生数,考试科目数量
  • 输出参数:null
  • 实现功能:输出链表中所有节点
  • void AverSumofEveryStudent(STU *head)
  • 输入参数:学生链表
  • 输出参数:null
  • 实现功能:计算每门课程的总分和平均分
  • void AverSumofEveryCourse(STU *head)
  • 输入参数:学生链表
  • 输出参数:null
  • 实现功能:计算每个学生的总分和平均分
  • void StatisticAnalysis(STU *head, int n, int m)
  • 输入参数:学生链表,学生数,考试科目数量
  • 输出参数:null
  • 实现功能:按类别及比例输出
  • STUSortbyScore(STUhead, int n)

输入参数:学生链表,学生数

输出参数:学生链表头结点

  • 实现功能:按每个学生的总分由高到低排出名次表
  • STUSortbyScore1(STUhead, int n)
  • 输入参数:学生链表,学生数
  • 输出参数:学生链表头结点
  • 实现功能:按每个学生的总分由低到高排出名次表
  • STUSortbyNum(STUhead)

输入参数:学生链表

输出参数:学生链表头结点

  • 实现功能:按学号由小到大排出成绩表
  • STUSortbyName(STUhead, int n)

输入参数:学生链表,学生数,考试科目数量

输出参数:学生链表头结点

  • 实现功能:按姓名的字典顺序排出成绩表
  • STU *Create(int n, int m)
  • 输入参数:学生数,考试科目数量
  • 输出参数:学生链表头结点
  • 实现功能:创建链表并录入信息
  • void SearchbyNum(STU *head, int n, int m)

输入参数:学生链表,学生数,考试科目数量

输出参数:null

  • 实现功能:按学号查询学生排名及其考试成绩
  • void SearchbyName(STU *head, int n, int m)

输入参数:学生链表,学生数,考试科目数量

输出参数:null

  • 实现功能:按姓名查询学生排名及其考试成绩
  • void WritetoFile(STU *head, int n, int m)

输入参数:学生链表,学生数,考试科目数量

输出参数:null

  • 实现功能:将每个学生的纪录信息写入文件
  • STUReadfromFile(STUhead, intn, intm)

输入参数:学生链表,学生数,考试科目数量

输出参数:学生链表头结点

  • 实现功能:从文件中读出每个学生的纪录信息并显示
  • int DeleteFromFile(STUhead, intn, int *m);

输入参数:学生链表,学生数,考试科目数量

输出参数:不存在数据或没有数据返回 0,成功删除返回 1

  • 实现功能:物理删除(删除在文件中的数据)
  • STUgetAllMessageFromFile(STUhead, int count0[], int count1[], int *count2)

输入参数:学生链表,学生数,考试科目数量

输出参数:学生链表头结点

  • 实现功能:获取文件中所有的学生成绩数据,并组成单链表
  • STUModifyScore(STUhead)

输入参数:学生链表,学生数,考试科目数量

输出参数:学生链表头结点

  • 实现功能:用于修改学生某个科目的成绩信息

2.6 模块详细设计

2.6.1 成绩录入模块

2.6.2 录入新的学生成绩记录(临时区)

  • 功能描述:用户在系统主界面输入数字 “1” ,进入录入成绩功能,根据提示依次输入学生数量、考试科目数量,并依次输入每个学生的学号、姓名和各科成绩,最后按下回车将成绩提交到临时区。
  • 算法流程:

  • 相关函数:
int Menu(void); //函数1:创建菜单函数 STU *Create(int n, int m); //函数10:创建链表并录入信息
  • 测试结果:

2.6.3 将临时区数据保存到文件中

  • 功能描述:用户在系统主界面输入数字 “12” ,即可将临时区的学生成绩信息保存到 student.txt 文件中
  • 算法流程:

  • 相关函数
void WritetoFile(STU *head, int n, int m); //函数13:将每个学生的纪录信息写入文件
  • 测试结果

2.6.4 成绩导出模块

2.6.5 导出未保存的学生成绩信息(临时区)

  • 功能描述:用户在系统主界面输入数字 “11” ,进入临时区数据导出模块,此时界面会输出仍未保存的学生成绩数据,或临时区没有数据的提示信息。
  • 算法流程:

  • 相关函数:
void Print(STU *head, int n, int m); //函数2:打印函数
  • 测试结果

2.6.6 导出已保存的学生成绩信息(文件)

  • 功能描述:用户在系统主界面输入数字 “12” ,进入文件数据导出模块,此时界面会输出保存在 student.txt 的所有学生成绩。如果文件不存在或没有数据,则会输出 “student.txt 不存在或没有数据"的提示信息。
  • 算法流程:

  • 相关函数:
STU *ReadfromFile(STU *head, int *n, int *m); //函数14:从文件中读出每个学生的纪 录信息并显示 void Print(STU *head, int n, int m); //函数2:打印函数void Print(STU *head, int n, int m);
  • 测试结果:

2.6.7 排序模块

根据成绩总分的升序、降序进行排序

  • 功能描述:用户在系统主界面输入“4”进入降序排列,输入“5”进入升序排列。
  • 算法流程:首先调用 getAllMessageFromFile 函数从文件读取已经存入的信息,获得链表的头结点,再遍历链表,将总分作为对比依据进行冒泡排序,最后输出。
  • 相关函数:
  • STUSortbyScore(STUhead, int n); //函数 6:按每个学生的总分由高到低排出名次表
  • STUSortbyScore1(STUhead, int n); //函数 7:按每个学生的总分由低到高排出名次表
  • 测试结果:

根据学号的升序进行排序

  • 功能描述:用户在系统主界面输入“6”进入。
  • 算法流程:首先调用 getAllMessageFromFile 函数从文件读取已经存入的信息,获得链表的头结点,再遍历链表,将学号作为对比依据进行冒泡排序,最后输出。
  • 相关函数:与 7.1 的算法相似
  • 测试结果:

根据学生姓名的字典序进行排序

  • 功能描述:用户在系统主界面输入“7”进入。
  • 算法流程:首先调用 getAllMessageFromFile 函数从文件读取已经存入的信息,获得链表的头结点,再遍历链表,将姓名首字母的字典序作为对比依据进行冒泡排序,最后输出。
  • 相关函数:
  • STUSortbyNum(STUhead); //函数 8:按学号由小到大排出成绩表
  • 测试结果:

2.7 UI 界面设计模块

功能描述:展示操作界面

算法流程:

主界面根据序号展示相关操作,使用*作为边框

具体操作界面首先清屏,以实现更加简洁的展示便于操作,并使用*号分割

相关函数:

int Menu(void); //函数 1:创建菜单函数

测试结果:

2.8 条件查询模块

2.8.1 按学生学号查询排名及其考试成绩

  • 功能描述:用户在系统主界面输入数字 “8” ,进入按学生学号查询排名及其考试成绩,此时按照界面提示输入查询的学号。如果学号不存在或 student.txt 没有数据,则会输出 “抱歉,没有找到相关记录"的提示信息。
  • 算法流程:

  • 相关函数:
//函数11:按学号查询学生排名及其考试成绩 void SearchbyNum(STU *head, int n, int m); //函数16:获取文件中所有的学生成绩数据,并组成单链表 STU *getAllMessageFromFile(STU *head, int count0[], int count1[], int *count2);
  • 测试结果

2.8.2 按学生姓名查询排名及其考试成绩

  • 功能描述:用户在系统主界面输入数字 “9” ,进入按学生学号查询排名及其考试成绩,此时按照界面提示输入查询的姓名。如果学号不存在或 student.txt 没有数据,则会输出 “抱歉,没有找到相关记录"的提示信息。
  • 算法流程:

  • 相关函数:
//函数12:按姓名查询学生排名及其考试成绩 void SearchbyName(STU *head, int n, int m); //函数2:打印函数 void Print(STU *head, int n, int m);
  • 测试结果:

2.9 成绩修改模块

  • 功能描述:用户在系统主界面输入数字 “16” ,此时按照界面提示,输入即将修改的记录所对应的学号。如果学号不存在,则会输出 “抱歉,没有找到相关记录"的提示信息。否则,系统会打印出该学号对应的成绩记录并提示你需要修改的是学号、姓名还是科目成绩。如果是学号,则输入新的学号进行提交;如果是姓名,则输入新的姓名并进行提交;如果是科目成绩,则先输入是该科目的序号,再输入新的分数进行提交。
  • 算法流程:

  • 相关函数
//函数17 用于修改学生成绩信息 STU *ModifyScore(STU *head); //函数16:获取文件中所有的学生成绩数据,并组成单链表 STU *getAllMessageFromFile(STU *head, int count0[], int count1[], int *count2);
  • 测试结果

2.10 成绩删除

  • 功能描述:用户在系统主界面输入数字 “15” ,此时按照界面提示,输入即将删除的记录所对应的学号。如果学号不存在,则会输出 “抱歉,没有找到相关记录"的提示信息。否则,系统将会删除文件中该学号所在的成绩记录,并打印出删除成功的提示。
  • 算法流程:

  • 相关函数:
//函数15: 物理删除(删除在文件中的数据) int DeleteFromFile(STU *head, int *n, int *m);
  • 测试结果:

2.11 成绩统计计算

2.11.1 计算并输出每门课程的总分和平均分

  • 功能描述:用户在系统主界面输入数字 “2” ,系统会输出每一门课程的所有学生的总分和平均分
  • 算法流程:

  • 相关函数:

函数 3:计算每门课程的总分和平均分

void AverSumofEveryStudent(STU *head); //函数16:获取文件中所有的学生成绩数据,并组成单链表 STU *getAllMessageFromFile(STU *head, int count0[], int count1[], int *count2);
  • 测试结果

2.11.2 计算并输出每位学生的总分和平均分

  • 功能描述:用户在系统主界面输入数字 “3” ,系统会输出每一门课程的所有学生的总分和平均分
  • 算法流程:

  • 相关函数:
//函数4:计算每个学生的总分和平均分 void AverSumofEveryCourse(STU *head); //函数16:获取文件中所有的学生成绩数据,并组成单链表 STU *getAllMessageFromFile(STU *head, int count0[], int count1[], int *count2);
  • 测试结果:

2.11.3 对每门课程的成绩情况进行分段统计

  • 功能描述:用户在系统主界面输入数字 “10” ,系统会输出按课程得分为 100、90~99、80~ 89、70~79、60~69 和不及格学生的人数,以及所占百分比
  • 算法流程:

  • 相关函数:
//函数5:按类别及比例输出 void StatisticAnalysis(STU *head, int n, int m); //函数16:获取文件中所有的学生成绩数据,并组成单链表 STU *getAllMessageFromFile(STU *head, int count0[], int count1[], int *count2);
  • 测试结果:

2.12 项目创新点

该项目的亮点在于:之前对学生的成绩进行各种条件的排序时,由于单链表不像数组那样,可以从后往前进行遍历(注:一开始没有专门去设置尾指针,所以前面已经写好的代码比较多,后面也不好为了增加个尾指针而进行更改),因此为了能够对单链表引入快速排序算法,提高排序效率,所以我们的具体思路如下:

两个指针 p、q 都从头结点开始往后遍历, 开始的时候 p 指针指向头结点(key), q 指针指向 p 的下一个结点, q 指针从前往后查找比 key 值小的元素, 当 q 指针遇到比 key 值小的元素的时候, p 前进一位, 交换 p、q 指向的元素, 如果 q 指针遇到的元素比 key 大, 则 p 指针不动, q 指针继续向前查找, 直到 q 指针查找到链表末端. 显然 q 指针比 p 指针移动速度快, 这就保证了 p 指针前面的元素都比 key 小, 此时 p 指针指向的位置就是 key 对应的元素在排序后的正确位置, 也就是 partition 的位置, 因此交换 key 对应的元素与 p 指针当前指向的元素, 并以此位置作为 partition 的临界点。

2.13 收获和建议

黄继升:这学期的程序实践课程设计,我们小组决定做一个学生成绩管理系统。自大一大二上完数据结构以及操作系统等课程之后,便很少继续深入 C 语言的学习,平时用的较多的是其他编程语言,因此通过这次大作业我们又重新对 C 语言进行了一次比较系统的复习,重点是指针、链表和文件 I/O 这一块,是 C 语言重点和难点,同时经过这次课程设计的开发,加深了对这一块内容的理解。

但是由于时间关系,最后的成果没能做到尽善尽美,该有的 bug 也没有能够消除:比如一次性录入超过 10 位学生,在写入到文件之前,打印出这 10 位学生的信息时最后两位学生的总分和平均分会出现一堆数字,可是写到文件里再读出却是正常的,这一点真的很困惑,但最终也没有解决)。另外对学生成绩的修改采用的方法也比较极端,是通过先将文件信息全部读到内存,再进行修改,最后把修改结果重新覆盖源文件。这是我们这次开发存在的两个最大的不足之处,此外 UI 界面的设计也值得吐槽。但是通过这次开发我们小组也是重新对基础语言进行了一次系统的复习,虽然我现在基本用的都是 python 和 Java,但是这些编程语言的底层还是用 C/C++ 来实现的,对 C 语言基础的巩固将会有助于我今后对开发框架底层、JVM 和数据库等有更深的了解,让自己的知识积累更加丰富。

朱伯翰:这次的小组作业是建立一个学生成绩管理系统,我和搭档掌握了从功能设计开始构思整体框架,掌握了数组,指针,链表,排序,文件 I/O 等相关原理以及程序的编写。期间,查阅了相关的书籍和资料,也阅读了一些 C 语言相关的经典书籍,获得了对 C 语言更深刻的理解。

程序的编写过程中难免会出现一些 bug,这也更利于去查找相关的资料以获得更官方和清晰的解释从而用最优的方法进行编写。比如,C 语言内部,数组的首地址是不可以被更改的,所以不能用赋值的方式去交换。这样的困难会让自己积累经验,对 C 语言的掌握更深。

http://www.gsyq.cn/news/1485741.html

相关文章:

  • MuleSoft企业级LLM编排:AI Orchestration实战指南
  • 155.纯代码自动化刷机工具|适配安卓全机型+苹果设备,支持SN/MAC校准写入
  • AI动态简报之技术前沿篇(2026.06.08)
  • 入行网安多年薪资不见涨?先看全等级薪资参考,再学高效逆袭策略
  • 从台湾到泰州:4000平米厂房背后的坚守,钰腾如何用笨功夫死磕品质?
  • 承重沙发脚生产厂商选哪家好 - 品牌推广大师
  • WinForms窗体缩放时控件自动等比适配的轻量封装类(含可运行示例)
  • 避坑指南:Logisim运算器(Arithmetic)级联时,那些容易搞错的进位/借位连接
  • 广州增城祖传老黄金回收攻略|无钢印、无票据变现估价避坑指南 - 行行星
  • Tadi 实验室:Splash 颜色格式助力颜色挑选,简单实现与多样应用
  • 如何用FlauBERT_small_cased快速实现法语文本特征提取?完整教程
  • 3分钟快速上手:免费音乐歌词批量下载器完整指南
  • 别再乱抛RuntimeException了!手把手教你设计一个实用的Java业务异常类(附完整代码)
  • Win10下用PHPStudy快速搭建PHP5.6.40环境,告别手动配置Apache的烦恼
  • 如何让老款Mac焕发新生:OpenCore Legacy Patcher完整使用指南
  • 解密三星固件加密机制:samloader背后的技术细节
  • 2026厂房暖通改造优选设计施工一体服务,缩短工期节约预算 - 品牌2026
  • MyBatis批量插入踩坑实录:从‘20分钟’优化到‘6秒’,我都经历了什么?
  • CANN矩阵乘与AllReduce融合算子
  • Maya glTF插件完整指南:3步将专业3D模型转换为Web标准格式
  • 即插即用AI记忆系统:零侵入兼容任意大模型
  • XHS-Downloader数据持久化架构深度解析:SQLite驱动的下载记录与元数据管理
  • 数字滤波器 C 语言实现大全
  • socplot足球数据可视化工具包:用Python快速画传球路线、压力热图和定制球场图
  • Kali渗透实战:从永恒之蓝漏洞到图形化桌面,手把手教你用xfreerdp连接靶机
  • 2026年甘肃旅行社推荐榜:本地人心中最靠谱的十大排名 - 资讯快报
  • 2026年6月劳力士中国区域官方售后服务体系升级优化专项核验报告 - 劳力士中国服务中心
  • Suncalc:如何轻松计算太阳和月亮位置的终极JavaScript指南
  • 如何快速上手Litematica:从安装到创建第一个Schematic
  • 宠物领养平台Java+Vue全栈项目包:含可运行源码、MySQL建库脚本与傻瓜式部署文档