- 1、本文档共28页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
案例十二 小孩出列 本案例知识要点 结构体的使用 指针的使用 链表的使用 类的设计和使用 类间的调用 一、案例需求 案例描述 小孩出列游戏,也称为Joseph问题。一群小孩围成一个圆圈,任意设定一个数m,从其中某个小孩开始,按顺时针方向数,每数到第m个小孩时,该小孩就离开,游戏一直进行到只剩最后一个小孩,该小孩便是游戏的胜者。 程序首先模拟生成一群小孩围成圆圈。然后实现游戏过程,求出最后的胜利者。 案例效果图 小孩出列案例效果如图所示。 小孩出列案例效果图 功能说明 由用户设置参加游戏的人数、从哪个人开始计数以及出列小孩之间的间隔数。 循环显示每次出列的小孩的编号,直到出现胜利者为止。 二、案例分析 本案例中,作为游戏角色的小孩围成圆圈可以用一个类来实现。另外,游戏过程也可以用一个类来模拟。下面讲述两个类的实现过程。 第一个类模拟小孩站成圆圈。因此类中必须包含的数据是用于描述圆圈的数据结构,可以使用链表结构来描述。类中的数据成员就是表示链表结构的指针等数据。链表中用每个结点代表一个小孩,每个结点是一个结构,结构中包括小孩的信息(本身的编号及指向下一个小孩的指针)。 因为游戏中数小孩,小孩出列(删除小孩结点)等事件都与链表有关,因此这些事件应该封装在本类中,将实现这些事件的函数作为类的成员函数。 第二个类模拟游戏过程,首先要知道参加游戏的人数、计数的起始位置,以及间隔多少个小孩出列一个小孩。这些属于类的特征,应作为类的数据成员。类的行为是:通过人机交互初始化上面这些数据,推动游戏产生胜利者。这些操作定义为成员函数。 第二个类在调用自身函数获取游戏初始信息后,通过生成第一个类的一个对象,并循环调用该对象的计数、出列等成员函数实现游戏过程。 类的设计 基于上述分析,本案例需要自定义结构 体child和两个类,第一个类ChildRing模拟小 孩站成圆圈,第二个类Game模拟游戏过程。 结构体 结构体child结构如图所示。 结构体child ChildRing类的设计 ChildRing类结构如图所示。 ChildRing类图 数据成员 int num; 队列中小孩的个数。 child *pBegin; 指向队列开始的指针。 child *pivot; 临时变量,用于链表操作。 child *pCurrent; 指向当前位置的指针。 函数成员 ChildRing(int totalnum); 构造函数,构造链表。 void Count(int countnum); 按顺序数coutnum个小孩,相当于链表当前指针向前 移动Countnum个位置。 void getCurrentChild(); 获取当前小孩信息。 void deleteChild(); 删除出列小孩。 int getRemainnum(); 获取剩余小孩数。 ~ChildRing(); 析构函数,清理内存。 Game类的设计 Game类的结构如图所示。 Game类图 数据成员 int NumofChildren; 游戏中小孩的个数。 int BeginPos; 游戏开始的位置。 int interval; 记载数数的间隔个数。 函数成员 void Initial(); 设置游戏初始值,包括参加游戏人数、从第几个人开始计数、间隔出列数。 void GetWinner(); 开始游戏,找出胜者。 主程序设计 主函数中声明了一个Game类的对象MyGame,通过调用类的两个成员函数完成显示初始画面、循环出列获得最后的胜者的任务。程序结构简洁清晰,流程图略。 四、案例实现 五、案例总结与提高 案例总结 本案例需要注意圆圈结构的链表的表示方法。主程序产生一个类(Game类)的对象,而这个对象自身成员函数GetWinner()又产生另一个类(ChildRing类)的对象,需注意这种类与类之间的互相调用关系。 本案例需要注意的细节很多。例如小孩出列后要删除节点,应当在析构函数中释放掉该节点占用的内存空间;从某个人开始计数,此值不能为负;循环出列的间隔数只能介于1和总人数之间;等等。读者在阅读程序时,必须注意每一个细节,正是这些细节之处增强了程序的健壮性。 案例提高 本案例是C++语言中比较经典的例 子,可以丰富的地方很多。 模拟圆圈结构,可以用数据链表结构,也可以用数组等其他方法实现。 游戏本身可以不使用面向对象的方法实现,可以通过模板等其他方法实现。 第*页 共28页 目录 退出 目录 * 第*页 共28页 目录 退出 目录
您可能关注的文档
- 格兰云天物业管理方案.ppt
- 格兰仕、脉动、统一等中国经典营销案例分析.ppt
- 根据生物的特征对生物进行分类课件.ppt
- 根测仪简易离体牙实验(教会你使用根测仪).ppt
- 格列佛游记(节选).pptx
- 格列佛游记修改版.ppt
- 格列佛游记人物形象.ppt
- 格力公司电子商务.ppt
- 格力I酷系列培训教材.ppt
- 格力变频空调产品知识.ppt
- 安庆医药高等专科学校《经济学思维方式》2023-2024学年第二学期期末试卷.doc
- 蚌埠学院《财务分析》2023-2024学年第二学期期末试卷.doc
- 北京汇佳职业学院《趣味经济学》2023-2024学年第二学期期末试卷.doc
- 滨州学院《组织行为学与企业社会责任》2023-2024学年第二学期期末试卷.doc
- 北京建筑大学《会展场馆经营与管理》2023-2024学年第二学期期末试卷.doc
- 安徽师范大学皖江学院《商业伦理》2023-2024学年第二学期期末试卷.doc
- 北京电子科技职业学院《职业教育经济学》2023-2024学年第二学期期末试卷.doc
- 包头轻工职业技术学院《高级运筹学》2023-2024学年第二学期期末试卷.doc
- 安徽体育运动职业技术学院《虚拟企业运营博弈对抗仿真》2023-2024学年第二学期期末试卷.doc
- 北华大学《税法(1)》2023-2024学年第二学期期末试卷.doc
文档评论(0)