




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、中北大學數 據 結 構課 程 設 計 說 明 書學生姓名:張蓓學 號:1021011602學 院:軟件學院專 業:軟件工程題 目:算術表達式的求解指導教師何志英2011年12月20日1. 設計任務概述(包括系統總體框圖及功能描述) 利用棧結構,求解用戶正確輸入的算術表達式,并實現保存、讀取、清除功能,且對用戶輸入的錯誤信息進行提示,重新輸入.按下”q”鍵表達式錯誤表達式正確按下”s”鍵按下”r”鍵按下”e”鍵 求解算術表達式系統輸入算術表達式 判斷表達式 是否正確求解運算,得到結果提示錯誤,重新輸入按下“n”鍵按下“y”鍵退出?(y/n)退出運算系統讀取剛才保存的得數保存得數按下“q”鍵2.
2、本設計所采用的數據結構(如:鏈表、棧、樹、圖等)本設計采用了棧結構,創建了兩個棧,一個壓入數字,另一個壓入符號。3. 功能模塊詳細設計3.1 詳細設計思想求解表達式的主要思想是創建兩個棧,一個是符號棧,另一個是數字棧。符號棧關鍵是運算優先順序,數字棧關鍵是多位數與小數的計算。本程序設計了四個模塊,第一個模塊double result(double num1,char op,double num2),主要目的是進行加減乘除運算的操作方法,num1與num2的關系;第二個模塊int compute(char str),主要目的是對用戶輸入的算術表達式進行求解,其中對多位數與小數進行了定義與數值計算
3、,以及帶括號的表達式運算的優先順序;第三個模塊void face(),主要目的是設計用戶主界面;第四個模塊是主函數,主要目的是將上述模塊集中運用,進行求解。至此完成利用棧結構求解表達式運算。3.2 核心代碼調用的庫函數:#include #include #include #include #include 自己定義的函數:1) double result(double num1,char op,double num2) 進行加減乘除運算2) int compute(char str) 對用戶輸入的算術表達式進行求解3) void face() 用戶主界面4) main() 主函數核心定義函數
4、設計:int compute(char str) double num=0; int i=0,j=1,k=1; int flag=0; numtop=optop=0; while(stri!=0|optop0) if(stri=0&stri0&!op(stri-1)&stri!=(&stri-1!=) numstacknumtop+=num*k; num=0; j=1; flag=0; k=1; if(optop=0|stri=() opstackoptop+=stri; else if(stri=) while(optop0&opstack-optop!=() numstacknumtop-
5、2=result(numstacknumtop-2,opstackoptop,numstacknumtop-1); numtop-; if(opstackoptop!=() return 0; else if(stri=0&numtop=0) return 0; while(optop0&op(stri)=op(opstackoptop-1) numstacknumtop-2=result(numstacknumtop-2,opstack-optop,numstacknumtop-1); numtop-; if(stri!=0) opstackoptop+=stri; if(stri!=0)
6、i+; if(numtop!=1|optop!=0) return 0; return 1; 3.3 程序運行結果(拷屏)1 運行程序,打開程序界面 2 用戶正確輸入算術表達式的值 3 如果在輸入過程中出現錯誤,例如,出現兩個乘號,按c鍵清除 4 清除后5 正確輸入算術表達式后按e得到正確結果6 按s鍵保存所得到的結果7 按r讀出被保存的數據8 按q退出程序9 按y退出4. 課程設計心得、存在問題及解決方法通過本次課程設計,我鞏固了棧的建立,入棧,出棧的操作,提高了發現問題進而解決問題的能力,深化了數據結構的基本知識,并進行了拓展實踐。最終,加強了程序設計的能力,并且能夠有條理的安排各個函數的
7、功能和位置。曾經存在的問題:1) 利用棧判斷小數存在,并求解小數運算。2) 考慮各個運算符的優先順序。解決方法:1) 利用小數點存在的判斷,以及位數與數值的關系,除以十的倍數進行數值運算。2) 優先順序自己先羅列一遍,以免遺漏。將+-*/數字化,以此代表優先順序。()單獨處理。附:程序源代碼:#include #include #include #include #include #define n 100 double numstackn=0; /*操作數堆棧*/int numtop; /*操作數堆棧棧頂相對棧底的偏移量,可以用來判斷堆棧是否為空*/char opstackn; /*界符堆棧
8、*/int optop; /*界符堆棧棧頂相對棧底的偏移量,可以用來判斷堆棧是否為空*/int op(char ch) /*將運算符映射為數字,表示優先級*/ if(ch=+|ch=-) return 2; if(ch=*|ch=/) return 3; if(ch=() return -1; return 0; double result(double num1,char op,double num2) /*執行運算*/ if(op=+) return num1+num2; if(op=-) return num1-num2; if(op=*) return num1*num2; if(op
9、=/) return num1/num2; return 0; int compute(char str) /*利用棧結構對算術表達式進行求解,分析表達式*/ double num=0; int i=0,j=1,k=1; /*j代表小數點后位數,k代表數字符號(正負)*/ int flag=0; /*flag=0表示不是小數位,1表示是小數位*/ numtop=optop=0; while(stri!=0|optop0) /*如果算術表達式不為空*/ if(stri=0&stri0&!op(stri-1)&stri!=(&stri-1!=) /*i0且前一字符不是+,-,*,/,(,)這些字符
10、,且當前字符不是(*/ numstacknumtop+=num*k; /*壓num*k入操作數堆棧*/ num=0; j=1; flag=0; k=1; if(optop=0|stri=() opstackoptop+=stri; /*如界符堆棧為空或當前字符為(,將當前字符壓入界符堆棧*/ else if(stri=) /*若當前字符為)*/ while(optop0&opstack-optop!=() numstacknumtop-2=result(numstacknumtop-2,opstackoptop,numstacknumtop-1); numtop-; /*分別從操作數堆棧,界符
11、堆棧出棧響應元素執行計算,結果送入操作數堆棧*/ /*直到遇到界符(,這是正常情況,或者界符堆棧為空,這表明表達式是有錯誤的*/ if(opstackoptop!=() return 0; else /*界符堆棧非空,當前字符不是(,也不是)*/ if(stri=0&numtop=0) return 0; /*如果表達式結束,或操作數堆棧已空,返回調用處*/while(optop0&op(stri)=0&ch=0&ch=9 ) numj+=ch; numj=0; else j=0; if(ch=s|ch=s) /*保存數據*/ if(strlen(num) face(); /*調用face函數
12、*/ printf(%s 已經被保存n,strcpy(save,num); /*將num中的算術表達式保存到save中*/ printf(請輸入一個算術表達式,按e得到結果n); printf(%s,str); else face(); /*調用face函數*/ printf(沒有數據被保存!n); /*沒有輸入算術表達式*/ printf(請輸入一個算術表達式,按e得到結果n); printf(%s,str); if(ch=r|ch=r) /*讀取數據*/ if(strlen(save) /*將保存的數據讀出*/ face(); /*調用face函數*/ printf(請輸入一個算術表達式,
13、按e得到結果n); printf(%s,strcat(str,save); /*輸出保存的數據*/ i+=strlen(save); if(ch=c|ch=c) /*清除數據*/ if(strlen(str) str-i=0; face(); /*調用face函數*/ printf(請輸入一個算術表達式,按e得到結果n); printf(%s,str); if(ch=e|ch=e) /*求算術表達式的值*/ if(compute(str) printf(n=%gn,numstack0); j=0; temp=numstack0; else face(); /*調用face函數*/ printf(請輸入一個算術表達式,按e得到結果n); printf(%s,str); printf(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設備拆除安全管理制度
- 設備檢測檢查管理制度
- 設備維護電池管理制度
- 設備設施控制管理制度
- 設計單位考勤管理制度
- 診室醫院感染管理制度
- 診所消防制度管理制度
- 診斷影像設備管理制度
- 調研法官助理管理制度
- 財務風險制度管理制度
- 某冶金機械廠供配電系統設計
- 收費站年度工作計劃
- xx縣精神病醫院建設項目可行性研究報告
- 《在中亞細亞草原上》賞析 課件
- 城市軌道交通供電技術442頁完整版教學課件匯總全書電子教案
- Q/GDW248-2008輸變電工程建設標準強制性條文實施管理規程第3部分:變電站建筑工程施工教程文件
- 班組會議運作技巧ppt課件
- 小學生綜合素質評價方案與評價表
- 技術比武理論復習題(繼電保護)
- 科室醫療質量安全管理與持續改進記錄本模板.doc
- DSP課程設計--基于IIR的語音信號濾波
評論
0/150
提交評論