C++课程设计报告 模板实现排行榜管理.docx
《C++课程设计报告 模板实现排行榜管理.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告 模板实现排行榜管理.docx(14页珍藏版)》请在冰点文库上搜索。
C++课程设计报告模板实现排行榜管理
VC++课程设计报告
题目:
模板实现排行榜管理
等级:
A级
院系:
材料科学与工程系
班级:
xxxxxx班
姓名:
xxx
学号:
xxxxxxxxxx
任课教师:
xxxx
时间:
2010年3月
得分:
教师点评:
目录
1.题目…………………………………………………
(1)
2.功能简介……………………………………………………
(1)
3.课程设计要求………………………………………………
(1)
4.程序设计思想………………………………………………
(1)
5.设计过程与设计亮点……………………………………(3-4)
6.部分关键程序代码注解…………………………………(4-9)
8.注意点……………………………………………………(3)
9.附图……………………………………………………(4)
10.部分关键程序代码注解…………………………………(4)
11.个人心得体会……………………………………………(8)
一、功能简介
模板形式的二叉树操作的实现。
定义了二叉树的一些基本功能:
插入、查找、删除、删除子树、前序、中序及后序遍历等,在示范例子中构造了整型数据形式的二叉树。
二、课程设计要求
(1)将模板类型用排行榜数据替代,构建一棵二叉树,表示游戏挑战大赛积分排行榜;当出现一个挑战者,其成绩能加到数据库中;也可将弃权者的记录从数据库中删除。
(2)能显示分数的排行榜,能根据姓名的顺序显示分数。
(3)统计平均得分。
(4)根据人名查找分数。
(5)根据分数查找人名。
(6)修改main函数,可以从键盘输入数据,要求界面清楚,并可循环操作。
三、程序设计思想
1)类的结构
原程序已详细定义了二叉树的各种基本的操作,在设计时不必改变原程序的成员函数,关键是要改变原程序的结点类中的数据类型,将模板类型变换成我们需要的排行榜的数据类型。
由于课程设计中要求能分别根据姓名和成绩排序,对于一个二叉树对象来说,根据两种不同类型的数据排序是很难实现的,而为了利用已编写好的模板类的成员函数,最好不要对已有的二叉树的成员函数进行变动,所以这里我们定义了两个二叉树对象,分别根据姓名和成绩的顺序进行构造,相应地定义了两个不同名的数据类,分别重载二叉树类中成员函数所需的运算符,这样,用相同的类定义就可以实现不同的排序功能。
2)main函数结构
main函数采用菜单选项的形式,具体的菜单选项参考如下:
主菜单
1.插入结点
2.根据姓名删除结点
3.根据姓名查找结点
4.根据姓名排序输出
5.根据成绩删除结点
6.根据成绩查找结点
7.根据成绩排序输出
0.退出
各项操作应能循环执行。
为使用户界面更加友好,避免输人数据类型错误导致的程序无效循环,在输人数据时进行判断,对非法输入予以提示,具体参见样例程序说明第三部分。
3)进一步完善程序
为了使程序更加实用,可以在程序中添加文件的输入输出功能,这样,就可以保存排行榜数据并将不同的排行榜文件读人程序进行管理操作。
四、设计过程与设计亮点
拿到这次程序设计的要求和源程序代码之后,我首先仔细阅读了对程序功能的要求和程序设计的主要思想,认真分析了已给出的关键源代码,找出其中所缺少的部分,大体构思出了设计和添补的方案。
1)书中的模板中缺少主界面函数,这使程序缺少实用性,最终界面不清晰,会严重影响用户的使用。
因此,我在其中添加了下面的这个函数。
template
voidTREESTRUCT:
:
xuanze()//*******显示菜单,有用户选择要执行的功能
{cout<cout<<"##########排行榜管理系统##########"<cout<<"请选择执行功能"<cout<<"1:
加入数据"<cout<<"2:
删除数据"<cout<<"3:
统计平均分"<cout<<"4:
用人名查分数"<cout<<"5:
用分数查人名"<cout<<"6:
由低到高输出排行榜"<cout<<"7:
由高到底输出排行榜"<cout<<"0:
退出"<cout<}
2)设计要求可以计算并输出平均分,但在书上给出的参考程序中,缺少可以实现这一功能的函数。
因此,我增加下面的这个函数。
voidshowAverage()//**统计平均分函数
{
if(root!
=NULL)
{
doublex=jisuanAverage(root);
showAverage(x);
return;
}
else
{cout<<"没有数据以供求平均分!
请先加入数据!
"<cout<<"返回主菜单"<xuanze();
return;
}
}
doublejisuanAverage(TreeNode*);//*****计算平均分函数
voidshowAverage(double);//******显示平均分
3)“cout<<"没有数据!
请先加入数据!
"<template
classTREESTRUCT//**建立一棵二叉树
{
public:
TREESTRUCT(){root=NULL;cout<<"没有数据!
请先加入数据!
"<4)书中给出的程序对于二叉树中的数据只能从低到高输出,而在排序方面也显得很复杂,程序也很繁琐。
因此,我没有使用书中给出的参考程序,而是,重新定义了2个函数来实现排序的功能。
voidshowNodesddg()//******低到高遍历整棵树
voidshowNodesgdd()//******高到低遍历整棵树
5)在书中给出了2个参考的排序类,分别是根据姓名和分数进行排序。
但我个人认为这两个程序分开写过于繁琐。
而且这两个类可以合并到插入数据函数中。
voidTREESTRUCT:
:
insertNode()
这样做简化了程序,更加方便、可行。
6)书中的函数并没有提示语句,不利于用户的操作。
所以,我在程序中加入了一些提示语句,方便用户的使用。
五、部分关键程序代码注解
1)template//******删除数据函数
voidTREESTRUCT:
:
remove()
{
intx=0,y=0;
Tdata;
charname[20];
if(root==NULL)
{
cout<<"没有数据以供删除!
请先加入数据,返回菜单!
"<xuanze();
return;
}
else
{
cout<<"请输入要删除的数据的姓名:
";
cin>>name;
cout<<"请输入要删除的数据的成绩:
";
cin>>data;
cout<<"您要删除的数据是:
"<cout<<"姓名为:
"<"<cout<<"请确认是否删除:
"<do
{
cout<<"1:
是2:
不是"<cin>>y;
if(y==1)//***用户确认删除操作
{
x=deleteNode(data,name,root,x=0);
if(x==0)//*******删除失败
cout<<"未找到符合要求的信息!
删除失败!
选择以下操作:
"<elseif(x==1)//**删除成功
cout<<"删除成功!
选择以下操作:
"<break;
}
elseif(y==2)//*****用户取消删除操作
{
cout<<"没有删除数据!
请选择以下操作:
!
"<break;
}
else
cout<<"选择错误!
请从新选择!
"<}while(y!
=1&&y!
=2);
do//**确认用户是否继续删除
{
cout<<"1:
继续删除2:
返回菜单:
"<cin>>x;
if(x==1)//******用户确认继续删除操作
{
remove();
x=0;
break;
}
elseif(x==2)//********用户确认返回菜单操作
{
cout<<"正在退出,返回菜单。
"<xuanze();
x=0;
break;
}
else
cout<<"选择错误,请从新选择!
"<}while(x!
=1&&x!
=2);
return;
}
}
2)template//*****计算平均分函数
doubleTREESTRUCT:
:
jisuanAverage(TreeNode*tRoot)
{
staticintsum=0;
staticinti=0;
doubleaverage;
TreeNode*tempNodeptr=tRoot;
if(tempNodeptr)
{
sum+=tempNodeptr->data;
i++;
jisuanAverage(tempNodeptr->left);
jisuanAverage(tempNodeptr->right);
}
average=double(sum)/i;
returnaverage;
}
template
voidTREESTRUCT:
:
showAverage(doublex)//*****显示平均分函数
{
cout<<"平均分是:
"<cout<<"正在返回主菜单"<xuanze();
}
3)template//*****用分数查姓名
voidTREESTRUCT:
:
searchNodeName()
{TreeNode*tRoot=root;
Tdata;
intx=0;
if(tRoot==NULL)
{
tRoot=0;
cout<<"没有数据以供查找!
请先加入数据!
返回主菜单"<xuanze();
return;
}
else
{cout<<"请输入要查找的数据的分数:
";
cin>>data;
while(tRoot!
=NULL)
{if(data==tRoot->data)//*找到相同值时,继续查找左支树
{
if(x==0)
cout<<"找到符合要求的信息是:
"<cout<<"姓名为:
"<name<<'\t'<<"成绩为:
"<data<tRoot=tRoot->left;
x++;
}
elseif(datadata)
tRoot=tRoot->left;
elseif(data>tRoot->data)
tRoot=tRoot->right;
}
if(x==0)
cout<<"未找到符合要求的信息!
请选择以下操作:
"<else//****查找成功
cout<<"查找成功!
以下选择以下操作:
"<do//*****确认用户是否再查找
{
cout<<"1:
继续查找2:
返回菜单:
"<cin>>x;
if(x==1)//****用户确认查找操作
{
searchNodeName();
break;
}
elseif(x==2)//******用户取消查找操作
{
cout<<"正在退出,返回主菜单。
"<xuanze();
break;
}
else
cout<<"选择错误,请从新选择!
"<}while(x!
=1&&x!
=2);
}
}
4)template//*****用姓名查分数
voidTREESTRUCT:
:
searchNodeData()
{
TreeNode*tRoot=root;
charname[20];
intx=0;
if(tRoot==NULL)
{
tRoot=0;
cout<<"没有数据以供查询!
请先加入数据!
返回主菜单."<xuanze();
return;
}
else
{cout<<"请输入要查找的数据的姓名:
";
cin>>name;
tRoot=root;
x=searchNodeData(tRoot,name);
if(x==1)//********查找成功
cout<<"查找成功!
选择以下操作:
"<else//****查找失败
cout<<"未找到符合要求的信息!
查找失败!
选择以下操作:
"<do//**确认用户是否继续查找
{cout<<"1:
继续查找2:
返回菜单:
"<cin>>x;
if(x==1)//*****用户确认继续查找操作
{
searchNodeData();
break;
}
elseif(x==2)//*******用户确认返回菜单操作
{
cout<<"正在退出,返回菜单。
"<xuanze();
break;
}
else
cout<<"选择错误,请从新选择!
"<}while(x!
=1&&x!
=2);
}
}
5)template//******低到高输出排行榜
voidTREESTRUCT:
:
showNodesddg(TreeNode*tRoot)
{
if(tRoot==NULL)
return;
showNodesddg(tRoot->left);
cout<<"姓名为:
"<name<<'\t'<<"成绩为:
"<data<showNodesddg(tRoot->right);
}
6)template//*********高到低输出排行榜函数
voidTREESTRUCT:
:
showNodesgdd(TreeNode*tRoot)
{
if(tRoot==NULL)
return;
showNodesgdd(tRoot->right);
cout<<"姓名为:
"<name<<'\t'<<"成绩为:
"<data<showNodesgdd(tRoot->left);