数据结构大作业之家谱管理系统Word下载.docx
《数据结构大作业之家谱管理系统Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构大作业之家谱管理系统Word下载.docx(32页珍藏版)》请在冰点文库上搜索。
//指向兄弟的指针
private:
//成员的各种数据
stringname="
未知"
;
stringbirthPlace="
BirthDaybirthDay;
stringsex="
floatheight=0;
intage=0;
stringeducation="
stringjob="
stringfather="
classFamilySystem{
FamilySystem()=default;
~FamilySystem(){
deleteroot;
}
boolfileInit();
//从文件中读取数据
intmenu();
//显示菜单(功能)
booladdMem();
//增加成员
booldeleteMem();
//删除成员
booldemandMem();
//查询
booldemandAve();
//查询家庭整体情况
boolmodifyMem();
//修改成员
boolshowFamily();
//展示整个家谱
boolsaveFile();
//保存信息到文件中,将使用两个文件,一个保存成员信息,一个保存家谱整体信息
Member*root=nullptr;
//家谱数结构的根节点指针?
inttotal=0;
//总人数
floataveAge=0;
//平均年龄
floataveHeight=0;
//平均身高
floataveMember=0;
//家庭平均人数
floatratio=0;
//男女比例
voidcalculate();
//计算平均值等
Member*seek(string);
//查找是否存在成员
voiddisplay(Member*,int);
//先序遍历树,用于显示所有成员
externstringgets();
//用于接收键盘的输入
类的函数及相关操作函数的实现
iomanip>
vector>
fstream>
sstream>
conio.h>
#include"
SystemClass.h"
cin;
cout;
endl;
setw;
vector;
ios;
ifstream;
ofstream;
istringstream;
stringgets(){//从控制台获取字符等信息
strings;
while(intn=_getch()){
if(n==27){
throw27;
break;
}
elseif(n==13){
cout<
endl;
elseif(n==8){
s.pop_back();
"
\b\b"
else{
char(n);
s.push_back(char(n));
returns;
}
//与BirthDay相关的函数
istream&
in,BirthDay&
b){//从文件中读取生日的信息
in>
b.year>
b.month>
b.day;
returnin;
ostream&
out,BirthDay&
b){
out<
b.year<
<
b.month<
returnout;
//与Member相关的函数
voidMember:
setE(){
try{
istringstreamsin;
cout<
setw(20)<
请输入成员信息:
\n"
<
endl<
姓名:
"
sin.str(gets());
sin>
name;
出生地:
sin.clear();
birthPlace;
生日:
while(true){
sin.clear();
sin>
birthDay.year>
birthDay.month>
birthDay.day;
if(!
sin||birthDay.year>
2014||birthDay.month>
12||birthDay.day>
31){
cout<
输入错误,请重新输入:
sin.str(gets());
elsebreak;
性别:
while(sin>
sex){
if(sex=="
male"
||sex=="
female"
男"
女"
)
break;
else{
性别必须是male、female、男或者女,请重新输入:
}
身高(厘米):
while(!
(sin>
height)){
sin.str(gets());
年龄:
age)||age>
300){
学历:
education;
工作:
job;
父亲:
father;
catch(intex){
throwex;
return;
m){
setw(25)<
该成员信息如下:
endl
<
setw(25)<
姓名:
m.name<
endl
出生地:
m.birthPlace<
生日:
m.birthDay.year<
m.birthDay.month
m.birthDay.day<
m.sex<
m.height<
m.age<
m.education<
m.job<
m.father<
m.name>
m.birthPlace>
m.birthDay>
m.sex
>
m.height>
m.age>
m.education>
m.job>
m.father;
//FamilySystem的成员函数
intFamilySystem:
menu(){
cout<
\n\n"
---------------------------\n"
||\n"
|系统菜单|\n"
|1.查询成员|\n"
|2.查询家庭整体情况|\n"
|3.添加成员|\n"
|4.删除成员|\n"
|5.修改成员信息|\n"
|6.显示整个家谱|\n"
|按ESC退出系统|\n"
intn=0;
while
(1){
n=_getch();
if(n==27)break;
if(n>
=49&
&
n<
=54)break;
\n请按下1、2、3、4、5、6选择或按ESC键退出!
returnn;
boolFamilySystem:
fileInit(){
ifstreaminfile;
//打开存储成员信息的文件,读入成员信息
infile.open("
Members.txt"
ios:
in|ios:
_Nocreate);
if(!
infile){
returnfalse;
vector<
Member*>
genely;
//保存这一代成员的指针
next;
//保存下一代成员的指针
Member*temp=newMember;
//临时保存输入的成员信息
root=temp;
//第一个赋给root
genely.push_back(root);
next.push_back(root);
while(infile>
*temp){
//将成员放入家族树中,成员的父亲必须是这一代的成员
for(autoi=genely.begin();
i!
=genely.end();
++i){
if((*i)->
name==temp->
father){
if((*i)->
pson==nullptr)
(*i)->
pson=temp;
else{
Member*p=(*i)->
pson;
while(p->
pbro!
=nullptr)
p=p->
pbro;
p->
pbro=temp;
}
next.push_back(temp);
temp=nullptr;
//若成员的父亲不是这一代的成员,则将next赋予genely,迭进下一代
if(temp!
=nullptr){
genely=next;
//迭进下一代
next.clear();
//清空next
for(autoi:
genely){//将成员放入家族树中
if(i->
i->
next.push_back(temp);
temp=nullptr;
break;
//动态创建临时成员变量,用于存储输入的下一个成员的信息
temp=newMember;
infile.close();
//关闭存储成员信息的文件
//若文件中没有成员信息,将root置为空
if(root->
name=="
root=nullptr;
//打开存储家庭总体信息的文件,读入信息
Wholes.txt"
infile>
total>
aveAge>
aveHeight>
aveMember>
ratio;
//关闭文件
returntrue;
Member*FamilySystem:
seek(stringnam){
//若家谱树为空,返回空指针
if(root==nullptr)
returnnullptr;
//若root不为空,继续查找
Member*store=nullptr;
//存储返回的指针
//存储这一代的指针
//存储下一代的指针
for(;
){//循环查找
//在这一代中查找,若找到,跳到最后
for(autop:
genely){
if(p->
name==nam){
store=p;
gotoEnd;
}
//判断下一代是否为空,若为空,跳到最后
intjubge=0;
pson!
=nullptr)
++jubge;
if(jubge==0)
gotoEnd;
//找到下一代
Member*temp=p->
if(temp==nullptr)continue;
while(temp->
pbro!
next.push_back(temp->
pbro);
temp=temp->
genely=next;
next.clear();
End:
returnstore;
addMem(){
3.添加成员.\n"
Member*temp=newMember;
temp->
setE();
//输入成员信息
catch(int){
//检查其父亲是否存在
Member*jubge=seek(temp->
father);
if(root==nullptr)root=temp;
elseif(jubge==nullptr){
\n家谱中没有此人父亲的信息!
无法插入!
\n请确认此人是否此家族中的人!
else{
if(seek(temp->
name)!
\n\n此人已存在于家谱中!
按ENTER确定添加并返回菜单\n按ESC取消添加并返回菜单"
for(;
){
intj=_getch();
if(j==27){
deletetemp;
if(j==13){
if(jubge->
pson==nullptr)jubge->
else{
Member*p=jubge->
while(p->
p=p->
p->
}
cout<
\n保存成功!
\n按ESC键返回菜单"
if(_getch()==27)
deleteMem(){
4.删除成员.\n\n"
请输入姓名:
stringna;
istringstreamsin(gets());
sin>
na;
gotoend;
Member*temp=seek(na);
if(temp==nullptr)
\n\n家谱中没有此人!
else{
if(temp->
\n\n此人有后代!
若删除此人其后代将同时被删!
\n\n按ENTER继续\n按ESC退出"
if(j==27)
returnfalse;
if(j==13)
Member*p=seek(temp->
if(p==nullptr)root=nullptr;
elseif(temp==p->
pson)p->
pson=nullptr;
while(p->
=temp){
p=p->
p->
pbro=nullptr;
\n\n删除成功!
cout<
end:
returntrue;
demandMem(){
1.查询成员.\n\n"
try{
Member*m=seek(na);
if(m!
=nullptr)cout<
*m;
elsecout<
\n\n对不起,家谱中没有此人的信息!
voidFamilySystem:
calcula