
一群猴子(設共number只)要選新猴王了。選擇方法是:先按照1、2、3 、…、number的順序給每個猴子一個編號,再按照編號的順序圍坐成一個圓圈(number號猴子之後是1號猴子),接着從第1號猴子開始往下數,每數到第指定個數字(用m表示)的猴子,該猴子就要離開圓圈,接着從緊鄰的下一隻猴子開始重新從1開始往下數,如此直到圈中最後只剩下一個猴子為止,最後的這隻猴子就是選出的新猴王。本節將編寫程序模擬並展示選新猴王的過程。
01
Qt C++編程實例:猴子選大王
創建一個基於QWidget、帶界面的應用程序,然後設計如圖5-12所示的界面。
由於初始時需要用戶設置猴子的總數以及指定的數字m,因此考慮在主界面顯示之前先請用戶輸入這兩個數據,並使用這兩個數據來對主界面進行一些初始化的工作。因此主函數代碼實現如下:
代碼中定義的number用於接收輸入對話框用戶輸入的猴子數量,m用於接收輸入對話框用戶輸入的指定數,接着再顯示主要的界面w。可以看到,主函數中還調用了自定義窗口類Widget中的initial成員函數(是自定義的成員函數,用來完成對窗口顯示內容的初始設置,將在隨後介紹)。

■圖5-12 例5_10界面
為了處理的方便,在Widget類中聲明如下數據成員:
m是指定數(數到m時,猴子退出)。鍊表monkeyList來表示猴子圍成的圓圈,每個未退出的猴子都是鍊表中的一個節點。鍊表迭代器currentMonkey表示當前正數到的猴子。
為了處理方便,還需在類中添加私有的成員函數showMonkeyList用於在界面的猴子序列區域(多行文本框)中顯示猴子序列,代碼如下:
依次遍歷鍊表,並將各節點中的內容連接成字符串,然後顯示在多行文本框中。如果鍊表中只有一個節點,則說明此時已找到新大王,彈出顯示結果的消息框,之後關閉整個窗口結束程序。
添加公有initial成員函數用於初始化窗口中顯示的內容,代碼如下:
功能為將傳入的固定數m的值存儲於對象內部的數據成員m中、設置界面上方標籤顯示的文字、使用循環初始化猴子鍊表(將number個猴子依次鏈接到鍊表)、設置當前開始數的位置為第一隻猴子、然後再調用showMonkeyList顯示初始狀態的猴子序列。此處使用鍊表來表示猴子圍成的圓圈(當訪問到鍊表結尾時,會繼續接着從鍊表頭開始訪問)。
點擊圖5-12中的「下一個出列的猴子」按鈕時,執行的自關聯槽定義如下:
功能為從當前猴子處往下數數,到第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
精彩推薦