学生成绩管理系统

开发语言:C语言
开发工具:Visual Studio 2019
开发时间:2019.4.14
开发者:summer

商业合作可淘宝搜索店铺“程序员夏天的小店”

@一、系统使用展示

@二、系统功能

@三、菜单

@四、录入学生信息

@五、打印学生信息

@六、保存学生信息

@七、读取学生信息

@八、统计所有学生人数

@九、查找学生信息

@十、修改学生信息

@十一、删除学生信息

@十二、退出系统

@十三、出错

一、系统使用展示

二、系统功能

  1. 系统功能介绍
1.录入学生信息:用户可以自由输入学生信息到系统中。
2.打印学生信息:格式化展示系统中的学生信息。
3.保存学生信息:将系统中的学生信息保存到本地文档。
4.读取学生信息:读取本地文档中的学生信息并显示。
5.统计所有学生人数
6.查找学生信息:根据用户给定的信息(学号)在系统中查找该学生的信息
7.修改学生信息
8.删除学生信息
0.退出系统
  1. 系统main函数,while循环在外,系统程序能够持续运行,switch判断语句进行功能选择与函数切换。
int main() {while (1){//打印菜单Menu();//读取一个字符 整数,字符在内存中映射为ASCII码char ch = _getch();switch (ch){case '1'://1.录入学生信息InputStudent();break;case '2'://2.打印学生信息PrintStudent();break;case '3'://3.保存学生信息SaveStudent();break;case '4'://4.读取学生信息ReadStudent();break;case '5'://5.统计所有学生人数CountStudent();break;case '6'://6.查找学生信息FindStudent();break;case '7'://7.修改学生信息ChangeStudent();break;case '8'://8.删除学生信息DeleteStudent();break;case '0'://0.退出系统return 0;break;default:printf("输入有误,没有该功能\n\n");system("pause");  //暂停system("cls");    //清屏break;}}return 0;
}

三、菜单

  1. 菜单显示
//菜单
void Menu() {printf("*************************************************\n");printf("*\t欢迎使用高校学生成绩管理系统V1.0\t*\n");printf("*\t\t请选择功能\t\t\t*\n");printf("*************************************************\n");printf("*\t\t1.录入学生信息\t\t\t*\n");printf("*\t\t2.打印学生信息\t\t\t*\n");printf("*\t\t3.保存学生信息\t\t\t*\n");printf("*\t\t4.读取学生信息\t\t\t*\n");printf("*\t\t5.统计所有学生人数\t\t*\n");printf("*\t\t6.查找学生信息\t\t\t*\n");printf("*\t\t7.修改学生信息\t\t\t*\n");printf("*\t\t8.删除学生信息\t\t\t*\n");printf("*\t\t0.退出系统\t\t\t*\n");printf("*************************************************\n");
}
  1. 打印菜单

scanf()、getchar()输入后均需要按enter,而getch()不用

 //打印菜单Menu();//读取一个字符 整数,字符在内存中映射为ASCII码char ch = _getch();

四、录入学生信息

  1. 定义学生结构体、链表节点结构体
//定义一个学生
typedef struct tagStudent {char szName[20]; //姓名char szSex[4];      //性别int  nAge;          //年龄int  nStuNo;        //学号int  nScore;        //成绩
}Student;//链表
//节点
typedef struct tagNode
{Student stu;           //学生信息struct tagNode* pNext;    //指向下一个节点
}Node;//创建头节点
Node* g_pHead = NULL;      //指向头节点
  1. 利用学生结构体,以及链表操作输入学生信息
//1.录入学生信息
void InputStudent() {//创建一个人,在堆中分配内存Node* pNewNode = (Node*)malloc(sizeof(Node));//指针下一个指向空pNewNode->pNext = NULL;//查找链表的尾结点Node* p = g_pHead;while (g_pHead != NULL && p->pNext != NULL){p = p->pNext;}//把节点插到链表的尾节点if (g_pHead == NULL) {g_pHead = pNewNode;}else {p->pNext = pNewNode;}//录入学生信息printf("请输入学生姓名:\n");scanf_s("%s", pNewNode->stu.szName, sizeof(pNewNode->stu.szName));printf("请输入性别:\n");scanf_s("%s", pNewNode->stu.szSex, sizeof(pNewNode->stu.szSex));printf("请输入学生年龄:\n");scanf_s("%d", &pNewNode->stu.nAge);printf("请输入学号:\n");scanf_s("%d", &pNewNode->stu.nStuNo);printf("请输入成绩:\n");scanf_s("%d", &pNewNode->stu.nScore);printf("学生信息录入成功。\n\n");system("pause");system("cls");
}

五、打印学生信息

  1. 读取链表结构,输出学生信息。先进行判空处理,如果无学生信息则输出提示信息,反之则正确输出学生信息。
//2.打印学生信息
void PrintStudent() {system("cls");//遍历链表Node* p = g_pHead;if (p == NULL) {printf("系统中暂无学生信息,请录入后再来打印查看。\n\n");}else {printf("*********************************************************************************\n");printf("*\t\t\t欢迎使用高校学生成绩管理系统V1.0\t\t\t*\n");printf("*********************************************************************************\n");printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");printf("*********************************************************************************\n");while (p != NULL){printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",p->stu.nStuNo,p->stu.szName,p->stu.szSex,p->stu.nAge,p->stu.nScore);//下一个节点p = p->pNext;printf("*********************************************************************************\n");}}system("pause");system("cls");
}

六、保存学生信息

  1. 利用文件对学生信息进行存储
//3.保存学生信息
void SaveStudent() {//打开文件FILE* pFile;pFile = fopen(".\\stuinfo.dat", "w");if (pFile == NULL) {printf("打开文件失败。\n");return;}//写入数据Node* p = g_pHead;while (p != NULL){fwrite(&p->stu, sizeof(Node), 1, pFile);p = p->pNext;}//关闭文件fclose(pFile);printf("数据保存成功。\n");system("pause");system("cls");
}
  1. fopen在vs中会报错,解决方式

(1)按照vs的提示,将fopen换成fopen_s

(2)不修改函数,仅仅修改项目的属性。因为fopen_s是一种Microsoft的函数,若纯做Windows开发则直接改为_s也无妨,但是我们尽量还是用标准C++比较好,这样代码有较好的移植性。

具体操作:

右键工程名–>属性–>C/C++–>预处理器–>预处理器定义,编辑右边输入框加入: _CRT_SECURE_NO_WARNINGS

保存(注意用分号隔开)。

七、读取学生信息

  1. 打开存储学生信息的文本,单个单词读取,判断非分隔符或者空时则赋值给链表中的节点,读取完毕后,直接调用PrintStudent()函数进行打印结果。
//4.读取学生信息
void ReadStudent() {system("cls");//打开文件FILE* pFile;pFile = fopen(".\\stuinfo.dat", "r");if (pFile == NULL) {printf("打开文件失败。\n");return;}//创建一个人,在堆中分配内存Node* p = (Node*)malloc(sizeof(Node));p->pNext = NULL;//重新建立链表g_pHead = p;//逐个单词读入文本内容char str[200];int i = 0;while (fscanf(pFile, "%s", str) != EOF) {  //读文件 //单词不是*或者空时,进行赋值if (strcmp(str, "*") && str != NULL) {switch (i){case 0:p->stu.nStuNo = atoi(str);break;case 1:strcpy(p->stu.szName, str);break;case 2:strcpy(p->stu.szSex, str);break;case 3:p->stu.nAge = atoi(str);break;case 4:p->stu.nScore = atoi(str);break;default:Node* pNewNode = (Node*)malloc(sizeof(Node));pNewNode->pNext = NULL;p->pNext = pNewNode;p = pNewNode;p->stu.nStuNo = atoi(str);i = 0;break;}i++;}}//打印读取结果PrintStudent();
}
  1. 读取文本时,将内容全部赋值给char数组,所有赋值时需特殊处理。
  • char数组赋值给整数

    在<stdlib.h>头文件中有两个函数,int atoi(char *p)和char *itoa(int p),分别将装有整数的char数组转化为整数,和将整数按位数分解依次存入char数组中。

  • char数组赋值给char数组

    用strcpy函数!

    原型声明:extern char *strcpy(char *dest,char *src);

    头文件:string.h

    功能:把src所指由NULL结束的字符串复制到dest所指的数组中。

    说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

    返回指向dest的指针。

    注:不能使用memcpy(a, b, strlen(b)),会导致中文乱码。

八、统计所有学生人数

  1. 设置计数器,遍历链表
//5.统计所有学生人数
void CountStudent() {int countStu = 0;//遍历链表Node* p = g_pHead;while (p != NULL){countStu++;p = p->pNext;}printf("学生总人数:%d\n\n", countStu);system("pause");system("cls");
}

九、查找学生信息

  1. 本次查找以学号为示例,改用姓名等信息查询流程基本一致。

    遍历链表,如果有符合信息的学生则打印,反之则继续下一个节点,若系统中无该学生信息,给予用户无结果提示。

//6.查找学生信息
void FindStudent() {system("cls");//以学号为查找示例,其他信息查找流程基本相似int stuNum;printf("请输入查找学生学号:");scanf("%d", &stuNum);//遍历链表查找,查找到后进行信息显示Node* p = g_pHead;//对表头进行展示一次bool isShowHead = false;//记录是否有找到该学号的学生信息bool isFindStu = false;while (p != NULL){if (stuNum == p->stu.nStuNo) {if (!isShowHead) {printf("*********************************************************************************\n");printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");printf("*********************************************************************************\n");isShowHead = true;}printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",p->stu.nStuNo,p->stu.szName,p->stu.szSex,p->stu.nAge,p->stu.nScore);isFindStu = true;printf("*********************************************************************************\n");}p = p->pNext;}if (!isFindStu) {printf("学号输入有误,系统中暂无该学生信息。\n\n");}system("pause");system("cls");
}

十、修改学生信息

  1. 可参考查找学生信息代码段,在查找后进行修改即可
//7.修改学生信息
void ChangeStudent() {//以学号为查找示例,其他信息查找流程基本相似int stuNum;printf("请输入欲修改学生的学号:");scanf("%d", &stuNum);//遍历链表查找,查找到后进行信息显示Node* p = g_pHead;//对表头进行展示一次bool isShowHead = false;//记录是否有找到该学号的学生信息bool isFindStu = false;while (p != NULL){if (stuNum == p->stu.nStuNo) {if (!isShowHead) {printf("*********************************************************************************\n");printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");printf("*********************************************************************************\n");isShowHead = true;}printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",p->stu.nStuNo,p->stu.szName,p->stu.szSex,p->stu.nAge,p->stu.nScore);//修改学生信息printf("请输入学生姓名:\n");scanf_s("%s", p->stu.szName, sizeof(p->stu.szName));printf("请输入性别:\n");scanf_s("%s", p->stu.szSex, sizeof(p->stu.szSex));printf("请输入学生年龄:\n");scanf_s("%d", &p->stu.nAge);printf("请输入学号:\n");scanf_s("%d", &p->stu.nStuNo);printf("请输入成绩:\n");scanf_s("%d", &p->stu.nScore);isFindStu = true;printf("*********************************************************************************\n");printf("学生信息修改成功,请注意及时保存。\n\n");}p = p->pNext;}if (!isFindStu) {printf("学号输入有误,系统中暂无该学生信息,无法进行修改。\n\n");}system("pause");system("cls");
}

十一、删除学生信息

  1. 仍然以查找学生信息操作为基础,以学号为线索,查找到则进行删除,未查找到则进行错误提示,删除时需要区分当前节点是头结点、尾节点或者中间节点,不同节点操作不同,同时该删除仅作用于本次操作,需保存学生信息才能长久生效。
//8.删除学生信息
void DeleteStudent() {system("cls");//以学号为查找示例,其他信息查找流程基本相似int stuNum;printf("请输入删除学生的学号:");scanf("%d", &stuNum);//遍历链表查找,查找到后进行信息显示Node* p = g_pHead;//记录前一个节点,删除时方便操作Node* beforeNode = g_pHead;//对表头进行展示一次bool isShowHead = false;//记录是否有找到该学号的学生信息bool isFindStu = false;while (p != NULL){if (stuNum == p->stu.nStuNo) {if (!isShowHead) {printf("*********************************************************************************\n");printf("*\t学号\t*\t姓名\t*\t性别\t*\t年龄\t*\t成绩\t*\n");printf("*********************************************************************************\n");isShowHead = true;}printf("*\t%d\t*\t%s\t*\t%s\t*\t%d\t*\t%d\t*\n",p->stu.nStuNo,p->stu.szName,p->stu.szSex,p->stu.nAge,p->stu.nScore);isFindStu = true;printf("*********************************************************************************\n");//删除节点为头节点if (p == g_pHead) {g_pHead = p->pNext;}//删除节点为尾节点else if (p->pNext == NULL) {p = beforeNode;p->pNext = NULL;}//删除节点为中间节点else {beforeNode->pNext = p->pNext;}printf("删除成功,请记得保存。\n\n");}beforeNode = p;p = p->pNext;}if (!isFindStu) {printf("学号输入有误,系统中暂无该学生信息,无法进行删除操作。\n\n");}system("pause");system("cls");
}

十二、退出系统

直接在选择0时,设置return即可。

十三、出错

用户输入有误时,进行提示信息输出即可。

 printf("输入有误,没有该功能\n\n");system("pause");  //暂停system("cls");    //清屏

C语言开发简单的学生成绩管理系统(附源码)相关推荐

  1. 第一篇博客——C语言实现简单的学生成绩管理系统

    C语言简单实现学生成绩管理系统 一.前言 首先,要写一个管理系统必须要先搭出一个框架来,即明确自己要实现哪些功能,将每个功能都写陈一个函数,然后再去编写实现各个功能的函数,最后再思考各个函数之间的相互 ...

  2. 基于python的学生成绩管理系统毕业设计源码071143

    Django学生成绩管理 摘   要 在国家重视教育影响下,教育部门的密确配合下,对教育进行改革.多样性.质量等等的要求,使教育系统的管理和运营比过去十年前更加理性化.依照这一现实为基础,设计一个快捷 ...

  3. 采用ASP.NET使用C#.NET语言开发的在线学生选课系统(源码+数据库+论文)

    随着在校大学生人数的不断增加,教务系统的数据量也不断的上涨.针对学生选课这一环节,本系统从学生网上自主选课以及教师的课程信息发布两个大方面进行了设计,基本实现了学生的在线信息查询.选课功能.教师添加课 ...

  4. Python学生成绩管理系统(源码+数据库)

    文章目录 前言 一.sqlite是什么? 二.实验步骤 1.封装数据库操作类dbHelper.py 2.设计学生类students.py 3.结果 4.SQLiteExpertPersSetup64( ...

  5. Java版学生信息管理系统 附源码(JavaFX图形界面)

    1.登录界面 其中的图片存储路径可以替换成自己的,当然我这里的账号密码是先设置好的,其实可以做一个注册的功能,把账号密码存进文件中 package SchoolWork.ManagementSyste ...

  6. 用C语言写的学生管理系统,C语言实现简单的学生成绩管理系统

    最近在问答上帮提问者回答问题,有遇到求C语言实现学生管理成绩系统,需求非常简单,就顺手码了下代码.我觉得这种比较小的系统,可以收录起来,做一个C语言基础学习目录也是不错的主意. 因为当时的问题已经找不 ...

  7. c语言学生信息管理系统作用,C语言学生信息管理系统(附源码).doc

    . word范文 学生信息管理系统 #include #include #include #include #include #define LEN sizeof(struct student) #d ...

  8. Java学生成绩管理系统(含源码+论文+答辩PPT等)

    该项目采用技术JSP.Servlet.jdbc.Tomcat服务器.MySQL数据库 ,项目含有源码.论文.配套开发软件.软件安装教程.项目发布教程 下面是系统运行起来后的部分截图:

  9. C语言课程设计(1)-学生成绩管理系统

    源码.经验交流QQ群:613879714,有问题QQ群提问,这里不能及时回复 1. 主要功能 输入学生数据 显示学生数据 计算成绩 成绩排序 成绩查找 成绩修改 添加学生数据 删除学生成绩 2.演示 ...

  10. java简单学生成绩系统_JAVA 实现简单的学生成绩管理系统

    一.实验目的 1.掌握java的类与对象的基本概念: 2.掌握简单的信息管理系统的设计与实现. 二.实验环境 实验建议在安装了以下软件的计算机上完成: 1.       Windows xp/win7 ...

最新文章

  1. html 写一个日志控件 查看log
  2. Linux下Apache+Tomcat 负载均衡
  3. 《CSS揭秘》-背景与边框
  4. Windows下UAC安全机制笔记
  5. linux的基础知识——进程组
  6. 信息学奥赛一本通(1008:计算(a+b)/c的值)
  7. wxnativecallback.php,ectouch开发 | 糊涂虫
  8. 流行的移动端UI框架
  9. DLL load failed while importing _swigfaiss: 找不到指定的模块。
  10. Facial Expression Recognition
  11. linux原子锁原理,了解Linux的锁与同步、原子加(atomic_add)
  12. 快手的扫描登录网页端隐藏得够深得
  13. 滴水逆向三期和中级和高期教程
  14. 数据结构童话版 001新的学年
  15. SSD1306显示屏--躲避类游戏
  16. UDP点对点传输实现
  17. Excel插入XactiveX提示出错“不能插入对象”解决
  18. NAS服务器有哪些优势
  19. UESTC 2014 Summer Training #7 Div.2
  20. 计算机64位地址总线,64位CPU和数据/地址总线的关系

热门文章

  1. 【数据结构 严蔚敏版】 链式栈基本操作
  2. CAD2012软件安装资料及教程
  3. 一个成功企业家立下的22条规矩
  4. Java快逸报表展现demo,快逸报表展示图片—来自数据库中的图片
  5. 如何安装mgn-mqt82.exe以及qtp10下载
  6. Windows系统安装jdk1.6
  7. 【SVN】解决SVN安装语言包后无法选择中文的问题
  8. DenseNet 简介
  9. 适合android手机 pdf阅读器,手机版pdf阅读器有哪些 这五款软件一定有适合你的
  10. java分析dump文件_干货分享丨jvm系列:dump文件深度分析