一、 大型实验的内容
学生信息管理系统用于学校进行对学生信息的管理,要求完成的主要的功能包括:设计菜单实现功能选择;能输入学生信息并保存到文件中;能按照学生学号排序;能根据学生学号修改学生信息;能根据学生学号删除学生信息;能根据学生姓名、学号、班级等信息查询学生信息;能按照班级统计学生人数。要求使用学习过的C/C++程序设计的知识完成图书管理系统的设计与实现。
二、 运行环境
学生信息管理系统在Xcode Version 8.3.2平台下开发,操作系统:macOS 10.12.5。
硬件环境:
处理器:2 GHz Intel Core i5
内存:8.00GB
三、 实验课题分析
3.1 学生信息管理系统的主要功能
学生信息管理系统的主要功能为:
1、设计菜单实现功能选择;
2、输入功能:输入学生信息,并保存到文件中;
3、能按照学生的学号排序
4、能根据学号修改学生信息
5、能根据学号删除学生信息
6、查询功能:
1)能够根据学号查询学生信息;
2)能够根据姓名、学号、班级等查询学生信息
3)按照班级统计学生人数。
3.2 系统分析及设计
设计学生类,包括学生的学号、班级、姓名、性别、联系电话。用文本文件进行数据的保存。
3.3系统的实现
(1)类的编写
具体类结构声明如下:
class student
{
public:
student(int num1=0,string name1="null",string Class1="null",string sex1="null",string phone1="null")
:num(num1),name(name1),Class(Class1),sex(sex1),phone(phone1){}
student* next;
void set(); //输入学生信息
void display(); //显示学生信息
string getName()const {return name;} //获取学生姓名
int getNum()const {return num;} //获取学生学号
string getSex()const {return sex;} //获取学生性别
string getClass()const {return Class;} //获取学生班级
string getPhone()const {return phone;} //获取学生电话
void setName(string str) {name=str;} //修改学生姓名
void setNum(int n) {num=n;} //修改学生学号
void setSex(string c) {sex=c;} //修改学生性别
void setClass(string str) {Class=str;} //修改学生班级
void setPhone(string str) {phone=str;} //修改学生电话
private:
int num; //学生学号
string name; //学生姓名
string Class; //学生班级
string sex; //学生性别
string phone; //学生电话
};
(2)链表的使用
系统实现采用文件的输入输出流对文本数据进行读取与写入,但是由于学生信息都是一个数据的集合,于是对数据的存储组织使用了单向链表。
因为学生信息管理系统在登录、查找、修改、添加的时候都需要处理大量的数据,所以使用链表十分必要。在student类的基础上定义一个对应的studentlist类来管理学生信息数据,具体的结构声明如下:
class studentlist
{
public:
studentlist():size(0),ptr(NULL){}
~studentlist(); //析构函数
void fileIn(); //导入数据
void fileOut(); //导出数据
void listdisplay(); //显示
void addStud(student&); //添加成员
student* searchByNum(int); //依据学号查抄
void searchByName(string); //依据姓名查找
void searchByClass(string); //依据班级查找
void add(); //用于输入新的学生信息
void menu(); //菜单用于实现功能的选贼
void change(); //用于更改学生信息
void sort(); //用于排序
void count(string); //统计班级人数
void Delete(int); //用于删除信息
void exchange(student&,student&); //用于数据交换
private:
int size;
student* ptr;
};
(3)交互界面以及登录菜单的实现
系统运行开始的界面如图所示:
主要通过选择结构和循环结构实现界面的前进和后退。例如,第一个登录界面出现4个选择:1.信息管理功能,2.查询功能,3.保存数据,-1.结束用switch case分别实现,选择之后转到下一个界面。
四、 实验调试、测试、运行记录及分析
系统在调试测试过程中遇到若干问题,不过经过仔细反复的检查已经消除各种bug。
主要的测试经过如下:
在开始界面输入“2”即可跳转到查询功能界面。
然后输入“1”根据学号查询学生信息。
然后输入学号“1001”查询该学生的信息。
跳出该学生的信息并再次出现选择界面。
遇到的问题及解决方法如下:
问题:
问题描述:开始未采用链表,而尝试用自定义类型数组来进行程序的编写,结果在学生信息读入处出现了问题。
解决方法:放弃用自定义数组类型,改用链表,成功实现了初始数据的读入,也实现了学生信息管理要求的其他功能。
五、 实验总结
我设计的学生信息管理系统基本满足任务书的功能要求,类的结构和关系清晰,功能完善,而且在批量数据存储上采用了链表,在空间的利用率、集合数据操作(添加和删除)上具有优势。
存在的缺点主要是链表在查找上好像没有什么优势,无论用户给出什么样的查找条件我都采用了从头开始遍历链表的方法进行查找,不能达到有序数组里的二分搜索这样的高效率,希望在今后的学习中能找出基于链表的高效查找方法。
通过这次C++的大型实验,我明白了课本知识与实践能力相结合的重要性。平时一定要多上机,提高自己编写代码的能力。课本上的知识不能无条件地全部接受,要自己试验过,这样能更深的理解书上的内容。
六、 附上源代码
student.hpp
#ifndef student_hpp
#define student_hpp
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
class student
{
public:
student(int num1=0,string name1="null",string Class1="null",string sex1="null",string phone1="null")
:num(num1),name(name1),Class(Class1),sex(sex1),phone(phone1){}
student* next;
void set(); //输入学生信息
void display(); //显示学生信息
string getName()const {return name;} //获取学生姓名
int getNum()const {return num;} //获取学生学号
string getSex()const {return sex;} //获取学生性别
string getClass()const {return Class;} //获取学生班级
string getPhone()const {return phone;} //获取学生电话
void setName(string str) {name=str;} //修改学生姓名
void setNum(int n) {num=n;} //修改学生学号
void setSex(string c) {sex=c;} //修改学生性别
void setClass(string str) {Class=str;} //修改学生班级
void setPhone(string str) {phone=str;} //修改学生电话
private:
int num; //学生学号
string name; //学生姓名
string Class; //学生班级
string sex; //学生性别
string phone; //学生电话
};
#endif /* student_hpp */
student.cpp
#include "student.hpp"
void student::display()
{
cout<<"学号:"<<num<<endl;
cout<<"姓名:"<<name<<endl;
cout<<"班级:"<<Class<<endl;
cout<<"性别:"<<sex<<endl;
cout<<"联系电话:"<<phone<<endl<<endl;
}
void student::set()
{
string na,cl,s,p;
int nu;
cout<<"请依次输入学生的学号、姓名、班级、性别和联系电话"<<endl;
cin>>nu>>na>>cl>>s>>p;
name=na;
num=nu;
Class=cl;
sex=s;
phone=p;
}
studentlist.hpp
#ifndef studentlist_hpp
#define studentlist_hpp
#include "student.hpp"
#include <fstream>
using namespace std;
class studentlist
{
public:
studentlist():size(0),ptr(NULL){}
~studentlist(); //析构函数
void fileIn(); //导入数据
void fileOut(); //导出数据
void listdisplay(); //显示
void addStud(student&); //添加成员
student* searchByNum(int); //依据学号查抄
void searchByName(string); //依据姓名查找
void searchByClass(string); //依据班级查找
void add(); //用于输入新的学生信息
void menu(); //菜单用于实现功能的选贼
void change(); //用于更改学生信息
void sort(); //用于排序
void count(string); //统计班级人数
void Delete(int); //用于删除信息
void exchange(student&,student&); //用于数据交换
private:
int size;
student* ptr;
};
#endif /* studentlist_hpp */
studentlist.cpp
#include "studentlist.hpp"
void studentlist::exchange(student& s1,student& s2)
{
student tmp;
tmp.setNum(s1.getNum());
s1.setNum(s2.getNum());
s2.setNum(tmp.getNum());
tmp.setName(s1.getName());
s1.setName(s2.getName());
s2.setName(tmp.getName());
tmp.setClass(s1.getClass());
s1.setClass(s2.getClass());
s2.setClass(tmp.getClass());
tmp.setSex(s1.getSex());
s1.setSex(s2.getSex());
s2.setSex(tmp.getSex());
tmp.setPhone(s1.getPhone());
s1.setPhone(s2.getPhone());
s2.setPhone(tmp.getPhone());
}
void studentlist::Delete(int n)
{
student *p;
while(1)
{
if(searchByNum(n)==NULL)
{
cout<<"不存在该学生"<<endl<<endl;
}
break;
}
p=searchByNum(n);
for(student* pn=ptr;;pn=pn->next)
{
if(ptr==p)
{
ptr=ptr->next;
size--;
delete pn;
cout<<"已成功删除"<<endl;
cout<<endl;
break;
}
if(pn->next==p)
{
pn->next=p->next;
delete p;
size--;
cout<<"已成功删除"<<endl;
cout<<endl;
break;
}
}
}
void studentlist::count(string cl)
{
int n=0;
student* p = ptr;
while (p != NULL)
{
if((*p).getClass()==cl)
n++;
p = p->next;
}
if(n==0)
cout<<"该班级没有学生"<<endl<<endl;
else
cout<<"该班级有"<<n<<"个学生"<<endl;
cout<<endl;
}
void studentlist::sort()
{
student* p;
for(int i=1; i<size; i++)
{
p = ptr;
for(int j=0; j<size-i; j++)
{
if(p->getNum() > p->next->getNum())
{
exchange(*p,*(p->next));
}
p=p->next;
}
}
cout<<"已排序成功"<<endl;
}
void studentlist::addStud(student& s)
{
student* pn=new student(s);
if(size==0)
{
pn->next=NULL;
}
else
{
pn->next=ptr;
}
ptr=pn;
size++;
}
void studentlist::add()
{
int n,i;
cout<<"需要添加信息的学生数为:";
cin>>n;
student s[n];
student * ptr =s;
ptr=s;
for(i=0;i<n;i++)
{
(*(ptr+i)).set();
}
for(i=0;i<n;i++)
{
addStud(s[i]);
}
cout<<"信息添加成功"<<endl;
}
void studentlist::change()
{
int n;
cout<<"请输入想修改的学生的学号:";
cin>>n;
if(searchByNum(n)==NULL)
{
cout<<"无此学生"<<endl;
}
else
{
(*searchByNum(n)).set();
}
}
studentlist::~studentlist()
{
for(student* r=ptr;(r=ptr);delete r)
{
ptr=ptr->next;
}
}
void studentlist::fileIn()
{
string na,cl,s,p;
int nu;
ifstream infile("student.txt");
while(infile>>nu>>na>>cl>>s>>p)
{
student s1(nu,na,cl,s,p);
addStud(s1);
}
infile.close();
}
void studentlist::fileOut()
{
ofstream outfile("student.txt");
for(student* p=ptr;p!=NULL;p=p->next)
{
outfile<<p->getNum()<<' '
<<p->getName()<<' '
<<p->getClass()<<' '
<<p->getSex()<<' '
<<p->getPhone()<<' '
<<endl;
}
outfile.close();
}
void studentlist::listdisplay()
{
student* p = ptr;
while (p != NULL)
{
(*p).display();
p = p->next;
}
cout << endl;
}
student* studentlist::searchByNum(int n)
{
student* p;
for(p=ptr;p!=NULL;p=p->next)
{
if(p->getNum()==n)
break;
}
return p;
}
void studentlist::searchByName(string str)
{
bool flag=0;
student* p;
for(p=ptr;p!=NULL;p=p->next)
{
if(p->getName()==str)
{
if(flag==0)
{
cout<<"该学生的信息为:"<<endl;
flag=1;
}
(*p).display();
}
}
if(flag==0)
{
cout<<"无此学生!"<<endl;
}
}
void studentlist::searchByClass(string str)
{
bool flag=0;
student* p;
for(p=ptr;p!=NULL;p=p->next)
{
if(p->getClass()==str)
{
flag=1;
(*p).display();
cout<<endl;
}
}
if(flag==0)
{
cout<<"不存在该班级!"<<endl;
}
}
void studentlist::menu()
{
int i1=0;
int i;
while(i1!=-1)
{
i1=0;
i=0;
cout<<" ------------------------------------------------------\n";
cout<<" | 欢迎进入学生信息管理系统 |"<<endl;
cout<<" | 1.信息管理功能 |"<<endl;
cout<<" | 2.查询功能 |"<<endl;
cout<<" | 3.保存数据 |"<<endl;
cout<<" ------------------------------------------------------\n";
cout<<" 请选择(1/2,-1为结束):";
cin>>i1;
switch(i1)
{
case 1:
while(i!=-1)
{
cout<<"-----------------------------------------\n";
cout<<"1.添加学生信息"<<endl;
cout<<"2.按照学生的学号排序"<<endl;
cout<<"3.根据学号修改学生信息"<<endl;
cout<<"4.根据学号删除学生信息"<<endl;
cout<<"请选择(1/2/3/4,输入-1返回上层结构):"<<endl;
cin>>i;
switch (i)
{
case 1:
while(1)
{
add();
break;
}break;
case 2:
while(1)
{
sort();
break;
}break;
case 3:
while(1)
{
change();
break;
}break;
case 4:
while(1)
{
int n;
cout<<"请输入要删除信息的学生的学号:";
cin>>n;
Delete(n);
break;
}break;
}
}break;
case 2:
while(i!=-1)
{
cout<<"-----------------------------------------\n";
cout<<"1.根据学号查询学生信息"<<endl;
cout<<"2.根据姓名查询学生信息"<<endl;
cout<<"3.根据班级查询学生信息"<<endl;
cout<<"4.按照班级统计学生人数"<<endl;
cout<<"5.显示所有学生"<<endl;
cout<<"请选择(1/2/3/4/5,输入-1返回上层结构):"<<endl;
cin>>i;
switch(i)
{
case 1:
while(1)
{
int x;
cout<<"请输入要查询学生的学号:";
cin>>x;
(*searchByNum(x)).display();
break;
}break;
case 2:
while(1)
{
string na;
cout<<"请输入要查询的学生姓名:";
cin>>na;
searchByName(na);
break;
}break;
case 3:
while(1)
{
string cl;
cout<<"请输入要查询的班级:";
cin>>cl;
searchByClass(cl);
break;
}break;
case 4:
while(1)
{
string cl;
cout<<"请输入要查询的班级:";
cin>>cl;
count(cl);
break;
}break;
case 5:
while(1)
{
listdisplay();
break;
}break;
}
}break;
case 3:
while(1)
{
fileOut();
cout<<"学生信息保存成功"<<endl<<endl;
break;
}break;
}
}
}
main.cpp
#include "studentlist.hpp"
using namespace std;
int main()
{
setlocale(LC_ALL,"");
studentlist sl;
sl.fileIn();
sl.menu();
return 0;
}