1舞伴配对系统实训报告.docx
- 文档编号:9969206
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:34
- 大小:193KB
1舞伴配对系统实训报告.docx
《1舞伴配对系统实训报告.docx》由会员分享,可在线阅读,更多相关《1舞伴配对系统实训报告.docx(34页珍藏版)》请在冰豆网上搜索。
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");
queue
queue
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 queueNode }; //定义类模板中成员函数 template queue : queue() { //构造函数,初始化队列 queSize=0; head=NULL; tail=NULL; } template //向队列尾插入结点函数 voidqueue : push(T&x) { queueNode 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 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"); queue queue 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成员函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 舞伴 配对 系统 报告