实验六——多态性和虚函数

写程序一时爽,debug火葬场

debug用了三小时我直呼内行


多态性在学校人员信息管理系统中应用

系统描述:

     学校人员信息管理系统的主要功能是对在校人员的信息资料进行管理。在校人员包括学生、教师和行政人员。各系将学生的基本资料如姓名、性别、年龄等及课程成绩输入到系统。教师除了具有学生一样的基本资料(姓名、性别、出生年月)外,还需要记录一些与教学工作相关的信息,如所教课程、所属系部、当前职称等,并希望能够计算每个教师课时工作量。同样行政人员除了具有学生一样的基本资料(姓名、性别、出生年月)外,还有职务,业绩评级等。系统能够随时输入、显示和查询各类人员的相关信息。

关于显示和查询的问题,虽然事先问过老师

但我还是有点疑问

据老师的说法,显示是显示一个成员的所有数据

查询是查询数据库里有几条记录

我反而觉得应该是反过来

一些要注意的东西都写在注释里了

#include<iostream>
#include<cstring>
#define x 10
//定义常量,如果想要扩大数据容量直接修改这里就行了 

using namespace std;

class student{
  public://注意基类成员全声明公有,这样后面的派生类才能继承到 
    string name;
    string sex;
    int age;
    int score;
    student(){
      name="num";
      sex="num";
      age=0;
      score=0;
    }
  
  //需要声明为虚函数,这样才能多态 
  virtual void inputdata(){
    cout<<"请输入你的名字"<<endl;
    cin>>name;
    cout<<"请输入你的性别"<<endl;
    cin>>sex;
    cout<<"请输入你的年龄"<<endl;
    cin>>age;
    cout<<"请输入你的绩点"<<endl;
    cin>>score; 
  }
  
  //同上,声明为虚函数 
  virtual void displaydata(){
    cout<<"姓名:"<<name<<endl;
    cout<<"性别:"<<sex<<endl;
    cout<<"年龄:"<<age<<endl;
    cout<<"绩点:"<<score<<endl;
  }
  
  virtual void displayname(){
    cout<<name<<endl;
  }
};

class teacher:public student{
  private:
    string curriculum;
    string department;
    string title;
    int classhour;
    
  public:
    teacher(){
      curriculum="num";
      department="num";
      title="num";
      classhour=0;
    }
    
  void inputdata(){
    cout<<"请输入你的名字"<<endl;
    cin>>name;
    cout<<"请输入你的性别"<<endl;
    cin>>sex;
    cout<<"请输入你的年龄"<<endl;
    cin>>age;
    cout<<"请输入你的授教课程"<<endl;
    cin>>curriculum;
    cout<<"请输入你的所属院系"<<endl;
    cin>>department; 
    cout<<"请输入你的职称"<<endl;
    cin>>title; 
    cout<<"请输入你的课时数/周"<<endl;
    cin>>classhour; 			
  }
  
  void displaydata(){
    cout<<"姓名:"<<name<<endl;
    cout<<"性别:"<<sex<<endl;
    cout<<"年龄:"<<age<<endl;
    cout<<"授教课程:"<<curriculum<<endl;
    cout<<"所属院系:"<<department<<endl;
    cout<<"职称:"<<title<<endl;
    cout<<"课时数/周:"<<classhour<<endl;
  }
  
  void displayname(){
    cout<<name<<endl;
  }
};
  
class administration:public student{
  private:
    string post;
    string perform;
  
  public:
    administration(){
      post="num";
      perform="num";
    }
  void inputdata(){
    cout<<"请输入你的名字"<<endl;
    cin>>name;
    cout<<"请输入你的性别"<<endl;
    cin>>sex;
    cout<<"请输入你的年龄"<<endl;
    cin>>age;
    cout<<"请输入你的职务"<<endl;
    cin>>post;
    cout<<"请输入你的业绩评级"<<endl;
    cin>>perform; 			
  }
  
  void displaydata(){
    cout<<"姓名:"<<name<<endl;
    cout<<"性别:"<<sex<<endl;
    cout<<"年龄:"<<age<<endl;
    cout<<"职务:"<<post<<endl;
    cout<<"业绩评级:"<<perform<<endl;
  }		
  
  void displayname(){
    cout<<name<<endl;
  }
};

int main(){
  student a[x];
  teacher b[x];
  administration c[x];
  start:
  system("cls");
  int i=0;
  int choose=0;
  string compare="num";
  
  cout<<"欢迎进入学校人员信息管理系统"<<endl;
  cout<<"1.录入信息"<<endl;
  cout<<"2.显示数据"<<endl; 
  cout<<"3.查询信息"<<endl;
  cin>>i;
  
  switch(i){
    case 1:{
      reinput:
      system("cls");
      cout<<"请选择你的身份进行录入"<<endl;
      cout<<"1.学生/2.教师/3.行政人员"<<endl;
      cin>>choose;
      //这里和书上的例子一样,定义一个指针来存放变量地址
      //当判定条件一致的时候,就对指针重新赋值
      //确保调用虚函数能呈现多态性 
      system("cls");
      student *p;
      //在一开始做一次排查,如果已经存放了数据就跳过这个成员 
      switch(choose){
        case 1:{
          for(i=0;i<x;i++){
            if(a[i].name=="num"){
              p=&a[i];
              break;
            }else{
              continue;
            }
          }					
          p->inputdata();
          break;			
        }
        case 2:{
          for(i=0;i<x;i++){
            if(b[i].name=="num"){
              p=&b[i];
              break;							
            }else{
              continue;
            }
          }					
          p->inputdata();
          break;				
        }
        case 3:{
          for(i=0;i<x;i++){
            if(a[i].name=="num"){
              p=&c[i];
              break;
            }else{
              continue;
            }
          }					
          p->inputdata();
          break;				
        }								
      }
      choose=0;
      cout<<"是否还要继续录入 1.是/2.否"<<endl;
      cin>>choose;
      if(choose==1){
        goto reinput;
      }
      if(choose==2){
        break;
      }		
    break;
    }
    
    case 2:{
      system("cls");
      choose=0;
      //我个人认为,对所有数据进行遍历
      //效率是一定不如对数据的三分之一进行遍历来得快的
      //所以在这里增加了问题 
      cout<<"请选择你的身份"<<endl; 
      cout<<"1.学生/2.教师/3.行政人员"<<endl;
      cin>>choose;
      cout<<"请输入你的名字"<<endl;
      cin>>compare;
      if(choose == 1){
        for(i=0;i<x;i++){
          if(a[i].name == compare){
            a[i].displaydata();
            //百度上cin.get()不知道在这里为什么不生效
            //我找了很长一段时间才找到这个最快捷的办法
            //一个语句就能让你等待任意键再继续 
            system("pause");
            break;
          }else if(a[i].name != compare){
            cout<<"未找到"<<compare<<"的数据,请重试"<<endl;
            break;
          }
        }
      }else if(choose == 2){
        for(i=0;i<x;i++){
          if(b[i].name == compare){
            b[i].displaydata();
            system("pause");
            break;
          }else if(b[i].name != compare){
            cout<<"未找到"<<compare<<"的数据,请重试"<<endl;
            break;
          }
        }				
      }else if(choose == 3){
        for(i=0;i<x;i++){
          if(c[i].name == compare){
            c[i].displaydata();
            system("pause");
            break;
          }else if(c[i].name != compare){
            cout<<"未找到"<<compare<<"的数据,请重试"<<endl;
            break;
          }
        }				
      }
      break;
    }
    
    case 3:{
      int j=0;
      //这里我对查询的理解还是有点疑问的
      //暂时先这么写 
      cout<<"请问你想查询下列哪项信息?"<<endl;
      cout<<"1.展示学生名单"<<endl;
      cout<<"2.展示教师名单"<<endl;
      cout<<"3.展示行政人员名单"<<endl; 
      cin>>j;
      system("cls");
      switch(j){
        case 1:{
          for(i=0;i<x;i++){
            if(a[i].name!="num"){
              a[i].displayname();
            }else{
              break;
            }
          }
          cout<<"总共有" <<i<<"条记录"<<endl; 
          system("pause");
          break;
        }
        case 2:{
          for(i=0;i<x;i++){
            if(b[i].name!="num"){
              b[i].displayname();
            }else{
              break;
            }
          }
          cout<<"总共有" <<i<<"条记录"<<endl;
          system("pause");
          break;										
          }
        case 3:{
          for(i=0;i<x;i++){
            if(c[i].name!="num"){
              c[i].displayname();
            }else{
              break;
            }
          }
          cout<<"总共有" <<i<<"条记录"<<endl;
          system("pause");
          break;										
          }					
      }
      break;
    }
    
  }	 
  
  goto start;
  return 0;
}

发表评论

您的电子邮箱地址不会被公开。