計算24點 數據結構_第1頁
計算24點 數據結構_第2頁
計算24點 數據結構_第3頁
計算24點 數據結構_第4頁
計算24點 數據結構_第5頁
已閱讀5頁,還剩5頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目 錄課程設計任務書 -1=課程設計任務書學生姓名: 趙旭林 專業班級: 計算機科學與技術0801 指導教師: 楊克 工作單位: 計算機科學系 題 目: 計算24點 初始條件:有2、3、4、5、6、7、8、9、10、J、Q、K、A共13張牌,編一程序,判斷對任意給定的4張牌,能否在進行加、減、乘、除運算后,其運算結果等于24。其中J按11計算,Q按12計算,K按13計算,A按1計算。(1)能接受用戶輸入的4張牌點,并進行24點判斷,并輸出判定結果。(2)若能得到結果24,要求輸出至少一個可得到該結果的計算表達式。 例如,對給定的2,7,J,Q,按下述方法計算可得到結果24: (J-7)*(Q/

2、2) 或 Q*(J-2-7) (3)若不能得到24點,亦應輸出提示。要求完成的主要任務: (包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求)課程設計報告按學校規定格式用A4紙打?。〞鴮懀缦聝热荩?1. 問題描述簡述題目要解決的問題是什么。2. 設計存儲結構設計、主要算法設計(用類C/C+語言或用框圖描述)、測試用例設計;3. 調試報告調試過程中遇到的問題是如何解決的;對設計和編碼的討論和分析。4. 經驗和體會(包括對算法改進的設想)5. 附源程序清單和運行結果。源程序要加注釋。如果題目規定了測試數據,則運行結果要包含這些測試數據和運行輸出。說明:1. 設計報告、程序不得相

3、互抄襲和拷貝;若有雷同,則所有雷同者成績均為0分。2. 凡拷貝往屆任務書或課程設計充數者,成績一律無效,以0分記。時間安排:1、第18周完成。2、7月2日8:30時到實驗中心檢查程序、交課程設計報告、源程序(U盤)。指導教師簽名: 2010年 月 日系主任(或責任教師)簽名: 2010年 月 日數據結構課程設計正文 -計算24點1. 問題描述在A、2、3、4、5、6、7、8、9、10、J、Q、K中任意選擇4個數,通過這4個數進行任意+ 、- 、*、 /的運算(這四個數可以任意排列),而且可以添加需要的“()”來進行先后運算。看是否能夠得到一個計算式,使得其結果為24。如果有,則輸出所有的計算式

4、,如果沒有,則輸出相應的提示。例如,對給定的2,7,J,Q,按下述方法計算可得到結果24,并且輸出下列的表達式: (J-7)*(Q/2)=24 Q*(J-2-7)=24 由于輸入有A、J、Q、K字符型數據,所以把輸入數據存放在char字符型數組中,并且在程序內部定義一個數組,把輸入的字符型數據一一轉換為相對應的int整型,其中A代表為1,J代表為11,Q代表為12,K代表為13。約束條件:輸入的4個數不能為重復,如果重復,則輸出錯誤提示,并要求重新輸入。而且輸入的數不能在所要求的數之外,如果輸入了不在輸入范圍內的數,則也應該輸出相應錯誤提示,并要求重新輸入。2.實驗設計2.1 算法設計:采用窮

5、舉法,把所有可能的情況一一計算,如果計算式得到24,則把相應的計算式輸出;假設選擇A B C D四張牌,#代表操作符,則有以下五種情況: 1.(A#B)#C)#D 2.(A#B)#(C#D) 3.(A#(B#C)#D 4.A#(B#C)#D) 5.A#(B#(C#D)把這些計算式都變成兩兩計算的情況,因此可以把一個計算式分成三個由兩個運算數組合而成的計算式。其中的“#”可以是+、-、*、/ 中的任何一種運算,并且可以重復。A、B、C、D不能重復。由于按照以上的方法,ABCD的順序固定,從而導致有一些情況不能被計算在內,所以需要列舉出ABCD所有可能的排序狀況,再將A B C D所有的排列組合一

6、一按照上面的五個計算式計算。這樣就能把所有有可能的情況都包含進去,不會漏掉某個有可能得到24點的算法。對四個數沒進行完一次排序,則對新的排序序列進行24點計算式比較,如果有計算式,則輸出所有的計算式,如果沒有,則輸出提示?,F在程序外定義一些全局變量:cal r,w,t;/三個操作符類char data10;/輸入的數據int _data10;/把牌轉化為數字之后存放的數組bool find=false;/如果find為false,則代表沒有24點計算式,如果為true,則代表有主函數偽碼設計為:int main()tranput();/輸入數據;tran();/轉換數據;trandata();

7、/處理數據;if(find=false)/如果沒有能得到24點的計算式,輸出提示;return 0;定義4個函數,分別完成相對應的功能。void tranput();/作用是讓用戶輸入選擇的牌;void tran();/把字符型的輸入轉換為對應的數字,A代表1,J代表11,Q代表12,K代表13;void look();/對于4張牌的一個組合尋找能得出點的表達式;void trandata();/列出所選擇4張牌的所有可能排列情況,再對每種情況進行look()操作;2.2 偽碼設計 存儲結構設計,定義一個cal類,目的是重載操作符。重載函數返回經過重載后操作符運算的結果。cal類偽碼:clas

8、s cal /操作符類,重載操作符public:char s; /s為操作符cal()double operator()(double a,double b) /重載操作符switch(s)判斷s,對不同的s返回不同的結果;;tranput()函數偽碼:void tranput()for(int i=0;i<4;i+)輸入datai;定義一個判斷型數組judge;do把輸入的數與判斷型數組進行一一比較,如果不屬于數組里面的,則輸出輸入錯誤提示;while();for(int j=i-1;j>=0;j-)將正確的當前輸入與之前輸入相比較,如果相同代表重復輸入,輸出錯誤提示;look(

9、)函數偽碼:void look()定義數組char,存放+、-、*、/四種運算符for(int i=0;i<4;i+)/不同組合的操作符 選擇一種運算符;for(int i=0;i<4;i+)選擇一種運算符;for(int i=0;i<4;i+)選擇一種運算符;一一對五種表達式進行判斷,如果行,則把find值為true;trandata()偽碼:void trandata() char temp10; for(int i=0;i<4;i+) 四重循環,對ABCD進行排列組合,并對每一種排列進行look()操作; 2.3 算法分析: 由于有4個輸入,且在計算的時候這4個數

10、不能重復出現,所有共有4!=4*3*2*1=24種排 列的情況。而對于操作符而言,共有+、-、*、/四種操作符,而在一個計算式里面操作符顯然可以重復 出重復出現。對操作符進行全排列,4*4*4*一共有256種排列狀況??傮w分析,在輸入一組數據后 后,如果要得出由這組數據形成的24點表達式,則要進行256*24=6144次比較后才能得出所有的計算式。2.4 測試用例設計 1.K K 7 7; /錯誤例子,用來檢測程序健壯性; 2.10 5 6 7; 3.A 6 9 K; 4.Q 7 9 K; 5.R 14 5 K; /錯誤例子,用來檢測程序健壯性;3.程序調試1.剛開始調試時,輸入數據7,9,J

11、,K出現計算式:(K/(7/J)+9=24,表達式錯誤,經過檢查,發現在if(t(w(data0,r(data1,_data2),_data3)=24)24點判斷式中把_data0,data1寫成了data0,data1,改正后結果顯示:沒有相應的表達式。2.剛開始直接定義一個整型數組(int data),結果由于輸入有可能是A J Q K字符型,所以不能通過整型數組來記錄所有的輸入。因此把int data改為char data,因為char型占一個字符,此時能夠正確記錄19和A、J、Q、K,但不能記錄10,每次輸入10的時候總是判斷為非法輸入。嘗試把char data換為string dat

12、a,結果出現: c:usersadministratordocumentsvisual studio 2008projects24點24點24點.cpp(7) : error C2679: 二進制“>>”: 沒有找到接受“std:string”類型的右操作 數的運算符(或沒有可接受的轉換) c:programfilesmicrosoftvisualstudio9.0vcincludeistream(1144): “std:basic_istream<_Elem,_Traits>&std:operator >><std:char_traits&l

13、t;char>>(std:basic_istream<_Elem,_Traits> &,signed char *)” with _Elem=char, _Traits=std:char_traits<char> 不知道怎么調試,所以只能在輸入的時候提示用戶用#來代表10的輸入;例如:輸入5,7,#,K(5,7,10,K) 得到下列的結果:(5-K)*(7-#)=24 (7-#)*(5-K)=24 (#-7)*(K-5)=24(K-5)*(#-7)=243.因為運算符有交換率,不同的表達式有可能表達相同的意思。所以在程序的輸出中有很大一部分結果是重復

14、的。例如,輸入3,7,9,K,結果為:(7*9)-(K*3)=24 (7*9)-(3*K)=24(9*7)-(K*3)=24(9*7)-(3*K)=24 這四個表達式代表相同的意思,可以用其中任意一個計算式代表其他,但目前為止還沒有想出來好的辦法來進行重復計算式的判斷。4.實驗結果與分析1.K K 7 7 結果為:結果分析:輸入第一個K,符合要求,輸入第二個K,與第一個重復,輸出錯誤提示,后面同理。程序繼續等待輸入正確數字。 2.10 5 6 7(#,5,6,7); 結果為: 結果分析:為正確輸入,沒有相應的24點計算式。3.A 6 9 K;結果為: 結果分析:有相當多的計算式,不過其中有很多

15、重復。4.Q 7 9 K;結果為: 結果分析:和第二組數據一樣,沒有相應的24點計算式。5.R 14 5 K 結果為:結果分析:由于R和14不在輸入范圍里面,所以導致錯誤提示。程序繼續等待輸入正確數字。5.經驗和體會 這次的的課程設計使我收獲了很多平時上課和做練習不能得到的經驗,并且讓我對編程有了更加深入的了解,激發了我對編程的興趣。1.程序設計要求程序員要有很清晰的思路和很好的耐心。在拿到題目后,首先應該對題目進行仔細的分析,清楚的明白題目的要求、約束條件等等。然后再進行算法的設計。2在進行算法的設計時,往往會有很多不同的思路來解決相同的一個問題。此時要對比這些思路,看看哪一個更適用于目前的算法,哪一個更簡潔,更容易理解,綜合所有的分析來選擇一個相對來說更好的算法來進行編程。這樣不僅能夠節省大量的編程、調試時間,而且更容易理解,更能提升自己對編程的興趣。3.在編程時候應該很仔細,很小心,對于一般的語法錯誤應該盡量避免。同時對于一些模棱兩可的想法應該盡快查閱書本

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論