基于C语言实现(控制台)学生成绩管理系统【100010051】

news2025/1/18 7:40:21

学生成绩管理系统

说明:

  • 注册密码:2014052421
  • 程序包含中文和特殊字符,在 Window 下需 ASCII 编码,不能 UTF-8 编码。
  • 程序对三个文件要求是文本文件,且 studata.txt 中包含中文字符,在 window 下也需要 ASCII 编码
  • studata.txt:学生数据文件,保存学生姓名学号成绩等信息
  • admintea.txt:教师登录文件,保存教师账号和密码
  • adminstu.txt:学生登录文件,保存学生账号和密码

功能展示与介绍

概述:

综合运用 C 语言基础知识,利用预处理、数据类型、自定义函数、结构体、链表、文件操作、WindowsAPI 等,初步实现了教师与学生两种操作模式下成绩的录入、修改、删除、查询、排序、保存,以及切换登陆模式、退出等功能,并且在修改、删除、查询、排序功能中可按照多种方式操作。如可根据姓名或名字对成绩进行修改、删除,查询可分为个人成绩查询,分数段查询与不及格成绩查询,排序功能实现按照学号、姓名、五门成绩、总分、绩点,可由大到小或由小到大进行排序。同时,本学生成绩管理系统使用 WindowAAPI 实现鼠标操作,告别繁琐笨重的键盘,以整齐的区域化布局提供用户友好的操作界面,既解决了由于键盘输入不合法造成的错误,又符合用户的使用习惯。

登录界面:

图为运行程序后的初始登录界面。可以选择教师或学生登录,教师权限较大,可进行所有操作。学生只提供查询功能。在登录之间必须注册账号,只有拥有注册密码的教师或同学才能注册账号。

注册与登录:

图进行教师注册,规定密码长度小于等于 15,程序内没有进行密码长度校验。若两次密码不一致,账号(工号)已经被注册或注册密码错误,则提示相关信息;登录成功,按任意键进入操作菜单

主界面:

在主操作菜单中,包含__录入成绩修改成绩删除成绩查询成绩成绩排序显示成绩保存成绩 七大功能,以及 退出登录 退出系统__两个其他操作。接下来将一一介绍。

录入成绩:

不限定输入人数,以学号为 0 判定是否输入结束。根据提示依次输入学生信息,输入结束后按任意键返回菜单。此功能暂不提供姓名与学号重复和长度校验,分数学分的区间校验,以及编号长度校验是程序的一大 BUG,有待日后完善

修改成绩:

可选择根据学号或姓名修改学生信息,若查无此人,则提示错误并结束修改操作,否则可根据提示修改全部信息(是的,如果不想修改某处信息,则填上之前的数据)

删除成绩:

删除成绩与修改成绩类似,可选择根据学号或姓名删除学生,若查无此人,则提示错误并结束操作,否则删除该学生__(如果有确认删除的提示会更好)__

查询成绩:

上图为查询成绩界面,有三种查询方式可供选择:个人成绩,分数段成绩和不及格成绩。

个人成绩查询:

个人成绩可根据学号或姓名查询,查有此人则返回该同学详细信息,否则提示没有该学生。

分数段查询:

分数段查询要求输入分数下限和分数上线,则系统会返回所有人在这个分数区间(闭区间)内的所有科目成绩。

不及格成绩查询

返回所有人所有不及格的科目

成绩排序

支持多种关键字排序,根据提示选择关键字与排序顺序即可完成操作,排序结束后会询问时候显示所有人成绩,若是则调用第六个功能显示成绩,否则返回主菜单。排序完的成绩并没有立即保存回文件

显示成绩

可选择显示所有同学成绩或按班级显示成绩。若无学生,则提示无学生记录,否则格式化打印学生成绩并统计人数显示在左下角

保存成绩

手动保存成绩,将学生成绩保存到外存文件 studata.txt

退出登录

若成绩未修改或已保存修改,则正常返回登录界面,否则询问用户是否要保存修改。

学生操作界面

若选择学生登录,则只有查询成绩的功能。

代码细节与实现

学生结构体:

typedef struct stu{
	int num;									//学号
	char name[11],sex[5],cla[20];				//姓名,性别,班级
    struct cou les[5];                       	//5门课程
    double all,average,mark;                    //总分,平均分,绩点
	struct stu *next;
}STU;

课程结构体:

typedef struct cou{
	int lesnumber;								//课程编号
    char lesname[41];      						//课程名字
    double score,point;     					//分数,学分
}COU;

宏定义:

# define NAME 0
# define NUMBER 1
# define ALL 2
# define MARK 3
# define COU1 4
# define COU2 5
# define COU3 6
# define COU4 7
# define COU5 8
# define FROMBIG 0                  //从大到小
# define FROMSMALL 1      	       //从小到大

本程序使用动态链表(无虚头结点)作为学生记录的数据结构,通过对链表的增删改等操作实现对学生记录的管理。每个记录包含学生姓名、学号、性别、班级、五门课程、总分、平均分、绩点等记录项__(其中学号是 int 类型而不是 char[]类型)__。本程序包含 windowAPI 库,支持鼠标操作是程序一大亮点。

函数说明:

int RegisterTea();      						 //教师注册
int RegisterStu();      						 //学生注册

根据提示要求用户输入账号(学号)和密码,匹配成功返回 1,匹配失败返回 0。使用 scanf 输入,不能输入空格等分隔符,没有密码长度的校验,密码是明文,但有控制账号不能重复

int Count(STU *head);

遍历链表,计算链表节点个数,即学生人数,可用于判断是否有学生记录或学生人数是否增加

int StuNum(STU *p,double low,double high);

计算某学生分数在[low,high]之间的科目数量,用于分数段查询和不及格查询

void DisplayAll(STU *head);						 //打印所有学生信息

遍历链表,若链表为空,则打印“无学生记录”,否则打印所有学生的学号、姓名和五门课程的成绩、总分、平均分和排名__(其实不是排名只是序号而已)__

STU *Search_name(STU *head,char *name);		     //通过名字搜索学生
STU *Search_num(STU *head,int num);		   		 //通过学号搜索学生

顺序遍历链表,若搜索到匹配的学生返回该节点的指针,否则返回 NULL

void DisplayOne(STU *head,int n,char *name);     //打印一个学生详细信息

形参 head 为链表头指针,n 可选择 NAMENUM 作为关键字的类型,name 作为学生搜索的关键字。如打印名字为"ABC"的同学的信息,则 DisplayOne(head,NAME,"ABC") 若查找不到该同学,则打印"没有该同学的信息",否则打印该同学学号、姓名等所有信息

void DisplayCla(STU *head,char *class);			 //按班级显示学生信息

遍历链表,查找是否有班级为 class 的学生,若无则打印“无班级为 class 的学生”,否则打印班级为 class 的所有学生

void DisplayGrade(STU *head,double low,double high);			//按分数段查询成绩
void DisplayFail(STU *head);					 //不及格科目查询

不及格成绩是分数段成绩的特殊情况,其实只要调用 DisplayGrade(head,0,59) 就好了。若无该分数段的学生则打印"没有学生",否则以详细信息的形式打印所有学生分数在该区间的所有科目

STU *Delete(STU *head,int n,char *name,int *item);	//删除学生成绩

形参中 n 是关键字类型,可选择 NAMENUM,name 是用于搜索的关键字,item 接收一个整型信号,若 item 为 0,则表示没有找到该学生,删除失败;若 item 为 1,则表示已成功删除该学生。返回类型为学生节点 STU,表示新的链表头指针(若删除的是链表的第一个节点,则需要更新头指针)

int Modify(STU *head,int n,char *name);			//修改学生信息

形参中 n 是关键字类型,可选择 NAMENUM,name 是用于搜索的关键字,调用 Search_nameSearch_num 查找该学生,若该学生不存在则修改失败,返回 0,否则依次修改学生的所有信息__(必须修改所有信息,本程序不合理的地方之一)__,返回 1 表示修改成功

int Save(STU *head);					//保存成绩

将链表里的所有学生节点格式化输出到__文本文件__studata.txt 中保存

int Lof(FILE *fp);					//计算文件中学生人数

计算文件中不为 "" 且不为 "\n" 的行的行数,方便读取文件时知道文件有多少非空行,即有多少个学生记录。计算完后将文件指针返回文件头

STU *Initialize();					//初始化读取文件中的学生

打开并读取 studata.txt 文件的数据,新建一个链表,将数据填充进链表中,对链表按总分由大到小的顺序排序,至此初始化操作完成,关闭文件并返回链表的头指针。若该文件第一行是空行,则认为该文件是空的(其实有可能第一行是空行,第二行开始才有内容,这里有一个 BUG),顺序读取每一行的内容存到链表中,若中间存在空行则读取会出现问题。文件末尾允许存在空行,但存在空格等也会导致读取出错,有待改进

int Position(STU *head,STU *p);
STU *SetPosition(STU *head,int n);

前者返回节点 p 在链表 head 中的位置,若不存在则返回-1;后者返回链表 head 中第 n 个位置的节点指针,若 n 超过链表的长度,则返回 NULL。用于链表的排序

STU *Sort(STU *head,int m,int n);			//成绩排序

采用直接插入法进行排序,改变节点的指针起到排序的作用。相对其他排序法直接插入法每趟排序只需要移动一个节点,需要改变的指针数量也相对较少。但这里直接插入法用得不是很好,还是用数组的思想,因此使用了 SetPositionPosition 进行定位,帮助排序。链表排序可以考虑将每个节点的地址存在一个数组里,对数组进行排序,排序完再调整链表顺序,需要长度为 4n 的辅助空间。或者采用简单选择排序,挑选出最小的节点单独链成一个链表,将它从原链表分离,再寻找第二个节点,链到新链表中,从原链表分离,以此类推。也可以用直接插入排序,将链表逻辑上分成已排序和待排序两个链表,每次从待排序链表中取下一个,插入已排序链表中,以此类推。

STU *Creat(int n);

创建一个长度为 n 的链表,返回链表的头指针

STU *Connect(STU *head,STU *end)                	//连接两个链表

将链表 head 的尾与 end 的头相连,这里缺少判断形参合法性

double Mark(STU *p);

计算绩点,根据成绩转化为单科绩点,同时累加每科的学分和单科绩点,最后除以总绩点除以总学分就是平均绩点

STU *Input();              			 	//输入学生成绩

创建一个节点并让用户输入相关数据,将数据填充进节点内。完成一个学生记录的输入,返回节点的指针。注意并没有将该记录连接到链表中,代码中没有对各个数据项进行校验,判断其是否合法,存在 BUG

void HideCursor();					//隐藏光标
void PutCursor();					//显示光标
void GotoXy(int x,int y);				//将光标移动到(X,Y)
void Clear(int x,int y,int line);			//清除line行的内容后将坐标返回(x,y)
void GetXy(int *X,int *Y,int x1,int x2,int y1,int y2);	//获取在规定范围内鼠标点击的坐标

鼠标操作相关函数,本程序虽然能用鼠标操作,但美中不足的是只能用鼠标操作,如果能用键盘会更好

int main();

♻️ 资源

在这里插入图片描述

大小: 341KB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87248924

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全网惟一面向软件测试人员的Python基础教程-在Python中如何优雅的切西瓜呢?

全网惟一面向软件测试人员的Python基础教程 起点:《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗? 第四章 Python数据类型中有那些故事呢?…

第03讲:Security之用户鉴权

一、创建项目 参考:浅试Security 二、实现用户鉴权 何为鉴权?说白了其实就是用户认证,用户输入用户名和密码,只有认证通过了才能使用我的系统。 在实际的项目开发中,账号和密码都是从数据库中查询出来的。所…

820爆炸案(模拟案件)

文章目录模拟案件背景相关密码快压word邮箱BitLocker系统证书bestcrypt涉案图片模拟案件背景 8月20日18:00某市汽车站发生一起爆炸案件,经初步侦查,炸弹系通过手机远程引爆,办案人员经过综合研判分析,确定了引爆炸弹的…

在Mac电脑上怎么修改移动硬盘的读写权限?怎样修改mac电脑中移动硬盘的权限

在Mac电脑上怎么修改移动硬盘的读写权限?你是否遇到过把外部硬盘连接到Mac电脑后,外部硬盘只能读取不能写入的问题?大部分的情况是因为硬盘格式可能是Windows系统的格式,导致在mac电脑上只能读取不能写入。那我们要怎么才能正常的…

腾讯T3-3级资深架构师呕心整理:10万字节springboot教程全解!

前言: 可以毫不夸张地说,这篇文章介绍的 SpringBoot 教程基本已经涵盖你工作中遇到的大部分常用的场景。对于每一个springboot的用法,文中都会都会有详细的教程解释。 本文总共从29个章节,248页PDF,阐述springboot在各种环境下的…

计算机毕设Python+Vue校园心理咨询平台(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Servlet应用(Request+response对象)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

测试架构师需要具备哪些能力?

目录 前言 为什么软件项目需要架构设计? 测试架构师需要解决什么问题? 测试架构师需要具备哪些能力? 测试工程师如何培养架构能力? 总结 重点:配套学习资料和视频教学 前言 相比于我们常见的研发架构师&#x…

微信机器人的构建与使用

一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion:2022.12.15 Last edited: 2022.12.15 目录 《微信机器人》程序使用说明 微信机器人使用说明 1.项目说明 2. 系统环境 3.准备条…

Java+MySQL基于SSH的扶贫信息管理系统 开题 毕业设计

扶贫信息管理系统采用了B/S(浏览器/服务器)体系结构,JAVA作为开发语言,MySQL作为数据存储进行开发,Tomcat作为WEB服务器,开发平台windows,开发工具采用比elicpse更好用的myeclipse。系统角色分为用户和管理员,主要模块有:县管理模块、贫困户管理模块、扶贫文件管理模…

B站试用期刚过,被HR和大老板一起谈话,说我工作没任何问题,但今晚必须走人!...

最近B站的裁员消息大家关注了吗?一位B站的新员工哭诉:试用期刚过,就被HR和大老板一起谈话,说他工作态度、工作能力、工作产出都没有任何问题,但必须在12.16号走人!他不接受,争辩了很久&#xff…

鉴源论坛 · 观模丨AUTOSAR调度表可调度性的形式化分析

作者 | 郭建 上海控安可信软件创新研究院特聘专家 版块 | 鉴源论坛 观模 汽车上大量软件和电子控制单元(ECU,Electronic Control Unit)的使用导致了汽车电子架构变得更为复杂,现如今从工厂生产的汽车更像是带轮子的电脑。现代汽车由大约50到…

Java+MySQL基于ssm的物理竞赛管理系统 开题 论文

物理竞赛是对课堂上所学的理论知识的实践运用,加深所学知识的理解,锻炼团队协作能力。学生可以根据个人爱好,个人特长选择参与,不仅能培养学生的创新意思、提高专业技能,还能锻炼学生的组织能力和协作能力。物理竞赛是在中国科协的领导下,由中国物理学会主办,各省、自治区、直辖…

windows11-IIS和nginx部署 vue3项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 IIS部署vue3项目一、IIS 安装二、解决404问题三、windows环境下安装/使用 nginx提示:以下是本篇文章正文内容,下面案例可供参考 一、IIS 安装 https…

Ac-Nle-P-Nle-D-AMC

Ac-nLPnLD-AMC, substrate for proteasome.Ac-nLPnLD-AMC,蛋白酶体底物。 编号: 185966中文名称: 蛋白酶体底物:Ac-Nle-Pro-Nle-Asp-7-氨基-4-甲基香豆素CAS号: 355140-49-7单字母: Ac-Nle-P-Nle-D-AMC三字母: Ac-Nle-Pro-Nle-Asp-AMC氨基酸个数: 4分子式…

高压放大器怎么选择型号的(高压放大器选型标准规范最新版)

高压放大器一般是指能够产生最大功率输出以驱动特定负载的装置,这是电子测量行业比较常见的一种仪器,可以对信号源的电压信号进行放大。 ATA-2000系列电压放大器选型指南: 高压放大器特点介绍: 1、可以输出1W以上更大的功率。 2、…

ReplicaSet和Deployment

ReplicaSet和Deployment 写在前面 语雀原文阅读效果更佳:198 ReplicaSet和Deployment 语雀 《198 ReplicaSet和Deployment》 1、ReplicaSet 假如我们现在有一个 Pod 正在提供线上的服务,我们来想想一下我们可能会遇到的一些场景: 某次运营…

[思考进阶]03 每一个成年人都应该掌握的学习技巧

除了要提升自己的技术能力,思维的学习和成长也非常非常重要,特推出此[思考进阶]系列,进行刻意练习,从而提升自己的认知。 这世间有两种人:一种被誉为天之骄子,拥有那种天才的创造能力,这种人极少…

React 入门:使用 Express 快速搭建web服务

文章目录什么是 ExpressExpress 用来做什么安装 Express创建 web 服务器启动服务器访问服务器什么是 Express 官方概念 Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。通俗理解 Express 的作用和 Node.js 内置的 http 模块类似,是专门…

最近更换系统盘踩了不少坑,主要是软件运行错误,造成原成原系统盘被损毁

更换系统盘应该注意的问题: PE系统要是经过测试的系统,这次损毁的PE我很信任,但是有个克隆软件,今天一用就损毁了,他的名字是“Acronis True Image",不建议用他克隆整盘。 推荐几个经过严格测试的好用的PE&#…