用C语言写的学生管理系统,C语言实现简单的学生成绩管理系统
最近在问答上帮提问者回答问题,有遇到求C语言实现学生管理成绩系统,需求非常简单,就顺手码了下代码。我觉得这种比较小的系统,可以收录起来,做一个C语言基础学习目录也是不错的主意。
因为当时的问题已经找不到了,我就回想着把问题的大致说一下。
一 题目
简单实现一个学生成绩系统,一个学生包含学号,姓名,年龄,数学成绩,计算机成绩,总成绩六项信息,学号唯一,姓名可以重名。
数据格式如下:
学号
姓名
年龄
数学
计算机
总分
int
char[20]
int
int
int
int
需实现以下功能:
(1) 添加学生信息
(2) 浏览学生信息
(3) 查询学生信息
(4) 删除学生信息
(5) 按总分排序
(6) 退出系统
使用过程需要有简单的描述性语句,便于操作者使用。
总体来说,回忆题目大致是如此,不影响对后续代码的实现和阅读。
二 设计
1.单个学生信息
这个就按照数据格式表格要求来即可,使用C语言结构体定义学生信息,C语言中的结构体可以存储复杂的数据。
typedef struct Student{
int id; //学号
char name[20]; //名字
int age; //年龄
int math; //数学成绩
int computer; //计算机成绩
int total; //总分
}Stu;
2.存放学生信息
因为不知道有多少学生信息,而且学生信息支持增删改查,这里采用单链表的形式来存放学生数据,以下是链表的数据结构
typedef struct StudentData{
Stu student;
struct StudentData * next;
}StuData, *PStuData;
3.定义布尔型数据
将是和否值1,0定义为宏,对一些常用的数值定义为宏,不失为一个好的编码习惯。这个是给后面判断语句和循环语句使用。
//定义布尔
#define TRUE 1
#define FALSE 0
typedef short BOOL;
4.函数设计
//选择主菜单
int EnterMainMenu();
//申请数据内存
PStuData GetPStuData();
//释放数据内存
void FreePStuData(PStuData pData);
//添加学生
void AddStudent(PStuData pHead);
//删除学生
void RemoveStudent(PStuData pHead);
//浏览学生信息
void DisplayStudents(PStuData pHead);
//查询学生信息
void QueryStudent(PStuData pHead);
//排序并显示
void SortStudents(PStuData pHead);
//Student数据复制
void CopyStudent(Stu * st1, Stu * st2);
//返回主菜单
void BackMain();
//清屏操作
void ClearScreen();
//清空输入缓冲
void ClearStdin();
后面会着重说明和实现这些函数的作用和功能。
三 代码实现
1.主菜单选择
使用puts输出字符串打印菜单信息,通过scanf接收屏幕上输入的选择信息。getchar函数是接收一个字符,在scanf使用中换行代表输入结束,但是这个换行会停留在输入缓存区里面,这里接收掉是为了不干扰后续的输入和显示。
int EnterMainMenu(){
int menu;
//打印菜单
puts("请选择系统功能(按对应数字,回车执行)");
puts("(1) 添加学生信息");
puts("(2) 浏览学生信息");
puts("(3) 查询学生信息");
puts("(4) 删除学生信息");
puts("(5) 按总分排序");
puts("(6) 退出系统");
scanf("%d", &menu);
//接收多余的回车键
getchar();
return menu;
}
2.返回主菜单
封装函数功能,getchar()函数获取一个任意字符,返回主菜单。
void BackMain(){
ClearStdin();//清理输入缓存区,后续展示该函数功能
printf("输入任何字符返回主菜单");
getchar();
ClearScreen();//清理屏幕信息,后续展示该函数功能
}
3.主函数main实现
使用switch(开关语句)对菜单输入进行控制流程。
int main(){
int menu;
BOOL doing = TRUE;
PStuData pData = NULL;
pData = GetPStuData();//申请数据内存,后续会解释此函数
if(pData == NULL){
doing = FALSE;
}
while(doing){
menu = EnterMainMenu();
switch(menu){
case 1:
AddStudent(pData);
break;
case 2:
DisplayStudents(pData);
break;
case 3:
QueryStudent(pData);
break;
case 4:
RemoveStudent(pData);
break;
case 5:
SortStudents(pData);
break;
case 6:
doing = FALSE;
puts("退出系统");
break;
default:
puts("输入错误!");
break;
}
}
return 0;
}
4.内存申请和释放
因为不知道具体学生信息的数量,而且还需要支持增、删功能。那么我们就需要动态的分配内存来存储学生信息数据, 使用stdlib.h库中的malloc函数动态申请内存和free函数释放内存。
PStuData GetPStuData(){
PStuData pData = NULL;
pData = (PStuData)malloc(sizeof(StuData));
if(pData){
pData->next = NULL;
}
return pData;
}
void FreePStuData(PStuData pData){
if(pData != NULL){
free(pData);
}
}
5.添加学生信息
获取屏幕录入的学生信息,按学号升序添加到学生信息单链表中。
void AddStudent(PStuData pHead){
BOOL bUpdate = FALSE;
int id, age, math, computer;
char name[20];
char loop[20];
PStuData pVisit = NULL;
PStuData pLast = NULL;
PStuData pNew = NULL;
ClearScreen();//清屏,后续展示该函数功能
puts("===录入学生信息===");
printf("请输入学生学号:");
scanf("%d", &id);
printf("请输入学生姓名:");
scanf("%s", name);
printf("请输入学生年龄:");
scanf("%d", &age);
printf("请输入学生数学成绩:");
scanf("%d", &math);
printf("请输入学生计算机成绩:");
scanf("%d", &computer);
pNew = GetPStuData();
if(!pNew){
puts("内存空间不足,无法添加学生信息");
BackMain();
return;
}
pNew->student.id = id;
strcpy(pNew->student.name, name);
pNew->student.age = age;
pNew->student.math = math;
pNew->student.computer = computer;
pNew->student.total = math + computer;
pVisit = pHead->next;
pLast = NULL;
while(pVisit){
//仅更新数据
if(pVisit->student.id == id){
CopyStudent(&pVisit->student, &pNew->student);//封装,相当于student的数据赋值
//清理申请的内存
FreePStuData(pNew);
bUpdate = TRUE;
break;
}
if(pVisit->student.id > id){
break;
}
pLast = pVisit;
pVisit = pLast->next;
}
//找到插入节点
if(pLast){
pNew->next = pLast->next;
pLast->next = pNew;
}
else if(!bUpdate){//添加的首个元素
pHead->next = pNew;
}
if(bUpdate){
puts("更新学生信息完成");
}
else{
puts("添加学生信息完成");
}
//清理
pNew = NULL;
pVisit = NULL;
bUpdate = FALSE;
BackMain();
}
6.学生信息拷贝赋值
封装函数功能,拷贝赋值学生信息,其中学生名字不能直接赋值,需要string.h库中的strcpy函数进行操作。
void CopyStudent(Stu * st1, Stu * st2){
st1->id = st2->id;
strcpy(st1->name, st2->name);//字符串不能直接赋值,需要string.h库中的strcpy函数进行操作
st1->age = st2->age;
st1->math = st2->math;
st1->computer = st2->computer;
st1->total = st2->total;
}
7.查询学生信息
获取录入的学号,顺序迭代访问单链表,查询显示该学号的学生信息。
void QueryStudent(PStuData pHead){
PStuData pVisit = NULL;
int id;
ClearScreen();//清屏,后续展示该函数功能
printf("请输入要查询学生信息的学号:");
scanf("%d", &id);
pVisit = pHead->next;
while(pVisit){
if(pVisit->student.id == id){
printf("查询信息 学号:%d 姓名:%s 年龄:%d 数学:%d 计算机:%d 总分:%d\n",
pVisit->student.id, pVisit->student.name, pVisit->student.age, pVisit->student.math,
pVisit->student.computer, pVisit->student.total);
break;
}
pVisit = pVisit->next;
}
if(!pVisit){
printf("查询id无效");
}
BackMain();
}
8.展示学生信息
顺序迭代访问单链表,显示所有学生信息。
void DisplayStudents(PStuData pHead){
PStuData pData = NULL;
ClearScreen();//清屏,后续展示该函数
if(pHead){
pData = pHead->next;
}
if(!pData){
puts("没有学生数据信息");
}
else{
printf("%-10s| %-20s| %-5s| %-5s| %-6s| %-5s|\n", "学号", "姓名", "年龄", "数学", "计算机", "总分");
}
while(pData){
printf("%-10d| %-20s| %-5d| %-5d| %-6d| %-5d|\n", pData->student.id, pData->student.name,
pData->student.age, pData->student.math, pData->student.computer, pData->student.total);
pData = pData->next;
}
BackMain();
}
9.删除学生信息
获取输入学号,删除单链表中匹配的学生信息。
void RemoveStudent(PStuData pHead){
PStuData pVisit = NULL;
PStuData pLast = NULL;
int id;
ClearScreen();//清屏
printf("请输入要删除学生信息的学号:");
scanf("%d", &id);
pVisit = pHead->next;
pLast = pHead;
while(pVisit){
if(pVisit->student.id == id){
break;
}
pLast = pVisit;
pVisit = pLast->next;
}
if(pVisit){
pLast->next = pVisit->next;
FreePStuData(pVisit);
printf("删除学号为%d的信息成功\n", id);
}
else{
printf("删除学号为%d的信息失败,学生不存在\n", id);
}
BackMain();
}
10.升序排序学生总成绩并显示出来
这里的做法是创建新的单链表,使用插入法排序。
void SortStudents(PStuData pHead){
PStuData pVisit = NULL;
PStuData pSortHead = NULL;
PStuData pSortVisit = NULL;
PStuData pSortLast = NULL;
PStuData pNew = NULL;
pVisit = pHead->next;
pSortHead = GetPStuData();
while(pVisit){
pSortVisit = pSortHead->next;
pSortLast = pSortHead;
while(pSortVisit){
if(pSortVisit->student.total >= pVisit->student.total){
break;
}
pSortLast = pSortVisit;
pSortVisit = pSortVisit->next;
}
pNew = GetPStuData();
CopyStudent(&pNew->student, &pVisit->student);
pNew->next = pSortVisit;
pSortLast->next = pNew;
pVisit = pVisit->next;
}
DisplayStudents(pSortHead);
pSortVisit = NULL;
while(pSortHead){
pSortVisit = pSortHead->next;
FreePStuData(pSortHead);
pSortHead = pSortVisit;
}
}
11.其他函数
void ClearScreen(){
system("cls");
}
void ClearStdin(){
setbuf(stdin, NULL);
}
四 整体代码
#include
#include
#include
//定义布尔
#define TRUE 1
#define FALSE 0
typedef short BOOL;
//学生数据
typedef struct Student{
int id; //学号
char name[20]; //名字
int age; //年龄
int math; //数学成绩
int computer; //计算机成绩
int total; //总分
}Stu;
typedef struct StudentData{
Stu student;
struct StudentData * next;
}StuData, *PStuData;
//选择主菜单
int EnterMainMenu();
//申请数据内存
PStuData GetPStuData();
//释放数据内存
void FreePStuData(PStuData pData);
//添加学生
void AddStudent(PStuData pHead);
//删除学生
void RemoveStudent(PStuData pHead);
//浏览学生信息
void DisplayStudents(PStuData pHead);
//查询学生信息
void QueryStudent(PStuData pHead);
//排序并显示
void SortStudents(PStuData pHead);
//Student数据复制
void CopyStudent(Stu * st1, Stu * st2);
//返回主菜单
void BackMain();
//清屏操作
void ClearScreen();
//清空输入缓冲
void ClearStdin();
int main(){
int menu;
BOOL doing = TRUE;
PStuData pData = NULL;
pData = GetPStuData();
if(pData == NULL){
doing = FALSE;
}
while(doing){
menu = EnterMainMenu();
switch(menu){
case 1:
AddStudent(pData);
break;
case 2:
DisplayStudents(pData);
break;
case 3:
QueryStudent(pData);
break;
case 4:
RemoveStudent(pData);
break;
case 5:
SortStudents(pData);
break;
case 6:
doing = FALSE;
puts("退出系统");
break;
default:
puts("输入错误!");
break;
}
}
return 0;
}
PStuData GetPStuData(){
PStuData pData = NULL;
pData = (PStuData)malloc(sizeof(StuData));
if(pData){
pData->next = NULL;
}
return pData;
}
void FreePStuData(PStuData pData){
if(pData != NULL){
free(pData);
}
}
int EnterMainMenu(){
int menu;
//打印菜单
puts("请选择系统功能(按对应数字,回车执行)");
puts("(1) 添加学生信息");
puts("(2) 浏览学生信息");
puts("(3) 查询学生信息");
puts("(4) 删除学生信息");
puts("(5) 按总分排序");
puts("(6) 退出系统");
scanf("%d", &menu);
//接收多余的回车键
getchar();
return menu;
}
void AddStudent(PStuData pHead){
BOOL bUpdate = FALSE;
int id, age, math, computer;
char name[20];
char loop[20];
PStuData pVisit = NULL;
PStuData pLast = NULL;
PStuData pNew = NULL;
ClearScreen();
puts("===录入学生信息===");
printf("请输入学生学号:");
scanf("%d", &id);
printf("请输入学生姓名:");
scanf("%s", name);
printf("请输入学生年龄:");
scanf("%d", &age);
printf("请输入学生数学成绩:");
scanf("%d", &math);
printf("请输入学生计算机成绩:");
scanf("%d", &computer);
pNew = GetPStuData();
if(!pNew){
puts("内存空间不足,无法添加学生信息");
BackMain();
return;
}
pNew->student.id = id;
strcpy(pNew->student.name, name);
pNew->student.age = age;
pNew->student.math = math;
pNew->student.computer = computer;
pNew->student.total = math + computer;
pVisit = pHead->next;
pLast = NULL;
while(pVisit){
//仅更新数据
if(pVisit->student.id == id){
CopyStudent(&pVisit->student, &pNew->student);
//清理申请的内存
FreePStuData(pNew);
bUpdate = TRUE;
break;
}
if(pVisit->student.id > id){
break;
}
pLast = pVisit;
pVisit = pLast->next;
}
//找到插入节点
if(pLast){
pNew->next = pLast->next;
pLast->next = pNew;
}
else if(!bUpdate){//添加的首个元素
pHead->next = pNew;
}
if(bUpdate){
puts("更新学生信息完成");
}
else{
puts("添加学生信息完成");
}
//清理
pNew = NULL;
pVisit = NULL;
bUpdate = FALSE;
BackMain();
}
void DisplayStudents(PStuData pHead){
PStuData pData = NULL;
ClearScreen();
if(pHead){
pData = pHead->next;
}
if(!pData){
puts("没有学生数据信息");
}
else{
printf("%-10s| %-20s| %-5s| %-5s| %-6s| %-5s|\n", "学号", "姓名", "年龄", "数学", "计算机", "总分");
}
while(pData){
printf("%-10d| %-20s| %-5d| %-5d| %-6d| %-5d|\n", pData->student.id, pData->student.name,
pData->student.age, pData->student.math, pData->student.computer, pData->student.total);
pData = pData->next;
}
BackMain();
}
void QueryStudent(PStuData pHead){
PStuData pVisit = NULL;
int id;
ClearScreen();
printf("请输入要查询学生信息的学号:");
scanf("%d", &id);
pVisit = pHead->next;
while(pVisit){
if(pVisit->student.id == id){
printf("查询信息 学号:%d 姓名:%s 年龄:%d 数学:%d 计算机:%d 总分:%d\n",
pVisit->student.id, pVisit->student.name, pVisit->student.age, pVisit->student.math,
pVisit->student.computer, pVisit->student.total);
break;
}
pVisit = pVisit->next;
}
if(!pVisit){
printf("查询id无效");
}
BackMain();
}
void RemoveStudent(PStuData pHead){
PStuData pVisit = NULL;
PStuData pLast = NULL;
int id;
ClearScreen();
printf("请输入要删除学生信息的学号:");
scanf("%d", &id);
pVisit = pHead->next;
pLast = pHead;
while(pVisit){
if(pVisit->student.id == id){
break;
}
pLast = pVisit;
pVisit = pLast->next;
}
if(pVisit){
pLast->next = pVisit->next;
FreePStuData(pVisit);
printf("删除学号为%d的信息成功\n", id);
}
else{
printf("删除学号为%d的信息失败,学生不存在\n", id);
}
BackMain();
}
void SortStudents(PStuData pHead){
PStuData pVisit = NULL;
PStuData pSortHead = NULL;
PStuData pSortVisit = NULL;
PStuData pSortLast = NULL;
PStuData pNew = NULL;
pVisit = pHead->next;
pSortHead = GetPStuData();
while(pVisit){
pSortVisit = pSortHead->next;
pSortLast = pSortHead;
while(pSortVisit){
if(pSortVisit->student.total >= pVisit->student.total){
break;
}
pSortLast = pSortVisit;
pSortVisit = pSortVisit->next;
}
pNew = GetPStuData();
CopyStudent(&pNew->student, &pVisit->student);
pNew->next = pSortVisit;
pSortLast->next = pNew;
pVisit = pVisit->next;
}
DisplayStudents(pSortHead);
pSortVisit = NULL;
while(pSortHead){
pSortVisit = pSortHead->next;
FreePStuData(pSortHead);
pSortHead = pSortVisit;
}
}
void CopyStudent(Stu * st1, Stu * st2){
st1->id = st2->id;
strcpy(st1->name, st2->name);
st1->age = st2->age;
st1->math = st2->math;
st1->computer = st2->computer;
st1->total = st2->total;
}
void BackMain(){
ClearStdin();
printf("输入任何字符返回主菜单");
getchar();
ClearScreen();
}
void ClearScreen(){
system("cls");
}
void ClearStdin(){
setbuf(stdin, NULL);
}
演示:
演示.gif
至此,该学生成绩管理系统介绍完毕,其中都是采用比较简单的做法。当然这里可以进一步优化,比如数据可以存储到文件而不用每次都重新输入等等,但不影响此系统的小全的功能,我就不上文件存储功能的代码了。
用C语言写的学生管理系统,C语言实现简单的学生成绩管理系统相关推荐
- C语言期末大作业15个(附源码)成绩管理系统、图书馆管理系统、学生打卡系统、超市信息管理系统、学生考勤系统、职工信息管理系统源码、歌曲信息管理系统、超市收款系统等等
C语言期末作业15个(上) 1.C语言学生成绩管理系统 2.C语言图书馆管理系统(复杂版) 3.C语言图书馆管理系统(简洁版) 4.C语言停车管理系统(两个版本) 5.C语言学生考勤系统 6.C语言班 ...
- 易语言写c盘配置文件,易语言写配置文件的方法
易语言编程开发环境的诞生引领了一个编程新时代的到来.它以其本土化.易用化.开发速度快等优点迅速被广大编程爱好者所认可和接受."配置文件"这个术语相信大家都很熟悉了,因为日常生活中随 ...
- 电脑怎么用c语言写丘比特,如何用C语言先输出一段文字如何再输出心形图案?...
学习C语言其实并不是枯燥无味的,也有蛮多好玩的 代码如下: #include int main() { int i,j; printf(" ****** ******\n ...
- XML案例(简单的考生成绩管理系统)
1.以如下格式的exam.xml文件为例 <?xml version="1.0" encoding="UTF-8" standalone="no ...
- 用c语言写图书馆程序,用c语言写图书馆管理系统
满意答案 p68634193 2017.01.12 采纳率:54% 等级:12 已帮助:7180人 你不觉得给的悬赏少了点么 新建一个下面的文件 讲这个文件和下面的代码放在一个目录下 表示你的图 ...
- php学籍信息管理系统心得_PHP实现简单的学生信息管理系统(web版)
(∩_∩) 1.概述 学了php的一些基础,包括HTML,php,pdo,mysql操作等,一直都没有将它们有机结合.最近写了一个简单的网页版学生信息管理系统,前台用HTML,脚本用到了JavaScr ...
- linux下c语言写文件,Linux下C语言之文件操作
C语言库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在DOS.Windows.Linux还是在VxWorks中都是这些函数: 创建和打开的函数: FILE *fopen(const cha ...
- java学生签到系统视频教程_手把手教你做一个Java web学生信息、选课、签到考勤、成绩管理系统附带完整源码及视频开发教程...
四个阶段的Java web学生信息系统视频教程终于录制完成了,系统用到的知识点有:jsp+servlet+mysql+jquery+ajax,前端采用的是当下最流行的easyui管理框架,全部采用面向 ...
- dll文件是什么语言写的程序_易语言图文教学:写好了程序,如何配置程序名称、图标?内详...
引导语 通过前两篇图文,相信大家能制作出一个简单的易语言程序啦.今天是教大家怎样配置程序.说的再清楚些,就是给你的程序加个图标,改个进程名字,加上版本号,添加作者信息等等. 具体操作方法 打开一个已经 ...
- python是c语言写的_python使用C语言写扩展示例
对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! 本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 ...
最新文章
- effective c++ 条款10 让operator= 返回*this的引用
- 【Android 插件化】VAHunt 检测插件化引擎的具体细节
- MySQL中文参考手册-- 常用查询的例子
- 太原理工计算机组成原理报告,太原理工《计算机组成原理与体系结构》--实验报告.docx...
- 在Android应用中使用Pull解析XML文件(传智播客视频笔记)
- E. Jamie and Tree(树链剖分 + 线段树)
- C++网络编程快速入门(一):TCP网络通信基本流程以及基础函数使用
- CTS(23)---Camera Media CTS GTS VTS 记录
- 修改 linux分区文件,修改分区和EXT4文件系统大小
- 数据更新(2020-4-1)
- 《自拍教程47》Python adb重启设备100次
- c语言头文件下载微盘,c语言头文件下载 C语言头文件大全.doc
- 社交电商平台的消费返利模式——共享购
- 什么是表示学习(representation learning)表征学习 表达学习
- Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)
- 企业管理软件如何选型?看完后恍然大悟
- 图文详解!10大高性能开发核心技术+
- 如何构建一个在线绘图工具:Feakin 是如何设计与构建的?
- Android Camera2 之 CameraDevice 详解
- deepin20.1操作系统安装无线网卡驱动(8821ce)
热门文章
- 店盈通:拼多多一个店铺推几个产品最好
- RSS阅读——在繁杂的社会接受纯粹的信息 RSS介绍与RSS订阅源分享
- 使用360优化修复系统后无法上网的解决方法
- 【PaperReading】MAGNN: Metapath Aggregated Graph Neural Network for Heterogeneous Graph Embedding
- 定点数和浮点数加减乘除运算详解【计算机组成原理】---真的建议收藏啊!!!
- Java Scanner.nextLine()读取回车问题解决
- C++ unordered_map和unordered_set的使用
- 植物大战僵尸一:多线程修改UI界面,游戏必备API
- spring boot启动 Failed to scan from classloader hierarchy 解决方案
- PHP基于thinkphp的网上图书管理系统