数据结构课程设计C++舞池配对报告.docx
- 文档编号:13712808
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:16
- 大小:85.33KB
数据结构课程设计C++舞池配对报告.docx
《数据结构课程设计C++舞池配对报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计C++舞池配对报告.docx(16页珍藏版)》请在冰点文库上搜索。
数据结构课程设计C++舞池配对报告
数据结构课程设计报告
课程名称:
数据结构与算法课程设计
指导老师:
李**
班级:
网络111班
学号:
**********
姓名:
***
题目:
舞伴问题
1、问题描述
问题描述:
一班有m个女生、n个男生(m不等于n),举办一场舞会。
男女生分别编号坐在舞池两边的椅子上,每曲开始时,依次从男生和女生中各出一人配对跳舞,本曲没成功配对者坐着等待下一曲找舞伴,设计一个程序模拟舞伴配对过程。
基本要求:
输入男、女学生的姓名、性别,由程序自动为男女生编号,可以顺序编号,也可以随机编号,输出每曲配对情况(包括男、女生的姓名、性别和编号)。
原始数据和结果数据要保存到文件中。
提高要求:
计算出任意一位男生(编号为X)和任意一位女生(编号为Y),在第K曲配对跳舞的情况。
2.需求分析
软件的基本功能:
程序可以从文件里读取学生、歌曲信息,亦可从键盘输入相应的信息。
该程序能自动为男女生及舞曲编号(顺序或随机),用队列完成男女生在舞曲中的配对。
能输出每首舞曲的男女配对情况(包括男、女生的姓名、性别和编号),可以查询第K支舞曲的配对情况,能够查询任意一位男生(编号为X)和任意一位女生(编号为Y)在第K曲配对跳舞的情况。
将原始数据及配对结果保存到文件中,能够对文件为空、只有男生或只有女生、输入错误等异常情况进行相应处理。
输入/输出形式:
用户可以通过键盘,根据菜单提示输入/输出。
输入形式:
①正确的歌曲信息、学生信息。
②含有简单错误的歌曲、学生信息。
输出形式:
对于正确的歌曲信息、学生信息,可以输出男女生配情况,也可以输出男女生信息及歌曲信息。
对于含有简单错误的歌曲信息和学生信息,程序将自动输出错误提示。
测试数据要求:
用户可选择三组测试数据,分别为男生多于女生、女生多于男生、男女生人数相,还可以设置某些空列表(如男生队列为空)。
3.概要设计
(1)抽象数据类型:
根据题目的要求,考虑用队列类型比较适合。
ADTQueue
Data
队列中的元素具有相同类型及先进先出特性,相邻元素具有前驱和后继关系
Operation
InitQueue
前置条件:
队列不存在
输入:
无
功能:
初始化队列
输出:
无
后置条件:
构造一个空队列
~InitQueue
前置条件:
队列存在
输入:
无
功能:
销毁队列
输出:
无
后置条件:
释放队列所占用的存储空间
EnQueue
前置条件:
队列已存在
输入:
元素值x
功能:
入队操作,在队尾插入一个元素x
输出:
如果插入不成功,抛出异常
后置条件:
如果插入成功,队尾增加了一个元素
Dequeue
前置条件:
队列已存在
输入:
无
功能:
出队操作,删除队头元素
输出:
如果删除成功,返回被删元素值,否则,抛出异常
后置条件:
如果删除成功,队头减少了一个元素
GetQueue
前置条件:
队列已存在
输入:
无
功能:
读取队头元素
输出:
若队列不空,返回队头元素
后置条件:
队列不变
Empty
前置条件:
队列已存在
输入:
无
功能:
判空操作,断队列是否为空
输出:
如队列为空,返回1,否则,返回0
后置条件:
队列不变
EndADT
(2)主程序流程:
(3)模块调用关系:
本程序中函数包括:
main函数:
程序主函数,将所有操作结在一起,完成整个程序所有功能;
Add函数:
添加歌曲或学生信息,实现数据的录入;
Add_P函数:
添加学生信息,其功能包括从文件读取和手动输入学生信息,并将输入的信息保存至文件;
Add_M函数:
添加歌曲信息,其功能包括从文件读取和手动输入歌曲信息,并将输入的信息保存至文件;
Match函数:
实现对舞曲的配对操作,并将配对信息保存至文件
Display_e函数:
显示每首歌曲的配对情况;
Chaxun函数:
查询第K曲配对情况和任意一位男生(编号为X)女生(编号为Y),在第K曲配对的情况,还可以查询目前队列里所有歌曲及学生信息;
Display_p函数:
显示目前队列的学生信息;
Display_m函数:
显示目前队列的歌曲信息;
其函数调用关系如下:
4.详细设计
(1)实现概要设计的数据类型:
采用循环队列
constintMsize_Person=100;//学生人数上限
constintMsize_Music=100;//歌曲数目上限
constintMsize_End=1000;//配对队列上限
学生结构体:
structPerson//定义学生结构体
{
charname_p[30];//姓名
intnum_p;//学生编号
charsex;//性别b/g(男/女)
};
音乐结构体:
structMusic//定义音乐结构体
{
intnumber_m;//歌曲编号
intorder;//歌序号
charname_m[30];//歌曲名
charsinger[30];//歌手名
};
配对列表结构体:
structMatchList//定义配对列表结构体
{
intnum_b;//男编号
intnum_g;//女编号
charname_b[30];//男姓名
charname_g[30];//女姓名
charsex_b;//性别(男)
charsex_g;//性别(女)
charneme_me[30];//歌名
charsinger_e[30];//歌手
intnumber_me;//歌编号
intorder_e;//歌曲序号
};
舞伴类:
classDance//定义舞伴类
{
public:
Dance();//构造函数
voidMenu();//主界面
voidDisplay_e();//显示每曲配对
voidChaxun();//查询配对
voidAdd();//添加信息
voidReset();//配对列表重置
voidMatch();//自动配对
voidAdd_P();//添加学生
voidAdd_M();//添加歌曲
voidDisplay_p();//显示学生
voidDisplay_m();//显示歌曲
voidMenu_c();//查询配对
voidMenu_xinximo();//音乐录入菜单
voidMenu_xinxipo();//学生录入菜单
voidMenu_add();//添加信息主界面
private:
intfront_b,rear_b;//男生队头,队尾
intfront_g,rear_g;//女生队头,队尾
intfront_m,rear_m;//音乐队头,队尾
intfront_e,rear_e;//配对列表队头,队尾
intNum_B,Num_G,Num_M;//男生、女生、歌曲数目
intMin;//较少队列人数
intcount;//学生总人数用于学生编号
intFLOG;//判断是否有空队列
PersonQue_Boy[Msize_Person];//1男生队列
PersonQue_Girl[Msize_Person];//2女生队列
MusicQue_Music[Msize_Music];//3歌曲队列
MatchListQue_End[Msize_End];//4配对队列
};
(2)主程序以及其它模块的算法描述:
主函数具体代码:
intmain()
{
intflog;
charselection;
flog=1;
Dancedancer;
while(flog)
{
dancer.Menu();
cin>>selection;
switch(selection)
{
case'1':
//1、信息录入
dancer.Add();
break;
case'2':
//2、显示配对信息
dancer.Display_e();
break;
case'3':
//3、查询配对
dancer.Chaxun();
break;
case'4':
//退出
cout<<"谢谢使用系统界面,按任意键退出系统……"< flog=0; break; default: cout<<"\t输入错误,请重新输入"< break; } } return0; } 主函数调用了实现功能的各个函数。 其步骤为: 用户根据主界面提示先录入信息,在此步骤可以选择系统提供或是手动输入,然后调用自动配对函数。 录入完毕返回到主界面,继续根据提示选择操作。 选择每曲配对,显示每曲的配对情况。 选择查询信息可以按其菜单提示查询第K曲配对情况,查询任意一位男生(编号为X)女生(编号为Y),在第K曲配对跳舞的情况,还可以查询目前的所有歌曲及学生信息,直至用户选择退出。 (3)其它模块的算法描述 添加信息 功能: 录入学生及歌曲信息,可以通过调用文件操作函数从文件中获取已有信息,当文件打开失败或文件为空时,给于相应提示;亦可手动输入,将输入的信息存储到相应的队列里,并将这些信息通过文件操作存入到文件,对于一些输入错误能给出相应提示。 继而调用自动配对函数,对学生进行配对,若信息不匹配(如男生队列为空)则不能进行配对并给出提示。 再将配对信息存储到配对循环队列中,同时通过文件操作存储至文件。 该模块同时完成信息初始化及配对过程,是程序的重心。 每曲配对 功能: 显示每首歌曲的配对情况,若配对操作不成功则在此给出相应提示,如“女生队列为空,无配对信息”。 查询信息 功能: 可查询第K曲的配对信息,执行该功能时先在队列里查找第K曲,然后循环输出该舞曲配对信息,若K超出范围,则提示输入错误;还可查询任意一位男生(编号为X)女生(编号为Y)在第K曲配对跳舞的情况,先查找第K曲,再从其配对信息里查找该男女生,若查找成功,返回配对成功,否则配对失败;还可以查询目前队列里所有歌曲及学生信息。 自动配对 功能: 先建立临时队列,将男女信息复制到临时队列,以保证原信息的安全性。 然后男女按编号顺序出队,每次出队数目为男女队中较少的人数。 将男女生的信息分别赋值给配对队列,并将歌曲的信息赋值给该队列。 一首歌曲配对完毕将已配对的男女生入队到男女生队尾,以此循环,直至所有歌曲配对完毕。 最后将配对信息存储至文件,对于异常情况(如男(女)生队列为空),有相应提示,本模块是整个程序的核心。 5、编码与调试分析 编码与调试过程中遇到的问题及解决办法: 【问题一】在输出每曲配对时程序崩溃(满屏幕的“烫”) 解决办法: 通过对队列的分析,这是由于在循环输出的时候控制始末位置不准确。 于是认真分析,仔细查找队列内部的关系,找准始末位置,问题得以解决。 【问题二】当有队列为空在配对的时候时会进入死循环 解决办法: 反复阅读代码后发现控制循环跳出有细节处理的问题,将标识符flog赋初值移出switch就可以了。 【问题三】第二(或大于二)次进行每曲配对操作时,会重复输出配对信息 解决办法: 分析队列发现,这是因为每次输出都会调用配对函数,因而在配对队列后面重复了配对信息。 于是将配对函数放在添加信息里面,这样就不会因为其他模块的操作干扰了配对结果。 2.待解决问题: 一些功能的代码太长,因而代码显得臃肿,可读性不好; 不能重新对学生和歌曲进行编号; 6、使用说明 进入菜单,根据提示进行选择: (a).先选择添加信息,对数据进行初始化; (b).若要查看每曲配对情况,选择‘2’; (c).若要查询详细配对信息,如第K曲配对情况,选择‘3’; (d).若退出系统,选择‘4’; (e).若输入出现错误,则返回主菜单,重新输入。 7、测试结果 (1)每曲配对情况显示结果: (2)第K曲配对情况显示结果: (3)任意一位男生(编号为X)和任意一位女生(编号为Y),在第K曲配对跳舞的情况: (4)显示学生信息: (5)显示舞曲信息: (6)输入错误时的错误提示: 查找男女生(编号为X/Y)在第K曲配对情况错误提示 查找第K曲配对情况错误提示 录入学生信息错误提示 8、自学知识 在课程设计过程中期间,自学了许多新的知识。 例如strcpy()函数,strcmp()函数。 其功能分别是: 将字符串进行复制和比较。 还有文件的存储及读取等操作,结构体成员的入队方式,还有一些细节处理,比如怎样控制较复杂的循环跳出。 9、课程设计心得体会 这次课程设计,我又学到了很多东西,真正懂得了“程序设计的重点是设计而不是敲代码”。 以前在数据结构平台上练题喜欢粗略地看看题目就急切地敲代码,总以为提交通过就达到了目的,因此编程水平一直上不去。 这次课程设计一刚开始就想着敲代码,感觉敲代码会很有快感。 于是期间多次删除写好的代码或是对其进行大修改,效率很低。 由于习惯不好,代码略显臃肿,可读性也较差。 这次课设告诉我一个良好的程序不仅要有良好的算法设计,还要求设计者有良好的习惯和代码风格,大程序尤为如此。 课设主要的问题是对数据间的关系掌握不牢,编程习惯不好,细节问题处理方式欠缺。 因此在很多细节问题上被卡了很久,还因习惯不好,代码看起来臃肿,可读性较差。 对编程语言(C++/C)的一些操作不熟悉,如文件的操作等。 编写程序过程中,同学对我的帮助是很大的。 如: 输出配对列表时不能找到信息的准确位置,一些难以发现的bug。 得到了左运涛的细心帮助,他帮我修改了错误代码,并讲解错误原因和一些找bug的方法,还替我纠正了一些细节问题。 通过同学的帮助和自学,程序设计过程中遇到的问题基本解决了,一些技术和技巧性的东西还需不断练习、感悟。 在以后得程序设计中一定要先认真分析,给程序设计一个良好的算法,养成良好的程序设计习惯,多注意细节的处理,努力提高编程水平。 参考书: [1]《c++面向对象程序设计》清华大学出版社谭浩强著 [2]《数据结构(C++版)》清华大学出版社王红梅、胡明、王涛著
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 C+ 舞池 配对 报告