C语言实现学生信息管理系统(文件操作)
更新时间:2022年6月20日 13:53 点击:310 作者:Demo龙
本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下
前言:与上篇文章相比,增加了文件操作,可将任意时期的的学生数据存储再文件中,菜单也随之改动,增加了文件操作一栏,是否存储到相应文件中由使用者决定
新增函数——文件操作;
//学生数据文件储存 //储存任意时期的学生数据 void Store_List(Link head) { //文件操作 ofstream ofs; ofs.open("Std_Information.txt",ios::out); if(head==NULL) { printf("学生为空\n"); return; } else { Link p=head->next; while(p) { ofs<< "姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; p=p->next; } } }
1.头文件和预处理
#include <stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<stdbool.h> #include<iostream> #include<fstream>//文件操作所需头文件 using namespace std; #define NO_LENGTH 20 #define NAME_LENGTH 11 /* 定义学生结构体的数据结构 */ typedef struct Student{ char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH]; int score; }st; /* 定义每条记录或节点的数据结构 */ typedef struct node { struct Student data; //数据域 struct node *next; //指针域 }Node,*Link; //Node为node类型的别名,Link为node类型的指针别名
2.定义学生结构体的数据结构
typedef struct Student{ char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH]; int score; }st;
3.定义每条记录或节点的数据结构
/* 定义每条记录或节点的数据结构 */ typedef struct node { struct Student data; //数据域 struct node *next; //指针域 }Node,*Link; //Node为node类型的别名,Link为node类型的指针别名
4.函数接口代码.
1.定义提示菜单
//定义提示菜单 void myMenu(){ printf("*****************************菜单*****************************\n"); printf("***********************1 增加学生记录*************************\n"); printf("***********************2 删除学生记录*************************\n"); printf("***********************3 查找学生记录*************************\n"); printf("***********************4 修改学生记录*************************\n"); printf("***********************5 统计学生人数 ************************\n"); printf("***********************6 显示学生记录*************************\n"); printf("***********************7 信息文件打印*************************\n"); printf("***********************8 退出系统 ****************************\n"); }
2.增加学生记录
void inputStudent(Link l){ printf("请输入学生学号:"); scanf("%s",l->data.studentNo); printf("请输入学生的姓名:"); scanf("%s",l->data.studentName); printf("请输入学生的成绩:"); scanf("%s",&(l->data.score)); //每个新创建的节点的next域都初始化为NULL l->next = NULL; system("cls"); }
3.输入学号接口·
void inputStudentNo(char s[],char no[]){ printf("请输入要%s的学生学号:",s); scanf("%s",no); }
4.遍历表中学生
//遍历表中学生 void displayNode(Link head){ if(head==NULL) { printf("学生为空\n"); return; } else { Link p=head->next; while(p) { cout<<"姓名:"<<p->data.studentName<<" 学号"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; p=p->next; } } // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息 system("pause"); system("cls"); }
5.增加学生记录
/* 增加学生记录 */ bool addNode(Link head){ Link p,q; //p,q两个节点一前一后 Link node; //node指针指向新创建的节点 node=(Link)malloc(sizeof(Node)); inputStudent(node); q = head; p = head->next; //q指向head后面的第一个有效节点 if(head->next==NULL) //链表为空时 head->next = node; else { //循环访问链表中的所有节点 while(p != NULL){ if (node->data.studentNo < p->data.studentNo){ //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序 q->next = node; node->next = p; return true; } else{ //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后) q = p; p = p->next; } } //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面 q->next = node; } return true; system("pause"); system("cls"); }
6.删除学生信息
//删除学生信息 bool deleteNode(Link head){ // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("删除",no); Link p=head->next; Link q=head; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"成功删除该学生"<<endl; q->next=p->next; free(p); system("pause"); system("cls"); return true; } else { q=p; p=p->next; } } cout<<"未找到该学生"<<endl; system("pause"); system("cls"); return false; }
7.查找学生信息
//查找学生信息 bool queryNode(Link head){ // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("查找",no); Link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { system("cls"); cout<<"姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; return true; } else { p=p->next; } } cout<<"未找到该学生"<<endl; system("cls"); return false; }
8.修改学生信息
//修改学生信息 bool modifyNode(Link head){ // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("修改",no); Link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"请输入修改后的姓名"<<endl; cin>>p->data.studentName; cout<<"请输入修改后的学号"<<endl; cin>>p->data.studentNo; cout<<"请输入修改后的成绩"<<endl; cin>>p->data.score; system("cls"); return true; } else { p=p->next; } } cout<<"未找到该学生,请重新输入学号"<<endl; system("cls"); return false; }
9.统计学生人数
//统计学生人数 int countNode(Link head){ //统计学生人数,扫描链表统计节点个数,返回节点数 Link p; int count = 0; p = head->next; while(p) { p=p->next; count++; } //填充代码 system("cls"); return count; }
10.清空链表
//清空链表 void clearLink(Link head){ Link q,p; p=head->next; q=head; while(p) { q->next=p->next; free(p); p=q->next; } //遍历链表,用free语句删除链表中用malloc建立起的所有的节点 }
11.文件操作
//学生数据文件储存 //储存任意时期的学生数据 void Store_List(Link head) { //文件操作 ofstream ofs; ofs.open("Std_Information.txt",ios::out); if(head==NULL) { printf("学生为空\n"); return; } else { Link p=head->next; while(p) { ofs<< "姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; p=p->next; } } }
5.main函数
int main() { int select; int count; Link head; // 定义链表 //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据 head = (Link)malloc(sizeof(Node)); head->next = NULL; while(1) { myMenu(); printf("\n请输入你的选择(0-7):"); //显示提示信息 scanf("%d",&select); switch(select) { case 1: //增加学生记录 if(addNode(head)) printf("成功插入一个学生记录。\n\n"); break; case 2: //删除学生记录 if(deleteNode(head)) printf("成功删除一个学生记录。\n\n"); else printf("没有找到要删除的学生节点。\n\n"); break; case 3: //查询学生记录 if(queryNode(head)) printf("成功找到学生记录。\n\n"); else printf("没有找到要查询的学生节点。\n\n"); break; case 4: //修改学生记录 if(modifyNode(head)) printf("成功修改一个学生记录。\n\n"); else printf("没有找到要修改的学生节点。\n\n"); break; case 5: //统计学生人数 count = countNode(head); printf("学生人数为:%d\n\n",count); break; case 6: //显示学生记录 displayNode(head); break; case 7: //退出前清除链表中的所有结点 clearLink(head); return 0; default: printf("输入不正确,应该输入0-7之间的数。\n\n"); system("cls"); break; } } return 0; }
6.学生信息管理系统总源码(可直接复制运行)
#include <stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #include<stdbool.h> #include<iostream> #include<fstream>//文件操作所需头文件 using namespace std; #define NO_LENGTH 20 #define NAME_LENGTH 11 /* 定义学生结构体的数据结构 */ typedef struct Student{ char studentNo[NO_LENGTH]; char studentName[NAME_LENGTH]; int score; }st; /* 定义每条记录或节点的数据结构 */ typedef struct node { struct Student data; //数据域 struct node *next; //指针域 }Node,*Link; //Node为node类型的别名,Link为node类型的指针别名 //定义提示菜单 void myMenu(){ printf("*****************************菜单*****************************\n"); printf("***********************1 增加学生记录*************************\n"); printf("***********************2 删除学生记录*************************\n"); printf("***********************3 查找学生记录*************************\n"); printf("***********************4 修改学生记录*************************\n"); printf("***********************5 统计学生人数 ************************\n"); printf("***********************6 显示学生记录*************************\n"); printf("***********************7 信息文件打印*************************\n"); printf("***********************8 退出系统 ****************************\n"); } void inputStudent(Link l){ printf("请输入学生学号:"); scanf("%s",l->data.studentNo); printf("请输入学生的姓名:"); scanf("%s",l->data.studentName); printf("请输入学生的成绩:"); scanf("%d",&(l->data.score)); //每个新创建的节点的next域都初始化为NULL l->next = NULL; system("cls"); } void inputStudentNo(char s[],char no[]){ printf("请输入要%s的学生学号:",s); scanf("%s",no); } //遍历表中学生 void displayNode(Link head){ if(head==NULL) { printf("学生为空\n"); return; } else { Link p=head->next; while(p) { cout<<"姓名:"<<p->data.studentName<<" 学号"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; //ofs<< "姓名:"<<p->data.studentName<<" 学号"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; p=p->next; } } // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息 system("pause"); system("cls"); } /* 增加学生记录 */ bool addNode(Link head){ Link p,q; //p,q两个节点一前一后 Link node; //node指针指向新创建的节点 node=(Link)malloc(sizeof(Node)); inputStudent(node); q = head; p = head->next; //q指向head后面的第一个有效节点 if(head->next==NULL) //链表为空时 head->next = node; else { //循环访问链表中的所有节点 while(p != NULL){ if (node->data.studentNo < p->data.studentNo){ //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序 q->next = node; node->next = p; return true; } else{ //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后) q = p; p = p->next; } } //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面 q->next = node; } return true; system("pause"); system("cls"); } bool deleteNode(Link head){ // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("删除",no); Link p=head->next; Link q=head; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"成功删除该学生"<<endl; q->next=p->next; free(p); system("pause"); system("cls"); return true; } else { q=p; p=p->next; } } cout<<"未找到该学生"<<endl; system("pause"); system("cls"); return false; } //查找学生信息 bool queryNode(Link head){ // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("查找",no); Link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { system("cls"); cout<<"姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; return true; } else { p=p->next; } } cout<<"未找到该学生"<<endl; system("cls"); return false; } //修改学生信息 bool modifyNode(Link head){ // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false //输入要处理的学号 char no[NO_LENGTH]; inputStudentNo("修改",no); Link p=head->next; while(p) { if(strcmp(p->data.studentNo,no)==0) { cout<<"请输入修改后的姓名"<<endl; cin>>p->data.studentName; cout<<"请输入修改后的学号"<<endl; cin>>p->data.studentNo; cout<<"请输入修改后的成绩"<<endl; cin>>p->data.score; system("cls"); return true; } else { p=p->next; } } cout<<"未找到该学生,请重新输入学号"<<endl; system("cls"); return false; } //统计学生人数 int countNode(Link head){ //统计学生人数,扫描链表统计节点个数,返回节点数 Link p; int count = 0; p = head->next; while(p) { p=p->next; count++; } //填充代码 system("cls"); return count; } //清空链表 void clearLink(Link head){ Link q,p; p=head->next; q=head; while(p) { q->next=p->next; free(p); p=q->next; } //遍历链表,用free语句删除链表中用malloc建立起的所有的节点 } //学生数据文件储存 //储存任意时期的学生数据 void Store_List(Link head) { //文件操作 ofstream ofs; ofs.open("Std_Information.txt",ios::out); if(head==NULL) { printf("学生为空\n"); return; } else { Link p=head->next; while(p) { ofs<< "姓名:"<<p->data.studentName<<" 学号:"<<p->data.studentNo<<" 成绩:"<<p->data.score<<endl; p=p->next; } } } int main() { int select; int count; Link head; // 定义链表 //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据 head = (Link)malloc(sizeof(Node)); head->next = NULL; while(1) { myMenu(); printf("\n请输入你的选择(0-8):"); //显示提示信息 scanf("%d",&select); switch(select) { case 1: //增加学生记录 if(addNode(head)) printf("成功插入一个学生记录。\n\n"); break; case 2: //删除学生记录 if(deleteNode(head)) printf("成功删除一个学生记录。\n\n"); else printf("没有找到要删除的学生节点。\n\n"); break; case 3: //查询学生记录 if(queryNode(head)) printf("成功找到学生记录。\n\n"); else printf("没有找到要查询的学生节点。\n\n"); break; case 4: //修改学生记录 if(modifyNode(head)) printf("成功修改一个学生记录。\n\n"); else printf("没有找到要修改的学生节点。\n\n"); break; case 5: //统计学生人数 count = countNode(head); printf("学生人数为:%d\n\n",count); break; case 6: //显示学生记录 displayNode(head); break; case 7:Store_List(head); cout<<"打印成功"<<endl; system("pause"); system("cls"); break; case 8: //退出前清除链表中的所有结点 clearLink(head); return 0; default: printf("输入不正确,应该输入0-8之间的数。\n\n"); system("pause"); system("cls"); break; } } return 0; }
7.测试结果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
原文出处:https://zal321.blog.csdn.net/article/details/122496735
上一篇: 基于Qt实现SVG图片浏览器
下一篇: C语言超全面覆盖操作符知识点
相关文章
- 这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
- 本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
- 这篇文章主要介绍了Vue基于localStorage存储信息代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-16
- 这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
- 这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
详解C语言中的rename()函数和remove()函数的使用方法
这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
- 本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
C#利用System.Threading.Thread.Sleep即时输出信息的详解
本篇文章是对C#利用System.Threading.Thread.Sleep即时输出信息进行了详细的分析介绍,需要的朋友参考下...2020-06-25- 护卫神·主机管理系统该版本支持在Windows Server 200320082012,含32位和64位,直接开设配置WEB站、FTP站,以及SQL Server和MySQL,是您开设和管理虚拟主机的绝好帮手。但是对于新用户可能在使用上有一些困难,因此请仔细阅读如下说明文档...2016-01-27
- 这篇文章主要介绍了C# 获取硬盘号,CPU信息,加密解密技术的步骤,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2021-01-16
- Redis 是一个开源、高性能的Key-Value数据库,被广泛应用在服务器各种场景中。本文介绍几个查看Redis内存信息的命令,包括常用的info memory、info keyspace、bigkeys等。...2021-01-15
- 这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
- 今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言中memcpy 函数的用法详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言中查找字符在字符串中出现的位置的方法,分别是strchr()函数和strrchr()函数的使用,需要的朋友可以参考下...2020-04-25
- 很多同学在学习c语言的时候是不是会碰到a++和++a都有甚么作用啊。今天我们就来探讨下...2020-04-25