用c++模拟实现一个学生成绩管理系统

https://blog.csdn.net/yanxiaolx/article/details/53393437

题目:用c++模拟实现一个学生成绩的信息管理系统,要求能添加、删除、修改、查看和保存学生的信息等功能

源代码如下:

[cpp] view plaincopy
  1. #define  _CRT_SECURE_NO_WARNINGS  
  2.   
  3. #include<iostream>  
  4. using namespace std;  
  5. #include<string.h>  
  6. #include<fstream>  
  7.   
  8. class student  
  9. {  
  10. private:  
  11.     student* next;  
  12. public:  
  13.     char stu_num[15];                  //学号  
  14.     char stu_name[30];                //姓名  
  15.     float stu_score;                      //成绩  
  16.   
  17.     void afterInsert(student *p);//在该节点后插入一个节点  
  18.     void afterDelete();//在该节点后删除一个节点  
  19.       
  20.     student *getNext()//获得下一个节点的指针  
  21.     {   
  22.         return next;   
  23.     }  
  24.   
  25.     /***********查询学生信息************/  
  26.     void getMage();  
  27.   
  28.     /******学生信息修改******/  
  29.     void changeMage(int n, char *ptr);  
  30.     void changegrade(float p);  
  31.   
  32.     /******构造*****/  
  33.     student(char *num, char *name, float score);  
  34.     student();  
  35. };  
  36.   
  37. void student::changegrade(float p)  
  38. {  
  39.     stu_score = p;  
  40. }  
  41.   
  42. student::student()           //构造  
  43. {  
  44.     strcpy(stu_num, "\0");  
  45.     strcpy(stu_name, "\0");  
  46.     stu_score = 0;  
  47.     next = '\0';  
  48. }  
  49.   
  50. student::student(char *num, char *name, float score)  
  51. {  
  52.     strcpy(stu_num, num);  
  53.     strcpy(stu_name, name);  
  54.     stu_score = score;  
  55.     next = '\0';  
  56. }  
  57.   
  58. void student::afterInsert(student *p)//插入节点  
  59. {  
  60.     p->next = next;  
  61.     next = p;  
  62. }  
  63.   
  64. void student::afterDelete()        //删除节点  
  65. {  
  66.     student *p = next;  
  67.     next = p->next;  
  68.     delete p;  
  69. }  
  70.   
  71. void student::getMage()             //获得信息  
  72. {  
  73.     cout << "学号:" << stu_num << "      姓名:" << stu_name;  
  74.     cout << "      c++成绩:" << stu_score << endl;  
  75. }  
  76.   
  77. void student::changeMage(int n, char *ptr)  
  78. {  
  79.     switch (n)  
  80.     {  
  81.     case 1: strcpy(stu_num, ptr);   
  82.         break;  
  83.     case 2: strcpy(stu_name, ptr);  
  84.     }  
  85. }  
  86.   
  87. //建立链表函数  
  88. void  construct_list(student *tail)  
  89. {  
  90.     student *p = new student;  
  91.     char very[20];  
  92.     float achieve;  
  93.     cout << "请输入学号:" << endl;  
  94.     cin >> very;  
  95.     p->changeMage(1, very);  
  96.     cout << "请输入姓名:" << endl;  
  97.     cin >> very;  
  98.     p->changeMage(2, very);  
  99.     cout << "请输入c++成绩:" << endl;  
  100.     cin >> achieve;  
  101.     p->changegrade(achieve);  
  102.     system("cls");  
  103.     cout << "信息输入完毕" << endl;  
  104.   
  105.     for (; tail->getNext() != '\0';)  
  106.     {  
  107.         tail = tail->getNext();  
  108.     }  
  109.   
  110.     tail->afterInsert(p);  
  111. }  
  112.   
  113. /*********查询信息*********/  
  114. student *findmege(student *head)  
  115. {  
  116. loop:  
  117.     cout << "1--按姓名查询           2--按学号查询              q--返回上一级菜单" << endl;  
  118.     char p[5], ptr[20];  
  119.     student *mid = head;  
  120.     cin >> p;  
  121.   
  122.     if (p[0] != '1'&&p[0] != '2'&&p[0] != 'q' || strlen(p)>1)  
  123.     {  
  124.         system("cls");  
  125.         cout << "对不起,你的输入有误,请重新输入!" << endl;  
  126.         goto loop;  
  127.     }  
  128.   
  129.     switch (p[0])  
  130.     {  
  131.     case '1':  
  132.     {  
  133.         system("cls");  
  134.         cout << "请输入要查找的姓名:" << endl;  
  135.         cin >> ptr;  
  136.   
  137.         for (; strcmp(ptr, mid->stu_name) != 0; mid = mid->getNext())  
  138.         {  
  139.             if (mid->getNext() == '\0')  
  140.             {  
  141.                 cout << "对不起,你要查找的人不存在,请确认你的输入是否正确!" << endl;  
  142.                 goto loop;  
  143.             }  
  144.         }  
  145.         return mid;  
  146.     }  
  147.     case '2':  
  148.     {  
  149.         system("cls");  
  150.         cout << "请输入您要查找的学号:" << endl;  
  151.         cin >> ptr;  
  152.         for (; strcmp(ptr, mid->stu_num) != 0; mid = mid->getNext())  
  153.         {  
  154.             if (mid->getNext() == '\0')  
  155.             {  
  156.                 cout << "对不起,您要查找的内容不存在,请确认您的输入是否正确!" << endl;  
  157.                 goto loop;  
  158.             }  
  159.         }  
  160.         return mid;  
  161.     }  
  162.     case 'q':   
  163.     {  
  164.         return '\0';  
  165.     }  
  166.     default:  
  167.     {  
  168.         system("cls");  
  169.         cout << "对不起,您的输入有误,请重新输入!" << endl;  
  170.         goto loop;  
  171.     }  
  172.     }  
  173. }  
  174.   
  175. /******************删除链表 节点***********************/  
  176. void delete_list(student *head)  
  177. {  
  178.     student *p = '\0';  
  179.     char selet[4];  
  180.     system("cls");  
  181.     cout << "在删除前,系统会根据您的提示找到您要删除的学生信息!" << endl;  
  182.     p = findmege(head);  
  183.     if (p != '\0')  
  184.     {  
  185.         cout << "确认要删除吗(yes/任意键返回)" << endl;  
  186.         cin >> selet;  
  187.   
  188.         if (strcmp(selet, "yes") == 0)  
  189.         {  
  190.             for (; head->getNext() != p; head = head->getNext());  
  191.             head->afterDelete();  
  192.             system("cls");  
  193.             cout << "该信息删除成功!" << endl;  
  194.         }  
  195.     }  
  196. }  
  197.   
  198. /*******************修改节点信息********************/  
  199. void change_info(student *head)  
  200. {  
  201.     system("cls");  
  202.     cout << "在您修改前,系统会根据您提供的信息找的您要修改的信息:" << endl;  
  203.     student *p = '\0';  
  204.   
  205.     float achieve;  
  206.     p = findmege(head);  
  207.     if (p != '\0')  
  208.     {  
  209.         cout << "请输入c++成绩:" << endl;  
  210.         cin >> achieve;  
  211.         p->changegrade(achieve);  
  212.         system("cls");  
  213.         cout << "修改成功!" << endl;  
  214.     }  
  215.   
  216. }  
  217.   
  218. /**************输出学生成绩信息**************/  
  219. void output(student *head)  
  220. {  
  221.     system("cls");  
  222.     cout << "1-查看指定学生信息;2-查看所有学生信息;3-分段输出学生信息" << endl;  
  223.     char ch;  
  224.     int n = 0;  
  225.     head = head->getNext();  
  226.     cin >> ch;  
  227.     switch (ch)  
  228.     {  
  229.     case '1':   
  230.         head = findmege(head);  
  231.         if (head == '\0')  
  232.         {  
  233.             break;  
  234.         }  
  235.         head->getMage();  
  236.         break;  
  237.     case '2':   
  238.     while (head)  
  239.     {  
  240.         head->getMage();  
  241.         head = head->getNext();  
  242.     }  
  243.     break;  
  244.     case '3':   
  245.         cout << "a-60分以下;b-60~70分之间;c-70~80分之间;d-80~90分之间;e-90~100分之间:" << endl;  
  246.         cin >> ch;  
  247.         switch (ch)  
  248.         {  
  249.         case 'a':  
  250.         while (head)  
  251.         {  
  252.             if (head->stu_score <= 60)  
  253.             {  
  254.                 head->getMage();  
  255.                 n++;  
  256.             }  
  257.             head = head->getNext();  
  258.         }  
  259.          break;  
  260.         case 'b':   
  261.         while (head)  
  262.         {  
  263.             if (head->stu_score>60 && head->stu_score <= 70)   
  264.             {   
  265.                 head->getMage();  
  266.                 n++;   
  267.             }  
  268.             head = head->getNext();  
  269.         }  
  270.         break;  
  271.         case 'c':   
  272.         while (head)  
  273.         {  
  274.             if (head->stu_score>70 && head->stu_score <= 80)  
  275.             {   
  276.                 head->getMage();   
  277.                 n++;   
  278.             }  
  279.             head = head->getNext();  
  280.         }  
  281.         break;  
  282.         case 'd':   
  283.         while (head)  
  284.         {  
  285.             if (head->stu_score>80 && head->stu_score <= 90)  
  286.             {  
  287.                 head->getMage();  
  288.                 n++;  
  289.             }  
  290.             head = head->getNext();  
  291.         }  
  292.         break;  
  293.         case 'e':   
  294.         while (head)  
  295.         {  
  296.             if (head->stu_score>90 && head->stu_score <= 100)  
  297.             {   
  298.                 head->getMage();  
  299.                 n++;  
  300.             }  
  301.             head = head->getNext();  
  302.         }  
  303.         }  
  304.         if (n == 0)  
  305.         {  
  306.             cout << "该分段内没有您要找的学生信息" << endl;  
  307.         }  
  308.     }  
  309. }  
  310.   
  311. /*****************主菜单************************/  
  312. void mainmenu(student *head)  
  313. {  
  314.     char selet[10];  
  315.     int n = 1;  
  316.     ofstream outfile;  
  317.     ifstream infile;  
  318.     student *p, *ptr;  
  319.     student *test = head, *mid;  
  320.     cout << "*************************欢迎进入学生信息管理系统*************************" << endl;  
  321.     do {  
  322.         cout << "**************************************************************************" << endl;  
  323.         cout << "1.插入信息;   2.删除信息;  3.修改信息; 4.查看信息; 5.保存  " << endl;  
  324.         cout << "按'q'键退出      " << endl;  
  325.         cout << "**************************************************************************" << endl;  
  326.         cin >> selet;  
  327.         if (((selet[0]<'1' || selet[0]>'6') && selet[0] != 'q') || strlen(selet)>1)  
  328.         {  
  329.             system("cls");  
  330.             cout << "您的输入有误,请重新输入!" << endl;  
  331.             break;  
  332.         }  
  333.         switch (selet[0])  
  334.         {  
  335.   
  336.         case '1':  
  337.             construct_list(head);  
  338.             break;   
  339.         case '2':   
  340.             delete_list(head);   
  341.             break;  
  342.         case '3':   
  343.             change_info(head);  
  344.             break;  
  345.         case '4':   
  346.             output(head);  
  347.             break;  
  348.         case '5':    
  349.             outfile.open("students.txt", ios::out | ios::app);  
  350.             for (p = head->getNext(); p != '\0'; p = p->getNext())  
  351.             {  
  352.                 outfile << p->stu_name << ' ';  
  353.                 outfile << p->stu_num << ' ';  
  354.                 outfile << p->stu_score << ' ';  
  355.                 outfile << endl;  
  356.             }  
  357.             outfile.close();  
  358.             system("cls");  
  359.             cout << "保存成功!" << endl;  
  360.             break;  
  361.         case 'q':   
  362.             break;  
  363.         }  
  364.     } while (selet[0] != 'q');  
  365. }  
  366.   
  367. void main()  
  368. {  
  369.     student head;  
  370.     mainmenu(&head);  
  371. }  
运行结果部分截图:



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python3列表

操作&#xff1a;索引、切片、加、乘、检查成员、确定序列长度、确定最大最小元素 定义&#xff1a; 列表名 [元素]下标列表名[x] 截取:列表名[x:y] 更新&#xff1a; list[x]y 或者使用append()方法添加列表项删除&#xff1a; del list[x]常用操作&#xff1a; 截取与…

Linux惊群效应详解(最详细的了吧)

https://blog.csdn.net/lyztyycode/article/details/78648798?locationNum6&fps1 linux惊群效应详细的介绍什么是惊群&#xff0c;惊群在线程和进程中的具体表现&#xff0c;惊群的系统消耗和惊群的处理方法。1、惊群效应是什么&#xff1f;惊群效应也有人叫做雷鸣群体效应…

epoll原理详解(最清晰)

https://blog.csdn.net/lyztyycode/article/details/79491419我只是把内容搬运过来做个记录&#xff0c;方便自己以后回头看。第一部分&#xff1a;select和epoll的任务关键词&#xff1a;应用程序 文件句柄 用户态 内核态 监控者要比较epoll相比较select高效在什么地方&#x…

Ubuntu卸载软件

用过使用dpkg软件管理工具得到所有已经安装的软件&#xff0c;如果不清楚软件的全名可以使用grep命令进行查找 然后再使用sudo apt-get remove --purge 软件名卸载软件&#xff08;--purge参数会删除配置文件&#xff0c;删的干净一些&#xff09; 例如&#xff1a;

一个重要且实用的signal---SIGCHLD

https://blog.csdn.net/lyztyycode/article/details/78150805SIGCHLD(修改)因为笔者之前的文章里面有错误&#xff0c;今天发现&#xff0c;立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时&#xff0c;我说调用wait函数要一直检测子进程是否执行完…

Python3函数和代码复用

函数的定义 def 函数名([参数列表]):注释函数体注意事项 函数形参不需要声明类型&#xff0c;可以使用return语句在结束函数执行的同时返回任意类型的值&#xff0c;函数返回值类型与return语句返回表达式i的类型一致 即使该函数不需要接受任何参数&#xff0c;也必须保留一堆…

一文说尽C++赋值运算符重载函数(operator=)

http://www.cnblogs.com/zpcdbky/p/5027481.html在前面&#xff1a;关于C的赋值运算符重载函数(operator)&#xff0c;网络以及各种教材上都有很多介绍&#xff0c;但可惜的是&#xff0c;内容大多雷同且不全面。面对这一局面&#xff0c;在下在整合各种资源及融入个人理解的基…

Python a和a[:]的区别

简单来讲a[:]是深复制&#xff0c;a是浅复制&#xff0c;相当于赋值a的话是赋值了指针&#xff0c;赋值a[:]相当于复制了a对应的那段空间 例如&#xff1a; a [1,1,1,1,1,1]for x in a:if x1:a.remove(x)print(a)运行结果&#xff1a; remove操作是移除序列中第一个x元素。…

Linux系统【二】exec族函数及应用

文件描述符 文件描述符表是一个指针数组&#xff0c;文件描述符是一个整数。 文件描述符表对应的指针是一个结构体&#xff0c;名字为file_struct&#xff0c;里面保存的是已经打开文件的信息 需要注意的是父子进程之间读时共享&#xff0c;写时复制的原则是针对物理地址而言…

白话C++系列(27) -- RTTI:运行时类型识别

http://www.cnblogs.com/kkdd-2013/p/5601783.htmlRTTI—运行时类型识别 RTTI&#xff1a;Run-Time Type Identification。 那么RTTI如何来体现呢&#xff1f;这就要涉及到typeid和dynamic_cast这两个知识点了。为了更好的去理解&#xff0c;那么我们就通过一个例子来说明。这个…

使用头文件的原因和规范

原因 通过头文件来调用库功能。在很多场合&#xff0c;源代码不便&#xff08;或不准&#xff09;向用户公布&#xff0c;只 要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库 功能&#xff0c;而不必关心接口怎么实现的。编译器会从库中提取相应…

转圈踢人问题

https://www.cnblogs.com/lanxuezaipiao/p/3339603.html 有N个人围一圈依次报数&#xff0c;数到3的倍数的人出列&#xff0c;问当只剩一个人时他原来的位子在哪里&#xff1f; 解答&#xff1a;经典的转圈踢人问题&#xff0c;好吧专业一点&#xff0c;约瑟夫环问题&#xff0…

Python3常用数据结构

Python3中有三种组合数据类型&#xff0c;分别为&#xff1a; 序列类型&#xff1a;字符串&#xff08;str&#xff09;、元组&#xff08;tuple&#xff09;、列表&#xff08;list&#xff09;集合类型&#xff1a;集合&#xff08;set&#xff09;映射类型&#xff1a;字典…

TCP第四次挥手为什么要等待2MSL

当客户端进入TIME-WAIT状态的时候(也就是第四次挥手的时候)&#xff0c;必须经过时间计数器设置的时间2MSL(最长报文段寿命)后&#xff0c;才能进入关闭状态&#xff0c;这时为什么呢&#xff1f;&#xff1f;&#xff1f; 这最主要是因为两个理由&#xff1a; 1、为了保证客户…

计算机网络【一】概述+OSI参考模型

网络概述 局域网:覆盖范围小(100m以内)&#xff0c;自己花钱买设备&#xff0c;带宽固定(10M,100M,1000M)&#xff0c;自己维护&#xff08;接入层交换机直接连接电脑、汇聚层交换机直接连接接入层交换机&#xff09; 广域网:距离远&#xff0c;花钱买服务&#xff0c;租带宽&…

单链表逆序的多种方式

https://www.cnblogs.com/eniac12/p/4860642.htmltemplate<class T> void List<T>::Inverse() {if(first NULL) return;LinkNode<T> *p, *prev, *latter; p first->link;   // 当前结点prev NULL;   // 前一结点l…

socket编程 -- epoll模型服务端/客户端通信的实现

https://blog.csdn.net/y396397735/article/details/50680359 本例实现如下功能&#xff1a; 支持多客户端与一个服务端进行通信&#xff0c;客户端给服务端发送字符串数据&#xff0c;服务端将字符串中小写转为大写后发送回客户端&#xff0c;客户端打印输出经转换后的字符串。…

Python3 面向对象程序设计

类的定义 Python使用class关键字来定义类 class Car:def infor(self):print("This is a car") car Car() car.infor()内置方法isinstance()来测试一个对象是否为某个类的实例 self参数 类的 所有实例方法都有一个默认的self参数&#xff0c;并且必须是方法的第一…

计算机网络【二】物理层基础知识

计算机网络的性能 速率&#xff1a;连接在计算机网络上的主机在数字信道上传送数据位数的速率&#xff0c;也成为data rate 或bit rate&#xff0c;单位是b/s,kb/s,Mb/s,Gb/s。 我们平时所讲的宽带的速度是以字为单位的&#xff0c;但是实际中应用一般显示的是字节 &#xff0…

Linux网络编程——tcp并发服务器(多进程)

https://blog.csdn.net/lianghe_work/article/details/46503895一、tcp并发服务器概述一个好的服务器,一般都是并发服务器&#xff08;同一时刻可以响应多个客户端的请求&#xff09;。并发服务器设计技术一般有&#xff1a;多进程服务器、多线程服务器、I/O复用服务器等。二、…