close

一群猴子(設共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<QApplication>#include<QInputDialog>intmain(intargc, char*argv[]){QApplication a(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<QString> monkeyList;QLinkedList<QString>::iterator currentMonkey;

m是指定數(數到m時,猴子退出)。鍊表monkeyList來表示猴子圍成的圓圈,每個未退出的猴子都是鍊表中的一個節點。鍊表迭代器currentMonkey表示當前正數到的猴子。

為了處理方便,還需在類中添加私有的成員函數showMonkeyList用於在界面的猴子序列區域(多行文本框)中顯示猴子序列,代碼如下:

void Widget::showMonkeyList() //遍歷顯示猴子鍊表{QString str;QLinkedList<QString>::iterator iter;for(iter= monkeyList.begin();iter!=monkeyList.end();iter++){if(iter==currentMonkey)str+='*'+*iter+' ';elsestr+=*iter+' ';}ui->textEdit->setText(str);if(monkeyList.size()==1){QString bigBoss=*monkeyList.begin();QMessageBox::information(this,"結果","新大王為猴子"+bigBoss);this->close();}}

依次遍歷鍊表,並將各節點中的內容連接成字符串,然後顯示在多行文本框中。如果鍊表中只有一個節點,則說明此時已找到新大王,彈出顯示結果的消息框,之後關閉整個窗口結束程序。

添加公有initial成員函數用於初始化窗口中顯示的內容,代碼如下:

voidWidget::initial(int number, 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<m;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++編程從入門到實戰-微課視頻版》

ISBN:9787302582045

作者:彭源、孫超超、田秀霞、李紅嬌

定價: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深度學習 │一文掌握卷積神經網絡


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()