最新用二叉树来实现学生健康情况管理系统.docx
《最新用二叉树来实现学生健康情况管理系统.docx》由会员分享,可在线阅读,更多相关《最新用二叉树来实现学生健康情况管理系统.docx(21页珍藏版)》请在冰豆网上搜索。
最新用二叉树来实现学生健康情况管理系统
【综设实验题目】
实现学生健康情况管理的几个操作功能(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。
健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
实验内容
1.利用二叉树来实现
2.系统的菜单功能项如下:
1------新建学生健康表
2------向学生健康表插入学生信息
3------在健康表删除学生信息
4------从文件中读取健康表信息
5------向文件写入学生健康表信息
6------在健康表中查询学生信息(按学生学号来进行查找)
7------在屏幕中输出全部学生信息
8-----退出
【中文摘要】这次实验主要用二叉树来实现简单的学生健康管理系统,为了方便查找,进一步使用排序二叉树来实现。
系统的功能包括:
向学生健康表插入学生信息,在健康表删除学生信息,从文件中读取健康表信息,向文件写入学生健康表信息,在健康表中查询学生信息(按学生学号来进行查找),在屏幕中输出全部学生信息等。
健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。
【关键词】排序二叉树学生健康管理系统学生信息
【前言】
本次实验是为了进一步熟悉和掌握VC环境下的编译、调试和执行的方法及步骤,熟悉二叉树存储的实现方式及其应用。
【实验设计】
以排序二叉树为储存机制,可以方便的实现插入或删除学生信息。
每个学生的信息储存在一个结构体Sstudent中,并且这个结构体带有输出学生信息的函数ouput()。
然后以这个结构体作为二叉树节点的数据类型,这样就实现了学生信息的储存。
在创建二叉树对象时将已存储在文件中的学生信息写入二叉树,在析构函数里实现将学生信息写入文件。
【实验实现】
软件平台:
VC++6.0
硬件平台:
32位机器
主要功能模块分析:
1、储存一个学生的信息:
/*******************************************************************
Sstudent.h文件
*******************************************************************/
#ifndef_Sstudent_h_
#define_Sstudent_h_
#include
usingnamespacestd;
structbirthday//出生日期
{
unsignedshortday;
unsignedshortmonth;
unsignedshortyear;
};
structSstudent//一个学生的基本信息
{
charnumber[12];//学号
charname[12];//名字
structbirthdaybd;//出生日期
chargender[4];//性别
charhealthcase[10];//健康情况
Sstudent(){}
voidinput();//输入学生的基本信息
voidoutput();//输出学生的基本信息
voidoperator=(Sstudents);
booloperator<(Sstudent&s);
booloperator==(Sstudents);
booloperator>(Sstudent&s);
};
voidSstudent:
:
input()//输入一个学生的信息
{
cout<<"请输入学生信息:
"<cout<<"请输入学生的学号:
";
cin>>number;
cout<<"请输入学生的名字:
";
cin>>name;
cout<<"请输入学生的性别:
";
cin>>gender;
cout<<"请输入学生生日的日期(年、月、日):
";
cin>>bd.year>>bd.month>>bd.day;
cout<<"请输入学生的健康情况(良好或差):
";
cin>>healthcase;
cout<}
voidSstudent:
:
output()//输出一个学生的信息
{
cout<<"学号:
"<<<"姓名:
"<<<"性别:
"<<<"生日:
"<<<"健康情况:
"<}
voidSstudent:
:
operator=(Sstudents)
{
strcpy(number,s.number);
strcpy(name,s.name);
strcpy(gender,s.gender);
bd.year=s.bd.year;
bd.month=s.bd.month;
bd.day=s.bd.day;
strcpy(healthcase,s.healthcase);
}
boolSstudent:
:
operator<(Sstudent&s)
{
if(strcmp(number,s.number)==-1)//若number小于s.number
returntrue;
else
returnfalse;
}
boolSstudent:
:
operator==(Sstudents)
{
if(!
strcmp(name,s.name))//若name等于s.number
if(!
strcmp(number,s.number))//若num等于s.number
returntrue;
returnfalse;
}
boolSstudent:
:
operator>(Sstudent&s)
{
if(strcmp(number,s.number)==1)//若number大于s.number
returntrue;
else
returnfalse;
}
#endif
2、将文件中的学生健康信息写进排序二叉树
BSTree:
:
BSTree()
{
root=NULL;
BTreeNode*b=NULL;
Sstudents;
fstreamfile;
file.open("student.dat",ios:
:
in|ios:
:
binary);
if(!
file)
{
cerr<<"student.datcan'topen!
"<abort();
}
while
(1)
{
file.read((char*)&s,sizeof(s));//从文件中读入一个学生的信息
if(!
file)
break;
b=newBTreeNode(s,NULL,NULL);
inst(b->data);//调用插入函数建二叉树
}
file.close();
}
3、将排序二叉树中的学生信息写进文件
思想:
在退出程序调用析构函数时,通过前序遍历,将访问到的节点信息依次写进文件。
BSTree:
:
~BSTree()
{
fstreamfile;
file.open("student.dat",ios:
:
out|ios:
:
binary);
if(!
file)
{
cerr<<"student.datcan'topen!
"<abort();
}
BTreeNode*p=root;
preorder2(file,write1);//通过前序遍历,调用写函数write1
file.close();
}
VoidBSTree:
:
preorder2(fstream&file,voidwrite1(fstream&file,BTreeNode*p))
{
BTreeNode*stack[10],*p;
inttop=0;
p=root;
while(top>=0)
{
while(p!
=NULL)
{
write1(file,p);
stack[top++]=p;
p=p->lchild;
}
top--;
p=stack[top];
if(p!
=NULL)
p=p->rchild;
}
cout<}
voidwrite1(fstream&outfile,BTreeNode*p)//将节点p写进文件流
{
if(p==NULL)
cout<<"p==NULL"<else
outfile.write((char*)&(p->data),sizeof(p->data));
}
4、向学生健康表插入学生信息
//具有插入功能的查找(递归)
voidBSTree:
:
inst(BTreeNode*p,BTreeNode*&bst)
{
if(bst==NULL)
bst=p;
elseif(p->datadata)
inst(p,bst->lchild);
else
inst(p,bst->rchild);
}
/*
功能:
在当前的排序二叉树上查找关键字等于给定值el的结点,当查找成功时输出相应的信息,
否则建立一个新结点并插入在当前排序二叉树的适当位置中。
*/
voidBSTree:
:
inst(Sstudentel)
{
BTreeNode*p;
p=sear(el.number);
if(p!
=NULL)
cout<<"已找到"<else
{
p=newBTreeNode(el,NULL,NULL);
inst(p,root);
}
}
5、删除学生信息
/*
思想:
首先查找该元素所在的节点p,同时记录父节点;
一、若p为空,则发出错误信号;
二、若p不为空:
分三种情况讨论:
若*p结点为叶子结点,即左子树和右子树均为空树。
由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。
若*p结点只有左子树或右子树,此时只要令左子树或右子树直接成为其双亲结点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可,
作此修改也不破坏二叉排序树的特性。
若*p结点的左子树和右子树均不空。
在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,做法:
用p的右子树的最左端的节点tmp的数据域刷新p的数据域,然后递归调用删除tmp.
*/
BTreeNode*BSTree:
:
deleteNode(BTreeNode*&p,charnum[])
{
BTreeNode*pfather=root,*qfather=NULL,*q=NULL;;
intk;
//搜索该元素所在的节点,同时记录父节点
while(p!
=NULL)
{
k=strcmp(num,p->data.number);
if(k==-1)
{
pfather=p;
p=p->lchild;
}
elseif(k==1)
{
pfather=p;
p=p->rchild;
}
else
break;
}
if(p==NULL)
{
cout<<"找不到该同学信息,删除失败!
"<returnNULL;
}
elseif(p->lchild!
=NULL&&p->rchild!
=NULL)//结点左右儿子都存在
{
BTreeNode*tmp=p->rchild;
while(tmp->lchild)
{
tmp=tmp->lchild;
}
p->data=tmp->data;
p->rchild=deleteNode(p->rchild,tmp->data.number);
}
else
{//只有一个儿子或没有儿子的情况
if(p->lchild==NULL)
{
if(p==pfather->lchild)//p是左子节点
pfather->lchild=p->rchild;
else
pfather->rchild=p->rchild;
}
elseif(p->rchild==NULL)
{
if(p==pfather->lchild)//p是左子节点
pfather->lchild=p->lchild;
else
pfather->rchild=p->lchild;
}
}
p->data.output();
returnp;
}
//实例函数
BTreeNode*BSTree:
:
deleteNode(charnum[])
{
BTreeNode*p=root;
returndeleteNode(p,num);
}
6、在屏幕中输出全部学生信息
//采用中序遍历的思想输出节点信息,则在屏幕上根据学生学号的升序输出。
voidBTree:
:
prnt(BTreeNode*p)//递归函数
{
if(p!
=NULL)
{
prnt(p->lchild);
p->data.output();
prnt(p->rchild);
}
}
//实例函数
voidBTree:
:
prnt()
{
prnt(root);
}
7、用户界面
主函数文件:
intmain()
{
BSTreet;//新建一个二叉树:
t
intchoice=10;//将choice初始化,使其不为0~4
Sstudents;
BTreeNode*p=NULL;
charnum[12];
while(choice)
{
cout<<"请输入您要进行的操作:
"<cout<<"1------向学生健康表插入学生信息"<<<"2------在健康表删除学生信息"<<<"3------在健康表中查询学生信息(按学生学号来进行查找)"<<<"4------在屏幕中输出全部学生信息"<<<"0------退出"<cin>>choice;
switch(choice)
{
case1:
s.input();//输入学生信息
t.inst(s);
break;
case2:
cout<<"请输入要删除学生的学号:
";
cin>>num;
p=t.deleteNode(num);
if(p!
=NULL)
{
cout<<"删除成功!
删除学生的信息为:
"<p->getdata().output();
}
break;
case3:
cout<<"请输入要查询学生的学号:
";
cin>>num;
p=t.sear(num);
if(p!
=NULL)
p->getdata().output();
else
cout<<"找不到该学生信息!
"<break;
case4:
t.prnt();
break;
case0:
break;
default:
cout<<"输入错误!
请重新输入。
"<}
cout<}
return0;
}
【结果及结果分析】
1、插入学生信息:
插入后的二叉树为:
(1)专业知识限制2、删除学生信息:
人民广场地铁站有一家名为“漂亮女生”的饰品店,小店新开,10平方米不到的店堂里挤满了穿着时尚的女孩子。
不几日,在北京东路、淮海东路也发现了“漂亮女生”的踪影,生意也十分火爆。
现在上海卖饰品的小店不计其数,大家都在叫生意难做,而“漂亮女生”却用自己独特的经营方式和魅力吸引了大批的女生。
然而影响我们大学生消费的最主要的因素是我们的生活费还是有限,故也限制了我们一定的购买能力。
因此在价格方面要做适当考虑:
我们所推出的手工艺制品的价位绝大部分都是在50元以下。
一定会适合我们的学生朋友。
就算你买手工艺品来送给朋友也是一份意义非凡的绝佳礼品哦。
而这一份礼物于在工艺品店买的现成的礼品相比,就有价值意义,虽然它的成本比较低但它毕竟它是你花心血花时间去完成的。
就像现在最流行的针织围巾,为何会如此深得人心,更有人称它为温暖牌绝大部分多是因为这个原因哦。
而且还可以锻炼你的动手能力,不仅实用还有很大的装饰功用哦。
3、按学号查询学生信息:
附件
(二):
调查问卷设计
随着社会经济、文化的飞跃发展,人们正从温饱型步入小康型,崇尚人性和时尚,不断塑造个性和魅力的现代文化价值观念,已成为人们的追求目标。
因此,顺应时代的饰品文化显示出强大的发展势头和越来越广的市场,从事饰品销售是有着广阔的市场空间。
手工艺品,它运用不同的材料,通过不同的方式,经过自己亲手动手制作。
看着自己亲自完成的作品时,感觉很不同哦。
不论是01年的丝带编织风铃,02年的管织幸运星,03年的十字绣,04年的星座手链,还是今年风靡一时的针织围巾等这些手工艺品都是陪伴女生长大的象征。
为此,这些多样化的作品制作对我们这一创业项目的今后的操作具有很大的启发作用。
在现代文化影响下,当今大学生对新鲜事物是最为敏感的群体,他们最渴望为社会主流承认又最喜欢标新立异,他们追随时尚,同时也在制造时尚。
“DIY自制饰品”已成为一种时尚的生活方式和态度。
在“DIY自制饰品”过程中实现自己的个性化追求,这在年轻的学生一代中尤为突出。
“DIY自制饰品”的形式多种多样,对于动手能力强的学生来说更受欢迎。
4、输出二叉树中所有的学生信息:
我们女生之所以会钟爱饰品,也许是因为它的新颖,可爱,实惠,时尚,简单等。
的确,手工艺品价格适中。
也许还有更多理由和意义。
那么大学生最喜欢哪种手工艺品呢?
此次调查统计如下图(1-3)
【参考文献】
参考文献与网址:
、《数据结构—C++描述》朱振元朱承编著