C模擬計算器程序合院何浩_第1頁
C模擬計算器程序合院何浩_第2頁
C模擬計算器程序合院何浩_第3頁
C模擬計算器程序合院何浩_第4頁
C模擬計算器程序合院何浩_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 合肥學(xué)院計算機科學(xué)與技術(shù)系課程設(shè)計報告20092010學(xué)年第二期課程課程設(shè)計名稱學(xué)生姓名學(xué)號專業(yè)班級指導(dǎo)教師 一 課程設(shè)計題目:模擬計算器程序設(shè)計內(nèi)容:設(shè)計一個程序來模擬一個簡單的手持計算器。程序支持算術(shù)運算+、-、*、/、=、以及(清除)、A(全清除)操作。程序運行時,顯示一個窗口,等待用戶輸入,用戶可以從鍵盤輸入要計算的表達(dá)式,輸入的表達(dá)式顯示在窗口中,用戶鍵入= 符號后,窗口顯示出結(jié)果。選作內(nèi)容如果用戶輸入的表達(dá)式不合法,可以判別出來并給出相應(yīng)的錯誤提示。測試數(shù)據(jù)程序輸入不少于5種不同的表達(dá)式進行測試。二問題的分析此程序設(shè)計主要運用了棧,利用棧后進先出的原理,建立兩個棧,操作數(shù)棧和操作

2、符棧,先將數(shù)據(jù)和運算符分別壓入這兩個棧,判斷棧內(nèi)和棧外運算符的優(yōu)先級,依據(jù)運算符的優(yōu)先級判斷是應(yīng)再次壓入運算符,還是將數(shù)據(jù)和運算符彈出棧,在棧外進行運算,再將所得的結(jié)果壓入棧,繼續(xù)進行與計算,直至運算結(jié)束。例如;計算5/2+1-2*3= 操作數(shù)2入操作數(shù)棧,2運算符”/”入運算符棧,操作數(shù)5入操作數(shù)棧5/ 數(shù)字棧 運算符棧。運算符“+”入運算符棧頂比較后,將2,5出棧運算,并將結(jié)果入數(shù)字棧2.5 數(shù)字棧 字符棧運算符“+”入字符棧,操作 1數(shù)1入數(shù)字棧 2.5+ 數(shù)字棧 字符棧 運算符“”入運算符棧頂比較后,將1, 2.5出棧運算,并將結(jié)果壓入操作數(shù)棧3.5 運算符“”入運算符棧 數(shù)字棧 字符

3、棧操作數(shù)2入操作數(shù)棧,運算符“*”入運算符棧頂比較后壓入運算符棧3將操作數(shù)3壓入操作數(shù)棧 2* 3.5 數(shù)字棧 字符棧當(dāng)掃描到=號時,操作數(shù)3和2出棧運算符*出棧,進行運算,運算結(jié)果入操作數(shù)棧 63.5 數(shù)字棧 字符棧操作數(shù)6和2出棧,運算符“”出棧,進行運算,運算結(jié)果入操作數(shù)棧6 3.5 數(shù)字棧 字符棧 運算符???,操作數(shù)棧中運算為運算2.5 結(jié)果 數(shù)字棧 字符棧分析:設(shè)置兩個棧,運算數(shù)棧和運算符棧,然后,自左向右掃描表達(dá)式,遇操作數(shù)進操作數(shù)棧,遇操作符棧則與操作符棧頂運算符比較:若當(dāng)前操作符大于操作符棧頂,則當(dāng)前操作符進入操作符棧;若當(dāng)前操作符小于等于運算符棧頂,次棧頂出棧,同時操作數(shù)棧頂

4、也出棧,形成一個運算,并將運算的結(jié)果壓入數(shù)字棧。流程圖開始 初始化數(shù)字棧和字符棧 讀入字符c 是否為“=”號 Y N N 是否為運算符 Y 字符棧是否為空 Y N C入數(shù)字棧 Y 是否比字符棧頂優(yōu)先級高N C入字符棧 數(shù)字棧頂元素和次棧頂元素 出棧,運算符棧頂出棧,運算結(jié)果入數(shù)字棧 結(jié)束三算法的設(shè)計1、 創(chuàng)建一個calculator類,將計算器需要用到的函數(shù)都封裝起來,形成一個整體。2、 設(shè)計成員函數(shù)及數(shù)據(jù)。首先定義兩個私有的結(jié)構(gòu)體save1和save2分別用來存放數(shù)字和運算符,在結(jié)構(gòu)體內(nèi)定義整型的棧頂元素top,和存放數(shù)據(jù)及運算符的數(shù)組double nMAX和char nMAX。定義了一個空

5、的構(gòu)造函數(shù)calculator()。函數(shù)bool stack1empty(save1 s),bool stack2empty(save2 s)分別判斷數(shù)字棧和字符棧是否為空,若棧頂為-1則空則返回1表示真,否則返回0表示假。函數(shù)void push1(save1 &s,double num);,void push2(save2 &s,char op);分別將數(shù)字和字符壓入棧。若所存儲的內(nèi)容已經(jīng)數(shù)組的最大限度,則顯示“棧已滿”,否則將數(shù)字和字符壓入棧頂。函數(shù)void pop1(save1 &s,double &num),void pop2(save2 &s,

6、char &op)分別是將棧內(nèi)的數(shù)字和字符彈棧,存儲在num和op中。首先判斷棧是否為空,若空則顯示“棧為空”,否則將棧頂元素分別賦值給num和op。函數(shù)int in(char op),int out(char op)分別判斷棧內(nèi)和棧外運算符的優(yōu)先級。 在棧內(nèi),“+”“”返回2,“*”“/”返回4,在棧外“+”“”返回1,“*”“/”返回3,當(dāng)遇到“+” 或“”和“*”或“/”同時存在時,“*”“/”的優(yōu)先級高于“+”“”,首選“*”“/”運算。當(dāng)遇到同級運算符時在時,先進行棧內(nèi)運算。通過返回值的大小選擇進行在哪里的哪種運算。函數(shù)void count(double a,char op,

7、double b)是用來進行計算的,并將計算的結(jié)果壓入棧。以便下一次的運算。函數(shù)void cal ()是最主要的操作函數(shù)。首先提示輸入表達(dá)式,并在表達(dá)式之后加上=,然后輸入表達(dá)式。分別清空存放數(shù)字和字符的棧??傮w用一個while語句,以“=”結(jié)束。由于是用char定義的表達(dá)式expressionMAX,所以要將里面的數(shù)字提取出來,轉(zhuǎn)化成int或float類型,利用庫函數(shù)isdigit()查找,若讀入的字符為數(shù)字,則繼續(xù)判斷下一個字符,直到下個字符不是數(shù)字或者不是小數(shù)點,即可保證該操作數(shù)是完整的小數(shù),然后將該數(shù)入操作數(shù)棧。庫函數(shù)atof()將char類型進行轉(zhuǎn)換。當(dāng)棧內(nèi)和棧外同時都有運算符時,利

8、用int in(char op) 和 int out(char op)函數(shù)根據(jù)其返回值的大小判斷運算符的優(yōu)先級,判斷是將棧外的運算符壓入棧還是將站內(nèi)的數(shù)據(jù)及運算符彈出棧進行運算。若為后者,運算完后再將所得的結(jié)果壓入棧頂,再次進行判斷,直至棧頂為空,運算結(jié)束。主函數(shù)void main(),首先提示此程序設(shè)計者的信息。然后進行正式的計算環(huán)節(jié),將整個主函數(shù)分為part1 和part2兩部分,運用goto語句使程序在執(zhí)行的流程可以跳轉(zhuǎn)到part1部分,進行多次運算。定義calculator mycal,進行運算。運算結(jié)束提示是否繼續(xù)進行運算,輸入選擇y(是) n(否) A(退出)利用while語句,當(dāng)

9、輸入A時結(jié)束運算。當(dāng)輸入“y”時,運用system("cls")對前面的運算進行全清除,然后利用goto語句跳轉(zhuǎn)到part1再次進行計算。當(dāng)輸入“n”時停止運算,輸出“謝謝使用!”程序運行結(jié)束。類:calculator數(shù)據(jù):struct save1struct save1函數(shù):calculator();bool stack1empty(save1 s);bool stack2empty(save2 s);void push1(save1 &s,double num);void push2(save2 &s,char op);void pop1(save1 &

10、amp;s,double &num);void pop2(save2 &s,char &op);int in(char op);int out(char op);void count(double a,char op,double b);void cal();系統(tǒng)類圖基類的數(shù)據(jù)成員和函數(shù)成員描述 屬性和方法定義類名成員類別類型成員名描述calculator屬性structSave1存儲數(shù)字Struct Save2存儲運算符Boolstack1empty(save1s)判斷數(shù)字棧是否為空Boolstack2empty(save2s)判斷運算符棧是否為空voidpush1(

11、save1&s,doublenum)將數(shù)據(jù)壓入數(shù)字棧voidpush2(save2 &s,char op)將運算符壓入運算符棧voidpop1(save1&s,double&num)將棧頂?shù)臄?shù)據(jù)元素取出,存放在num中voidintintvoidvoidpop2(save2 &s,char &op)in(char op)out(char op)count(double a,char op,double b)cal()將棧頂?shù)倪\算符取出,存放在op中在棧內(nèi)優(yōu)先級的判斷棧外優(yōu)先級的判斷進行計算并將所得的結(jié)果壓入棧頂主要進行運算的函數(shù)用戶手冊程序運行時

12、,首先顯示此程序設(shè)計者的信息。提示歡迎使用計算機請輸入表達(dá)式(輸完之后請加=),然后輸入所要進行計算的表達(dá)式,進行計算。計算結(jié)束后提示:繼續(xù)計算嗎?,輸入y表示同意繼續(xù)計算,輸入n表示結(jié)束計算,并顯示謝謝使用!輸入A時退出,選擇你所需的形式,進行計算。(四) 上機調(diào)試過程 (1) 剛開始只能進行兩個數(shù)字的運算,不能進行多個數(shù)字的計算,想到用for循環(huán)解決輸入數(shù)字上的問題,但只能進行一種運算,達(dá)不到多重運算的要求。 (2)想到在用for循環(huán)解決次問題,但改來改去都弄不好,最后經(jīng)老師提示,運用棧的知識解決問題。 (3)開始對棧一點都不了解,全部程序都需要重新寫,完全沒有一點頭緒,把課本關(guān)于棧的部分

13、看了好多遍,和同學(xué)討論,大概知道棧是什么樣的了,開始寫我的程序了。 (4)本來只是考慮到建立一個數(shù)字棧的,但這樣運算符的優(yōu)先級不能進行,得不出正確的結(jié)果,經(jīng)同學(xué)提示,建立兩個棧,一個存儲數(shù)字,另一個存放運算符,判斷運算符的優(yōu)先級以后,將數(shù)字和運算符彈出棧,進行計算,把計算的結(jié)果壓入棧,以便下一次運算。 (5)解決了多個多個數(shù)和多個運算符計算的問題,又想到了可不可以進行多次運算,當(dāng)想結(jié)束時,按指定的鍵,結(jié)束運算,想到了用goto語句進行跳轉(zhuǎn),達(dá)到循環(huán)計算的目的。說明:此程序清除的功能還不能實現(xiàn),只能進行全清除,修改了好長時間也未能找到一個好方法解決。(五) 運行實例選擇繼續(xù)運算,跳轉(zhuǎn)到part1

14、部分。 經(jīng)驗與體會此次c+課程設(shè)計,在指導(dǎo)教師的精心教導(dǎo)下,我們學(xué)會了如何用C+編寫一個簡單的應(yīng)用程序。首先要對程序的設(shè)計要求有一個比較明確的認(rèn)識,然后系統(tǒng)分析與系統(tǒng)設(shè)計,最后是代碼設(shè)計與調(diào)試。程序?qū)崿F(xiàn)上,設(shè)計了簡單的查詢界面,將各個功能集中出來按照程序編寫原則,便于查詢。根據(jù)C+課程所學(xué)的概念、理論和方法,按照C+程序設(shè)計的基本步驟,設(shè)計出一個適當(dāng)規(guī)模的程序;進一步加深對C+語言的理解和掌握。理論聯(lián)系實際,加深和鞏固所學(xué)的理論知識,提高實踐能力和計算機的綜合運用能力。我們編寫程序的過程是辛苦與快樂的,程序的編寫原則很重要,只要我們在編程,就必須不斷改進,才能更好提高編程能力。課程設(shè)計是培養(yǎng)學(xué)

15、生綜合運用所學(xué)知識、發(fā)現(xiàn)、提出、分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對學(xué)生實際工作能力的具體訓(xùn)練和考察過程.隨著科學(xué)技術(shù)發(fā)展的日新日異,C+已經(jīng)成為當(dāng)今計算機應(yīng)用中空前活躍的領(lǐng)域, 在生活和學(xué)習(xí)中可以說得是無處不在。因此作為二十一世紀(jì)的大學(xué)來說掌握C+軟件開發(fā)技術(shù)是十分重要的。此次課程設(shè)計使我們將理論教學(xué)中涉及到的知識點貫穿起來,對不同的數(shù)據(jù)類型、程序控制結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)作一比較和總結(jié),結(jié)合設(shè)計題目進行綜合性應(yīng)用,對所學(xué)知識達(dá)到融會貫通的程度。通過課程設(shè)計,使我們在各方面的能力應(yīng)該得到鍛煉,不僅進一步鞏固、加深學(xué)生所學(xué)專業(yè)課程C+語言教程的基本理論知識,理論聯(lián)系實際,進一步培養(yǎng)學(xué)生綜合

16、分析問題,解決問題的能力。而且全面考核我們所掌握的基本理論知識及其實際業(yè)務(wù)能力,從而達(dá)到提高學(xué)生素質(zhì)的最終目的。并且利用所學(xué)知識,開發(fā)小型應(yīng)用系統(tǒng),掌握運用C+語言編寫調(diào)試應(yīng)用系統(tǒng)程序,訓(xùn)練獨立開發(fā)應(yīng)用系統(tǒng),進行數(shù)據(jù)處理的綜合能力。還使我們懂得了對于給定的設(shè)計題目,如何進行分析,理清思路,并給出相應(yīng)的數(shù)學(xué)模型。 同時也使我們掌握自頂而下的設(shè)計方法,將大問題進行模塊化,領(lǐng)會結(jié)構(gòu)化程序設(shè)計的方法。熟練掌握C+語言的基本語法,靈活運用各種數(shù)據(jù)類型。進一步掌握在集成環(huán)境下如何調(diào)試程序(單步調(diào)試,設(shè)置斷點、觀察表達(dá)式,分塊調(diào)試)和修改程序。這次課程設(shè)計歷時二周,通過這次設(shè)計讓我對C+有了更新的認(rèn)識,認(rèn)識

17、到了它的實際應(yīng)用價值,可以及大的減少工作量,節(jié)省人力物力,同時也讓我認(rèn)識發(fā)現(xiàn)到自己再學(xué)習(xí)上的存在的不足,再以后的生活學(xué)習(xí)中要多加練習(xí)編程,力求改變自己的不足。課程設(shè)計學(xué)習(xí)讓我學(xué)到了很多,學(xué)會了用所學(xué)習(xí)的知識去解決實際問題,一開始拿到題目,根本就不知道要從什么地方下手,感覺寫這個也不行寫那個不行,但經(jīng)過時間的磨練以及和同學(xué)之間的交流開始有點頭緒,腦海中有個大概,但還是無法全部寫出來,只能實現(xiàn)一部分功能,而且在寫程序時遇到了很多問題,程序出錯自己無法修改,后來經(jīng)過學(xué)長的指導(dǎo)和同學(xué)以及指導(dǎo)老師的幫助大部分功能都可以實現(xiàn),自己再慢慢摸索,程序終于寫出來了,這期間感覺以前好多不懂的,通過這次的學(xué)習(xí)都可以

18、一一解決,但發(fā)現(xiàn)自己也有很多的不足,很多以前學(xué)過的知識點都不記得了,而且無法將它們聯(lián)系在一起,除了課本上的知識還有好多跟本課程有關(guān)的知識點都不懂,所以通過這次的學(xué)習(xí),我知道自己不僅僅要把課本上的東西學(xué)好,還要了解相關(guān)的東西,讓自己的知識面更廣,同時我也更深刻的認(rèn)識到了任何事都不可能一個人獨立完成,同學(xué)和老師的幫助是非常重要的。(六) 參考資料1 鄭莉 等編著C+語言程序設(shè)計(第三版)北京:清華大學(xué)出版社2 鄭莉 等編著C+語言程序設(shè)計(第三版)學(xué)生用書北京: 清華大學(xué)出版社3 劉振安 等編著C+程序設(shè)計課程設(shè)計 機械工業(yè)出版社4 吳乃陵 等編著C+程序設(shè)計北京:高等教育出版社5 李春葆 等編著

19、C+程序設(shè)計學(xué)習(xí)與上機實驗指導(dǎo) 北京:清華大學(xué)出版社6 范輝 等編著Visual C+6.0程序設(shè)計簡明教程 高等教育出版社7 李龍澍C+程序設(shè)計實訓(xùn)教程北京:清華大學(xué)出版社 8 洪國勝 等編著 C+ Builder程序設(shè)計輕松上手北京:清華大學(xué)出版社9 寧正元數(shù)據(jù)結(jié)構(gòu)(c語言) 南京:東南大學(xué)出版社。2000年6月第1版10 嚴(yán)蔚敏等 數(shù)據(jù)結(jié)構(gòu)(c語言版) 北京:清華大學(xué)出版社,1997年4月第1版。11 胡學(xué)鋼等數(shù)據(jù)結(jié)構(gòu)算法設(shè)計指導(dǎo)北京:清華大學(xué)出版社,1999年 第1版。 源程序:#include <stdlib.h>#include<iostream.h>#in

20、clude<ctype.h> # define MAX 1000class calculatorprivate:struct save1 /存儲數(shù)字double nMAX;int top;stack1;struct save2 /存儲運算符char nMAX;int top;stack2;public:calculator(); /空的構(gòu)造函數(shù)bool stack1empty(save1 s);bool stack2empty(save2 s);void push1(save1 &s,double num);void push2(save2 &s,char op);

21、void pop1(save1 &s,double &num);void pop2(save2 &s,char &op);int in(char op);int out(char op);void count(double a,char op,double b);void cal();bool calculator:stack1empty(save1 s) /判斷數(shù)字棧是否為空if(s.top=-1)return 1;else return 0;bool calculator:stack2empty(save2 s)/判斷運算符棧是否為空if(s.top=-1)

22、return 1;else return 0;void calculator:push1(save1 &s,double num)/將數(shù)據(jù)壓入數(shù)字棧if(s.top=MAX-1)cout<<"棧已滿 "elses.top+;s.ns.top=num;void calculator:push2(save2 &s,char op)/將運算符壓入運算符棧if(s.top=MAX-1)cout<<"棧已滿"elses.top+;s.ns.top=op;void calculator:pop1(save1 &s,do

23、uble &num)/將棧頂?shù)臄?shù)據(jù)元素取出,存放在num中if(s.top=-1)cout<<"棧為空"<<endl;else num=s.ns.top;s.top-;void calculator:pop2(save2 &s,char &op)/將棧頂?shù)倪\算符取出,存放在op中if(s.top=-1)cout<<"棧為空"<<endl;else op=s.ns.top;s.top-;int calculator:in(char op)/在棧內(nèi)優(yōu)先級的判斷if(op='-&#

24、39;|op='+')return 2;else if(op='*'|op='/')return 4;else return -1;int calculator:out(char op)/早棧外優(yōu)先級的判斷if(op='-'|op='+')return 1;else if(op='*'|op='/')return 3;else return -1;void calculator:count(double a,char op,double b)/進行計算并將所得的結(jié)果壓入棧頂doubl

25、e sum;switch(op)case '+':sum=a+b;break;case '-':sum=a-b;break;case '*':sum=a*b;break;case '/':sum=a/b;break;default:break;push1(stack1,sum);void calculator:cal(void)int i=0,j;double a,b,c;char expressionMAX,operate,temp20;cout<<"請輸入表達(dá)式(輸完之后請加=):"cin>

26、;>expression;stack1.top=-1;/清空數(shù)字棧stack2.top=-1;/清空運算符棧while(expressioni!='=')/以=號結(jié)尾if(isdigit(expressioni)/*若讀入的字符為數(shù)字,則繼續(xù)判斷下一個字符,直到下個字符不是數(shù)字或者不是小數(shù)點,即可保證該操作數(shù)是完整的小數(shù),然后將該數(shù)入操作數(shù)棧*/j=0;while(isdigit(expressioni)|expressioni='.')tempj+=expressioni;i+;tempj='0'c=atof(temp);/char類型進行轉(zhuǎn)換push1(stack1,c);elseif(expressioni='-'|expressioni='+'|expressioni='*'|expressioni='/')/若讀入的字符為運算符的情況if(in(stack2.nstack2.top)<out(expressioni)|stack2empty(stack2)/讀入的運算符與運算符棧頂元素相比,并進行相應(yīng)的操作push2(stack2,expressioni);i+;else pop1(stack1,a);pop1(stack1,b);pop2(

溫馨提示

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

評論

0/150

提交評論