c++ 简易人员信息管理系统
一、内容
编写一个人员信息管理系统。
这个系统的功能是:交互式的实现校园人员信息的录入与显示。
二、类分析
学校里,主要有四类人员:大学本科学生、教师、研究生和助教。
大学本科生每周有固定的学时数。教师除了固定的学时数外,还有每周的教学时数。研究生除了固定的学时数外,每周还可以自由做一定的研究。助教生除了上课外,还要做研究和一定的教学工作。
人员的基本信息包括姓名、编号、性别、身份证号、总学时数以及每周固定学时数。各个人员之间的关系: people类派生出student 类和teacher类,student 类派生出graduate类, graduate类和teacher类派生出TA类。
三、代码剖析
3.1 各种类的实现
根据以上分析,不难写出其对应的类。
people类:
class people
{
public:
people() {}
virtual ~people(){}
virtual void print();
protected:
string name;
string number;
int isGril;
string id;
double totalHours;
double fixedPerWeekHours;
};
void people::print()
{
cout << name << "信息表:\n";
cout << "姓名:"<< name <<endl
<< "编号:"<< number << endl
<< "性别:" << ( isGril ==0 ? "♀" : "♂") << endl
<< "身份证号:" << id << endl
<< "总学时数:" << totalHours << endl
<< "每周固定学时数:" << fixedPerWeekHours << endl;
}
student类:
class student : virtual public people
{
public:
student(){}
friend istream & operator>>(istream &in, student &p);
void print()
{
people::print();
}
};
istream & operator>>(istream &in, student &p)
{
cout << "请分别输入姓名、编号、性别(女:1,男:0)、身份证号、总学时数以及每周固定学时数(Tips:每项空格隔开)\n";
in >> p.name >> p.number >> p.isGril >> p.id >> p.totalHours >> p.fixedPerWeekHours;
return in;
}
teacher类:
class teacher :virtual public people
{
public:
teacher(){}
friend istream & operator>>(istream &in, teacher &p);
void print()
{
people::print();
cout << "每周教学时数:" << teachHours;
cout << endl;
}
protected:
double teachHours;
};
istream & operator>>(istream &in, teacher &p)
{
cout << "请分别输入姓名、编号、性别(女:1,男:0)、身份证号、总学时数、每周固定学时数以及每周教学时数(Tips:每项空格隔开)\n";
in >> p.name >> p.number >> p.isGril >> p.id >> p.totalHours >> p.fixedPerWeekHours >> p.teachHours;
return in;
}
graduate类:
class graduate : virtual public student
{
public:
graduate(){}
friend istream & operator>>(istream &in, graduate &p);
void print()
{
student::print();
cout << "每周研究时数:" << studyHours;
cout << endl;
}
protected:
double studyHours;
};
istream & operator>>(istream &in, graduate &p)
{
cout << "请分别输入姓名、编号、性别(女:1,男:0)、身份证号、总学时数、每周固定学时数以及每周研究时数(Tips:每项空格隔开)\n";
in >> p.name >> p.number >> p.isGril >> p.id >> p.totalHours >> p.fixedPerWeekHours >> p.studyHours;
return in;
}
TA类:
class TA : public graduate, public teacher
{
public:
friend istream & operator>>(istream &in, TA &p);
void print()
{
teacher::print();
cout << "每周教学时数:" << teachHours << endl
<< "每周研究时数:" << studyHours << endl;
}
};
istream & operator>>(istream &in, TA &p)
{
cout << "请分别输入姓名、编号、性别(女:1,男:0)、身份证号、总学时数、每周固定学时数、每周教学时数以及每周研究时数(Tips:每项空格隔开)\n";
in >> p.name >> p.number >> p.isGril >> p.id >> p.totalHours >> p.fixedPerWeekHours >> p.teachHours >> p.studyHours;
return in;
}
3.2 交互式界面结构剖析
如你所见到的,这些类已经可以完成信息的输入与输出,所以接下来我们要做的就是做一个交互式的界面。鄙人代码中大量使用了switch()语句,以实现交互。如下main()方法里的代码展示了整个系统的结构。
int main()
{
system("title 人员信息管理系统");
while(1)
{
cout << "*********** 请输入您的选择 **********\n";
cout << " 1 录入 \n";
cout << " 2 显示 \n";
cout << " 3 退出 \n";
cout << "*********************************************\n";
cout << ">";
int choose1;
cin >> choose1;
switch (choose1)
{
case 1://录入
{
system("cls");
input();
system("pause");
system("cls");
break;
}
case 2://显示
{
system("cls");
print();
system("pause");
system("cls");
break;
}
case 3://退出
return 0;
default:
{
cin.clear();
cin.ignore(1024, '\n');
cout << "输入错误!可输入选项:[1,2,3]";
system("pause");
break;
}
}
}
}
如你所见,代码中有大量文字以提示用户操作。
这里面有几点需要说明的:
-
system(“pause”) 用于暂停,目的是使用户能看见他的操作
-
system(“cls”)用于清屏,这样做可以实现界面的跳转操作(看起来是这样)。如果你对这个概念不清楚,没关系,你可以在文末下载打包好的exe程序体验一下,或者是自己动手试一下
-
cin.clear()和cin.ignore(1024, ‘\n’)的作用是防止用户输入的东西与你规定使用的不一致而导致的程序崩溃
-
input()和print()函数里面也大量使用了switch()语句(实现交互),且代码结构与如上代码大致相同,这里不做分析,读者可在源代码中查看
-
input()与print()函数里面使用虚函数与指针实现了多态,由于笔者水平有限,这里也不做讲解,如有错误,欢迎斧正
四、效果演示
用户主界面
选择2,进入显示界面
按任意键后停留在原界面
输入e返回上一级,并选择1进行录入
按任意键后仍然停留在原界面,再次输入
输入完成后,进入显示界面:
以上就是界面展示
五、源代码
#include <iostream>
#include <string>
using namespace std;
int stuNum = 0;
int teachNum = 0;
int gradNum = 0;
int taNum = 0;
class people
{
public:
people() {}
virtual ~people(){}
virtual void print();
protected:
string name;
string number;
int isGril;
string id;
double totalHours;
double fixedPerWeekHours;
};
void people::print()
{
cout << name << "信息表:\n";
cout << "姓名:"<< name <<endl
<< "编号:"<< number << endl
<< "性别:" << ( isGril ==0 ? "♀" : "♂") << endl
<< "身份证号:" << id << endl
<< "总学时数:" << totalHours << endl
<< "每周固定学时数:" << fixedPerWeekHours << endl;
}
class student : virtual public people
{
public:
student(){}
friend istream & operator>>(istream &in, student &p);
void print()
{
people::print();
}
};
istream & operator>>(istream &in, student &p)
{
cout << "请分别输入姓名、编号、性别(女:1,男:0)、身份证号、总学时数以及每周固定学时数(Tips:每项空格隔开)\n";
in >> p.name >> p.number >> p.isGril >> p.id >> p.totalHours >> p.fixedPerWeekHours;
return in;
}
class teacher :virtual public people
{
public:
teacher(){}
friend istream & operator>>(istream &in, teacher &p);
void print()
{
people::print();
cout << "每周教学时数:" << teachHours;
cout << endl;
}
protected:
double teachHours;
};
istream & operator>>(istream &in, teacher &p)
{
cout << "请分别输入姓名、编号、性别(女:1,男:0)、身份证号、总学时数、每周固定学时数以及每周教学时数(Tips:每项空格隔开)\n";
in >> p.name >> p.number >> p.isGril >> p.id >> p.totalHours >> p.fixedPerWeekHours >> p.teachHours;
return in;
}
class graduate : virtual public student
{
public:
graduate(){}
friend istream & operator>>(istream &in, graduate &p);
void print()
{
student::print();
cout << "每周研究时数:" << studyHours;
cout << endl;
}
protected:
double studyHours;
};
istream & operator>>(istream &in, graduate &p)
{
cout << "请分别输入姓名、编号、性别(女:1,男:0)、身份证号、总学时数、每周固定学时数以及每周研究时数(Tips:每项空格隔开)\n";
in >> p.name >> p.number >> p.isGril >> p.id >> p.totalHours >> p.fixedPerWeekHours >> p.studyHours;
return in;
}
class TA : public graduate, public teacher
{
public:
friend istream & operator>>(istream &in, TA &p);
void print()
{
teacher::print();
cout << "每周教学时数:" << teachHours << endl
<< "每周研究时数:" << studyHours << endl;
}
};
istream & operator>>(istream &in, TA &p)
{
cout << "请分别输入姓名、编号、性别(女:1,男:0)、身份证号、总学时数、每周固定学时数、每周教学时数以及每周研究时数(Tips:每项空格隔开)\n";
in >> p.name >> p.number >> p.isGril >> p.id >> p.totalHours >> p.fixedPerWeekHours >> p.teachHours >> p.studyHours;
return in;
}
void input();
void print();
student stu[50];
teacher tech[20];
graduate grad[50];
TA ta[50];
int main()
{
system("title 人员信息管理系统");
while(1)
{
cout << "*********** 请输入您的选择 **********\n";
cout << " 1 录入 \n";
cout << " 2 显示 \n";
cout << " 3 退出 \n";
cout << "*********************************************\n";
cout << ">";
int choose1;
cin >> choose1;
switch (choose1)
{
case 1://录入
{
system("cls");
input();
system("pause");
system("cls");
break;
}
case 2://显示
{
system("cls");
print();
system("pause");
system("cls");
break;
}
case 3://退出
return 0;
default:
{
cin.clear();
cin.ignore(1024, '\n');
cout << "输入错误!可输入选项:[1,2,3]";
system("pause");
break;
}
}
}
}
void print()
{
while(1)
{
system("cls");
char choose;
cout << "********** 当前位置:主菜单->输出 *********\n";
cout << "*********** 请输入您的选择 **********\n";
cout << " A/a 学生 \n";
cout << " B/b 教师 \n";
cout << " C/c 研究生 \n";
cout << " D/d 助教生 \n";
cout << " E/e 返回上一级 \n";
cout << "*********************************************\n";
cout << ">>";
cin >> choose;
switch (choose)
{
case 'a':
case 'A':
{
people *p;
cout << "****** 学生列表" << " 共 " << stuNum << " 项 ******\n";
for (int i = 0; i < stuNum; i++)
{
p = &stu[i];
p->print();
cout << endl;
}
system("pause");
break;
}
case 'b':
case 'B':
{
people *p;
cout << "****** 教师列表" << " 共 " << teachNum << " 项 ******\n";
for (int i = 0; i < teachNum; i++)
{
p = &tech[i];
p->print();
cout << endl;
}
system("pause");
break;
}
case 'c':
case 'C':
{
people *p;
cout << "****** 研究生列表" << " 共 " << gradNum << " 项 ******\n";
for (int i = 0; i < gradNum; i++)
{
p = &grad[i];
p->print();
cout << endl;
}
system("pause");
break;
}
case 'd':
case 'D':
{
people *p;
cout << "****** 助教生列表" << " 共 " << taNum << " 项 ******\n";
for (int i = 0; i < taNum; i++)
{
p = &ta[i];
p->print();
cout << endl;
}
system("pause");
break;
}
case 'e':
case 'E':
{
return;
}
default:
{
cin.clear();
cin.ignore(1024, '\n');
cout << "输入错误!可输入选项:[A ~ E内任意字母的大小写]";
system("pause");
system("cls");
break;
}
}
}
}
void input()
{
while (1)
{
system("cls");
char choose;
cout << "********** 当前位置:主菜单->录入 *********\n";
cout << "*********** 请输入您的选择 **********\n";
cout << " A/a 学生 \n";
cout << " B/b 教师 \n";
cout << " C/c 研究生 \n";
cout << " D/d 助教生 \n";
cout << " E/e 返回上一级 \n";
cout << "*********************************************\n";
cout << ">>";
cin >> choose;
switch (choose)
{
case 'a':
case 'A':
{
int n;
cout << "请输入录入学生数目 >>>";
cin >> n;
cout << endl;
for (int i = stuNum; i < n + stuNum; i++)
{
cin >> stu[i];
}
stuNum += n;
system("pause");
break;
}
case 'b':
case 'B':
{
int n;
cout << "请输入录入教师数目 >>>";
cin >> n;
cout << endl;
for (int i = teachNum; i < n + teachNum; i++)
{
cin >> tech[i];
}
teachNum += n;
system("pause");
break;
}
case 'c':
case 'C':
{
int n;
cout << "请输入录入研究生数目 >>>";
cin >> n;
cout << endl;
for (int i = gradNum; i < n + gradNum; i++)
{
cin >> grad[i];
}
gradNum += n;
system("pause");
break;
}
case 'd':
case 'D':
{
int n;
cout << "请输入录入助教生数目 >>>";
cin >> n;
cout << endl;
for (int i = taNum; i < n + taNum; i++)
{
cin >> ta[i];
}
taNum += n;
system("pause");
break;
}
case 'e':
case 'E':
{
return;
}
default:
{
cin.clear();
cin.ignore(1024, '\n');
cout << "输入错误!可输入选项:[A ~ E内任意字母的大小写]";
system("pause");
system("cls");
break;
}
}
}
}