自製簡單計算器

2022-03-24 02:43:37 字數 3688 閱讀 2293

好多次想學習c++,但都是望而卻步。這次因為專業方向原因(數字影象處理),不得不走上學習c++的道路上。網上找了些c++的推薦書籍,入門的大多都是《c++程式語言》、《c++ primer》,《c++ primer plus》。這3本書都找來看,但是都沒有看完,都是看到型別部分就放棄了。網上推薦的看不了,就自個在圖書館尋尋覓覓,偶然找到了《c++ in action 》,大致翻看了下,沒有用幾章介紹型別,就它了。新學期第一周,把第一部分語言的基礎看完了,這裡就著書中計算器的例子做個總結。

計算器基於堆疊,接受使用者數字和運算符號的輸入。輸入數字則儲存在棧中,如果是運算符號則彈出棧中數字進行運算。計算器實現的是字尾表示式(posfix notation)的運算,不需要小括號輸入。

計算器的頂級物件當然是計算器本身,儲存輸入的數字並進行運算。輸入的數字需要儲存在棧中,並且每次運算完成後需要遍歷棧中元素,所以需要乙個棧及棧的訪問器。另外用於的輸入獨立於計算器,這就需要乙個輸入物件獲取使用者的輸入。

棧的實現是基於陣列的。其定義如下:

1:  

const

int maxstack = 16 ;

2:
3:  

class lstack

4:
10:
11:  

int pop();

12:  

void push(int i);

13:  

bool isfull() ;

14:  

bool ieempty() ;

15:  

private:

16:  

int top ;

17:  

int arr[maxstack] ;

18:  };
利用陣列arr儲存棧中元素,成員top作為指向棧頂的指標。其實現**還是很簡單的,這裡就不貼出具體**了。

訪問器逐個返回棧中的元素,需要訪問棧的私有成員,作為棧的友元出現。其定義:

1:  

class lstackseq

2:  ;
icur指向當前訪問的元素,advance用來移動icur實現元素遍歷,atend判斷是否遍歷完了,getnum取得當前元素的值。

實現了訪問器後,對棧中元素的遍歷就很方便了。

1:  

for(lstackseq seq(stack) ; !seq.atend() ; seq.advance())

2:          std::cout << seq.getnum() << std::endl ;
從標準輸入cin讀取字元到緩衝器,並且根據輸入的第乙個字元來判斷輸入的類別。輸入token可以分為三類:數字、運算子、非法字元。其定義如下:

1:  

const

int maxbuf = 16;

2:
3:  

//3種token型別:數字、運算子、非法字元

4:  

const

int number = 1 ;

5:  

const

int error = 2 ;

6:
7:  

class input

8:
13:  

//將字元轉換為數字

14:  

int tonumber() const ;

15:  

private:

16:  

int token ;

17:  

char buffer[maxbuf] ;

18:  };
建構函式input根據使用者輸入判斷輸入字元的類別設定token的值。如果輸入是運算子,則token直接等於輸入字元,並可以通過token()訪問;輸入是數字,則設定token值number,可以呼叫tonumber將該類輸入轉換為數字;還允許輸入負數,當輸入第乙個字元是『-』時,判斷輸入的第二個字元是否是數字。具體實現:
1:  input::input()
2:
18:  

else

19:          token = error ;
20:  }
21:
22:  

int input::tonumber() const

23:
從input獲取使用者輸入,實現計算功能。如果得到的輸入型別是數字,則將其壓入到棧中;輸入是運算子,則彈出棧中元素進行運算。定義:

1:  

class calculator

2:
6:  

private:

7:      lstack stack ;
8:  

int calcu(int n1,int n2,int token) const ;

9:  };
execute從input獲取使用者輸入,並決定是將輸入壓入到棧中,還是彈出棧中元素並呼叫calcu方法完成計算。

1:  

bool calculator::execute(input const & input)

2:
10:  

else

if (token == number)

11:
16:          stack.push(input.tonumber());
17:          status = true ;
18:      }
19:  

else

20:
26:  

else

27:
38:      }
39:
40:  

return status ;

41:  }
42:
43:  

int calculator::calcu(int n1,int n2,int token) const

44:
59:  

else

60:
63:      }
64:
65:  

return result ;

66:  }
測試**就不貼出了,其執行結果:

計算器接受的輸入是字尾表示式,是很不方便的,可在input中新增乙個轉換,將輸入的中綴表示式轉換為字尾表示式後再進行計算。

簡單計算器

unit unit1 inte ce uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,stdctrls,buttons,math math是數 算單元 type tform1 class ...

簡單計算器

a 簡單計算器 crawling in process.crawling failed time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 讀入乙個只包含 的非負整數計算表示...

簡單計算器

問題描述 乙個最簡單的計算器,支援 四種運算。僅需考慮輸入輸出為整數的情況,資料和運算結果不會超過int表示的範圍。輸入 輸入只有一行,共有三個引數,其中第1 2個引數為整數,第3個引數為操作符 輸出 輸出只有一行,乙個整數,為運算結果。然而 1.如果出現除數為0的情況,則輸出 divided by...