1舞伴配对系统实训报告.docx
《1舞伴配对系统实训报告.docx》由会员分享,可在线阅读,更多相关《1舞伴配对系统实训报告.docx(34页珍藏版)》请在冰点文库上搜索。
![1舞伴配对系统实训报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/b4913228-2524-4268-936d-2e827b3c3a1c/b4913228-2524-4268-936d-2e827b3c3a1c1.gif)
1舞伴配对系统实训报告
舞伴配对系统
本题目设计目的是训练本人的基本编程能力,了解数据结构C++实现系统的开发流程,掌握数据结构和熟悉C++语言的面向对象各种基本操作。
本程序中涉及结构体、单链表、类等方面的知识。
通过本程序的训练,使本人能对C++语言的类操作有一个更深刻的了解,为进一步开发出高质量的有关数据结构方面系统打下坚实的基础。
1、问题定义
【内容与要求】
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。
跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
要求写程序模拟上述舞伴配对问题。
对于此问题,可使用队列这种数据结构实现。
在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。
2、系统设计
2.1总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。
需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。
可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。
本系统由如下功能模块组成
功能图:
配对流程图
2.2详细设计
2.2.1数据
舞伴配对类体classpeoples将用于存基本信息。
//定义类peoples
classpeoples
{
public:
peoples();
voidshuru(char*na,char*s);//输入函数
voidsf();//相当于析构函数
voidshow();//显示函数
char*fhn();//获取姓名
char*fhs();
private:
char*name;
char*sex;
};
这样就定义了一个类结构。
2.2.2主控函数执行流程
//主函数实现
voidmain()
{
//运行系统程序执行生成标题
system("title☆舞伴配对系统☆--全建思");
//运行系统程序执行改变界面颜色
system("colorB1");
queueman;
queuewoman;//把peoples类放入模板,然后创建两个队列
peoplesp;//创建对象
intk;//用于输入每次舞会的人数
chart;//用于输入是否继续下一场舞会
staticintcount_m=0;//男的数量
staticintcount_w=0;//女的数量
staticintcount_t=0;//舞会的次数
cout<<"\t\t******************************************"<cout<<"\t\t★★★★★欢迎使用舞伴配对系统★★★★★★"<cout<<"\t\t******************************************"<ofstreaminout("舞伴配对.txt",ios:
:
in);//创建文件
if(!
inout)//如果创建不成功就返回
{
cout<<"Cannotopenthefile"<return;
}
for(;;)//死循环相当于while
(1)
{
cout<<"\t\t第"<<++count_t<<"场舞会"<inout<<"\t\t第"<"<cout<<"\t\t请输入人数:
";
cin>>k;
for(inti=0;i{
peoplesp;
charname[12];
charsex[2];
cout<<"\t\t请输入姓名:
";
cin>>name;
cout<<"\t\t请输入性别(男(m)女(w)):
";
while
(1)
{
cin>>sex;
if(strcmp(sex,"m")==0||strcmp(sex,"w")==0)//比较是否一样
break;
else
cout<<"\t\t性别错误,请重新输入:
";
}
p.shuru(name,sex);
if(strcmp(sex,"m")==0)
{
man.push(p);//进队列
count_m++;//男的数量+1
}
elseif(strcmp(sex,"w")==0)//女的同上
{
woman.push(p);
count_w++;
}
}
if(count_m>count_w)//当男的大于女的的时候
{
for(inti=0;i{
cout<<"第"<
man.pop(p);//出队列
p.show();//显示
inout<
inout<
p.sf();//析构
cout<<"和";
inout<<"和";
woman.pop(p);
p.show();
inout<
inout<
p.sf();
cout<<'\n';
inout<<"\n";
}
cout<<"\t\t男队有剩余"<<""<<"剩余数:
"<count_m=count_m-count_w;//男的数目变成剩下的。
count_w=0;//女的数目变为0,由于都出队了
cout<<"\t\t剩余人:
";
for(i=0;i同最后面的一样
{
man.pop(p);
p.show();
cout<man.push(p);
}
}
//当男的小于女的的时候和当男的大于女的的时候方法是一样的,只是男和女的区别
elseif(count_m{
for(inti=0;i{
cout<<"\t\t第"<
man.pop(p);
p.show();
inout<
inout<
p.sf();
cout<<"和";
inout<<"和";
woman.pop(p);
p.show();
inout<
inout<
p.sf();
cout<<'\n';
inout<<"\n";
}
cout<<"\t\t女队有剩余"<<""<<"剩余数:
"<count_w=count_w-count_m;
count_m=0;
cout<<"\t\t剩余人:
";
for(i=0;i{
woman.pop(p);
p.show();
cout<woman.push(p);
}
}
//当男女数量相等同上
elseif(count_w==count_m)
{
for(inti=0;i{
cout<<"\t\t第"<
man.pop(p);
p.show();
inout<
p.sf();
cout<<"和";
inout<<"和";
woman.pop(p);
p.show();
inout<
p.sf();
cout<<'\n';
inout<<"\n";
}
count_m=0;
count_w=0;
}
cout<<'\n';
cout<<"\t\t第"<\n\t\t(如果键入n则退出系统)(y/n)";
cin>>t;
system("cls");//清屏函数;
if(t=='y')
{
if(count_w>0)
{
cout<<"\t\t上次剩余女士人数:
"<cout<<"\t\t分别是:
";
for(i=0;i{
//显示剩余的人的时候,用先出队,显示,再入队,由于这些人第二轮还要用
woman.pop(p);
p.show();
cout<woman.push(p);
}
}
elseif(count_m>0)
{
cout<<"\t\t上次剩余男士人数:
"<cout<<"\t\t分别是:
";
for(i=0;i{
man.pop(p);
p.show();
cout<man.push(p);
}
}
}
else
{
cout<<"\t\t\t★谢谢使用★!
"<<'\n';
inout.close();
p.sf();
man.~queue();
woman.~queue();
break;
}
}
}
本舞伴配对系统执行先创建文件,再输入相关数据,接下来进行比较,然后执行显示主出来和进入主循环操作,进行判断。
本舞伴配对系统用到了类模板,分别是:
2.2.3
template
classqueue
2.2.4
template
queue:
:
queue()
2.2.5
template
//向队列尾插入结点函数
voidqueue:
:
push(T&x)
2.2.6
template
//从队列头中取出一结点
//布尔型,只有一个字节,取值false和true,是0和1的区别
boolqueue:
:
pop(T&x)
2.2.7
template
//清空队列
voidqueue:
:
clearQue()
2.2.8函数功能描述
//定义类模板
template
classqueue
{
public:
queue();
~queue()
{
clearQue();
}
voidpush(T&);//向队列尾插入结点
boolpop(T&);//从队列头中取出一结点
voidclearQue();//清空队列
protected:
intqueSize;//队列长度
queueNode*head;//定义头结点
queueNode*tail;//定义尾结点
};
//定义类模板中成员函数
template
queue:
:
queue()
{
//构造函数,初始化队列
queSize=0;
head=NULL;
tail=NULL;
}
template
//向队列尾插入结点函数
voidqueue:
:
push(T&x)
{
queueNode*tp;
tp=newqueueNode;//定义/创建一个结点
if(!
tp)//如果创建一个结点错误,就返回
{
return;
}
tp->nodeData=x;//把x值送给结点
//假如队列有数据(也就是不是空队列),那么从对尾插入
if(tail)
{
tp->next=NULL;
tail->next=tp;
tail=tp;
}
//假如队列无数据(也就是空队列),那么这个结点既是对首结点也是对尾结点
else
{
tp->next=NULL;
tail=tp;
head=tp;
}
queSize++;
}
template
//从队列头中取出一结点
//布尔型,只有一个字节,取值false和true,是0和1的区别
boolqueue:
:
pop(T&x)
{
queueNode*tp;
if(head)
{
//由于出队是在对首出队,所以把对首结点给定义的结点tp,再head=head->next;
x=head->nodeData;
tp=head;
head=head->next;//head的后置结点给head
if(head==NULL)//假如对首结点为空了,那么对尾也将是空的,也就是队列已被清空了
{
tail=NULL;
}
deletetp;
queSize--;
returntrue;
}
returnfalse;
}
template
//清空队列
voidqueue:
:
clearQue()
{
Ttp;
while(pop(tp));
head=tail=NULL;
}
3、系统实现
3.1编码
3.1.1程序预处理
包括加载头文件,定义类、常量和变量,并对它们进行初始化工作。
#include
#include
#include//清屏函数的头文件
#include//输入输出流头文件
template//声明一个类模板
//-------------------------------------------------------------
structqueueNode//链式队列的结构体
{
TnodeData;
queueNode*next;
};
peoples:
:
peoples()//构造函数
{
//初始化
name=newchar[8];
name=NULL;
sex=newchar[2];
sex=NULL;
}
3.1.2主函数
主函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。
voidmain()
{
//运行系统程序执行生成标题
system("title☆舞伴配对系统☆--全建思");
//运行系统程序执行改变界面颜色
system("colorB1");
queueman;
queuewoman;//把peoples类放入模板,然后创建两个队列
peoplesp;//创建对象
intk;//用于输入每次舞会的人数
chart;//用于输入是否继续下一场舞会
staticintcount_m=0;//男的数量
staticintcount_w=0;//女的数量
staticintcount_t=0;//舞会的次数
cout<<"\t\t******************************************"<cout<<"\t\t★★★★★欢迎使用舞伴配对系统★★★★★★"<cout<<"\t\t******************************************"<ofstreaminout("舞伴配对.txt",ios:
:
in);//创建文件
if(!
inout)//如果创建不成功就返回
{
cout<<"Cannotopenthefile"<return;
}
for(;;)//死循环相当于while
(1)
{
cout<<"\t\t第"<<++count_t<<"场舞会"<inout<<"\t\t第"<"<cout<<"\t\t请输入人数:
";
cin>>k;
for(inti=0;i{
peoplesp;
charname[12];
charsex[2];
cout<<"\t\t请输入姓名:
";
cin>>name;
cout<<"\t\t请输入性别(男(m)女(w)):
";
while
(1)
{
cin>>sex;
if(strcmp(sex,"m")==0||strcmp(sex,"w")==0)//比较是否一样
break;
else
cout<<"\t\t性别错误,请重新输入:
";
}
p.shuru(name,sex);
if(strcmp(sex,"m")==0)
{
man.push(p);//进队列
count_m++;//男的数量+1
}
elseif(strcmp(sex,"w")==0)//女的同上
{
woman.push(p);
count_w++;
}
}
if(count_m>count_w)//当男的大于女的的时候
{
for(inti=0;i{
cout<<"第"<
man.pop(p);//出队列
p.show();//显示
inout<
inout<
p.sf();//析构
cout<<"和";
inout<<"和";
woman.pop(p);
p.show();
inout<
inout<
p.sf();
cout<<'\n';
inout<<"\n";
}
cout<<"\t\t男队有剩余"<<""<<"剩余数:
"<count_m=count_m-count_w;//男的数目变成剩下的。
count_w=0;//女的数目变为0,由于都出队了
cout<<"\t\t剩余人:
";
for(i=0;i同最后面的一样
{
man.pop(p);
p.show();
cout<man.push(p);
}
}
//当男的小于女的的时候和当男的大于女的的时候方法是一样的,只是男和女的区别
elseif(count_m{
for(inti=0;i{
cout<<"\t\t第"<
man.pop(p);
p.show();
inout<
inout<
p.sf();
cout<<"和";
inout<<"和";
woman.pop(p);
p.show();
inout<
inout<
p.sf();
cout<<'\n';
inout<<"\n";
}
cout<<"\t\t女队有剩余"<<""<<"剩余数:
"<count_w=count_w-count_m;
count_m=0;
cout<<"\t\t剩余人:
";
for(i=0;i{
woman.pop(p);
p.show();
cout<woman.push(p);
}
}
//当男女数量相等同上
elseif(count_w==count_m)
{
for(inti=0;i{
cout<<"\t\t第"<
man.pop(p);
p.show();
inout<
p.sf();
cout<<"和";
inout<<"和";
woman.pop(p);
p.show();
inout<
p.sf();
cout<<'\n';
inout<<"\n";
}
count_m=0;
count_w=0;
}
cout<<'\n';
cout<<"\t\t第"<\n\t\t(如果键入n则退出系统)(y/n)";
cin>>t;
system("cls");//清屏函数;
if(t=='y')
{
if(count_w>0)
{
cout<<"\t\t上次剩余女士人数:
"<cout<<"\t\t分别是:
";
for(i=0;i{
//显示剩余的人的时候,用先出队,显示,再入队,由于这些人第二轮还要用
woman.pop(p);
p.show();
cout<woman.push(p);
}
}
elseif(count_m>0)
{
cout<<"\t\t上次剩余男士人数:
"<cout<<"\t\t分别是:
";
for(i=0;i{
man.pop(p);
p.show();
cout<man.push(p);
}
}
}
else
{
cout<<"\t\t\t★谢谢使用★!
"<<'\n';
inout.close();
p.sf();
man.~queue();
woman.~queue();
break;
}
}
}
3.1.3主菜单界面
主菜单界面用到了系统程序执行改变颜色:
system("colorB1");
同时主菜单界面用到了系统程序执行显示标题
system("title☆舞伴配对系统☆--全建思");:
3.1.4定义peoples成员函数