目录
功能介绍:
增、删、改、查、文本文件读取、平均成绩显示、异常处理(输入成绩时输入成绩为负时的抛出)
所用知识:
虚函数,继承,异常处理,文本文件读取等。
类图:
派生类类benstu和yanstu
成员函数:
实现基类的虚函数增加成员函数getedu()和setedu()。
数据成员:
添加数据成员char edu[12]。
实现和代码
将代码和文本文件benstu与yanstu放在同一目录下
代码
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<fstream>
#include<iomanip>
using namespace std;
class student
{
protected:
int id;//学号
char name[12];//姓名
char sex[12];//性别
int age;//年龄
char pro[12];//专业
int clas;//班级
double score;//分数
public:
student(){};
virtual int getid()=0;//获取学号
virtual string getname()=0;//获取姓名
virtual string getsex()=0;//获取性别
virtual int getage()=0;//获取年龄
virtual string getpro()=0;//获取专业
virtual int getclas()=0;//获取班级
virtual double getscore()=0;//获取分数
virtual void setid(int x)=0;//给数据成员学号赋值
virtual void setname(char x[])=0;//给数据成员姓名赋值
virtual void setsex(char x[])=0;//给数据成员性别赋值
virtual void setage(int x)=0;//给数据成员年龄赋值
virtual void setpro(char x[])=0;//给数据成员专业赋值
virtual void setclas(int x)=0;//给数据成员班级赋值
virtual void setscore(double x)=0;//给数据成员分数赋值
virtual int getdate()=0;//给所有的数据成员赋值
virtual void display()=0;//显示所有的数据成员
};
class yanstu:public student//研究生类
{
public:
int getid(){return id;}
string getname(){return name;}
string getsex(){return sex;}
int getage(){return age;}
string getpro(){return pro;}
int getclas(){return clas;}
double getscore(){return score;}
string getedu(){return edu;}
void setid(int x){id=x;}
void setname(char x[]){strcpy(name,x);}
void setsex(char x[]){strcpy(sex,x);}
void setage(int x){age=x;}
void setpro(char x[]){strcpy(pro,x);}
void setclas(int x){clas=x;}
void setscore(double x){score=x;}
int getdate(){cin>>id>>name>>sex>>age>>pro>>clas>>score;if(score<0)throw 1;cin>>edu;}
void setedu(char x[]){strcpy(edu,x);}
void display(){cout<<setw(10)<<id<<setw(12)<<name<<setw(12)<<sex<<setw(12)<<age<<setw(12)<<pro<<setw(12)<<clas<<setw(12)<<score<<setw(12)<<edu<<endl;}
private:
char edu[12];//学历
};
class benstu:public student//本科生类
{
public:
int getid(){return id;}
string getname(){return name;}
string getsex(){return sex;}
int getage(){return age;}
string getpro(){return pro;}
int getclas(){return clas;}
double getscore(){return score;}
string getedu(){return edu;}
void setid(int x){id=x;}
void setname(char x[]){strcpy(name,x);}
void setsex(char x[]){strcpy(sex,x);}
void setage(int x){age=x;}
void setpro(char x[]){strcpy(pro,x);}
void setclas(int x){clas=x;}
void setscore(double x){score=x;}
int getdate(){cin>>id>>name>>sex>>age>>pro>>clas>>score;if(score<0)throw 1;cin>>edu;}
void setedu(char x[]){strcpy(edu,x);}
void display(){cout<<setw(10)<<id<<setw(12)<<name<<setw(12)<<sex<<setw(12)<<age<<setw(12)<<pro<<setw(12)<<clas<<setw(12)<<score<<setw(12)<<edu<<endl;}
private:
char edu[12];//学历
};
class benmanager//本科生管理类
{
public:
benmanager(){sum=0;}
void infile()//从文本文件中读取数据
{
ifstream input("benstu.txt");
if (!input)
{
cout<<"File cannot be opened."<<endl;
return ;
}
int id;
char name[12];
char sex[12];
int age;
char pro[12];
int clas;
double score;
char edu[12];
benstu s;
input>>id>>name>>sex>>age>>pro>>clas>>score>>edu;
s.setid(id);s.setname(name);s.setsex(sex);s.setage(age);s.setpro(pro);s.setclas(clas);s.setscore(score);s.setedu(edu);
while(input)
{
sum=sum+s.getscore();
n++;
a.push_back(s);
input>>id>>name>>sex>>age>>pro>>clas>>score>>edu;
s.setid(id);s.setname(name);s.setsex(sex);s.setage(age);s.setpro(pro);s.setclas(clas);s.setscore(score);s.setedu(edu);
}
}
void outfile()//将文本文件输入到文本文件
{
int i;
ofstream file("benstu.txt" );
for(i=0;i<a.size();i++)
file<<a[i].getid()<<setw(12)<<a[i].getname()<<setw(12)<<a[i].getsex()<<setw(12)<<a[i].getage()<<setw(12)<<a[i].getpro()<<setw(12)<<a[i].getclas()<<setw(12)<<a[i].getscore()<<setw(12)<<a[i].getedu()<<endl;
file.close();
}
void display()//显示本科生数据
{
int i;
cout<<setw(10)<<"学号"<<setw(12)<<"姓名"<<setw(12)<<"性别"<<setw(12)<<"年龄"<<setw(12)<<"专业"<<setw(12)<<"班级"<<setw(12)<<"成绩"<<setw(12)<<"学历"<<endl;
for(i=0;i<a.size();i++)
a[i].display();
}
void add()//添加一个本科生数据
{
benstu s;
cout<<"输入数据:(学号,姓名,性别,年龄,专业,班级,成绩,学历)"<<endl;
try
{
s.getdate();
}
catch(int)
{
cout<<"ERROR:分数输入错误停止添加"<<endl;
return;
}
a.push_back(s);
n++;
sum=sum+s.getscore();
}
void exit()//修改数据
{
int i;
string n;
cout<<"输入想要修改的姓名:"<<endl;
cin>>n;
for(i=0;i<a.size();i++)
{
if(a[i].getname()==n)
{
int y;
cout<<setw(10)<<"学号"<<setw(12)<<"姓名"<<setw(12)<<"性别"<<setw(12)<<"年龄"<<setw(12)<<"专业"<<setw(12)<<"班级"<<setw(12)<<"成绩"<<setw(12)<<"学历"<<endl;
a[i].display();
while(1)
{
cout<<"输入要修改的内容:"<<endl;
cout<<"*****************************************"<<endl;
cout<<"1.学号 2.性别 3.年龄 4.专业 5.班级 6.成绩"<<endl;
cin>>y;
if(y==1)
{
cout<<"输入修改后的学号:"<<endl;
int id1;cin>>id1;
a[i].setid(id1);
break;
}
else if(y==2)
{
cout<<"输入修改后的性别:"<<endl;
char sex1[12];cin>>sex1;
a[i].setsex(sex1);
break;
}
else if(y==3)
{
cout<<"输入修改后的年龄:"<<endl;
int age1;cin>>age1;
a[i].setage(age1);
break;
}
else if(y==4)
{
cout<<"输入修改后的专业:"<<endl;
char pro1[12];cin>>pro1;
a[i].setpro(pro1);
break;
}
else if(y==5)
{
cout<<"输入修改后的班级:"<<endl;
int clas1;cin>>clas1;
a[i].setclas(clas1);
break;
}
else if(y==6){
cout<<"输入修改后的成绩:"<<endl;
sum=sum-a[i].getscore();
double score1;cin>>score1;
sum=sum+score1;
a[i].setscore(score1);
break;
}
else {
cout<<"输入错误重新输入"<<endl;
}
}
cout<<"修改成功"<<endl;
break;
}
}
}
void find()//按姓名查找
{
string n;
cout<<"输入想要查询的姓名:"<<endl;
cin>>n;
int i;
for(i=0;i<a.size();i++)
{
if(a[i].getname()==n)
{
cout<<setw(10)<<"学号"<<setw(12)<<"姓名"<<setw(12)<<"性别"<<setw(12)<<"年龄"<<setw(12)<<"专业"<<setw(12)<<"班级"<<setw(12)<<"成绩"<<setw(12)<<"学历"<<endl;
a[i].display();
return;
}
}
cout<<"不存在"<<endl;
}
void delete1()//删除一个本科生数据
{
string b;
while(1)
{
cout<<"输入要删除的学生姓名:"<<endl;
cin>>b;
int i,j;
for(i=0;i<a.size();i++)
{
if(b==a[i].getname())
{
sum=sum-a[i].getscore();
a.erase(a.begin()+i);
cout<<"删除成功"<<endl;
n--;
return ;
}
}
if(i==a.size())cout<<"输入错误重新输入"<<endl;
}
}
void average()//显示平均成绩
{
cout<<"平均成绩:"<<sum/n<<endl;
}
static int n;//总人数为n
private:
vector<benstu> a;
double sum;//总分
};
int benmanager::n=0;
class yanmanager
{
public:
yanmanager(){sum=0;}
void infile()//从文本文件中读取数据
{
ifstream input("yanstu.txt");
if (!input)
{
cout<<"File cannot be opened."<<endl;
return ;
}
int id;
char name[12];
char sex[12];
int age;
char pro[12];
int clas;
double score;
char edu[12];
yanstu s;
input>>id>>name>>sex>>age>>pro>>clas>>score>>edu;
s.setid(id);s.setname(name);s.setsex(sex);s.setage(age);s.setpro(pro);s.setclas(clas);s.setscore(score);s.setedu(edu);
while(input)
{
sum=sum+s.getscore();
n++;
a.push_back(s);
input>>id>>name>>sex>>age>>pro>>clas>>score>>edu;
s.setid(id);s.setname(name);s.setsex(sex);s.setage(age);s.setpro(pro);s.setclas(clas);s.setscore(score);s.setedu(edu);
}
}
void outfile()//将文本文件输入到文本文件
{
int i;
ofstream file("yanstu.txt" );
for(i=0;i<a.size();i++)
file<<a[i].getid()<<setw(12)<<a[i].getname()<<setw(12)<<a[i].getsex()<<setw(12)<<a[i].getage()<<setw(12)<<a[i].getpro()<<setw(12)<<a[i].getclas()<<setw(12)<<a[i].getscore()<<setw(12)<<a[i].getedu()<<endl;
file.close();
}
void display()//输出数据
{
int i;
cout<<setw(10)<<"学号"<<setw(12)<<"姓名"<<setw(12)<<"性别"<<setw(12)<<"年龄"<<setw(12)<<"专业"<<setw(12)<<"班级"<<setw(12)<<"成绩"<<setw(12)<<"学历"<<endl;
for(i=0;i<a.size();i++)
a[i].display();
}
void add()//添加一个研究生数据
{
yanstu s;
cout<<"输入数据:(学号,姓名,性别,年龄,专业,班级,成绩,学历)"<<endl;
try
{
s.getdate();
}
catch(int)
{
cout<<"ERROR:分数输入错误停止添加"<<endl;
return;
}
a.push_back(s);
n++;
sum=sum+s.getscore();
}
void exit()//修改数据
{
int i;
string n;
cout<<"输入想要修改的姓名:"<<endl;
cin>>n;
for(i=0;i<a.size();i++)
{
if(a[i].getname()==n)
{
int y;
cout<<setw(10)<<"学号"<<setw(12)<<"姓名"<<setw(12)<<"性别"<<setw(12)<<"年龄"<<setw(12)<<"专业"<<setw(12)<<"班级"<<setw(12)<<"成绩"<<setw(12)<<"学历"<<endl;
a[i].display();
while(1)
{
cout<<"输入要修改的内容:"<<endl;
cout<<"*****************************************"<<endl;
cout<<"1.学号 2.性别 3.年龄 4.专业 5.班级 6.成绩"<<endl;
cin>>y;
if(y==1)
{
cout<<"输入修改后的学号:"<<endl;
int id1;cin>>id1;
a[i].setid(id1);
break;
}
else if(y==2)
{
cout<<"输入修改后的性别:"<<endl;
char sex1[12];cin>>sex1;
a[i].setsex(sex1);
break;
}
else if(y==3)
{
cout<<"输入修改后的年龄:"<<endl;
int age1;cin>>age1;
a[i].setage(age1);
break;
}
else if(y==4)
{
cout<<"输入修改后的专业:"<<endl;
char pro1[12];cin>>pro1;
a[i].setpro(pro1);
break;
}
else if(y==5)
{
cout<<"输入修改后的班级:"<<endl;
int clas1;cin>>clas1;
a[i].setclas(clas1);
break;
}
else if(y==6){
cout<<"输入修改后的成绩:"<<endl;
sum=sum-a[i].getscore();
double score1;cin>>score1;
sum=sum+score1;
a[i].setscore(score1);
break;
}
else {
cout<<"输入错误重新输入"<<endl;
}
}
cout<<"修改成功"<<endl;
break;
}
}
}
void find()//按姓名查找
{
string n;
cout<<"输入想要查询的姓名:"<<endl;
cin>>n;
int i;
for(i=0;i<a.size();i++)
{
if(a[i].getname()==n)
{
cout<<setw(10)<<"学号"<<setw(12)<<"姓名"<<setw(12)<<"性别"<<setw(12)<<"年龄"<<setw(12)<<"专业"<<setw(12)<<"班级"<<setw(12)<<"成绩"<<setw(12)<<"学历"<<endl;
a[i].display();
return;
}
}
cout<<"不存在"<<endl;
}
void delete1()//删除一个研究生数据
{
string b;
while(1)
{
cout<<"输入要删除的学生姓名:"<<endl;
cin>>b;
int i,j;
for(i=0;i<a.size();i++)
{
if(b==a[i].getname())
{
sum=sum-a[i].getscore();
a.erase(a.begin()+i);
cout<<"删除成功"<<endl;
n--;
return ;
}
}
if(i==a.size())cout<<"输入错误重新输入"<<endl;
}
}
void average()//显示平均成绩
{
cout<<"平均成绩:"<<sum/n<<endl;
}
static int n;
private:
vector<yanstu> a;
double sum;
};
int yanmanager::n=0;
int main()
{
int sel;
int a,b,a1=0,a2=0;
benmanager m;
yanmanager n;
while(1)
{
cout<<"***************学生管理系统*****************"<<endl<<endl;
cout<<"1:本科生 2:研究生 0:退出"<<endl;
cout<<"********************************************";
cout<<"\n请选择(0-2)"<<endl;
cin>>a;
if(a==1)
{
while(1)
{
cout<<"***************本科生管理系统***************";
cout<<endl<<endl;
cout<<"1:加载数据 2:输出数据 3:按姓名查询" <<endl
<<"4:添加数据 5:保存数据 6:修改数据"<<endl
<<"7:删除数据 8:显示平均成绩 0:退出 "<<endl;
cout<<"********************************************";
cout<<"\n请选择(0-8)"<<endl;
cin>>sel;
switch(sel)
{
case 1:m.infile();break;
case 2:m.display();break;
case 3:m.find();break;
case 4:m.add();break;
case 5:m.outfile();break;
case 6:m.exit();break;
case 7:m.delete1();break;
case 8:m.average();break;
case 0:a1=1;
}
if(a1==1){a1=0;break;}
}
}
else if(a==2)
{
while(1)
{
cout<<"***************研究生管理系统***************";
cout<<endl<<endl;
cout<<"1:加载数据 2:输出数据 3:按姓名查询" <<endl
<<"4:添加数据 5:保存数据 6:修改数据"<<endl
<<"7:删除数据 8:显示平均成绩 0:退出 "<<endl;
cout<<"********************************************";
cout<<"\n请选择(0-8)"<<endl;
cin>>sel;
switch(sel)
{
case 1:n.infile();break;
case 2:n.display();break;
case 3:n.find();break;
case 4:n.add();break;
case 5:n.outfile();break;
case 6:n.exit();break;
case 7:n.delete1();break;
case 8:n.average();break;
case 0:a2=1;
}
if(a2==1)
{a2=0;break;}
}
}
else if(a==0)exit(0);
else {
cout<<"输入错误重新输入"<<endl;
}
}
return 0;
}
基本流程
功能测试
本科生
研究生
异常处理
输入成绩时输入成绩为负时的抛出
学习中........