C語言速算24數據結構課程設計_第1頁
C語言速算24數據結構課程設計_第2頁
C語言速算24數據結構課程設計_第3頁
C語言速算24數據結構課程設計_第4頁
C語言速算24數據結構課程設計_第5頁
已閱讀5頁,還剩17頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、.課程設計(論文)題 目 名 稱 速算 24 課 程 名 稱 數據結構課程設計 學 生 姓 名 王浩明 學 號 0941301253 系 、專 業 信息工程系、信息類 指 導 教 師 謝兵 2010年 12 月 22 日摘 要設計一個簡單的速算24程序,由系統發出4張撲克牌,輸入一個利用撲克牌的數字及運算符號“+”,“-”,“*”,“/”,及“(”和“)”組成計算表達式,系統運行后得出計算結果,如果結果等于24,則顯示“”,否則,顯示“”,接著詢問是否繼續,按字符n后程序結束,否則系統重復上述步驟。用棧來解決。關鍵詞:速算24;棧;計算;SummaryDesign a simple speed

2、 is 24, the system to make four playing card, enters a playing card number and operation of using the notation "" and "-" and "man", "" and "(" and ") of the expression, the system to run after the calculation, if the result is 24," "a

3、nd" "and then asked whether to go on a n after the application or system to repeat steps above. in the stack to solve.Keywords : speed is 24 ;Stack ; the stack ;目 錄1 問題描述12 需求分析13 概要設計,131設計思路132模塊劃分133流程圖24 詳細設計341數據類型的定義342程序分析343基本程序35 分析結果6 課程設計總結18參考文獻181 問題描述用C語言,結構體實現速算24的運算,從一副牌中隨機

4、發出4張撲克,用撲克牌的數字及運算符號“”、“-”、“×”、“/”及括號“(”和“)”組成一個計算表達式,從鍵盤上輸入該計算表達式,系統運行后得出計算結果,如果結果等于24,則顯示“very good”,否則,顯示“wrong!”,接著詢問是否繼續,按字符n后程序結束,否則系統重復上述步驟。2 需求分析用二維數組char p413存放撲克,用A表示1,0表示10,J、Q、K分別表示11、12、13。建立兩個棧分別存放隨機發的四張牌和運算符進行入棧出棧操作進行速算,輸出計算的值判斷如果結果等于24則成功若結果不為24繼續循環操作直到結果為24或者輸入n或N終止。3 概要設計,31設計思

5、路(1)首先定義全局變量,引入標準輸入與輸出函數,建立結構體對速速24進行相關的操作。(2)主函數main,判斷棧空,計算機隨機發發出四張牌進行入1棧操作。(3)利用出棧操作棧1棧2進行運算操作。(4)運算結果等于24結束不等于24繼續循環直到出現24或者按n或N結束。32模塊劃分本程序包括一個模塊:主程序模塊,main( ) 初始化;定義數據類型;初始化棧;發牌進行入棧出棧運算操作;33流程圖開始發四張牌輸入表達式字符s1調用change函數將中綴表達式變后綴表達式調用計算函數計算表達式的值返回結果result結果=24jieguo輸出結果“wrong”輸出結果“very good”是否繼續

6、YN不輸入字符輸入N或n入棧1入棧2結束4 詳細設計41數據類型的定義(1)數組類型#define N 20#define COL 100#define ROW 40#include "stdio.h"#include "time.h" /*系統時間函數*/#include "alloc.h"/*動態地址分配函數*/#include "stdlib.h" /*庫函數*/#include "string.h" /*字符串函數*/#include "ctype.h" /*字符操作

7、函數*/(2)棧Stack1,stack2;42程序分析此程序只包含主函數部分;主函數包含,(1)棧的建立及初始化(2)隨機發牌;(3)牌的入棧;(4)中綴字符轉后綴(5)出棧計算;(6)判斷計算值(7)計算值等于24停止不等于24繼續循環。5 分析結果測試數據及結果如下:從結果顯示來看,此程序正確。6 課程設計總結 通過這次數據結構課程設計讓我對有了更深刻的了解,也讓我認識到數據結構這門課對于我們專業的重要性,更讓我體會了團隊的力量。這次課程設計我有幸被分到和唐玉柏同學一組,他是一個十分優秀的合作伙伴,正是他讓我領略了團隊合作的真諦。從一開始拿到課程設計,我跟唐玉柏經過討論,達成了一個分工合

8、作的共識,他主要負責源程序這一塊,而我就負責流程圖那一部分。在接下來這些日子里我們都在各自努力的進行著,但中間并不缺少交流與討論。一個星期過去了,我們的課程設計也基本快完成了。為了讓課程設計能更好,我們就請教了一些優秀的同學,當然還有我們負責任的老師謝老師。 這次課程設計能順利完成,我要感謝許許多多的人,正因為他們的支持與指導,才能讓我在課程設計過程中不那么笨拙。最后,我要感謝我的合作伙伴唐玉柏同學,是他給了我無盡的支持與合作,當然還要感謝我的指導老師謝兵老師,是他給了我無窮的耐心與指導。謝謝你們!參考文獻1 黃同成,黃俊民,董建寅數據結構2張福祥,牛莉. C語言程序設計. 附錄(源程序清單)

9、 #define N 20#define COL 100#define ROW 40#include "stdio.h"#include "time.h" /*系統時間函數*/#include "alloc.h"/*動態地址分配函數*/#include "stdlib.h" /*庫函數*/#include "string.h" /*字符串函數*/#include "ctype.h" /*字符操作函數*/char p413='A','2',

10、9;3','4','5','6','7','8','9','0','J','Q','K',/*撲克牌,10用0來表示*/'A','2','3','4','5','6','7','8','9','0','J','Q','K',

11、'A','2','3','4','5','6','7','8','9','0','J','Q','K','A','2','3','4','5','6','7','8','9','0','J','Q',

12、'K'typedef struct node int data; struct node *link; STACK1; /*棧1*/typedef struct node2 char data; struct node2 *link; STACK2; /*棧2*/void play(void);/*發牌的具體過程*/void rand1(int j);/*隨機發牌函數*/void change(char *e,char *a); /*中綴變后綴函數*/int computer(char *s); /*后綴表達式計算函數*/STACK1 *initstack1(STACK1 *t

13、op); /*棧1初始化*/STACK1 *push(STACK1 *top,int x); /*棧1入棧運算*/STACK1 *pop(STACK1 *top); /*棧1刪除棧頂元素*/int topx(STACK1 *top); /*棧1讀棧頂元素*/STACK1 *ptop(STACK1 *top,int *x); /*棧1讀出棧頂元素值并刪除棧頂元素*/int empty(STACK1 *top); /*判棧1是否為空函數*/STACK2 *initstack2(STACK2 *top); /*棧2初始化*/STACK2 *push2(STACK2 *top,char x); /*棧

14、2入棧運算*/STACK2 *pop2(STACK2 *top); /*棧2刪除棧頂元素*/char topx2(STACK2 *top); /*棧2讀棧頂元素*/STACK2 *ptop2(STACK2 *top,char *x); /*棧2讀出棧頂元素值并刪除棧頂元素*/int empty2(STACK2 *top); /*判棧2是否為空函數*int text1(char *s) ; /*顯示文本*/main() char sN,s1N,ch; int i,result; int gdriver, gmode; init(); /*初始化函數*/ while(1) play(); /*發牌

15、*/ gotoxy(1,15); /*移動光標*/ printf("-Note-n"); printf(" Please enter express accroding to above four numbern"); /*提示信息*/ printf(" Format as follows:2.*(5.+7.)n");/*提示輸入字符串格式*/ printf(" -n"); scanf("%s%c",s1,&ch); /*輸入字符串壓回車鍵*/ change(s1,s); /*調用cha

16、nge函數將中綴表達式s1轉換為后綴表達式s*/ result=computer(s); /*計算后綴表達式的值,返回結果result */ if(result=24) /*如果結果等于24*/ text1("very good"); /*調用函數text1顯示字符串"very good"*/ else text1("wrong!");/*否則函數text1顯示字符串"wrong!"*/ printf("Continue (y/n)?n"); /*提示信息,是否繼續*/ scanf("

17、%c",&ch); /*輸入一字符*/ if(ch='n'|ch='N') /*如果該字符等于n或N*/ break; /*跳出循環,程序結束*/ /*否則,開始下一輪循環*/ close(); return; /*返回*/ void rand1(int j)/*隨機發牌函數*/int kind,num; char str3,n; randomize();while(1)/*循環直到有牌發*/ num=random(13); /*大小隨機數*/ if(pkindnum!=-1) /*該數未取過*/ n=pkindnum; /*取相應位置的撲克牌

18、數*/ pkindnum=-1; /*牌發好以后相應位置的元素置-1*/ break; if(n!='0')/*輸出其牌他*/ settextstyle(0,0,3); sprintf(str,"%c",n); outtextxy(COL+j*100-5,ROW+100-5,str);/*顯示牌的大小*/ else/*輸出10的時候*/ sprintf(str,"%d",10); outtextxy(COL+j*100-6,ROW+100-5,str); void play(void)/*發牌的具體過程*/ int j; for(j=0;

19、j<4;j+) rand1(j); /*隨機取牌*/ delay(10000); /*延時顯示*/ void change(char *e,char *a) /*中綴字符串e轉后綴字符串a函數*/ STACK2 *top=NULL; /* 定義棧頂指針*/ int i,j;char w; i=0; j=0; while(e!='0') /*當字符串沒有結束時*/ if(isdigit(e) /*如果字符是數字*/ do aj=e; /*將數字原樣拷貝到數組a中*/ i+; /*e數組的下標加1*/ j+; /*a數組的下標加1*/ while(e!='.'

20、); /*直到字符為數字結束符“.”為止*/ aj='.'j+; /*將數字結束符“.”拷貝到a數組依然保持結束標記*/ if(e='(') /*如果字符是“(”時*/ top=push2(top,e); /*將其壓入堆棧*/ if(e=')') /*如果字符是“)”時*/ top=ptop2(top,&w); /*取出棧頂元素,并從棧頂刪除該元素*/ while(w!='(') /*如果字符不是“(”時反復循環*/ aj=w; /*將棧頂元素存入a數組*/ j+; /*下標加1*/top=ptop2(top,&w

21、) ; /*取出棧頂元素,并從棧頂刪除該元素*/ if(e='+'|e='-') /*如果字符是加或減號時*/ if(!empty2(top) /*如棧不為空*/ w=topx2(top); while(w!='(') /*當棧頂元素不是“(”時反復循環*/ aj=w; j+; /*將棧頂元素存入表達式a中,a的下標加1*/ top=pop2(top); /*刪除棧頂元素*/ if(empty2(top) /*如果棧為空*/ break; /*跳出循環*/ else w=topx2(top); /*否則讀棧頂元素*/ top=push2(top,

22、e); /*將當前e的字符元素壓入堆棧*/ if(e='*'|e='/') /*如果字符是乘或除號時*/ if(!empty2(top) /*如棧不為空*/ w=topx2(top); /*讀棧頂元素存入w*/ while(w='*'|w='/')/*當棧頂元素是乘或除時反復循環*/ aj=w; j+; /*將棧頂元素存入字符串a中,a的下標加1*/ top=pop2(top); /*刪除棧頂元素*/ if(empty2(top) /*如果棧為空*/ break; /*跳出循環*/ else w=topx2(top); /*否則讀

23、棧頂元素*/ top=push2(top,e); /*將當前e字符元素壓入堆棧*/ i+; /*e的下標加1*/ while(!empty2(top) /*當不為空時反復循環*/ top=ptop2(top,&aj+); /*將棧頂元素存入數組a中*/ aj='0' /*將字符串結束標記寫入最后一個數組元素中構成字符串*/ int computer(char *s) /* 計算函數*/ STACK1 *top=NULL; int i,k,num1,num2,result; i=0; while(s!='0') /*當字符串沒有結束時作以下處理*/ if(

24、isdigit(s) /*判字符是否為數字*/ k=0; /*k初值為0*/ do k=10*k+s-'0' /*將字符連接為十進制數字*/ i+; /*i加1*/ while(s!='.'); /*當字符不為.時重復循環*/ top=push(top,k); /*將生成的數字壓入堆棧*/ if(s='+') /*如果為'+'號*/ top=ptop(top,&num2); /*將棧頂元素取出存入num2中*/ top=ptop(top,&num1); /*將棧頂元素取出存入num1中*/ result=num2+

25、num1; /*將num1和num2相加存入result中*/ top=push(top,result); /*將result壓入堆棧*/ if(s='-') /*如果為'-'號*/ top=ptop(top,&num2); /*將棧頂元素取出存入num2中*/ top=ptop(top,&num1); /*將棧頂元素取出存入num1中*/ result=num1-num2; /*將num1減去num2結果存入result中*/ top=push(top,result); /*將result壓入堆棧*/ if(s='*') /*如

26、果為'*'號*/ top=ptop(top,&num2); /*將棧頂元素取出存入num2中*/ top=ptop(top,&num1); /*將棧頂元素取出存入num1中*/ result=num1*num2; /*將num1與num2相乘結果存入result中*/ top=push(top,result); /*將result壓入堆棧*/ if(s='/') /*如果為'/'號*/ top=ptop(top,&num2); /*將棧頂元素取出存入num2中*/ top=ptop(top,&num1); /*將棧

27、頂元素取出存入num1中*/ result=num1/num2; /*將num1除num2結果存入result中* top=push(top,result); /*將result壓入堆棧*/ i+; /*i加1*/ top=ptop(top,&result); /*最后棧頂元素的值為計算的結果*/ return result; /*返回結果*/ STACK1 *initstack1(STACK1 *top) /*初始化*/ top=NULL; /*棧頂指針置為空*/ return top; /*返回棧頂指針*/ STACK1 *push(STACK1 *top,int x) /*入棧函

28、數*/ STACK1 *p; /*臨時指針類型為STACK1*/ p=(STACK1 *)malloc(sizeof(STACK1); /*申請STACK1大小的空間*/ if(p=NULL) /*如果p為空*/ printf("memory is overflown!"); /*顯示內存溢出*/ exit(0); /*退出*/ p->data=x; /*保存值x到新空間*/ p->link=top; /*新結點的后繼為當前棧頂指針*/ top=p; /*新的棧頂指針為新插入的結點*/ return top; /*返回棧頂指針*/ STACK1 *pop(STA

29、CK1 *top) /*出棧*/ STACK1 *q; /*定義臨時變量*/ q=top; /*保存當前棧頂指針*/ top=top->link; /*棧頂指針后移*/ free(q); /*釋放q*/ return top; /*返回棧頂指針*/ int topx(STACK1 *top) /*讀棧頂元素*/ if(top=NULL) /*棧是否為空*/ printf("Stack is nulln"); /*顯示棧為空信息*/ return 0; /*返回整數0*/ return top->data; /*返回棧頂元素*/ STACK1 *ptop(STAC

30、K1 *top,int *x) /*取棧頂元素,并刪除棧頂元素*/ *x=topx(top); /*讀棧頂元素*/ top=pop(top); /*刪除棧頂元素*/ return top; /*返回棧頂指針*/ int empty(STACK1 *top) /*判棧是否為空*/ if(top=NULL) /*如果為空*/ return 1; /*返回1*/ else return 0; /*否則返回0*/ STACK2 *initstack2(STACK2 *top) /*初始化*/ top=NULL; /*棧頂指針置為空*/ return top; /*返回棧頂指針*/ STACK2 *push2(STACK2 *top,char x) /*入棧函數*/ STACK2 *p; /*臨時指針類型為STACK2*/ p=(STACK2 *)malloc(sizeof(STACK2)

溫馨提示

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

評論

0/150

提交評論