C語言課程設(shè)計(jì)簡單計(jì)算器程序文件_第1頁
C語言課程設(shè)計(jì)簡單計(jì)算器程序文件_第2頁
C語言課程設(shè)計(jì)簡單計(jì)算器程序文件_第3頁
C語言課程設(shè)計(jì)簡單計(jì)算器程序文件_第4頁
C語言課程設(shè)計(jì)簡單計(jì)算器程序文件_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

/課程設(shè)計(jì)名稱:C語言課程設(shè)計(jì)課程設(shè)計(jì)題目:簡單計(jì)算器程序目錄22494第1章需求分析16561.1設(shè)計(jì)要求143121.2任務(wù)117689第2章總體設(shè)計(jì)2113862.1設(shè)計(jì)簡介及設(shè)計(jì)方案論述2178202.2功能模塊層次圖223044第3章詳細(xì)設(shè)計(jì)363593.3由〔后綴逆波蘭表達(dá)式計(jì)算中綴表達(dá)式原理8318493.3.1算法描述810620第4章調(diào)試分析10130834.1程序設(shè)計(jì)中所遇到的錯(cuò)誤及犯錯(cuò)的原因10233374.2錯(cuò)誤的解決方法1028144第5章用戶手冊(cè)1118363總結(jié)1530940參考文獻(xiàn)162164附錄〔程序清單17第1章需求分析1.1設(shè)計(jì)要求用C語言數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)程序設(shè)計(jì);〔2利用結(jié)構(gòu)體、棧、進(jìn)行相關(guān)信息處理;系統(tǒng)的各個(gè)功能模塊要求用函數(shù)的形式實(shí)現(xiàn);〔4界面簡單.可操作性高。1.2任務(wù)定義一個(gè)結(jié)構(gòu)體類型數(shù)組.輸入0~9及+、--、*等符號(hào)的信息.將其信息存儲(chǔ)起來;〔2輸入簡單的加減乘除算術(shù)計(jì)算式.并在屏幕上顯示逆波蘭〔后綴式表達(dá)式和計(jì)算結(jié)果;〔3編寫代碼;〔4程序分析與調(diào)試。說明:本課程設(shè)計(jì)將實(shí)現(xiàn)一個(gè)簡單計(jì)算器。在功能上盡量模仿windows的計(jì)算器。系統(tǒng)界面不做牽制要求。該程序能實(shí)現(xiàn)標(biāo)準(zhǔn)型中+、-、*、/、〔、、.、的混合運(yùn)算表達(dá)式〔一般意義上的中綴表達(dá)式.將其轉(zhuǎn)換成逆序波蘭表達(dá)式〔后綴表達(dá)式并計(jì)算輸出結(jié)果。在進(jìn)行運(yùn)算后可以選擇繼續(xù)運(yùn)算或者結(jié)束當(dāng)前運(yùn)算。即時(shí)準(zhǔn)確地獲得需要的計(jì)算的結(jié)果.充分降低了數(shù)字計(jì)算的難度和節(jié)約了時(shí)間.對(duì)人們的生活有一定的幫助。第2章總體設(shè)計(jì)2.1設(shè)計(jì)簡介及設(shè)計(jì)方案論述逆波蘭表達(dá)式又叫做后綴表達(dá)式。在通常的表達(dá)式中.二元運(yùn)算符總是置于與之相關(guān)的兩個(gè)運(yùn)算對(duì)象之間.所以.這種表示法也稱為中綴表達(dá)式。波蘭邏輯學(xué)家J.Lukasiewicz于1929年提出了另一種表示表達(dá)式的方法。按此方法.每一運(yùn)算符都置于其運(yùn)算對(duì)象之后.故稱為后綴表達(dá)式。后綴表達(dá)式的優(yōu)點(diǎn)是顯而易見的.編譯器在處理時(shí)候按照從左至右的順序讀取逆波蘭表達(dá)式.遇到運(yùn)算對(duì)象直接壓入堆棧.遇到運(yùn)算符就從堆棧提取后進(jìn)的兩個(gè)對(duì)象進(jìn)行計(jì)算.這個(gè)過程正好符合了計(jì)算機(jī)計(jì)算的原理。后綴表達(dá)式比前綴表達(dá)式更加易于轉(zhuǎn)換.并且它的最左面一定為數(shù)字.這一點(diǎn)在實(shí)際編程的時(shí)候就會(huì)體會(huì)到它的好處了。逆波蘭表達(dá)式有一個(gè)更大的優(yōu)點(diǎn).就是拆括號(hào).根據(jù)運(yùn)算符的級(jí)別將中綴表達(dá)式轉(zhuǎn)換成逆波蘭表達(dá)式后.運(yùn)算順序就已經(jīng)替代了運(yùn)算符的級(jí)別.這樣也避免了括號(hào)提高運(yùn)算級(jí)別的特殊處理。簡單計(jì)算器2.2功能模塊層次圖簡單計(jì)算器求值計(jì)算系求值計(jì)算系統(tǒng)表達(dá)式格式轉(zhuǎn)換系統(tǒng)將算術(shù)表達(dá)式轉(zhuǎn)化為逆波蘭表達(dá)式計(jì)算逆波蘭表達(dá)式的值第3章詳細(xì)設(shè)計(jì)3.1棧的定義與使用首先定義兩個(gè)棧.一個(gè)字符型.一個(gè)雙精度型.程序代碼如下:Struct{chardata[MaxSize];//存放表達(dá)式的字符數(shù)組inttop;//棧頂指針}Sym;/*符號(hào)*///作為存放運(yùn)算表達(dá)式的棧使用struct{doubledata[MaxSize];//存放運(yùn)算結(jié)果的數(shù)組inttop;//棧頂指針}Num;/*數(shù)*/存儲(chǔ)逆波蘭表達(dá)式〔后綴式計(jì)算器的運(yùn)算數(shù)//作為存放運(yùn)算結(jié)果的棧使用voidInitStack<>{Sym.top=Num.top=-1;}//棧的初始化voidSymPush<>//壓棧{if<Sym.top<MaxSize-1>{Sym.data[++Sym.top]=calc[i++];}else{printf<"Sym棧滿\n">;return;}}voidSymPop<>//出棧{if<Sym.top>=0>{expr[++t]=Sym.data[Sym.top--];}else{printf<"Sym??誠n">;return;}}voidNumPush<>//壓棧{If<Num.top<MaxSize-1>{Num.data[++Num.top]=ston<expr,&i>;}else{printf<"Num棧滿\n">;return;}}定義逆波蘭〔后綴式表達(dá)式的計(jì)算函數(shù)〔出棧voidNumPop<>{if<Num.top>=0>{if<expr[i]!=''>{switch<expr[i]>{case'+':Num.data[Num.top-1]=Num.data[Num.top-1]+Num.data[Num.top];break;case'-':Num.data[Num.top-1]=Num.data[Num.top-1]-Num.data[Num.top];break;case'*':Num.data[Num.top-1]=Num.data[Num.top-1]*Num.data[Num.top];break;case'/':Num.data[Num.top-1]=Num.data[Num.top-1]/Num.data[Num.top];break;}Num.top--;}}else{printf<"Num??誠n"}}定義一個(gè)對(duì)逆波蘭表達(dá)式中.數(shù)字的處理函數(shù)doubleston<charx[],int*p>{intj=*p+1,i;doublen=0;charsign=x[*p];if<sign=='+'||sign=='-'>*p=*p+1;while<x[j]>='0'&&x[j]<='9'>{j++;}for<i=*p;i<j;i++>{n=n*10+<x[i]-'0'>;}if<x[j]=='.'>{*p=++j;while<x[j]>='0'&&x[j]<='9'>{j++;}for<i=*p;i<j;i++>{n=n+pow<0.1,i-*p+1>*<x[i]-'0'>;}}*p=j;if<sign=='-'>return<-n>;return<n>;}3.2功能模塊流程圖〔以下有簡易圖與詳細(xì)圖主函數(shù)主函數(shù)輸入輸入從棧中取出結(jié)果并輸出將逆波蘭表達(dá)式壓棧,遇到運(yùn)算符,取出兩個(gè)操作數(shù)進(jìn)行運(yùn)算,并將結(jié)果壓棧以此類推,最后棧中只剩下最后結(jié)果遇到數(shù)字壓棧,括號(hào)刪除,運(yùn)算符壓棧從而轉(zhuǎn)化為逆波蘭表達(dá)式從棧中取出結(jié)果并輸出將逆波蘭表達(dá)式壓棧,遇到運(yùn)算符,取出兩個(gè)操作數(shù)進(jìn)行運(yùn)算,并將結(jié)果壓棧以此類推,最后棧中只剩下最后結(jié)果遇到數(shù)字壓棧,括號(hào)刪除,運(yùn)算符壓棧從而轉(zhuǎn)化為逆波蘭表達(dá)式開始開始數(shù)字運(yùn)算符小于或等于取出棧頂元素運(yùn)算符操作數(shù)運(yùn)算結(jié)果是否輸入表達(dá)式輸入表達(dá)式逐個(gè)字符掃描直至‘逐個(gè)字符掃描直至‘=’或‘\0’如果是‘〔’直接壓棧如果是‘〔’直接壓棧判斷字符類型大于壓入棧中第一個(gè)字符直接壓棧,其余的與棧頂元素比較優(yōu)先級(jí)寫入逆波蘭表達(dá)式大于壓入棧中第一個(gè)字符直接壓棧,其余的與棧頂元素比較優(yōu)先級(jí)寫入逆波蘭表達(dá)式直至遇到‘’,取出棧中元素直至遇到‘’,取出棧中元素輸出逆波蘭表達(dá)式輸出逆波蘭表達(dá)式逐個(gè)掃描字符直至遇到‘逐個(gè)掃描字符直至遇到‘\0’判斷字符類型取出棧中兩個(gè)操作數(shù),執(zhí)行運(yùn)算,得出運(yùn)算結(jié)果判斷字符類型取出棧中兩個(gè)操作數(shù),執(zhí)行運(yùn)算,得出運(yùn)算結(jié)果壓棧壓棧輸出棧頂元素,也即最終運(yùn)算結(jié)果取出棧頂元素是否繼續(xù)使用計(jì)算器輸出棧頂元素,也即最終運(yùn)算結(jié)果取出棧頂元素是否繼續(xù)使用計(jì)算器結(jié)束結(jié)束3.3由〔后綴逆波蘭表達(dá)式計(jì)算中綴表達(dá)式原理計(jì)算機(jī)處理〔后綴逆波蘭表達(dá)式求值問題是比較方便的.即將遇到的操作數(shù)暫存于一個(gè)操作數(shù)棧中.凡是遇到操作數(shù).便從棧中pop出兩個(gè)操作數(shù).并將結(jié)果存于操作數(shù)棧中.直到對(duì)〔后綴逆波蘭表達(dá)式中最后一個(gè)操作數(shù)處理完.最后壓入棧中的數(shù)就是后最表達(dá)式的計(jì)算結(jié)果。中綴表達(dá)式轉(zhuǎn)換為等價(jià)的〔后綴逆波蘭表達(dá)式.中綴表達(dá)式不方便與計(jì)算機(jī)處理.通常要講中綴表達(dá)式轉(zhuǎn)換為一個(gè)與之等價(jià)的〔后綴逆波蘭表達(dá)式。等價(jià)是指兩個(gè)表達(dá)式的計(jì)算順序和計(jì)算結(jié)果完全相同。中綴表達(dá)式:0.3/<5*2+1>=的等價(jià)〔后綴逆波蘭表達(dá)式是:0.352*1+/=仔細(xì)觀察這兩個(gè)等價(jià)的表達(dá)式可知.操作數(shù)的出現(xiàn)次序是相同的.但運(yùn)算符的出現(xiàn)次序是不同的。在〔后綴逆波蘭表達(dá)式中.運(yùn)算符的出現(xiàn)次序是實(shí)際進(jìn)行操作的次序;在中追表達(dá)式中.由于受到操作符的優(yōu)先級(jí)和括號(hào)的影響.操作符出現(xiàn)次序與實(shí)際進(jìn)行操作的次序很可能是不一樣的。3.3.1算法描述將中綴表達(dá)式轉(zhuǎn)換為等價(jià)的〔后綴逆波蘭表達(dá)式的過程要使用一個(gè)棧放"〔".具體可以按照下面的方式進(jìn)行。〔1從左到右一次掃描中綴表達(dá)式的每一個(gè)字符.如果是數(shù)字字符和圓點(diǎn)"."則直接將它們寫入〔后綴逆波蘭表達(dá)式中?!?如果遇到的是開括號(hào)"〔".則將它們壓入一個(gè)操作符?!膊恍枰c棧頂操作符相比較.它表明一個(gè)新的計(jì)算層次的開始.在遇到和它匹配的閉括號(hào)""時(shí).將棧中的元素彈出來并放入〔后綴逆波蘭表達(dá)式中.直到棧頂元素為"<"時(shí).將棧頂元素"〔"彈出〔不需要加入〔后綴逆波蘭表達(dá)式.表明這一層括號(hào)內(nèi)的操作處理完畢?!?如果遇到的是操作符.則將該操作符和操作符棧頂元素比較:a當(dāng)所遇到的操作符的優(yōu)先級(jí)小于或等于棧頂元素的優(yōu)先級(jí)時(shí).則取出棧頂元素放入〔后綴逆波蘭表達(dá)式.并彈出該棧頂元素.反復(fù)執(zhí)行直到棧頂元素的優(yōu)先級(jí)小于當(dāng)前操作符的優(yōu)先級(jí);b、當(dāng)所遇到的操作符的優(yōu)先級(jí)大于棧頂元素的優(yōu)先級(jí)的時(shí)則將它壓入棧中。〔4重復(fù)上述步驟直到遇到中綴表達(dá)式的結(jié)束符標(biāo)記"=".彈出棧中的所有元素并放入〔后綴逆波蘭表達(dá)式中.轉(zhuǎn)換結(jié)束。第4章調(diào)試分析4.1程序設(shè)計(jì)中所遇到的錯(cuò)誤及犯錯(cuò)的原因在編輯程序時(shí).往往需要輸入漢字作為提示信息.而此時(shí).忘記切換輸入法.導(dǎo)致用搜狗輸入法輸進(jìn)去的字符使得程序無法編譯成功。在編輯程序時(shí).將關(guān)鍵字輸入錯(cuò)誤.如:else打成else,printf打成print調(diào)試程序時(shí).運(yùn)行界面還未關(guān)閉.有點(diǎn)擊運(yùn)行.致使程序無法運(yùn)行。清屏函數(shù)不會(huì)使用。運(yùn)行程序之后.輸入時(shí).因輸入法的問題可能會(huì)出現(xiàn)運(yùn)算錯(cuò)誤。4.2錯(cuò)誤的解決方法先找到錯(cuò)誤出現(xiàn)的大概區(qū)域.然后仔細(xì)盤查.最終發(fā)現(xiàn)問題所在。解決方法同上。請(qǐng)教同學(xué).在同學(xué)的指導(dǎo)下解決了此錯(cuò)誤。用手機(jī)上網(wǎng)百度搜索并請(qǐng)教同學(xué).從而解決了問題。進(jìn)行多次調(diào)試后發(fā)現(xiàn)問題所在.并獨(dú)立解決。第5章用戶手冊(cè)5.1對(duì)于此"計(jì)算器程序".操作簡單方便.能快速算出您所需的計(jì)算結(jié)果。5.2開始時(shí).進(jìn)入運(yùn)行界面.根據(jù)程序運(yùn)行提示進(jìn)行輸入.如圖所示:圖5.1要輸入正常運(yùn)算表達(dá)式.如:12*23—34/15*〔26.5+3.4=注意:在輸入表達(dá)式時(shí).切記使用電腦原自帶輸入法.不要使用搜狗等輸入法.否則程序可能無法正確讀取字符.從而使運(yùn)算結(jié)果出錯(cuò)!如圖所示:圖5.2輸入之后請(qǐng)按回車鍵.之后程序便自動(dòng)會(huì)將表達(dá)式轉(zhuǎn)化為逆波蘭表達(dá)式〔后綴式.并輸出計(jì)算結(jié)果!如圖所示:圖5.3繼續(xù)計(jì)算請(qǐng)輸入y.退出請(qǐng)輸入n。如圖所示:輸入y的顯示界面圖5.4輸入n的顯示界面切記:運(yùn)行程序時(shí).請(qǐng)客戶務(wù)必按照程序運(yùn)行提示.進(jìn)行一系列的相關(guān)操作.否則.程序可能會(huì)運(yùn)行出錯(cuò).所以.請(qǐng)用戶謹(jǐn)慎操作!總結(jié)經(jīng)過了兩個(gè)多星期的C語言程序設(shè)計(jì).終于在老師的細(xì)心指導(dǎo)和同學(xué)的熱情幫助下基本完成了計(jì)算器課題的設(shè)計(jì)任務(wù)!雖然有些地方不盡如人意但是初步達(dá)到了對(duì)自己的要求!剛開始設(shè)計(jì)的時(shí)候找不到頭緒.不知道該從哪里下手!通過向同學(xué)詢問和查找資料找走進(jìn)了設(shè)計(jì)的門檻!通過網(wǎng)上查找到很多成功的計(jì)算器程序.通過對(duì)那些已經(jīng)成功地程序進(jìn)行分析找到自己的設(shè)計(jì)思路.制定設(shè)計(jì)流程。并通過比較各種程序了解各個(gè)程序的利弊.從而明確自己計(jì)算器的設(shè)計(jì)方向和如何通過技術(shù)手段達(dá)到自己的目的!萬事開頭難.可是對(duì)于并不是很熟悉的C語言數(shù)據(jù)結(jié)構(gòu)的我.在一開始的設(shè)計(jì)中.困難重重..通過查找C語言數(shù)據(jù)結(jié)構(gòu)的教材.去圖書館查找相關(guān)的資料和同學(xué)一起討論終于把一個(gè)個(gè)棘手的陌生的問題解決!程序編好后.在測(cè)試階段中發(fā)現(xiàn)了幾處錯(cuò)誤導(dǎo)致程序不能運(yùn)行.通過耐心的分析源代碼終于編好了一個(gè)完整無誤的程序。參考文獻(xiàn)[1]C程序設(shè)計(jì)〔第三版譚浩強(qiáng)清華大學(xué)出版社20XX1月[2]數(shù)據(jù)結(jié)構(gòu)〔c語言版楊薇薇清華大學(xué)出版社20XX[3]數(shù)據(jù)結(jié)構(gòu)精講與習(xí)題詳解殷人昆清華大學(xué)出版社20XX[4]數(shù)據(jù)結(jié)構(gòu)殷人昆清華大學(xué)出版社20XX[5]c語言課程設(shè)計(jì)案例精編郭翠英中國水利出版社2004.03[6]c程序設(shè)計(jì)語言克尼漢.附錄〔程序清單#include<stdio.h>#include<conio.h>#include<math.h>#include<stdlib.h>#include<string.h>#defineMaxSize99charcalc[MaxSize],expr[MaxSize];inti,t;struct{chardata[MaxSize];inttop;}Sym;struct{doubledata[MaxSize];inttop;}Num;doubleston<charx[],int*p>{intj=*p+1,i;doublen=0;charsign=x[*p];if<sign=='+'||sign=='-'>*p=*p+1;while<x[j]>='0'&&x[j]<='9'>{j++;}for<i=*p;i<j;i++>{n=n*10+<x[i]-'0'>;}if<x[j]=='.'>{*p=++j;while<x[j]>='0'&&x[j]<='9'>{j++;}for<i=*p;i<j;i++>{n=n+pow<0.1,i-*p+1>*<x[i]-'0'>;}}*p=j;if<sign=='-'>return<-n>;return<n>;}voidInitStack<>{Sym.top=Num.top=-1;}voidSymPush<>{if<Sym.top<MaxSize-1>{Sym.data[++Sym.top]=calc[i++];}else{printf<"Sym棧滿\n">;return;}}voidSymPop<>{if<Sym.top>=0>{expr[++t]=Sym.data[Sym.top--];}else{printf<"Sym棧空\n">;return;}}voidNumPush<>{if<Num.top<MaxSize-1>{Num.data[++Num.top]=ston<expr,&i>;}else{printf<"Num棧滿\n">;return;}}voidNumPop<>{if<Num.top>=0>{if<expr[i]!=''>{switch<expr[i]>{case'+':Num.data[Num.top-1]=Num.data[Num.top-1]+Num.data[Num.top];break;case'-':Num.data[Num.top-1]=Num.data[Num.top-1]-Num.data[Num.top];break;case'*':Num.data[Num.top-1]=Num.data[Num.top-1]*Num.data[Num.top];break;case'/':Num.data[Num.top-1]=Num.data[Num.top-1]/Num.data[Num.top];break;}Num.top--;}}else{printf<"Num棧空\n">;return;}}intmain<void>{loop1:i=0,t=-1;system<"cls">;printf<"Calculator計(jì)算器\n">;printf<"***************************************\n">;printf<"*歡迎使用Welcome!:*\n">;printf<"***************************************\n">;printf<"請(qǐng)輸入算術(shù)表達(dá)式<中綴表達(dá)式>:\n">;InitStack<>;gets<calc>;while<calc[i]!='\0'&&calc[i]!='='>{if<calc[i]>='0'&&calc[i]<='9'>{while<<calc[i]>='0'&&calc[i]<='9'>||<calc[i]=='.'>>{loop2:expr[++t]=calc[i++];}expr[++t]='';}elseif<calc[i]=='<'>{SymPush<>;}elseif<calc[i]=='>'>{while<Sym.data[Sym.top]!='<'>{SymPop<>;expr[++t]='';}Sym.data[Sym.top--]='\0';i++;}elseif<calc[i]=='+'||calc[i]=='-'

溫馨提示

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

評(píng)論

0/150

提交評(píng)論