計(jì)算器 c語(yǔ)言課程設(shè)計(jì)_第1頁(yè)
計(jì)算器 c語(yǔ)言課程設(shè)計(jì)_第2頁(yè)
計(jì)算器 c語(yǔ)言課程設(shè)計(jì)_第3頁(yè)
計(jì)算器 c語(yǔ)言課程設(shè)計(jì)_第4頁(yè)
計(jì)算器 c語(yǔ)言課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選設(shè)計(jì)分析: 我做的是一個(gè)計(jì)算器程序,屬于B級(jí)。題目要求如下: 1、完善計(jì)算器程序,改為可對(duì)實(shí)數(shù)操作。 2、完善程序,改為多個(gè)操作數(shù)基本四則運(yùn)算,遇到z為止。 3、增加函數(shù),完成四則混合運(yùn)算,增加相應(yīng)的主菜單選項(xiàng) 4、添加語(yǔ)句,使四則運(yùn)算具有測(cè)試功能。 5、可擴(kuò)充其功能。 所給的計(jì)算器源程序中已有基本的加、減、乘、除和開方運(yùn)算,我所要做的就是添加一個(gè)可以進(jìn)行四則混合運(yùn)算功能的類。 本程序所要用到的頭文件有如下幾種: process,iostream,conio,stdlib,math和assert. 原程序中已經(jīng)定義了加、減、乘、除和開方的運(yùn)算,它用了類oopcalc將這幾個(gè)基本運(yùn)算進(jìn)行封裝

2、。類中包含以下幾個(gè)函數(shù): void calcadd(); void calcsub(); void calcdiv(); void calcmult(); void calcfartocel(); void calcceltofar(); void calcsroot(); void exitprog(); void menu(); void badinput(); 每個(gè)函數(shù)的參數(shù)形式如下: int add(float x,float y); int sub(float x, float y); int div(float x, float y); int mult(float x, floa

3、t y); int fartocel(float x); int celtofar(float x); int sqroot(float x); 原程序?qū)@幾個(gè)函數(shù)分別做了如下定義: int oopcalc:add(float x, float y) val = x + y; return val; int oopcalc:sub(float x,float y) val = x - y; return val; int oopcalc:div(float x, float y) val = x / y; return val; int oopcalc:mult(float x, float

4、y) val = x * y; return val; int oopcalc:fartocel(float x) int cel = (x - 32) * 5) / 9; return cel; int oopcalc:celtofar(float x) int f; f = x * 9 / 5 + 32; return f; int oopcalc:sqroot(float x) int g = sqrt(x); return g; 首先要把程序改為可對(duì)實(shí)數(shù)進(jìn)行操作,由于原程序中的操作數(shù)類型都是整形,因此我所接受的方法就是把“int”依次改成“float”。這是最簡(jiǎn)潔的修改方法,也是最有效

5、的修改方法。 在menu()函數(shù)中使用了 switch()語(yǔ)句來對(duì)功能進(jìn)行選擇,以便于操作。不同的數(shù)字則對(duì)應(yīng)不同的功能。 下面所要進(jìn)行的修改就是添加四則運(yùn)算功能。 首先在switch()語(yǔ)句中添加一個(gè)新的選項(xiàng),以用于作為進(jìn)行四則運(yùn)算的入口。然后設(shè)計(jì)一個(gè)簡(jiǎn)潔的計(jì)算器類,增加四則運(yùn)算功能。 簡(jiǎn)潔的運(yùn)算只要求有兩個(gè)操作數(shù),如原程序中的加、減、乘除。而所增加的四則運(yùn)算則要求輸入多個(gè)操作數(shù),有計(jì)算機(jī)自己通過程序來解決多個(gè)數(shù)字的運(yùn)算。這就要求設(shè)計(jì)的程序能夠自動(dòng)辨別“+”,“-”,“*”,“/”的優(yōu)先級(jí)和結(jié)合性。在這里,我運(yùn)用了棧的功能進(jìn)行對(duì)程序的修改。 設(shè)有表達(dá)式: a+b*c-d/e= 為實(shí)現(xiàn)運(yùn)算符的優(yōu)

6、先級(jí),接受兩個(gè)棧:一個(gè)數(shù)棧,一個(gè)運(yùn)算符棧。數(shù)棧臨時(shí)存放操作數(shù),運(yùn)算符棧臨時(shí)存放運(yùn)算符。從左向右掃描算術(shù)表達(dá)式,遇到操作數(shù),壓入數(shù)棧;遇到運(yùn)算符,則與運(yùn)算符棧棧頂?shù)倪\(yùn)算符比較優(yōu)先級(jí)。若新的運(yùn)算符優(yōu)先級(jí)高或運(yùn)算符???,則壓棧;否則,將棧頂運(yùn)算符出棧,與數(shù)字棧出棧的兩個(gè)數(shù)據(jù)進(jìn)行運(yùn)算,結(jié)果壓入數(shù)棧,再將新運(yùn)算符壓棧。連續(xù)掃描,直到遇到=號(hào),掃描結(jié)束。棧中數(shù)據(jù)連續(xù)按前面規(guī)章出棧。上面所列表達(dá)式運(yùn)算過程如下圖所示: (A) (B) (C) (D) (E) N O N O N O N O N O - - - - - - - - - - - - - - - - - - - - - - > e - -&g

7、t; - - -> - - -> - - c - b*c->t1 d / d/e->t2 t2 - t1-t2->t3 - - a+t3->t4 - - b * t1 _ t1 _ t3 - - - a + a + a + a + - - 首先a入數(shù)棧,“+”入運(yùn)算符棧,b入數(shù)棧,“*”入運(yùn)算符棧,c入數(shù)棧,見圖(A);再掃描到“-”號(hào),則“*”和c、b出棧,b*c得t1壓入數(shù)棧,“-”號(hào)壓入運(yùn)算符棧,“/號(hào)壓入運(yùn)算符棧,e壓入數(shù)棧,遇到=,掃描結(jié)束,見圖(B);”/“號(hào)彈出運(yùn)算符棧,e、d彈出數(shù)棧,d/e得t2壓數(shù)棧,見圖C;”-“號(hào)出棧,t2、t1出棧,

8、t1-t2得t3、t4壓棧,見圖(D);”+“號(hào)出棧,t3、a出棧,棧全空,a+t3得t4,即運(yùn)算結(jié)果。增加四則混合運(yùn)算的功能要解決的問題是怎樣使計(jì)算機(jī)能辨別出運(yùn)算符的優(yōu)先級(jí)。這里我想到了我們上課學(xué)的棧和鏈表的學(xué)問這題我用到了鏈棧。首先建立一個(gè)鏈棧的類模板和一個(gè)結(jié)點(diǎn)鏈表。template<typename T>class Stack;這一行是類結(jié)點(diǎn)的聲明。由于在類中也同樣遵循“先聲明后使用”的原則。 template<typename T>class Node T info;Node<T>*link;public:Node(T data=0,Node<

9、T>*next=NULL)info=data;link=next;friend class Stack<T>這一段是結(jié)點(diǎn)模板的定義。Info是結(jié)點(diǎn),“Node<T>*link”是定義了一個(gè)結(jié)點(diǎn)指針。“friend class Stack<T>”定義了類Node的友元函數(shù)Stack。“info=data;”設(shè)置第一個(gè)接點(diǎn)的值,“l(fā)ink=next;”把下一個(gè)指針的值賦給link指針。template<typename T>class Stack Node<T>*top; public:Stack()top=NULL;Stack()

10、;void Push(const T &data); T Pop(); T GetTop(); void MakeEmpty(); bool IsEmpty()return top=NULL;這一段是類模板的定義。其中“Node<t>*top”是棧頂指針的定義?!癝tack()”是類的構(gòu)造函數(shù),在構(gòu)造函數(shù)中把棧頂指針指向NULL.“Stack()”是析構(gòu)函數(shù)。“void Push(const T &data)”是用于壓棧的函數(shù)?!癟 Pop()”是用于將數(shù)據(jù)彈出棧的函數(shù)?!癟 GetTop()”是用于取棧頂元素的函數(shù)?!皏oid Makeempty()”是用于將棧中

11、的元素清空的函數(shù)。template<typename T>void Stack<T>:MakeEmpty()Node<T>*temp;while(top!=NULL)temp=top;top=top->link;delete temp;這一段是對(duì)清空鏈表的函數(shù)進(jìn)行定義。設(shè)置了一個(gè)指針temp,當(dāng)頭結(jié)點(diǎn)不等于NULL是進(jìn)行while循環(huán)。循環(huán)是將頭結(jié)點(diǎn)的值賦給temp,再把頭結(jié)點(diǎn)的指針指向下一個(gè)結(jié)點(diǎn)。template<typename T>void Stack<T>:Push(const T &data)top=new N

12、ode<T>(data,top); 鏈棧向前生成,新壓棧的結(jié)點(diǎn)在鏈棧頭template<typename T>T Stack<T>:Pop()assert(!IsEmpty();Node<T> *temp=top;T data=temp->info;top=top->link; delete temp; return data; 這是對(duì)彈出函數(shù)的定義?!皌op=top->link;” 丟棄棧頂結(jié)點(diǎn)?!癲elete temp; ”釋放棧頂結(jié)點(diǎn)?!皉eturn data; ”返回棧頂數(shù)據(jù)。class Calculator Stack

13、<int> Nstack;Stack<char> Ostack;public:Calculator(void);void Cal(void); /計(jì)算器運(yùn)算程序void GetTowNum(int &Num1,int&Num2);void Compute(char Opr);void Clear(void);這是簡(jiǎn)潔計(jì)算器的類定義。在這個(gè)類里,將鏈棧Nstack和Ostack都定義為了私有函數(shù),還聲明白一個(gè)構(gòu)造函數(shù)“Calculator(void);”?!皏oid Clear(void);”是用于清空計(jì)算器數(shù)據(jù)的函數(shù),其中分別調(diào)用了“Nstack.Mak

14、eEmpty();”和“Ostack.MakeEmpty();”?!皏oid GetTowNum(int &Num1,int&Num2);”定義了兩個(gè)數(shù)字Num1和Num2,調(diào)用了函數(shù)“Nstack.Pop();”?!皏oid Compute(char Opr);”則定義了各種運(yùn)算符的計(jì)算,這些運(yùn)算符是“+”、“-”、“*”、“/”和“=”。“void Cal(void);”是簡(jiǎn)易的計(jì)算器程序,定義如下:void Calculator:Cal()cout<<"進(jìn)行四則運(yùn)算:"<<endl;bool b1=true,b2=true; /

15、用布爾型定義兩個(gè)變量char ch1,ch2,str50; /定義了三個(gè)字符型變量int k=-1;while(b2) /while循環(huán)cin>>ch1;if(ch1>='0'&&ch1<='9') /推斷ch1是否滿足條件k+; /k自增strk=ch1; /數(shù)字字符添入串中elseif(k>=0)strk+1='0' /數(shù)字串生成Nstack.Push(atoi(str); /數(shù)字串轉(zhuǎn)換為整數(shù)后壓棧k=-1;switch(ch1) /用switch語(yǔ)句對(duì)不同的運(yùn)算符進(jìn)行定義case'c&#

16、39;:Clear(); /清空棧break;case'+':case'-':while(!Ostack.IsEmpty()ch2=Ostack.Pop(); /不會(huì)有比+、-優(yōu)先級(jí)低的Compute(ch2);Ostack.Push(ch1);break;case'*':case'/':while(!Ostack.IsEmpty()&&b1)ch2=Ostack.Pop(); /彈出棧頂運(yùn)算符if(ch2='*'|ch2='/') /比較優(yōu)先級(jí)Compute(ch2); /新的優(yōu)先

17、級(jí)并不高else /新的優(yōu)先級(jí)高Ostack.Push(ch2); /先把原棧中的運(yùn)算符壓回去b1=false;Ostack.Push(ch1); /再把新的運(yùn)算符壓棧b1=true; /此句保證乘除從左到右進(jìn)行break;case'=':while(!Ostack.IsEmpty()ch2=Ostack.Pop();Compute(ch2);Compute(ch1);break;if(ch1='z')b2=false; /當(dāng)輸入z時(shí)結(jié)束程序在Menu函數(shù)中也用了switch函數(shù)來把所選菜單項(xiàng)和對(duì)應(yīng)的函數(shù)聯(lián)系起來。比如在操作時(shí)選了“3”,則對(duì)應(yīng)的調(diào)用除法函數(shù)calcdiv() ,其他的運(yùn)算符也是一樣。void main()oopcalc s; s.menu();Calculator p;主函數(shù)很簡(jiǎn)潔,只定義了一個(gè)類oopcalc的對(duì)象s和類Calcu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論