约瑟夫环问题(C++)

问题描述

首先,说明一下这个问题是研究生期间c++课的综合作业,本来有好多选择但最后还是选择了约瑟夫环问题。下面是约瑟夫环的问题描述以及设计要求:
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
要求实现下面功能:

1.要求在实现约瑟夫环的同时,应该满足以下要求:
2.完整的图形用户界面,可以配置程序的运行参数,如:n的值,k的值、m的值、执行动画的速度等;
3.算法支持多线程;
4.执行过程可以暂停/继续;
5.算法执行的结果(包括中间结果)可以持久化(以自定义数据格式保存到文件中;
6.可从文件中读取数据,并在此基础上继续执行;
7.实时图形化显示执行结果;
8.可在执行完成后,或暂停时,打印执行的当前结果。

设计思路

在不考虑实现上面8个功能的前提下,我们应该实现下面一个简单的约瑟夫环问题:
在基于控制台程序情况下,对给定的n,k,m,输出报数的序列。然后将程序移植到基于mfc的程序当中,将功能分为几大块,最后组合到一起。具体源代码已经上传。

约瑟夫问题

约瑟夫环问题看做一个不断变小的环的数据提取:
以n=4,k=1,m=2为例:

这样我们将每次取下来的数存放在一个容器中[2,4,3,1],然后在显示程序中,逐个放进去:

这样就完成了约瑟夫环问题。程序流程如下:

用户界面设计

通过创建MFC AppWizard 基于对话框工程HOMEWORK2,自动生成HOMEWORK2App以及HOMEWORK2Dlg两类,在资源视图中手动画出下面两个界面:
一个用于初始化,用户可以配置程序的运行参数,如:n的值,k的值、m的值、执行动画的速度。另一个用于显示算法执行的过程。
在这里插入图片描述在这里插入图片描述并修改它们的属性ID值分别为:IDD_HOMEWORK2_DIALOG,IDD_DIALOGSHOW。
通过类向导将对话框IDD_DIALOGSHOW与类CDialogShow关联。接下来将两个界面上的所有组件修改属性ID,以及添加相应的消息映射函数。

自定义控件

执行的结果不是直接画在IDD_DIALOGSHOW上的,而是在IDD_DIALOGSHOW添加一个静态文本(IDC_STATICTU),并添加变量,变量类型为CMystatic类,这里需要自己在类视图中自己添加(基类选择CStatic),并重载OnPaint()函数:
在这里插入图片描述其中OnPaint()用于初始化显示界面,即是在IDC_STATICTU中画一个圆桌(用圆表示),m个人(用空白方框表示),并创建线程用于算法执行。

创建线程函数

将约瑟夫环算法嵌入到线程函数中,可以实现在点击开始按钮后,创建IDD_DIALOGSHOW对话框的同时,初始化IDC_STATICTU,然后创建一个线程(因为在OnPaint()中添加了创建线程m_ThreadSpeed的语句),这样就开始了约瑟夫环算法。最后通过线程的挂起、唤醒、终结实现执行过程的暂停/继续,以及终结。对于控制动画的显示速度则是通过Sleep()函数来控制。为了方便将线程函数,显示程序定义为CMystatic的成员函数。

实现打印

通过mfc里面已有的打印对话框类CPringDialog类实现对当前执行结果的打印功能。通过在类视图中添加类CMyPrintDialog类(基类为CPringDialog类)。最后在IDD_DIALOGSHOW中终结按钮的消息映射函数中写入打印程序。

// 创建一个打印机设备句柄 
if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0) {if(StartDoc(hdcprint,&di)>0) {//开始执行一个打印作业StartPage(hdcprint); //打印机走纸,开始打印SaveDC(hdcprint); //保存打印机设备句柄// 打印当前的结果,将list1里面的结果以字符串的形式打印出来TextOut(hdcprint,1000,800,"约瑟夫环打印结果为:",20);CString str;for(vector<int>::iterator it = list1.begin();it!=list1.end();it++){CString temp;temp.Format("%d",*it);str += "-->";str += temp;}}TextOut(hdcprint,1000,1000,str,str.GetLength()); RestoreDC(hdcprint,-1); //恢复打印机设备句柄EndPage(hdcprint); //打印机停纸,停止打印EndDoc(hdcprint); //结束一个打印作业MessageBox("打印完毕!","提示",MB_ICONINFORMATION);
}

实现结果

由于时间紧迫,以及个人能力有限,所以做的界面比较ugly。只实现了老师要求的一些功能:
在这里插入图片描述
默认n=16, k=1, m=3, s=1000ms, 数据读入在data.txt,结果保存在result.txt。
在这里插入图片描述

总结

由于是第一次写,所以排版什么的比较丑陋。约瑟夫环问题也是自己做的第一个关于用户界面的问题了,由于自己的能力有限,所以只能做到这种程度,中间会有福多错误,希望大家批评指正,以后会努力学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战!工作中常用到哪些设计模式

前言 大家好&#xff0c;我是捡田螺的小男孩。平时我们写代码呢&#xff0c;多数情况都是流水线式写代码&#xff0c;基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢&#xff0c;我觉得&#xff0c;最好的方式就是&#xff1a;使用设计模式优化自己的业务代码。今天跟大家…

什么是bcd码数据传输通讯_传输障碍| 数据通讯

什么是bcd码数据传输通讯传输障碍 (Transmission Impairment) In the data communication system, analog and digital signals go through the transmission medium. Transmission media are not ideal. There are some imperfections in transmission mediums. So, the signa…

Spring boot项目(问答网站)之timeline的推拉两种模式

Timeline介绍 所谓timeline就是当用户打开主页看到的随着时间轴发生的一系列时间的整合&#xff0c;主要包含&#xff1a; 关注用户的最新动态热门推荐广告推荐整合等等. 推、拉模式 推模式&#xff1a; 当一个用户关注了或者评论了一个问题或用户&#xff0c;触发事件&…

Bean放入Spring容器,你知道几种方式?

作者&#xff1a;三尺微命 一介书生来源&#xff1a;blog.csdn.net/weixin_43741092/article/details/120176466我们知道平时在开发中使用Spring的时候&#xff0c;都是将对象交由Spring去管理&#xff0c;那么将一个对象加入到Spring容器中&#xff0c;有哪些方式呢&#xff…

Spring boot项目(问答网站)之Python学习基础篇

简介 当问答网站基本框架搭建完毕之后需要一些初始的数据来进行填充&#xff0c;因此选用Python爬虫的方式&#xff0c;从网上截取一些资料信息&#xff08;当然是自己做项目使用&#xff0c;非商用&#xff09;放入到项目网站上面。这篇主要是关于Python基础知识的学习笔记。…

Spring Boot Admin,贼好使!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Spring Boot Admin&#xff08;SBA&#xff09;是一个开源的社区项目&#xff0c;用于管理和监控 Spring Boot 应用程序。应…

JAVA基础之容器基础内容

Java Collections框架 Java Collections框架中包含了大量的集合接口以及这些接口的实现类和操作它们的方法&#xff0c;具体包含了Set(集合&#xff09;、List(列表)、Map(键值对)、Queue(队列)、Stack(栈)等&#xff0c;其中List、Set、Queue、Stack都继承了Collection接口。…

更快的Maven构建工具mvnd和Gradle哪个性能更好?

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Maven 作为经典的项目构建工具相信很多人已经用很久了&#xff0c;但如果体验过 Gradle&#xff0c;那感觉只有两个字“真香…

SpringBoot + ShardingSphere 秒级分库分表!

Spring Boot 作为主流微服务框架&#xff0c;拥有成熟的社区生态。市场应用广泛&#xff0c;为了方便大家&#xff0c;整理了一个基于spring boot的常用中间件快速集成入门系列手册&#xff0c;涉及RPC、缓存、消息队列、分库分表、注册中心、分布式配置等常用开源组件&#xf…

git reset, git checkout, git revert 区别 (译)

博客原文地址: http://blog.mexiqq.com/index.php/archives/3/题记&#xff1a;团队中大多数成员使用 sourceTree 和 github 两款 git 工具&#xff0c;然而大家对于图形化工具提供的 reset,checkout,revert 功能点并不是很了解&#xff0c;甚至于混淆,然后凭借猜测去使用。功夫…

Redis笔记之基本数据结构 动态字符串SDS

简单动态字符串 传统上的C语言的字符串表示是以空字符结尾的字符数组&#xff08;C字符串&#xff09;&#xff0c;redis自己实现一个动态字符串&#xff08;SDS&#xff09;&#xff0c;两者之间的区别以及使用SDS的好处有&#xff1a; 结构不同。C字符串以空字符结尾的字符…

扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?

1. 实例的注入方式首先来看看 Spring 中的实例该如何注入&#xff0c;总结起来&#xff0c;无非三种&#xff1a;属性注入set 方法注入构造方法注入我们分别来看下。1.1 属性注入属性注入是大家最为常见也是使用最多的一种注入方式了&#xff0c;代码如下&#xff1a;Service p…

Redis笔记之基本数据结构 链表

链表 链表具有空间存储不连续&#xff0c;增删节点快的优点&#xff0c;因此redis在列表键、发布与订阅、慢查询、监视器等使用了链表作为底层实现。由于C语言中没有内置的链表实现&#xff0c;因此redis自己进行了实现。 双向链表。每个listtNode都有perv和next指针&#x…

SpringCloud组件:Ribbon负载均衡策略及执行原理!

大家好&#xff0c;我是磊哥。今天我们来看下微服务中非常重要的一个组件&#xff1a;Ribbon。它作为负载均衡器在分布式网络中扮演着非常重要的角色。本篇主要内容如下&#xff1a;在介绍 Ribbon 之前&#xff0c;不得不说下负载均衡这个比较偏僻的名词。为什么说它偏僻了&…

Redis笔记之基本数据结构 字典

字典 符号表、关联数组或者映射&#xff0c;有点类似于java中的map&#xff0c;用于保存键值对key-value。字典中的键key是独一无二的。底层实现为哈希表。下面进行简述&#xff1a; 哈希表。哈希表主要包含table数组、size、sizemask以及used。table用于保存哈希表节点&…

【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

本文目录 前言一、编写第一个C语言程序-Hello World二、编译程序三、链接程序四、运行程序五、总结六、学习建议七、clang指令汇总回到顶部前言 前面已经唠叨了这么多理论知识&#xff0c;从这讲开始&#xff0c;就要通过接触代码来学习C语言的语法。学习任何一门语言&#xff…

安卓平板体验Java开发,还能白嫖一年阿里无影云,真香!(内含白嫖方法,人人可领)...

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;阿里无影云早有耳闻&#xff0c;前两天看朋友发体验照片&#xff0c;可能是程序员天生爱折腾的特性又发挥作用了&#xff0c…

你知道group by的工作原理和优化思路吗?

前言 日常开发中&#xff0c;我们经常会使用到group by。亲爱的小伙伴&#xff0c;你是否知道group by的工作原理呢&#xff1f;group by和having有什么区别呢&#xff1f;group by的优化思路是怎样的呢&#xff1f;使用group by有哪些需要注意的问题呢&#xff1f;本文将跟大家…

关Jquery判断input type=checkbox元素是否被选中的判断

2019独角兽企业重金招聘Python工程师标准>>> 在用到复选框的时候&#xff0c;想在js中判断chekbox是否被选中 <input name"isPermit" id"isPermit" type"checkbox"> 百度了很多的判断方法 1、 if($("#isPermit").att…

Redis夺命十二问,你能扛到第几问?

Redis是面试中绕不过的槛&#xff0c;只要在简历中写了用过Redis&#xff0c;肯定逃不过。今天我们就来模拟一下面试官在Redis这个话题上是如何一步一步深入&#xff0c;全面考察候选人对于Redis的掌握情况。小张&#xff1a;面试官&#xff0c;你好。我是来参加面试的。面试官…