学生信息管理系统(SIMS:Student information management system)用于学生信息的管理,要求完成的主要的功能包括学生信息分输入,按学生的不同信息排序整理,根据学号修改学生信息,根据学号删除学生信息,查询学生信息,按照学院等分项统计学生人数等工作。要求使用学习过的 C/C++ 程序设计的知识完成学生信息管理系统的设计与实现。
完整代码:https://download.csdn.net/download/weixin_55771290/87394298
二、 运行环境
学生信息管理系统在 Visual Studio code 平台下开发,操作系统:macOS 10.14.6。
硬件环境:
处理器:Intel(R) Core(TM) i5 CPU @ 1.40GHz
内存:8.00GB
系统类型:64 位操作系统
三、 实验课题分析
3.1 学生信息管理系统的主要功能
学生信息管理系统(SIMS)主要功能为:学生信息分输入,按学生的不同信息排序整理,根据学号修改学生信息,根据学号删除学生信息,查询学生信息,按照学院等分项统计学生人数等工作。详细的系统功能结构为图 1 所示。
图 1 系统结构图
系统各模块的功能具体描述为:
1、输入功能
选择输入学生信息功能,首先选择输入学生人数,在相继输入学生的名字,性别,学号,学院,系,班级,寝室,籍贯,联系电话。
2、排序功能
将文件里的学生信息读入链表中,然后按照学号,学院,宿舍从小到达排序。
3、修改功能
输入学生的学号,可以根据学生的学号来修改其名字,性别,学号,学院,系,班级,寝室,籍贯,联系电话信息。
4、删除功能
输入学生学号,删除此学号学生的信息。
5、查询功能
输入学号、姓名,学院,系,班级,宿舍等分项,查找学生的信息。
输入学院,系,班级,籍贯统计此项下学生的人数。
3.2 系统分析及设计
系统涉及对象有两个类:学生类和链表类,学生类包含 9 个私有数据分别为名字,性别,学号,学院,系,班级,寝室,籍贯,联系电话,以及包含一个 next 的指针。以及一些成员函数。
链表类有一个头节点和尾节点,每个节点存放一个学生信息,以及一个指向学生的指针,链表的主要结构如下,通过链表将整个文件中的学生信息串联起来,在执行各个功能时能遍历链表查找信息。
图 2 链表的结构图
用文本文件进行数据的保存,需要保存的数据主要包括实现所有的文本操作相关的功能。
3.3 系统的实现
(1)类的编写
系统工程名为:SIMS。包含了 student 类(所有学生类),list 类(链表类)list 类中包含着两个 student 的指针,first 和 last 分别指向文件中的第一个学生和最后一个学生,在学生类中包含着一个 next 指针,用来指向下一个学生的地址,通过这种方法把学生的信息串联起来,实现相应的功能只需要遍历链表即可。
具体类结构声明如下:
classstudent{private:stringname;//姓名 stringsex;//性别 intnum;//学号 stringxueyuan;//学院 stringxi;//系 intcla;//班级 intdor;//寝室 stringjiguan;//籍贯 intphone;//联系电话 public:student*next;student(stringa1,stringb1,intc1,stringd1,stringe1,intf1,intg1,stringh1,inti1);student(student&a);//复制构造函数 ~student();//析构函数 stringgetname()const;voidsetname(string&a);//姓名的得到和修改 stringgetsex()const;voidsetsex(string&a);//性别的得到和修改 intgetnum()const;voidsetnum(int&a);//学号的得到和修改 stringgetxueyuan()const;voidsetxueyuan(string&a);//学院的得到和修改 stringgetxi()const;voidsetxi(string&a);//系的得到和修改 intgetcla()const;voidsetcla(int&a);//班级的得到和修改 intgetdor()const;voidsetdor(int&a);//寝室的得到和修改 stringgetjiguan()const;voidsetjiguan(string&a);//籍贯的得到和修改 intgetphone()const;voidsetphone(int&a);//联系电话的得到和修改 voiddisplay();//显示学生信息 voiddisplaytofile1();voiddisplaytofile2();//将学生信息同步到文件中 };# endif
(2)链表的使用
系统实现采用文件的输入输出流对文本数据进行读取与写入,但是由于学生信息是一个数据的集合,于是对数据的存储组织使用了单向链表。
因为学生信息管理系统在输入,排序、修改、删除、查询的时候都需要处理大量的数据,所以使用链表十分必要。将链表把所有学生串联起来,具体的结构声明如下:
classlist{student*first,*last;intlistsize;public:list():first(0),last(0),listsize(0){}voidadd(student&a);//将一个学生类加入链表 voidsortbynum();//根据学号排序 voidsortbyxueyuan();//根据学院排序 voidsortbydor();//根据寝室排序 voidchangebynum1(intnum,intchoose,intchange);//根据学号修改信息int型 voidchangebynum2(intnum,intchoose,stringchange);//根据学号修改信息string型 voiddeletebynum(intnum);//根据学号删除信息 voidfindbynum1(intnum);//根据学号查询学生信息 voidfindbynum2(intnum,intk);voidfindbyxueyuan(stringxueyuan);//根据学院查询学生信息 voidfindbyxueyuan2(stringxueyuan,intk);voidfindbyname(stringxingming);根据姓名查询学生信息voidfindbyxi(stringxi);//根据系查询学生信息 voidfindbybanji(intbanji);根据班级查询学生信息voidfindbysushe(intsushe);//根据宿舍查询学生信息 voidfindbysushe2(intsushe,intk);voidstatisticbyxueyuan(stringxueyuan1);//统计学院人数 voidstatisticbyxi(stringxi1);//统计系人数 voidstatisticbybanji(intcla1);//统计班级人数 voidstatisticbyjiguan(stringjiguan1);//统计籍贯人数 voidlistdisplay();//链表打印 voidlisttofile();//链表打印到文件 };
在运用时,令当前学生的 next 结点指向新的学生结点,即结点的指针 next 保存新的学生结点的地址(如下图 3 所示),以此类推,所有学生信息就通过链表的形式串联起来了。
图3 学生链表的建立
学生信息管理系统的信息的管理就具体表现为链表的操作。学生信息的查找、修改、添加和删除与链表的查找、修改、添加、删除对应。
学生信息的输入:
在学生信息的输入,首先会出现输入几个学生,然后输入各个学生的信息见图 4:
图4 学生信息输入界面
cin>>a>>b>>c>>d>>e>>f>>g>>h>>i;studentstu(a,b,c,d,e,f,g,h,i);m.add(stu);
以上代码将新输入的学生加入到链表的结尾
ofstreamoutfile;outfile.open("学生信息.txt",ios::app);outfile<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<f<<" "<<g<<" "<<h<<" "<<i<<endl;outfile.close();
通过以上代码把新输入的学生加入到文本文件里的末尾。
排序功能
排序共分成三部分为按学号,学院,宿舍排序界面为
通过 m.sortbynum();实现功能,具体代码为:
voidlist::sortbynum()//排序 {inta[1000];student*stu=first;for(inti=0;i<listsize;i++){a[i]=stu->getnum();stu=stu->next;}sort(a,a+listsize);for(inti=0;i<listsize;i++){findbynum2(a[i],i);}}
首先定义一个数组来装学生的学号,运用库函数 sort 进行从小到大排序,然后在遍历链表,把学号相同的学生信息输出,即为按学号排序,同时也保存到文件中。按学院排序以及按宿舍排序与上操作类似分别写了两个链表函数实现
m.sortbyxueyuan();voidlist::sortbyxueyuan(){stringa[1000];student*stu=first;for(inti=0;i<listsize;i++){a[i]=stu->getxueyuan();stu=stu->next;}sort(a,a+listsize);for(inti=0;i<listsize;i++){findbyxueyuan2(a[i],i);}}m.sortbydor();voidlist::sortbydor(){inta[1000];student*stu=first;for(inti=0;i<listsize;i++){a[i]=stu->getdor();stu=stu->next;}sort(a,a+listsize);for(inti=0;i<listsize;i++){findbysushe2(a[i],i);}}
根据学号修改学生信息
通过学生的学号先找到此学生然后在对其相对应的信息进行修改,界面为
这里我写了两个函数分别代表修改 int 型与修改 string 型数据
changebynum1(int num,int choose,int change);//根据学号修改信息
changebynum2(int num,int choose,string change);//根据学号修改信息
具体代码操作为:
voidlist::changebynum1(intnum,intchoose,intchange){student*stu=first;intk=0;for(stu=first;stu;stu=stu->next)//遍历链表找到相对应的学号 {if(stu->getnum()==num&&choose==3){stu->setnum(change);k++;}if(stu->getnum()==num&&choose==6){stu->setcla(change);k++;}if(stu->getnum()==num&&choose==7){stu->setdor(change);k++;}if(stu->getnum()==num&&choose==9){stu->setphone(change);k++;}}//改变相应的信息 if(k!=0)cout<<"修改成功"<<endl;if(k==0)cout<<"未找到相关信息,请重新操作"<<endl;//判断有无这个学号 }string类型的改变相似voidlist::changebynum2(intnum,intchoose,stringchange){student*stu=first;intk=0;for(stu=first;stu;stu=stu->next){if(stu->getnum()==num&&choose==1){stu->setname(change);k++;}if(stu->getnum()==num&&choose==2){stu->setsex(change);k++;}if(stu->getnum()==num&&choose==4){stu->setxueyuan(change);k++;}if(stu->getnum()==num&&choose==5){stu->setxi(change);k++;}if(stu->getnum()==num&&choose==8){stu->setjiguan(change);k++;}}if(k!=0)cout<<"修改成功"<<endl;if(k==0)cout<<"未找到相关信息"<<endl;}
学生信息的删除
通过输入学生的学号来删除此学生的信息,界面为:
这里通过 m.deletebynum(num2);来删除学生数据,具体代码为:
voidlist::deletebynum(intnum){student*stu=first;intk=0;if(stu->getnum()==num){first=stu->next;listsize--;k++;}//这里判断是不是第一个学生 else{for(stu=first;stu;stu=stu->next){if(stu->next->getnum()==num){stu->next=stu->next->next;listsize--;k++;break;}//删除学生信息 }}cout<<"删除成功"<<endl;if(k==0)cout<<"未找到相关信息"<<endl;}
stu->next=stu->next->next;这里使链表地址指向下下个结点,这样就相当于把一个学生的信息删除了。
查询功能
这里主要分为两个部分:一是通过一个分项来查询学生信息,二是统计同一个班级,学院等的人数。
m.findbynum1(num3);voidlist::findbynum1(intnum){student*stu=first;intk=0;for(stu=first;stu;stu=stu->next){if(stu->getnum()==num){stu->display();k++;}//遍历链表把学号相同的学生输出来 }if(k==0)cout<<"未找到相关信息"<<endl;}其他分项的查询与上述类似。统计方面:m.statisticbyxueyuan(xueyuan1);voidlist::statisticbyxueyuan(stringxueyuan1){student*stu=first;intk=0;for(stu=first;stu;stu=stu->next){if(stu->getxueyuan()==xueyuan1){k++;}//找到相应的学院便是人数加一; }cout<<"人数为"<<k<<endl;}
学生信息查找的流程图如下
(3)交互界面以及登录菜单的实现\
系统运行开始的界面如图 5 所示:
图 5 开始登录界面
主要通过 switch 结构和 while 结构实现界面的前进和后退。例如,第一个主菜单界面出现 6 个选择:1.输入功能,2.排序功能,3.修改功能,4.修改功能,5.查询功能,0.结束程序用 switch case 分别实现,选择之后转到下一个界面。
四、 实验调试、测试、运行记录及分析
系统在调试测试过程中遇到若干问题,不过经过仔细反复的检查已经消除各种 bug。
主要的测试经过如下:
主菜单页面:
输入功能
输入 1,进入输入功能
输入 2 为输入两位同学的信息
再次输入同学信息即添加了两位学生的信息
查询功能
在开始界面输入“5”即可跳转到登查询功能界面。
然后输入“3”,屏幕上跳出统计界面。
然后输入“3”,进入班级统计界面,
然后输入班级如输入 1902
即可得出 1902 班的人数