C语言实现学生信息管理系统(文件操作)

目录

新增函数——文件操作;

1.头文件和预处理

2.定义学生结构体的数据结构

3.定义每条记录或节点的数据结构

4.函数接口代码.

1.定义提示菜单

2.增加学生记录

3.输入学号接口·

4.遍历表中学生

5.增加学生记录

6.删除学生信息

7.查找学生信息

8.修改学生信息

9.统计学生人数

10.清空链表

11.文件操作

5.main函数

6.学生信息管理系统总源码(可直接复制运行)

7.测试结果

本文实例为大家分享了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.测试结果

推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    公共CPU接口类型的详细描述

    公共CPU接口类型的详细描述,,我们知道CPU是电脑的大脑, CPU的处理速度直接决定电脑的性能, 那你知道CPU发展到现在, 都那些CPU接口类型吗.

    FM1和AM3接口将在今年年底前淘汰

    FM1和AM3接口将在今年年底前淘汰,,据来自主板制造商的消息,AMD将开始逐步淘汰Socket FM1和Socket AM3接口从本月开始的处理器,最后消失在第

    Windows8开发版系统高清系统接口图

    Windows8开发版系统高清系统接口图,,今天,微软发布,目前由开发者体验版Windows 8操作系统为整个英文系统,Windows 8带来了一系列新功能,没有折

    探探语言设置|探探怎么设置语言

    探探语言设置|探探怎么设置语言,,1. 探探怎么设置语言打开探探软件,然后就有消息提示的红点,点开就行了!其实这些软件都是挺简单的操作的,都是

    excel常用函数都有哪些?

    excel常用函数都有哪些?,函数,哪些,常用,1、SUM函数:SUM函数的作用是求和。函数公式为=sum()例如:统计一个单元格区域:=sum(A1:A10)  统计多个

    git设置编码|git语言设置

    git设置编码|git语言设置,,git设置编码点击cap4j搜索从git直接链接上拉代码。git语言设置Git是一个开源的分布式版本控制系统,可以有效、高