(Python)計算器的設計與實現

實驗一 計算器的設計與實現

一、實驗目的與要求
實驗目的:鍛鍊可視化編程能力。
實驗要求:

  1. 熟悉VC++、Visual Studio C#或者Java編程環境。
  2. 運用面向對象程序設計知識對實驗題目進行分析和設計。
  3. 進行程序編寫和調試工作。

二、實驗內容
使用MFC框架在Visual Studio 6.0環境下(也可使用Visual Studio c#或者Java編程環境)編寫一個簡易的計算器,能實現簡單的加、減、乘、除四則運算,並加入特定的一些效果,如使計算器的顏色在紅色,綠色和藍色之間輪流變換等。完成諸如計算器對話框的創建、控件編輯、界面設計、關鍵功能的實現等工作。

三、實驗設計
本次計算機設計實驗採用python編程環境,設計分爲兩部分:
1)計算的實現 2)計算機可視化界面的實現
計算部分,採用python中自帶的eval()函數爲核心算法,原因在於eval()函數可以直接對輸入其中的字符串進行計算,確保輸入的字符串可計算即可,又採用try-except格式語句,對不能計算的情況進行處理,使其返回ERROR!
可視化界面設計部分,調用tkinter模塊,內置多項可視化組件,其中包括文本輸入框(Entry)、按鈕組件(Button)、框架(Frame)、標籤(Label)等等,引入各個組件並通過佈局函數pack()逐次調整位置,令其儘量美觀。大小方面使用expand=YES命令使用戶可以自由調整大小。計算器顏色方面以下程序中提供了三種顏色可供選擇,使用時選擇#style.configure 。。。。。的其中一個語句,將#(註釋符)去掉即可。
代碼量部分,採用python編程環境代碼量較少,僅50行(含註釋),也更美觀。

四、核心程序代碼

from tkinter import *
from tkinter.ttk import *
#將Frame的共同屬性作爲默認值,方便創建
def my_frame(master):
    w=Frame(master)
    w.pack(side=TOP,expand=YES,fill=BOTH)#expand控制fill開關,fill爲X、Y、BOTH
    return w
#將Button的共同屬性作爲默認,方便創建
def my_Button(master,text,command):
    w=Button(master,text=text,command=command,width=5)
    w.pack(side=LEFT,expand=YES,fill=BOTH,padx=2,pady=2) #padx、pady設置按鈕所佔空間格大小
    return w
#退格鍵功能設置,將數字串最末字符刪除並返回
def back(text):
    if len(text)>0:
        return text[:-1]
    else:
        return text
#利用eval函數計算表達式的值
def calc(text):
    try:
        return eval(text)   #此處爲計算器的計算語句,簡單粗暴
    except (SyntaxError,ZeroDivisionError,NameError):
        return 'ERROR!'
#計算器界面實現
wind=Tk()
wind.title('Demut-Calculator')  #標題
text=StringVar()
#創建文本框
Entry(wind,textvariable=text).pack(expand=YES,fill=BOTH,padx=3,pady=4)
#創建ttk子模塊的Style對象,設置按鈕內邊距及顏色
style=Style()
#style.configure('TButton',padding=3,background="#00FFFF",foreground="#008B8B")
#style.configure('TButton',padding=3,background="#00FFFF",foreground="#87CEFA")
style.configure('TButton',padding=3,background="#87CEFA",foreground="#DA70D6")
#創建第一行三個按鈕
my1=my_frame(wind)
Label(my_Button(my1,'Backspace',lambda t=text:t.set(back(t.get()))),style="TButton")
Label(my_Button(my1,'Clear',lambda t=text:t.set('')),style="TButton")
Label(my_Button(my1,'Inverse',lambda t=text:t.set('-('+t.get()+')')),style="TButton")
#創建其餘四行
for key in ('789/','456*','123-','0.=+'):
    my2=my_frame(wind)
    for ch in key:
        if ch =='=':
            Label(my_Button(my2,ch,lambda t=text:t.set(calc(t.get()))),style="TButton")
        else:
            Label(my_Button(my2,ch,lambda t=text,c=ch:t.set(t.get()+c)),style="TButton")

wind.mainloop()

五、實驗結果
1)測試一:(驗證+ - * / 的運算)
測試語句爲:2+3*2+6/3
測試結果如下:
運行前:

運行後:

2)測試二: (驗證帶小數點的運算)
測試語句爲:1.5+3.5
測試結果如下:
運行前:

運行後:

3)測試三: (驗證帶‘取負數操作’的運算)
測試語句爲:2+2 之後對其取負數,再+1
測試過程:
取反前:

取反後:(點擊inverse按鈕後)

+1 運算:

測試結果:

4)測試四: (驗證Backspace操作)
測試語句: 123 Backspace
測試結果:
運行前:

運行後:

5)測試五: (驗證clear操作)
測試語句: 123 Clear
測試結果:
運行前:

運行後:

6)測試六: (驗證非法語句的運算)
測試語句: 1+5*
測試結果:
運行前:

運行後:

7)測試七: (顏色變化)
測試結果:

六、實驗總結
初次接觸可視化界面的程序設計,選用python編程環境,在計算方面佔有很大的優勢,可以不用處理各個運算符的優先級順序,但在界面設計部分需要注意很多因素,包括按鈕的內外邊距、文本框組件的佈局位置、按鈕背後的函數傳參問題、非法語句的運算處理等等,因此此次實驗有效鍛鍊了使用python處理問題的能力,在查找以及使用各個模塊的同時,提高了代碼的閱讀效率以及利用率,在可視化部分自己有一個顯著的提高。
另需特別聲明:由於自身軟件問題(pycharm),缺乏相應的bg顏色更改功能,按鈕的背景顏色更改在代碼中雖有體現,在此軟件上確無法得到體現,而前景顏色可以展現出來,因此我保留了背景顏色更改語句,如有需要可運行查看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章