好多次想學習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...