C++学生信息管理系统(代码,基本解读和注释)

目录

 

功能介绍:

所用知识:

类图:

 

实现和代码

 代码

基本流程

功能测试 

本科生 

研究生


 

功能介绍:

增、删、改、查、文本文件读取、平均成绩显示、异常处理(输入成绩时输入成绩为负时的抛出)

所用知识:

虚函数,继承,异常处理,文本文件读取等。

类图:

5dbba2acaf42491c8ef66644d73dc7a6.png

派生类类benstuyanstu

成员函数:

实现基类的虚函数增加成员函数getedu()和setedu()。

数据成员:

添加数据成员char edu[12]。

543dada0d9a04feeb602717fb9674ca7.png

 

实现和代码

将代码和文本文件benstu与yanstu放在同一目录下

c74cfaa94efa4583a2d588ce71e3fcf7.png

 代码

#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;
}

基本流程

744381bb30e846fba3d4f54dd315be9a.jpeg

功能测试 

本科生 

1cd8259cd9ef4f46b320cf94d7e2f19a.png

03fcd0f5ce6a4de38e56637b1ba209b0.png

 

研究生

03185e1355e644a1b92bd5cb6cf9f339.png

030ba0d6cd604078b6a85a2397b73fc5.png 

 异常处理

输入成绩时输入成绩为负时的抛出

4f97b2b1725d4a0d810bc506aff082f7.png

 学习中........

 

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓零清

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值