王彩霞
摘要:隨著生活的便捷化,計算器成為日常生活中必不可少的工具,它可以讓人們輕松的獲得計算結(jié)果,縮短計算時間,提高計算效率,降低勞動強度。目前,很多計算器帶有許多復雜函數(shù)的強大功能,卻缺少最基本的帶括號和識別運算符優(yōu)先級的功能,該文利用堆棧和數(shù)組,設計一種帶有括號和優(yōu)先級的四則混合運算計算器,并基于C#語言,實現(xiàn)該計算器的主要功能。
關(guān)鍵詞:計算器;優(yōu)先級;括號
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)16-3798-04
Abstract: With the convenience of life, calculator become an indispensable tool in our daily life, which can make people easily get calculated results, shorten the time of calculation to improve the computational efficiency and reduce labor intensity. At present some calculators own many powerful features such as complex functions, but they are lacking in the most basic “with brackets” identification and operation with different priorities. In this paper, it will show you through using the stack and array to design the mixed computing calculator, which has some core features of “calculation with brackets and priorities”, based on C Sharp language.
Key words: calculator; priority; bracket
1 功能描述
目前,隨著智能手機的普及,幾乎人手一部智能手機,而幾乎每部手機上都自帶計算器功能。計算器成為人們生活中不可或缺的計算工具,它具有快速計算加、減、乘、除的能力,科學計算器還具有各種強大的函數(shù)功能,而往往日常生活中我們并不需要計算各種復雜的函數(shù),我們只需要計算帶括號具有優(yōu)先級別的表達式,如果用這種計算器計算該表達式,要先把乘除算出結(jié)果,然后再做加減[1]。試想,能不能有一種更好的計算器,可以識別括號和運算符的優(yōu)先級,能直接計算帶括號的表達式呢?基于此,該文設計并實現(xiàn)一種帶括號、可識別運算符優(yōu)先級、并能完成加、減、乘、除運算的計算器。
2 界面設計和屬性設置
1)打開VS 2008開發(fā)工具,新建一個Windows應用程序,命名為Calculator,其屬性設置為:Text:計算器 ;StartPosition:CenterScreen ;MaximizeBox:False ;AutoSizeMode:GrowAndShrink。
2)在窗體上依次拖放2個TextBox,Name分別為txtInput、txtOutput,Multiline均為True。
3)在窗體上依次拖放19個Button控件,button1— button19的Name屬性分別為:btn1、btn2、btn3、btn4、btn5、btn6、btn7、btn8、btn9、btn0、btnDot、btnLeftBracket、btnRightBracket、btnAdd、btnSub、btnMul、btnDiv、btnClear、btnEql。他們的Text屬性分別為:1、2、3、4、5、6、7、8、9、0、·、(、)、+、-、*、/。如圖1所示(設置好屬性后)。
3 算法分析
1) 數(shù)字按鈕事件函數(shù),即文中digitalButtonDown()函數(shù)
因為按鈕0到9都是用來在文本框里輸入數(shù)字文本的,其事件都相同,只是事件內(nèi)的文本內(nèi)容不同,故可以統(tǒng)一來處理。先定義一個Input()函數(shù),用來在文本框內(nèi)輸入文本,再定義digitalButtonDown()函數(shù),用來統(tǒng)一處理數(shù)字按鈕事件,同時將digitalButtonDown()分別綁定到各按鈕的MouseDown()事件下。
2) 中綴表達式轉(zhuǎn)化為后綴表達式,即文中的InfixToSuffix()函數(shù):
計算帶括號的式子,關(guān)鍵是要遵循四則混合運算法則:先乘除后加減,有括號要先計算括號內(nèi)表達式,括號里的表達式也要遵循這一原則[2]。怎么實現(xiàn)先乘除后加減呢?這就要先定義操作符的優(yōu)先級,乘除的優(yōu)先級高于加減,而低于括號。為此,我們設計一個堆棧stack3]和兩個數(shù)組pre、later,數(shù)組pre用來暫存中綴表達式,stack用來暫存操作符優(yōu)先級數(shù),數(shù)組later用來暫存操作數(shù)或中間結(jié)果。通過以下算法,把中綴表達式轉(zhuǎn)化為后綴表達式[4],算法如下:將輸入文本框中待計算的數(shù)字和運算符加入數(shù)組pre,逐個掃描數(shù)組pre,若
① 數(shù)組元素pre是數(shù)字時,直接加入數(shù)組later中。
②數(shù)組元素pre是+-*/運算符時,比較該元素和棧stack頂部的元素的優(yōu)先級:當棧頂元素的優(yōu)先級大于等于該元素的優(yōu)先級時,將棧頂元素彈出加入數(shù)組later中,循環(huán)執(zhí)行這一步驟,直到棧頂元素的優(yōu)先級小于該元素的優(yōu)先級,此時將該元素加入數(shù)組later中。
③ 數(shù)組元素pre是"("時,直接壓入棧stack。
④ 數(shù)組元素pre是")"時,將棧stack里的元素循環(huán)彈出,彈出的元素加入定義的數(shù)組later,直到遇見元素"(",注意:循環(huán)結(jié)束后將stack中的"("也彈出,但不加入數(shù)組later中。
最后得到的數(shù)組later就是后綴表達式。
3) 計算后綴表達式,即文中的Calculate()函數(shù):
① 數(shù)組later元素是數(shù)字,直接加入另外定義的棧stack1中。
② 若是運算符,取出stack1中棧頂?shù)膬蓚€數(shù),進行相應的操作,即若運算符是+,就讓兩數(shù)相加,相加結(jié)果加入棧stack1中。循環(huán)執(zhí)行這一步驟,直到later中元素全取出。最后stack1.pop()彈出計算結(jié)果。
4) 操作符函數(shù),即文中Operator()函數(shù)
由于執(zhí)行兩個數(shù)的加、減、乘、除運算,操作數(shù)個數(shù)相同,只是操作符不一樣,故定義一個操作符函數(shù)Operator(),方便加、減、乘、除運算。
4 代碼編寫
本程序需要用到一些公共變量,例如用來接收操作數(shù)、中間結(jié)果、運算結(jié)果,判斷輸入的是否為括號等,因此首先在代碼的通用段聲明以下變量:
6 總結(jié)
本文通過對計算器功能的描述,設計計算器的界面,并用C#語言來實現(xiàn)帶括號和優(yōu)先級別功能的計算器,該計算器為計算帶括號的表達式提供了方便,若在此基礎上添加一些功能函數(shù),會是一種非常實用的科學計算器。
參考文獻:
[1] 任凱.基于JAVA 的簡單計算器的設計與實現(xiàn)[J].電腦知識與技術(shù),2011,7(15):3566-3567.
[2] 楊建武,李蓉.基于編譯原理的表達式計算器設計[J].現(xiàn)代計算機,2009(7):151-153.
[3] 張鐘用VC++ 6實現(xiàn)計算器具有優(yōu)先功能[J].電腦編程技巧與維護,2009(3):17-19.
[4] 中綴表達式轉(zhuǎn)后綴表達式[EB/OL].http://blog.csdn.net/antineutrino/article/details/6763722.endprint
摘要:隨著生活的便捷化,計算器成為日常生活中必不可少的工具,它可以讓人們輕松的獲得計算結(jié)果,縮短計算時間,提高計算效率,降低勞動強度。目前,很多計算器帶有許多復雜函數(shù)的強大功能,卻缺少最基本的帶括號和識別運算符優(yōu)先級的功能,該文利用堆棧和數(shù)組,設計一種帶有括號和優(yōu)先級的四則混合運算計算器,并基于C#語言,實現(xiàn)該計算器的主要功能。
關(guān)鍵詞:計算器;優(yōu)先級;括號
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)16-3798-04
Abstract: With the convenience of life, calculator become an indispensable tool in our daily life, which can make people easily get calculated results, shorten the time of calculation to improve the computational efficiency and reduce labor intensity. At present some calculators own many powerful features such as complex functions, but they are lacking in the most basic “with brackets” identification and operation with different priorities. In this paper, it will show you through using the stack and array to design the mixed computing calculator, which has some core features of “calculation with brackets and priorities”, based on C Sharp language.
Key words: calculator; priority; bracket
1 功能描述
目前,隨著智能手機的普及,幾乎人手一部智能手機,而幾乎每部手機上都自帶計算器功能。計算器成為人們生活中不可或缺的計算工具,它具有快速計算加、減、乘、除的能力,科學計算器還具有各種強大的函數(shù)功能,而往往日常生活中我們并不需要計算各種復雜的函數(shù),我們只需要計算帶括號具有優(yōu)先級別的表達式,如果用這種計算器計算該表達式,要先把乘除算出結(jié)果,然后再做加減[1]。試想,能不能有一種更好的計算器,可以識別括號和運算符的優(yōu)先級,能直接計算帶括號的表達式呢?基于此,該文設計并實現(xiàn)一種帶括號、可識別運算符優(yōu)先級、并能完成加、減、乘、除運算的計算器。
2 界面設計和屬性設置
1)打開VS 2008開發(fā)工具,新建一個Windows應用程序,命名為Calculator,其屬性設置為:Text:計算器 ;StartPosition:CenterScreen ;MaximizeBox:False ;AutoSizeMode:GrowAndShrink。
2)在窗體上依次拖放2個TextBox,Name分別為txtInput、txtOutput,Multiline均為True。
3)在窗體上依次拖放19個Button控件,button1— button19的Name屬性分別為:btn1、btn2、btn3、btn4、btn5、btn6、btn7、btn8、btn9、btn0、btnDot、btnLeftBracket、btnRightBracket、btnAdd、btnSub、btnMul、btnDiv、btnClear、btnEql。他們的Text屬性分別為:1、2、3、4、5、6、7、8、9、0、·、(、)、+、-、*、/。如圖1所示(設置好屬性后)。
3 算法分析
1) 數(shù)字按鈕事件函數(shù),即文中digitalButtonDown()函數(shù)
因為按鈕0到9都是用來在文本框里輸入數(shù)字文本的,其事件都相同,只是事件內(nèi)的文本內(nèi)容不同,故可以統(tǒng)一來處理。先定義一個Input()函數(shù),用來在文本框內(nèi)輸入文本,再定義digitalButtonDown()函數(shù),用來統(tǒng)一處理數(shù)字按鈕事件,同時將digitalButtonDown()分別綁定到各按鈕的MouseDown()事件下。
2) 中綴表達式轉(zhuǎn)化為后綴表達式,即文中的InfixToSuffix()函數(shù):
計算帶括號的式子,關(guān)鍵是要遵循四則混合運算法則:先乘除后加減,有括號要先計算括號內(nèi)表達式,括號里的表達式也要遵循這一原則[2]。怎么實現(xiàn)先乘除后加減呢?這就要先定義操作符的優(yōu)先級,乘除的優(yōu)先級高于加減,而低于括號。為此,我們設計一個堆棧stack3]和兩個數(shù)組pre、later,數(shù)組pre用來暫存中綴表達式,stack用來暫存操作符優(yōu)先級數(shù),數(shù)組later用來暫存操作數(shù)或中間結(jié)果。通過以下算法,把中綴表達式轉(zhuǎn)化為后綴表達式[4],算法如下:將輸入文本框中待計算的數(shù)字和運算符加入數(shù)組pre,逐個掃描數(shù)組pre,若
① 數(shù)組元素pre是數(shù)字時,直接加入數(shù)組later中。
②數(shù)組元素pre是+-*/運算符時,比較該元素和棧stack頂部的元素的優(yōu)先級:當棧頂元素的優(yōu)先級大于等于該元素的優(yōu)先級時,將棧頂元素彈出加入數(shù)組later中,循環(huán)執(zhí)行這一步驟,直到棧頂元素的優(yōu)先級小于該元素的優(yōu)先級,此時將該元素加入數(shù)組later中。
③ 數(shù)組元素pre是"("時,直接壓入棧stack。
④ 數(shù)組元素pre是")"時,將棧stack里的元素循環(huán)彈出,彈出的元素加入定義的數(shù)組later,直到遇見元素"(",注意:循環(huán)結(jié)束后將stack中的"("也彈出,但不加入數(shù)組later中。
最后得到的數(shù)組later就是后綴表達式。
3) 計算后綴表達式,即文中的Calculate()函數(shù):
① 數(shù)組later元素是數(shù)字,直接加入另外定義的棧stack1中。
② 若是運算符,取出stack1中棧頂?shù)膬蓚€數(shù),進行相應的操作,即若運算符是+,就讓兩數(shù)相加,相加結(jié)果加入棧stack1中。循環(huán)執(zhí)行這一步驟,直到later中元素全取出。最后stack1.pop()彈出計算結(jié)果。
4) 操作符函數(shù),即文中Operator()函數(shù)
由于執(zhí)行兩個數(shù)的加、減、乘、除運算,操作數(shù)個數(shù)相同,只是操作符不一樣,故定義一個操作符函數(shù)Operator(),方便加、減、乘、除運算。
4 代碼編寫
本程序需要用到一些公共變量,例如用來接收操作數(shù)、中間結(jié)果、運算結(jié)果,判斷輸入的是否為括號等,因此首先在代碼的通用段聲明以下變量:
6 總結(jié)
本文通過對計算器功能的描述,設計計算器的界面,并用C#語言來實現(xiàn)帶括號和優(yōu)先級別功能的計算器,該計算器為計算帶括號的表達式提供了方便,若在此基礎上添加一些功能函數(shù),會是一種非常實用的科學計算器。
參考文獻:
[1] 任凱.基于JAVA 的簡單計算器的設計與實現(xiàn)[J].電腦知識與技術(shù),2011,7(15):3566-3567.
[2] 楊建武,李蓉.基于編譯原理的表達式計算器設計[J].現(xiàn)代計算機,2009(7):151-153.
[3] 張鐘用VC++ 6實現(xiàn)計算器具有優(yōu)先功能[J].電腦編程技巧與維護,2009(3):17-19.
[4] 中綴表達式轉(zhuǎn)后綴表達式[EB/OL].http://blog.csdn.net/antineutrino/article/details/6763722.endprint
摘要:隨著生活的便捷化,計算器成為日常生活中必不可少的工具,它可以讓人們輕松的獲得計算結(jié)果,縮短計算時間,提高計算效率,降低勞動強度。目前,很多計算器帶有許多復雜函數(shù)的強大功能,卻缺少最基本的帶括號和識別運算符優(yōu)先級的功能,該文利用堆棧和數(shù)組,設計一種帶有括號和優(yōu)先級的四則混合運算計算器,并基于C#語言,實現(xiàn)該計算器的主要功能。
關(guān)鍵詞:計算器;優(yōu)先級;括號
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)16-3798-04
Abstract: With the convenience of life, calculator become an indispensable tool in our daily life, which can make people easily get calculated results, shorten the time of calculation to improve the computational efficiency and reduce labor intensity. At present some calculators own many powerful features such as complex functions, but they are lacking in the most basic “with brackets” identification and operation with different priorities. In this paper, it will show you through using the stack and array to design the mixed computing calculator, which has some core features of “calculation with brackets and priorities”, based on C Sharp language.
Key words: calculator; priority; bracket
1 功能描述
目前,隨著智能手機的普及,幾乎人手一部智能手機,而幾乎每部手機上都自帶計算器功能。計算器成為人們生活中不可或缺的計算工具,它具有快速計算加、減、乘、除的能力,科學計算器還具有各種強大的函數(shù)功能,而往往日常生活中我們并不需要計算各種復雜的函數(shù),我們只需要計算帶括號具有優(yōu)先級別的表達式,如果用這種計算器計算該表達式,要先把乘除算出結(jié)果,然后再做加減[1]。試想,能不能有一種更好的計算器,可以識別括號和運算符的優(yōu)先級,能直接計算帶括號的表達式呢?基于此,該文設計并實現(xiàn)一種帶括號、可識別運算符優(yōu)先級、并能完成加、減、乘、除運算的計算器。
2 界面設計和屬性設置
1)打開VS 2008開發(fā)工具,新建一個Windows應用程序,命名為Calculator,其屬性設置為:Text:計算器 ;StartPosition:CenterScreen ;MaximizeBox:False ;AutoSizeMode:GrowAndShrink。
2)在窗體上依次拖放2個TextBox,Name分別為txtInput、txtOutput,Multiline均為True。
3)在窗體上依次拖放19個Button控件,button1— button19的Name屬性分別為:btn1、btn2、btn3、btn4、btn5、btn6、btn7、btn8、btn9、btn0、btnDot、btnLeftBracket、btnRightBracket、btnAdd、btnSub、btnMul、btnDiv、btnClear、btnEql。他們的Text屬性分別為:1、2、3、4、5、6、7、8、9、0、·、(、)、+、-、*、/。如圖1所示(設置好屬性后)。
3 算法分析
1) 數(shù)字按鈕事件函數(shù),即文中digitalButtonDown()函數(shù)
因為按鈕0到9都是用來在文本框里輸入數(shù)字文本的,其事件都相同,只是事件內(nèi)的文本內(nèi)容不同,故可以統(tǒng)一來處理。先定義一個Input()函數(shù),用來在文本框內(nèi)輸入文本,再定義digitalButtonDown()函數(shù),用來統(tǒng)一處理數(shù)字按鈕事件,同時將digitalButtonDown()分別綁定到各按鈕的MouseDown()事件下。
2) 中綴表達式轉(zhuǎn)化為后綴表達式,即文中的InfixToSuffix()函數(shù):
計算帶括號的式子,關(guān)鍵是要遵循四則混合運算法則:先乘除后加減,有括號要先計算括號內(nèi)表達式,括號里的表達式也要遵循這一原則[2]。怎么實現(xiàn)先乘除后加減呢?這就要先定義操作符的優(yōu)先級,乘除的優(yōu)先級高于加減,而低于括號。為此,我們設計一個堆棧stack3]和兩個數(shù)組pre、later,數(shù)組pre用來暫存中綴表達式,stack用來暫存操作符優(yōu)先級數(shù),數(shù)組later用來暫存操作數(shù)或中間結(jié)果。通過以下算法,把中綴表達式轉(zhuǎn)化為后綴表達式[4],算法如下:將輸入文本框中待計算的數(shù)字和運算符加入數(shù)組pre,逐個掃描數(shù)組pre,若
① 數(shù)組元素pre是數(shù)字時,直接加入數(shù)組later中。
②數(shù)組元素pre是+-*/運算符時,比較該元素和棧stack頂部的元素的優(yōu)先級:當棧頂元素的優(yōu)先級大于等于該元素的優(yōu)先級時,將棧頂元素彈出加入數(shù)組later中,循環(huán)執(zhí)行這一步驟,直到棧頂元素的優(yōu)先級小于該元素的優(yōu)先級,此時將該元素加入數(shù)組later中。
③ 數(shù)組元素pre是"("時,直接壓入棧stack。
④ 數(shù)組元素pre是")"時,將棧stack里的元素循環(huán)彈出,彈出的元素加入定義的數(shù)組later,直到遇見元素"(",注意:循環(huán)結(jié)束后將stack中的"("也彈出,但不加入數(shù)組later中。
最后得到的數(shù)組later就是后綴表達式。
3) 計算后綴表達式,即文中的Calculate()函數(shù):
① 數(shù)組later元素是數(shù)字,直接加入另外定義的棧stack1中。
② 若是運算符,取出stack1中棧頂?shù)膬蓚€數(shù),進行相應的操作,即若運算符是+,就讓兩數(shù)相加,相加結(jié)果加入棧stack1中。循環(huán)執(zhí)行這一步驟,直到later中元素全取出。最后stack1.pop()彈出計算結(jié)果。
4) 操作符函數(shù),即文中Operator()函數(shù)
由于執(zhí)行兩個數(shù)的加、減、乘、除運算,操作數(shù)個數(shù)相同,只是操作符不一樣,故定義一個操作符函數(shù)Operator(),方便加、減、乘、除運算。
4 代碼編寫
本程序需要用到一些公共變量,例如用來接收操作數(shù)、中間結(jié)果、運算結(jié)果,判斷輸入的是否為括號等,因此首先在代碼的通用段聲明以下變量:
6 總結(jié)
本文通過對計算器功能的描述,設計計算器的界面,并用C#語言來實現(xiàn)帶括號和優(yōu)先級別功能的計算器,該計算器為計算帶括號的表達式提供了方便,若在此基礎上添加一些功能函數(shù),會是一種非常實用的科學計算器。
參考文獻:
[1] 任凱.基于JAVA 的簡單計算器的設計與實現(xiàn)[J].電腦知識與技術(shù),2011,7(15):3566-3567.
[2] 楊建武,李蓉.基于編譯原理的表達式計算器設計[J].現(xiàn)代計算機,2009(7):151-153.
[3] 張鐘用VC++ 6實現(xiàn)計算器具有優(yōu)先功能[J].電腦編程技巧與維護,2009(3):17-19.
[4] 中綴表達式轉(zhuǎn)后綴表達式[EB/OL].http://blog.csdn.net/antineutrino/article/details/6763722.endprint