【C++】班级人事管理



1) 设计一个人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:name(姓名),number(编号),birthday(出生日期),id(身份证号)等等。其中“出生日期”定义为一个“日期”类(具有属性):year(年),month(月),date(日)内嵌子对象。用成员函数实现对人员信息的录入和显示等必要的功能操作(自己独立思考设计)。要求包括:构造函数和析构函数,拷贝构造函数,内联成员函数。

2) 从people(人员)类派生出student(学生)类,添加属性:班号 char chassNO;从people(人员)类派生出teacher(教师)类,添加属性:职务 char principalship,部门 char department. student类中派生出graduate(研究生)类,添加属性:专业 char subject,导师 teacher adviser(为(教师类内嵌子对象));graduate类和 teacher类派生出TA(助教生)类,注意虚基类的使用,重载相应的成员函数。

3) 对people类重载“= =”运算符和“=”运算符,“= =”运算符判断两个people类对象的id属性是否相等;“=”运算符实现people类对象的赋值操作。

4)定义一个对people类对象数组按编号排序的函数,一个按编号查找people对象的函数。



#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstring>
using namespace std;
static int number=0;     //编号

class date      //时间类
{
public:
    int year;
    int month;
    int day;
};

class people     //定义people类
{ protected:
    char name[20];
    char sex[10];

    char id[18];
    date birthday;
  public:

      void setname(char *n)
      { strcpy(name,n);}
      char *getname()
      { return name;}
      int getnumber()
      {return number;}
      void setsex(char *s)
      {   
          strcpy(sex,s);
      }
      char *getsex()
      { return sex;}


      void setid(char *i)
      { strcpy(id,i);}
      char* getid()
      {return id;}


       void setyear(int i)  //设置
       { birthday.year=i;}
       int getyear()   //获得
       {return birthday.year;}

         void setmonth(int i)  //设置
       { birthday.month=i;}
       int getmonth()   //获得
      {return birthday.month;}

         void setday(int i)  //设置
      { birthday.day=i;}
      int getday()   //获得
      {return birthday.day;}  

};

class student:public people   //学生类
{
private:
     char classno[7];    //班号
public:
     void setclassno(char *c)
     { strcpy(classno,c);}
     char *getclassno()
     { return classno;}

};

class teacher:virtual public people  //老师类
{
protected:
     char principaiship[11];
     char department[21];
public:
     void setprin(char *p)
     { strcpy(principaiship,p);}
     char *getprin()
     { return principaiship;}
     void setdepart(char *d)
     { strcpy(department,d);}
     char *getdepart()
     { return department;}
};

class graduate:virtual public student   //研究生类
{
protected:
     char subject[21];
public:
     void setsubject(char *s)
     { strcpy(subject,s);}
     char *getsubject()
     { return subject;}

};


int main()
{
     student s;
     teacher t;
     graduate g;
     char namestr[21];    //字符的变量
     char b[18];
     int a=0;
     int i=0; char y; int c; //定义传值过程中的变量
     char flag;   //判断是否继续输入的变量  

//ofstream ofile("people.bin",ios::out |ios::binary);  //定义输出的一个对象ofile
//建立结构体,用于write和read的传值
struct data 
{
     int year,month,day,nn;
     char name[20],sex[10],classno[7],principaiship[11],department[21],subject[21],id[18];
}; 
//number=ds.nn;
    data ds={0,0,0,0,0};//初始化结构体

    people *p[3]={&s,&t,&g};   //分配地址


do
{
   cout<<"**********************************************************"<<endl;
   cout<<"*                添加学生信息     按  1                  *"<<
   "\n"<<"*                添加老师信息     按  2                  *"<<
   "\n"<<"*               添加研究生信息    按  3                  *"<<
   "\n"<<"*                 按编号查询      按  4                  *"<<
   "\n"<<"*                 按编号排序      按  5                  *"<<endl;
   cout<<"**********************************************************"<<endl;
    cin>>c;


   if(c==1)

   {  
	  number++;    //调用一次标号加一
      cout<<"输入学生姓名:"<<endl;
      cin>>namestr;
      p[i]->setname(namestr);//设置学生姓名
      strcpy(ds.name,namestr);   //姓名的传值
        
      //判断性别
      do   
      {
          cout<<"输入性别(m/f)"<<endl;
          char y;
          cin>>y;
          if (y=='m'||y=='f') 
          {
              if(y=='m')
              { 
                  p[i]->setsex(namestr);
                  strcpy(ds.sex,"男");
              }
              else if(y=='f')
              { 
                  p[i]->setsex(namestr);
                  strcpy(ds.sex,"女");
              }
          }
          else
          {
              cout << "error!\n";
              cout << "again\n";
              cin >> y;
          }
      }while( y=='m'||y=='f') ;


       //获取id信息
       cout<<"输入id:"<<endl;
       cin>>b;   
       p[i]->setid(b); 
       strcpy(ds.id,b);       //id的传值	 
	   
	   //获取编号
       cout<<"输入编号:"<<endl;
       cin>>namestr;
       s.setclassno(namestr);    
       strcpy(ds.classno,namestr);      //班号的传值

      //获取生日
       cout<<"输入生日:"<<"\n"<<"year:"<<endl;
       cin>>a;
       s.setyear(a);
       ds.year=a;
       cout<<"month:"<<endl;

      //判断月份
       do
       {

          cin>>a;
          if(a<=12)
          {
              s.setmonth(a);
              ds.month=a;
          }
          else
          {   
              cout << "输入错误!"<<endl;
              cout << "请您重新输入:"<<endl;
              cout<<"month:"<<endl;
              cin>>a;
          }
       }while(a>12);
	   //判断日期
	   cout<<"day:"<<endl;
	   do
	   {
		   cin>>a;
		   if(a<=30)
		   {
			   s.setday(a);
			   ds.day=a;
		   }
		   else
		   {
			   cout<<"输入错误!"<<endl;
			   cout<<"请您重新输入:"<<endl;
			   cout<<"day:"<<endl;
			   cin>>a;
		   }
	   }while(a>30);


	   cout<<"录入成功"<<endl;


	   //将获得的信息写入文档中
	   ofstream ofile("people.txt",ios::out |ios::app);
	   if(!ofile)
	   {
		   cout<<"Cannot open file.\n";
		   return 1;
	   }
	   ofile.write((char*)&ds,sizeof ds);
	   ofile.close();

	   //是否继续
	   cout<<"是否继续?(y/n)"<<endl;
	   //flushall();
	   cin>>flag;
 }
     //添加老师信息
     else if(c==2)
     {       
		 number++;
		 i = 1 ;          
		 cout<<"输入老师姓名?"<<endl;
		 cin>>namestr;
		 strcpy(ds.name,namestr); 
		 p[i]->setname(namestr);
		 do
		 {     
			 cout<<"输入性别(m/f)"<<endl;
             char y;
			 cin>>y;
			 if(y=='m'||y=='f')
			 { 
				 if(y=='m')
				 {  
					 p[i]->setsex(namestr);
					 strcpy(ds.sex,"男");
				 }
				 else if( y=='f')   
				 { 
					 p[i]->setsex(namestr);
					 strcpy(ds.sex,"女");
				 } 
			 }
			 else
			 {  
				 cout<<"输入错误!"<<endl;
				 cout<<"请您重新输入?"<<endl;
				 cin>>y;
			 }
		 } while(y=='m'||y=='f');
		     //id的获得   
			 cout<<"输入id:"<<endl;
			 cin>>a;
			 p[i]->setid(b);
			 strcpy(ds.id,b);
		     // 获得老师职务信息 
			 cout<<"输入老师职务?"<<endl;
			 cin>>namestr;
			 t.setprin(namestr);
			 strcpy(ds.principaiship,namestr);
		     // 获得部门信息
			 cout<<"输入部门:"<<endl;    
			 cin>>namestr;
			 t.setdepart(namestr); 
			 strcpy(ds.department,namestr); 
			  // 获得生日信息 
			 cout<<"输入生日: "<<"\n"<<"year:"<<endl;
			 cin>>a; 
			 s.setyear(a);
			 ds.year=a;
			 do 
			 {
				 cout<<"month:"<<endl;
				 cin>>a;
				 if(a<=12)
				 { 
					 s.setmonth(a);
					 ds.month=a; 
				 }
				 else 
				 {
					 cout <<"输入错误!"<<endl;
					 cout<<"请您重新输入:"<<endl;
					 cin>>a;
				 }
			 } while(a>12);

			 do 
			 { 
				 cout<<"day:"<<endl;
				 cin>>a;
				 if(a<=30)
				 {
					 s.setday(a);
					 ds.day=a;
				 } 
				 else 
				 {  
					 cout<<"error!"<<endl; 
					 cout<<"again:"<<endl;
			         cin>>a;
				 } 
			 } while(a>30); 

		     //将得到的信息写入文挡保存 
			 ofstream ofile("people.bin",ios::out |ios::binary|ios_base::app);
	         if(!ofile)
	         {
		          cout<<"Cannot open file.\n";
		          return 1;
	         }
	   ofile.write((char * )&ds,sizeof ds);
	   ofile.close();

	   cout<<"录入成功!"<<endl;


	    //是否继续
	   cout<<"是否继续?(y/n)"<<endl;
//	   flushall();
	   cin>>flag;
 }

  //添加研究生信息
     else if(c==3)
     {       
		 number++;
		 i=2;          
		 cout<<"输入研究生姓名:"<<endl;
		 cin>>namestr;
		 strcpy(ds.name,namestr); 
		 p[i]->setname(namestr);

		 //判断性别
		 do
		 {     
			 cout<<"输入性别(m/f)"<<endl;
             char y;
			 cin>>y;

			 if(y=='m'||y=='f')
			 { 
				 if(y=='m')
				 {  
					 p[i]->setsex(namestr);
					 strcpy(ds.sex,"男");
				 }
				 else if( y=='f')   
				 { 
					 p[i]->setsex(namestr);
					 strcpy(ds.sex,"女");
				 } 
			 }
			 else
			 {  
				 cout<<"输入错误!"<<endl;
				 cout<<"请您重新输入?"<<endl;
				 cin>>y;
			 }
		 } while(y=='m'||y=='f');

		     //获得id信息   
			 cout<<"输入id:"<<endl;
			 cin>>a;
			 p[i]->setid(b);
			 strcpy(ds.id,b);

		     // 获得专业信息 
			 cout<<"输入专业:"<<endl;
			 cin>>namestr;
			 g.setsubject(namestr);
			 strcpy(ds.subject,namestr);
 
			  // 获得生日信息 
			 cout<<"输入生日: "<<"\n"<<"year:"<<endl;
			 cin>>a; 
			 s.setyear(a);
			 ds.year=a;

			 //判断月份
			 do 
			 {
				 cout<<"month:"<<endl;
				 cin>>a;
				 if(a<=12)
				 { 
					 s.setmonth(a);
					 ds.month=a; 
				 }

				 else 
				 {
					 cout <<"输入错误!"<<endl;
					 cout<<"请您重新输入:"<<endl;
					 cin>>a;
				 }
			 } while(a>12);

			 //判断日期
			 do 
			 { 
				 cout<<"day:"<<endl;
				 cin>>a;
				 if(a<=30)
				 {
					 s.setday(a);
					 ds.day=a;
				 } 
				 else 
				 {  
					 cout<<"error!"<<endl; 
					 cout<<"again:"<<endl;
			         cin>>a;
				 } 
			 } while(a>30);


		     //将得到的信息写入文挡保存 
			 ofstream ofile("people.bin",ios::out |ios::binary|ios_base::app);
	         if(!ofile)
	         {
		          cout<<"Cannot open file.\n";
		          return 1;
	         }
	          ofile.write((char * )&ds,sizeof ds);
	          ofile.close();

	   cout<<"录入成功!"<<endl;


	    //是否继续
	   cout<<"是否继续?(y/n)"<<endl;
	   //flushall();
	   cin>>flag;
}


//输入编码查询信息
else if(c==4)
{


	cout<<"请输入编码:"<<endl;
	int z;
	cin>>z;


	//读取文件通过指针定位来查找需要的信息
	fstream iofile;
	iofile.open("peoplo.bin",ios::in|ios::out);
	iofile.seekp(sizeof(ds),ios::beg);
	iofile.read((char*)&ds,sizeof ds);
	cout<<"*************************************"<<endl;
	cout<<number<<setw(10)<<ds.name<<setw(10)<<ds.id<<setw(10)
		<<ds.sex<<""<<ds.year<<"."<<ds.day<<setw(10)<<ds.classno<<setw(10
		)<<ds.department<<setw(10)<<ds.principaiship<<setw(10)<<ds.subject<<endl;
	cout<<"*************************************"<<endl;
	iofile.close();
	cout<<"\n"<<"是否继续?(y/n)"<<endl;
	//flushall();
	cin>>flag;

}

else if(c==5) //列出所有信息
{
	cout<<"信息列表:"<<endl;
	cout<<"*************************************"<<endl;

	cout<<"*************************************"<<endl;
	fstream iofile;
	iofile.open("people.bin",ios::in|ios::out);
	for(int h=1;h<=number;h++)
	{
		iofile.seekp((h-1)*sizeof(ds),ios::beg);
		iofile.read((char*)&ds,sizeof ds);
        cout<<h<<number<<setw(10)<<ds.name<<setw(10)<<ds.id<<setw(10)
		<<ds.sex<<""<<ds.year<<"-"<<ds.month<<"-"<<ds.day<<setw(10)<<ds.classno
		<<setw(10)<<ds.department<<setw(10)<<ds.principaiship<<setw(10)<<ds.subject<<endl;

	}
	iofile.close();

      cout<<"*************************************"<<endl;
	  cout<<"*************************************"<<endl;

	  cout<<"是否继续?(y/n)"<<endl;
	    //flushall();
		cin>>flag;
}

else
	cout<<"输入错误!"<<endl;
 }while(flag=='y'||flag=='Y');


 return 0;
 //ds.nn=number;
 }


  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验一 C++简单程序设计(2学时) 1.编程计算图形的面积。程序可以计算圆形、长方形、正方形的面积、运行时先提示用户选择图形类型,然后,对圆形要求用户输入半径、对长方形要求用户输入长和宽的值,对正方形要求用户输入边长,计算出面积后将其显示出来。要求使用debug调试功能观察程序运行中变量值的变化情况。 2.定义一个表示时间的结构体,可以精确的表示年、月、日、小时、分、秒;提示用户输入年、月、日、小时、分、秒的值,然后完整地显示出来。 实验二 函数的应用(2学时) 1.编写重载函数Max1,分别求出两个整数,两个双精度数,三个整数,三个双精度数的最大值。 2.使用重载函数模板重新实现上面的函数Max1。 要求:(1)练习重载函数的使用;(2) 练习函数模板的使用。 实验三 类与对象(2学时) 1.声明一个Dog类,包含age、weight等属性,以及对这些属性操作的方法。实现并测试这个类。 2.设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角和右上角两个点的坐标,有成员函数能计算矩形的面积。 3.定义一个CPU类,包含等级、频率,电压等属性,并编写构造函数、析构函数,以及成员函数run、stop模拟CPU的状态。其中,等级为整型,频率为单位是兆赫兹的整数,电压为浮点型。要求自己设计各个属性的标识。 4.定义一个简单的Computer类,包含数据成员cpu、ram、cdrom等等,有两个成员函数run、stop。其中cpu为CPU类的一个对象,ram为RAM类的一个对象,cdrom为CDROM类的一个对象,定义并实现这个类。 5.(必做)设计一个用于人事管理的People类。考虑到通用性,可以只抽象出所有人员都 具有的属性:number(编号),sex(性别) ,birthday(出生日期),id(身份证号)等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员函数的录入和显示。要求包括:编写构造函数和析构函数、拷贝构造函数、内联成员函数,类的组合。 实验四 C++程序的结构(2学时) 1.编写程序,实现并测试客户机(Client)类。定义字符型静态数据成员ServerName[10],保存其服务器名称;整型静态数据成员ClientNum,记录定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。在头文件client.h中定义类,在文件client.cpp中实现,在文件test.cpp中测试这个类,观察相应的成员变量的取值的变化情况。 2、在实验三题目5编写的人员类中设计适当的方法来实现类中数据的共享性,并采用多文件结构实现程序。 3.(选做)定义类X、Y、Z,函数h(X *),满足:类X有私有成员i,Y的成员函数g(X *)是X的友元函数,实现对X的成员i加1,类Z是类X的友元类,其成员函数f(X *)实现对X的成员i加5,函数h(X *)是X的友元函数,实现对X的成员i加10。在一个文件中声明类,在一个文件中实现类,在另一个文件中测试类。 实验五 继承和派生(2学时) 1.设计并定义一个交通工具类,并通过该类派生出新的类,编写程序定义这些类并测试它; 2.(选做)声明一个基类Shape,在此基础上派生Rectangle和Circle,二者都有GetArea()函数计算对象的面积,编写程序测试。 3.(选做)声明一个哺乳动物类Mammal,再由此派生出狗类Dog,定义一个Dog类的对象,观察基类与派生类的构造函数和析构函数的调用顺序。 4.完善实验四第2题的程序,具体要求如下: 任务1:从people(人员)类派生出student(学生)类,添加属性:学校、学院、专业、班号、入学成绩,设计相应的成员函数(构造函数,拷贝构造函数,录入函数,显示函数)。 任务2:从people类派生出teacher(教师)类,添加属性:职务,部门,职称。并设计相应的成员函数。 任务3:从student类派生出graduate(研究生)类,添加属性:导师,研究方向。并设计相应的成员函数。 任务4:编写程序来测试这个类。 实验六 小型学生管理系统的设计与实现1(2学时) 设计学生类、课程类、成绩类及相应的成员函数。要求能实现学生的信息、课程信息和成绩信息的增加、修改、删除与查询。 实验七 多态性(2学时) 1.定义Point类,有坐标X和Y两个成员变量,对Point类重载++和――运算符,实现对坐标值的改变。 2.定义一个车(Vehicle)类,有run,stop等成员函数,由此派生出自行车(bicycle)类、汽车(car)类,由bicycle类和car类派生出摩托车(motocar)类,它们都包含run,stop等成员函数,编写相应的虚函数并测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值