?

撲克牌數據結構程序設計

2018-01-17 09:29張樹根
電子技術與軟件工程 2017年23期
關鍵詞:數據結構程序設計

摘 要 所謂單鏈表,就是是使用任一種存儲單元來對線性表中的數據元素加以保存。撲克牌數據結構程序設計一般包括構建和輸入紙牌信息、分牌的具體方式以及最終形成的分牌結果和余牌的算法。整體而言是為更好的理解和掌握理論學習中提到的接種基本抽象數據類別的邏輯、儲存架構以及實際的操作和算法,還有上述在程序中如何應用。設計多種類且達成各種模塊間的調取,了解和學會通常的軟件設計一般形式,鍛煉學生設計規范軟件的能力。

【關鍵詞】數據結構 程序設計 單鏈表

1 緒論

1.1 問題重述

現有N套撲克牌,由于時間久遠張數已經不全,將其完全混合,希望拼湊成M套完整的撲克牌(大小王不做區分)。

要求:輸入數據的首行是一數字N(1≤N≤20),代表原來有N套牌,從次行開始,每四行都用來敘述牌組中不同花色(以黑桃、紅桃、梅花、方塊為序)的當前張數(各個行的首位數)以及牌號i(1≤i≤13)(每一行的其他數字,亂序)。每輸出一行,就認定其可以拼出的1套牌數。依照花色來輸出低i(1≤i≤N)套撲克里剩余的撲克,并且所有花色依照其點數進行輸出。

實現要求:單鏈表,具備表頭結點。

1.2 單鏈表的定義和基本操作

單鏈表,也就是線性表的鏈式存儲,他能夠以任一組存儲單元將線性表中的數據元素加以儲存。為構建起數據元素間的線型聯系。要對所有鏈表節點,除去存儲元素自身的訊息,也需要存儲一個能起到指向后繼作用的指針。它的基本操作包括:通過頭插法、尾插法構建單鏈表;通過序號找出、插入、和刪去節點值;求表長操作。

2 概要設計

2.1 抽象數據類型

對于此題,要設計的類大致有下面幾個。

2.1.1 Card類

任一張牌所包括的信息有dot(int類,代表特定牌的點數,從1到13)、type(int類,代表牌的花色,以1、2、3、4分別代表黑桃、紅桃、梅花、方塊)。

2.1.2 Poker類

一套撲克牌類。存儲這套牌的全部卡牌有三個方式,分別起到加牌、尋牌和刪牌的作用。

2.1.3 pokerDistributor類

分牌器工作目標,將全部殘缺牌組織湊齊。

2.1.4 LEArrayList:鏈表類

操作包括加入元素、去除元素、運算單鏈表長等。

2.1.5 Test類

主程序類。

2.2 主程序流程

主程序可以對數據輸入/輸出模塊、分牌模塊進行調用,讓程序保持其完整性和連貫性。先調用輸入模塊,使用戶給出撲克數據,并就輸入的數據進行處理。把這些數據封裝成實體類后,再對分牌模塊進行調用,把牌分好。最后在調用起輸出模塊,把剩余無用的牌數據輸出。

2.3 程序模塊的調用

2.3.1 數據輸入模塊

這一模塊的職責是在控制臺將用戶提供的數據進行分裝,成為三種對象。以便于它被其余模塊所使用。

2.3.2 分牌模塊

把數據輸入模塊分裝好的數據進行讀取和分配。

2.3.3 數據輸出模塊

分牌模塊工作完成后會給出可湊齊撲克的套數。以及每副牌剩下的卡牌。本模塊的作用就是將剩余牌的數據按照一定格式進行輸出。

3 詳細設計

3.1 帶表頭結點的單鏈表設計

應用泛型,編寫能夠存儲所有數據的、有表頭結點的單鏈表類。

Publicclass LEArrayList

這里T屬于泛型,屬于單鏈表存儲的數據形式。在建立單鏈表對象時被調用者所設定。LEArrayList類有著如下信息。

3.1.1 一個內部類

鏈表結點是privateclass Item的對象類。這里的data字段意思是代表結點數據,next字段則代表下個結點。

3.1.2 一個字段

private Item head是此單鏈表的表頭結點,任何搜索均必須由這一表頭結點起始。

3.1.3 四個方法

(1)新增節點,它的思路是要先把應該加入的節點構建一個Item結點對象a,而后再找出現在單鍵對中的末尾結點b,把b的next字段向a指;

(2)去除節點,它的思路是要先找出需要去除結點的前繼/后續結點找出,把前繼結點的next字段向后續節點指;

(3)找出預設下標的節點。它的思路是要從head起始循環通過next往下搜索,調用n次next獲得的節點下標應是n-1;

(4)讀取當前鏈表長,他的一般思路是自head起始來調用next,一直到獲得的節點是null結束,這時調用next的次數就是鏈表長。

3.2 所有類的設計思想

3.2.1 Card類

Card類:因為最后輸出要依照點數來對余牌進行排列,所以完成Comparable接口。它有這樣兩種字段:privateintdot、privateinttype,包涵以下方法。

(1)是從Object類的equals方法中繼承得來,這種方式可以判定兩張牌是不是一樣,如果其花色和點數的數據相同,就認定其為同一張牌。

(2)完成Comparable接口的途徑compareTo,這種措施可以用在對兩張牌大小的判別上,設定點數更多的牌是大牌。

3.2.2 Poker類

存儲這套撲克中全部的牌,按照項目需要,這里應用單鏈表LEArrayiLst,并預設數據類型是card?,F在給出幾個方法。

(1)新增牌:參數c對應某一張牌,調用單鏈表中新增元素的方式把將牌加進單鏈表。

(2)找出牌:從鏈表中找出指定牌c,按順序選出鏈表中的全部牌,同時調用Equals方式和C做出對比,判定牌是否一樣。

(3)刪去牌:和新增牌相像,只需調取鏈表中的刪去元素的方式就可以。

(4)重新編寫Object類的方式otsitrng,以便于結束時給出多余牌,這里要重寫otsitrng方法,把Poker類的字符串表現模式更替成下面給出的樣式:PokerDistributor類。此處編寫和Poker相像,通過鏈表存儲全部撲克牌的對象。一般包涵兩種方式:新增撲克的方式、分揀撲克的方式。其中后者是本設計中分牌模塊的主體方法,收到一參數boolean,如果參數值是false,那么就會轉為判定分牌器中有無可能湊齊一副整套撲克。若參數是true,出來判定之外,也會從Poker中刪去牌?;镜耐瓿伤悸肥峭ㄟ^兩重循環各自負責對花色以及點數進行循環,使用花色和點數構建出一張牌。然后按順序判定剩余牌中里有沒有這張牌,如果剩余牌中有所有的牌,就可認為還可分揀出≥1套的完整牌。如果有任一張牌在余牌中找不到,就不能分揀出整套撲克。

4 設計和調試

在分析時發現的嚴重問題集中在下面兩方面。

4.1 分牌模塊

剛著手設計時,Extract方法的效果是能夠把牌進行分揀,而沒有先判定可不可以分出一整套牌,致使分揀后獲取的余牌要少于實際余牌。改良后會在判斷完成后再分牌,也就是先循環一遍判定可否湊齊整套牌,如果可以的話再進入到分牌步驟中。

4.2 數據讀取模塊中的問題

起初時調用in.nextLine()獲取控制臺輸入的數據,不過導致了異常。分析后發現是程序讀?。躵\n導致了閱讀中斷。當輸入首位數就是余牌的數值時,點擊Enter時程序讀取換行符后終止,致使讀取到了空數據。修正后使用下列代碼來對控制臺數據進行讀?。?/p>

while((line=in.nextLine())。isEmpty())

如果數據是空的,就跳到讀下行數據進行讀取,直至讀取數據不為空結束。

4.3 設計缺陷

本設計并不完美,還有部分的缺點:

(1)未設計提示性語句和精美界面,若在輸入之前有語句能對用戶的輸入形式進行提示,那么錯誤就能避免一大部分。

(2)在輸入數據時,如果重復輸入(例如一副牌中輸入多張梅花A),程序界面不會提示輸入錯誤。

4.4 用戶應用說明

(1)本程序使用環境myeelipse對主程序運行。

(2)錄入數據時,首行應輸入數字N。N代表設定有N套殘牌。

(3)次行需要輸入首套殘牌里黑桃花色當前的數量(1-13內數值)。然后錄入這些牌的牌號,以這種形式錄入所有殘牌花色的數量和牌號。

(4)運行程序。輸出結果的首行是能夠湊齊的撲克牌數,下面幾行則為第i(1≤i≤N)套撲克里殘余的撲克,并依照牌的大小來給出。

5 總結

本文設計了一種挑選撲克牌的數據結構程序,遇到了一定問題。但這種綜合性訓練,在幫助筆者鞏固理論知識的同時,也數熟悉和掌握了面對對象程序的設計步驟,讓筆者獲得了一些相關經驗。

參考文獻

[1]張素霞.基于數據結構的程序遞歸算法設計[J].硅谷,2012(12):48+108.

[2]何芳.C程序設計與數據結構課程整合分析[J].數字技術與應用,2012(10):212+214.

[3]耿國華.程序設計能力培養模式的探索與實踐[J].中國大學教學,2013(03):30-32.

[4]余金山.邏輯程序設計中的數據結構[J].計算機應用,2015(05):8-11.

[5]仲萃豪,馮玉琳.程序設計方法學[J].計算機研究與發展,2014(03):1-60.

作者單位

張樹根(1995-),男,山西省晉中市人。大學本科學歷。

作者單位

山西農業大學信息學院 山西省晉中市 030801endprint

猜你喜歡
數據結構程序設計
基于Visual Studio Code的C語言程序設計實踐教學探索
從細節入手,談PLC程序設計技巧
數據結構課程教學網站的設計與實現
高職高專院校C語言程序設計教學改革探索
“翻轉課堂”教學模式的探討——以《數據結構》課程教學為例
OBE理念下基于Greenfoot的Java程序設計課程教學改革
PLC梯形圖程序設計技巧及應用
三級甲等公立醫院績效考核程序設計
TRIZ理論在“數據結構”多媒體教學中的應用
《數據結構》教學方法創新探討
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合