最近在问答上帮提问者回答问题,有遇到求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语言实现简单的学生成绩管理系统相关推荐

  1. C语言期末大作业15个(附源码)成绩管理系统、图书馆管理系统、学生打卡系统、超市信息管理系统、学生考勤系统、职工信息管理系统源码、歌曲信息管理系统、超市收款系统等等

    C语言期末作业15个(上) 1.C语言学生成绩管理系统 2.C语言图书馆管理系统(复杂版) 3.C语言图书馆管理系统(简洁版) 4.C语言停车管理系统(两个版本) 5.C语言学生考勤系统 6.C语言班 ...

  2. 易语言写c盘配置文件,易语言写配置文件的方法

    易语言编程开发环境的诞生引领了一个编程新时代的到来.它以其本土化.易用化.开发速度快等优点迅速被广大编程爱好者所认可和接受."配置文件"这个术语相信大家都很熟悉了,因为日常生活中随 ...

  3. 电脑怎么用c语言写丘比特,如何用C语言先输出一段文字如何再输出心形图案?...

    学习C语言其实并不是枯燥无味的,也有蛮多好玩的 代码如下: #include int main() { int i,j; printf("     ******       ******\n ...

  4. XML案例(简单的考生成绩管理系统)

    1.以如下格式的exam.xml文件为例 <?xml version="1.0" encoding="UTF-8" standalone="no ...

  5. 用c语言写图书馆程序,用c语言写图书馆管理系统

    满意答案 p68634193 2017.01.12 采纳率:54%    等级:12 已帮助:7180人 你不觉得给的悬赏少了点么 新建一个下面的文件 讲这个文件和下面的代码放在一个目录下 表示你的图 ...

  6. php学籍信息管理系统心得_PHP实现简单的学生信息管理系统(web版)

    (∩_∩) 1.概述 学了php的一些基础,包括HTML,php,pdo,mysql操作等,一直都没有将它们有机结合.最近写了一个简单的网页版学生信息管理系统,前台用HTML,脚本用到了JavaScr ...

  7. linux下c语言写文件,Linux下C语言之文件操作

    C语言库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在DOS.Windows.Linux还是在VxWorks中都是这些函数: 创建和打开的函数: FILE *fopen(const cha ...

  8. java学生签到系统视频教程_手把手教你做一个Java web学生信息、选课、签到考勤、成绩管理系统附带完整源码及视频开发教程...

    四个阶段的Java web学生信息系统视频教程终于录制完成了,系统用到的知识点有:jsp+servlet+mysql+jquery+ajax,前端采用的是当下最流行的easyui管理框架,全部采用面向 ...

  9. dll文件是什么语言写的程序_易语言图文教学:写好了程序,如何配置程序名称、图标?内详...

    引导语 通过前两篇图文,相信大家能制作出一个简单的易语言程序啦.今天是教大家怎样配置程序.说的再清楚些,就是给你的程序加个图标,改个进程名字,加上版本号,添加作者信息等等. 具体操作方法 打开一个已经 ...

  10. python是c语言写的_python使用C语言写扩展示例

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! 本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 ...

最新文章

  1. effective c++ 条款10 让operator= 返回*this的引用
  2. 【Android 插件化】VAHunt 检测插件化引擎的具体细节
  3. MySQL中文参考手册-- 常用查询的例子
  4. 太原理工计算机组成原理报告,太原理工《计算机组成原理与体系结构》--实验报告.docx...
  5. 在Android应用中使用Pull解析XML文件(传智播客视频笔记)
  6. E. Jamie and Tree(树链剖分 + 线段树)
  7. C++网络编程快速入门(一):TCP网络通信基本流程以及基础函数使用
  8. CTS(23)---Camera Media CTS GTS VTS 记录
  9. 修改 linux分区文件,修改分区和EXT4文件系统大小
  10. 数据更新(2020-4-1)
  11. 《自拍教程47》Python adb重启设备100次
  12. c语言头文件下载微盘,c语言头文件下载 C语言头文件大全.doc
  13. 社交电商平台的消费返利模式——共享购
  14. 什么是表示学习(representation learning)表征学习 表达学习
  15. Git快速入门篇—— Windows版本淘宝镜像快速下载安装详细步骤及简单入门教程(附带图文教程)
  16. 企业管理软件如何选型?看完后恍然大悟
  17. 图文详解!10大高性能开发核心技术+
  18. 如何构建一个在线绘图工具:Feakin 是如何设计与构建的?
  19. Android Camera2 之 CameraDevice 详解
  20. deepin20.1操作系统安装无线网卡驱动(8821ce)

热门文章

  1. 店盈通:拼多多一个店铺推几个产品最好
  2. RSS阅读——在繁杂的社会接受纯粹的信息 RSS介绍与RSS订阅源分享
  3. 使用360优化修复系统后无法上网的解决方法
  4. 【PaperReading】MAGNN: Metapath Aggregated Graph Neural Network for Heterogeneous Graph Embedding
  5. 定点数和浮点数加减乘除运算详解【计算机组成原理】---真的建议收藏啊!!!
  6. Java Scanner.nextLine()读取回车问题解决
  7. C++ unordered_map和unordered_set的使用
  8. 植物大战僵尸一:多线程修改UI界面,游戏必备API
  9. spring boot启动 Failed to scan from classloader hierarchy 解决方案
  10. PHP基于thinkphp的网上图书管理系统