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

下載本文檔

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

文檔簡介

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

2、。類中包含以下幾個函數(shù): void calcadd(); void calcsub(); void calcdiv(); void calcmult(); void calcfartocel(); void calcceltofar(); void calcsroot(); void exitprog(); void menu(); void badinput(); 每個函數(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ū)@幾個函數(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; 首先要把程序改為可對實數(shù)進行操作,由于原程序中的操作數(shù)類型都是整形,因此我所接受的方法就是把“int”依次改成“float”。這是最簡潔的修改方法,也是最有效

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

6、先級,接受兩個棧:一個數(shù)棧,一個運算符棧。數(shù)棧臨時存放操作數(shù),運算符棧臨時存放運算符。從左向右掃描算術表達式,遇到操作數(shù),壓入數(shù)棧;遇到運算符,則與運算符棧棧頂?shù)倪\算符比較優(yōu)先級。若新的運算符優(yōu)先級高或運算符??眨瑒t壓棧;否則,將棧頂運算符出棧,與數(shù)字棧出棧的兩個數(shù)據(jù)進行運算,結(jié)果壓入數(shù)棧,再將新運算符壓棧。連續(xù)掃描,直到遇到=號,掃描結(jié)束。棧中數(shù)據(jù)連續(xù)按前面規(guī)章出棧。上面所列表達式運算過程如下圖所示: (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ù)棧,“+”入運算符棧,b入數(shù)棧,“*”入運算符棧,c入數(shù)棧,見圖(A);再掃描到“-”號,則“*”和c、b出棧,b*c得t1壓入數(shù)棧,“-”號壓入運算符棧,“/號壓入運算符棧,e壓入數(shù)棧,遇到=,掃描結(jié)束,見圖(B);”/“號彈出運算符棧,e、d彈出數(shù)棧,d/e得t2壓數(shù)棧,見圖C;”-“號出棧,t2、t1出棧,

8、t1-t2得t3、t4壓棧,見圖(D);”+“號出棧,t3、a出棧,棧全空,a+t3得t4,即運算結(jié)果。增加四則混合運算的功能要解決的問題是怎樣使計算機能辨別出運算符的優(yōu)先級。這里我想到了我們上課學的棧和鏈表的學問這題我用到了鏈棧。首先建立一個鏈棧的類模板和一個結(jié)點鏈表。template<typename T>class Stack;這一行是類結(jié)點的聲明。由于在類中也同樣遵循“先聲明后使用”的原則。 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é)點模板的定義。Info是結(jié)點,“Node<T>*link”是定義了一個結(jié)點指針?!癴riend class Stack<T>”定義了類Node的友元函數(shù)Stack?!癷nfo=data;”設置第一個接點的值,“l(fā)ink=next;”把下一個指針的值賦給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()”是類的構造函數(shù),在構造函數(shù)中把棧頂指針指向NULL.“Stack()”是析構函數(shù)?!皏oid Push(const T &data)”是用于壓棧的函數(shù)。“T 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;這一段是對清空鏈表的函數(shù)進行定義。設置了一個指針temp,當頭結(jié)點不等于NULL是進行while循環(huán)。循環(huán)是將頭結(jié)點的值賦給temp,再把頭結(jié)點的指針指向下一個結(jié)點。template<typename T>void Stack<T>:Push(const T &data)top=new N

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

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

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

15、用布爾型定義兩個變量char ch1,ch2,str50; /定義了三個字符型變量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語句對不同的運算符進行定義case'c&#

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

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

溫馨提示

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

評論

0/150

提交評論