一群猴子(设共number只)要选新猴王了。选择方法是:先按照1、2、3 、…、number的顺序给每个猴子一个编号,再按照编号的顺序围坐成一个圆圈(number号猴子之后是1号猴子),接着从第1号猴子开始往下数,每数到第指定个数字(用m表示)的猴子,该猴子就要离开圆圈,接着从紧邻的下一只猴子开始重新从1开始往下数,如此直到圈中最后只剩下一个猴子为止,最后的这只猴子就是选出的新猴王。本节将编写程序模拟并展示选新猴王的过程。
01
Qt C++编程实例:猴子选大王
创建一个基于QWidget、带界面的应用程序,然后设计如图5-12所示的界面。
由于初始时需要用户设置猴子的总数以及指定的数字m,因此考虑在主界面显示之前先请用户输入这两个数据,并使用这两个数据来对主界面进行一些初始化的工作。因此主函数代码实现如下:
/****************************************
* 项目名:5_10
* 文件名:main.cpp
* 说明:主函数实现
****************************************/
include“widget.h”
include
include
intmain(intargc,char*argv[])
{
QApplicationa(argc, argv);
intnumber;
number=QInputDialog::getInt(nullptr,“初始设置”,“有多少只猴子?”,1,1,100);
intm;
m=QInputDialog::getInt(nullptr,“初始设置”,“数到几的猴子退出?”,1,1,100);
Widget w;
w.show;
w.initial(number,m);
returna.exec;
}
代码中定义的number用于接收输入对话框用户输入的猴子数量,m用于接收输入对话框用户输入的指定数,接着再显示主要的界面w。可以看到,主函数中还调用了自定义窗口类Widget中的initial成员函数(是自定义的成员函数,用来完成对窗口显示内容的初始设置,将在随后介绍)。
■图5-12 例5_10界面
为了处理的方便,在Widget类中声明如下数据成员:
private:
int m;
QLinkedList
QLinkedList
m是指定数(数到m时,猴子退出)。链表monkeyList来表示猴子围成的圆圈,每个未退出的猴子都是链表中的一个节点。链表迭代器currentMonkey表示当前正数到的猴子。
为了处理方便,还需在类中添加私有的成员函数showMonkeyList用于在界面的猴子序列区域(多行文本框)中显示猴子序列,代码如下:
void Widget::showMonkeyList//遍历显示猴子链表
{
QString str;
QLinkedList
for(iter= monkeyList.begin;iter!=monkeyList.end;iter++)
{
if(iter==currentMonkey)
str+=*+*iter+;
else
str+=*iter+;
}
ui->textEdit->setText(str);
if(monkeyList.size==1)
{
QString bigBoss=*monkeyList.begin;
QMessageBox::information(this,“结果”,“新大王为猴子”+bigBoss);
this->close;
}
}
依次遍历链表,并将各节点中的内容连接成字符串,然后显示在多行文本框中。如果链表中只有一个节点,则说明此时已找到新大王,弹出显示结果的消息框,之后关闭整个窗口结束程序。
添加公有initial成员函数用于初始化窗口中显示的内容,代码如下:
voidWidget::initial(intnumber, int m)
{
this->m=m;
ui->labelInfo->setText(“共”+QString::number(number)+“只猴子,数到”
+QString::number(m)+“退出”);
for(int i=1;i<=number;i++)//初始化猴子链表
monkeyList.append(QString::number(i));
currentMonkey=monkeyList.begin;
showMonkeyList;
}
功能为将传入的固定数m的值存储于对象内部的数据成员m中、设置界面上方标签显示的文字、使用循环初始化猴子链表(将number个猴子依次链接到链表)、设置当前开始数的位置为第一只猴子、然后再调用showMonkeyList显示初始状态的猴子序列。此处使用链表来表示猴子围成的圆圈(当访问到链表结尾时,会继续接着从链表头开始访问)。
点击图5-12中的下一个出列的猴子按钮时,执行的自关联槽定义如下:
void Widget::on_pushButton_clicked
{
for(int i=1;i
{
currentMonkey++;
if(currentMonkey==monkeyList.end)
currentMonkey=monkeyList.begin;
}
ui->lineEdit->setText(*currentMonkey);//显示将被删除的猴子
currentMonkey=monkeyList.erase(currentMonkey);
if(currentMonkey==monkeyList.end)
currentMonkey=monkeyList.begin;
showMonkeyList;
}
功能为从当前猴子处往下数数,到第m个的时候停止(如果中间有已到链表尾的情形,则切换到链表头继续),此时currentMonkey指向的即为当前要出列的猴子节点。将其显示在界面单行文本框中、从链表中删除此猴子节点、然后显示更新后的猴子序列。
程序运行结果如图5-13所示,左图为指定共10只猴子、数到3出列后的初始界面,右图为最终得到的结果。
■图5-13 例5_11运行效果
本小节的例子实际上是计算机和数学领域中的经典约瑟夫问题,程序只是模拟了原始的求解过程,实际上还有更多高效率的解法,感兴趣的读者可以再参考更多的资料以作了解。
02
源代码下载
关注微信公众号,后台回复关键词猴子选大王即可获得完整源代码。
03
参考书籍
《Qt C++编程从入门到实战-微课视频版》
作者:彭源、孙超超、田秀霞、李红娇
定价:79.80元
编辑推荐
1. 以Qt框架为载体,讲授C++面向对象机制
2. 贯彻实例式学习法,在实例中理解、掌握和深化概念
3. 注重编程习惯的培养,注重与动手实践的衔接
4. 注意与前序、后继课程之间的衔接
5. 具备知识的拓展性
本书配套资源丰富,包括教学大纲、教学课件、电子教案、程序源码、习题答案、教学进度表和在线作业,作者还为本书精心录制了500分钟的微课视频。
04
精彩推荐
Qt C++编程实例│计算器(附源码)
Qt C++案例│使用OpenCV库进行图像读写(源码+视频)
通关操作系统 | 外存分配方式(附视频限免)
通关操作系统 | 页面置换算法(附视频限免)
通关操作系统 | 页式存储管理(附视频限免)
通关操作系统 | 银行家算法(附视频限免)
通关操作系统 | 死锁问题(附视频限免)
通关操作系统 | 调度算法(附视频限免)
通关操作系统 | 同步问题举例(附视频限免)
通关操作系统 | 进程的同步与互斥(附视频限免)
通关操作系统 | 进程控制(附视频限免)
通关操作系统 | 进程的概念(附视频限免)
人工智能实践: 基于T-S 模型的模糊推理(附源码)
Python自然语言处理|语料清洗(附视频)
Python编程|实现基于字典的通讯录
CCF CSP-J/S第一轮认证考纲详解
Python 韩信点兵思政案例(含优惠码)
Python ︱爬取天气预报信息(附视频)
《机器学习》实验指导书(附实验参考+代码)
Python爬虫综合实战 │ 创建云起书院爬虫(附代码)
Python爬虫实战 │ Email提醒(附代码)
Python深度学习 │一文掌握卷积神经网络返回搜狐,查看更多
责任编辑:
评论0