在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

《Python程序設計》實驗二報告

li5236 ? 來源:博客園 ? 作者:博客園 ? 2022-03-30 15:16 ? 次閱讀

1.實驗內容

(1)設計并完成一個完整的應用程序,完成加減乘除模等運算,功能多多益善。

(2)考核基本語法、判定語句、循環語句、邏輯運算等知識點。

2. 實驗過程及結果

(1)設計思路

該實驗目標是制作一個計算器,能夠完成加減乘除、求余等運算,我選擇參考手機系統自帶的計算器進行實現。簡單的運算能夠使用運算符直接計算,開平方根等復雜運算通過Python的標準庫math實現。另一方面,使用pyqt5實現計算器的UI界面,便于用戶使用和規范用戶輸入。輸入完成后,對字符串進行識別并完成相應的計算過程。在設計階段設想能否在用戶輸入的同時處理算式,簡化代碼,但由于要給用戶提供退格功能,無法實現這個設想。于是采用了大三在編譯原理課程上學到的知識:使用符號優先表和雙棧算法來解決此問題。

(2)算法邏輯

雙棧算法,即“邊存邊看,邊走邊算”,設置符號棧和數字棧,符號棧中存儲運算符,數字棧中存儲數字。同時設置符號優先表,為所有可能出現的符號設置優先級。程序從左到右掃描算式,遇到數字則將其壓進數字棧;遇到符號則比較該符號與符號棧棧頂元素的優先級,若當前符號的優先級高,則將其壓棧,否則取數字棧棧頂元素,與符號一起完成計算,并將結果壓入數字棧。迭代整個過程,直到算式被識別完畢。

(3)主要代碼介紹

部分代碼有參考。

報告中只貼出了部分代碼,全部代碼已上傳碼云:運算部分,用戶界面部分(使用qt designer生成.ui文件,通過pyqt5庫將其轉換為.py文件)

計算函數:

完成數字、運算符彈棧后的計算操作,階乘、對數、開平方根等復雜運算通過math庫完成

import math

def calculate(operator, n1, n2=0):

“”“

:param n1: float

:param n2: float

:param operator: + - * / ^ % ! lg ln √

:return: float

”“”

if operator == “+”:

return n1 + n2

if operator == “-”:

return n1 - n2

if operator == “*”:

return n1 * n2

if operator == “/”:

return n1 / n2

if operator == ‘^’:

return n1 ** n2

if operator == ‘%’:

return n1 % n2

if operator == ‘!’:

return math.factorial(n1)

if operator == ‘lg’:

return math.log10(n1)

if operator == ‘ln’:

return math.log(n1)

if operator == ‘√’:

return math.sqrt(n1)

return 0

符號優先級判斷函數:

根據符號優先表,對比判斷當前符號與符號棧棧頂符號的優先級,對數運算與平方根運算是一元運算,因此比乘、除等二元運算優先級高。

def decision(last_op, new_op):

“”“

:param last_op: 運算符棧的最后一個運算符

:param new_op: 從算式列表取出的當前運算符

:return: 1 代表彈棧運算,0 代表彈運算符棧最后一個元素, -1 表示入棧

”“”

# 定義5種運算符級別

grade1 = [‘+’, ‘-’]

grade2 = [‘*’, ‘/’, ‘%’, ‘!’, ‘^’]

grade3 = [‘lg’, ‘ln’, ‘√’]

grade4 = [‘(’]

grade5 = [‘)’]

if last_op in grade1:

if new_op in grade2 or new_op in grade3 or new_op in grade4:

# 說明連續兩個運算優先級不一樣,需要入棧

return -1

else:

return 1

elif last_op in grade2:

if new_op in grade3 or new_op in grade4:

return -1

else:

return 1

elif last_op in grade3:

if new_op in grade4:

return -1

else:

return 1

elif last_op in grade4:

if new_op in grade5:

return 0 # ( 遇上 ) 需要彈出 (,丟掉 )

else:

return -1 # 只要棧頂元素為(,當前元素不是)都應入棧。

else:

return -1

過程函數:

實現了雙棧算法的函數,主要思路如上文所述。與二元運算不同的是,對數運算、平方根運算等一元運算只需要數字棧棧頂的一個元素即可。另外由于乘方運算的特殊性,函數中代表乘方運算的“!”符號一旦出現,就與數字棧棧頂的元素一起完成運算,并將結果壓入數字棧,即乘方運算是不進入符號棧的。

def final_calc(formula_list):

num_stack = [] # 數字棧

op_stack = [] # 運算符棧

for e in formula_list:

operator = is_operator(e)

if not operator:

# 壓入數字棧

# 字符串轉換為符點數

num_stack.append(float(e))

else:

# 如果是運算符

while True:

# 如果該運算符是“!”,則不進入符號棧,馬上算出數字棧棧頂元素的乘方,并將結果壓入數字棧

if e == ‘!’:

num1 = num_stack.pop()

num_stack.append(calculate(e, num1))

break

# 如果運算符棧等于0無條件入棧

if len(op_stack) == 0:

op_stack.append(e)

break

# decision 函數做決策

tag = decision(op_stack[-1], e)

if tag == -1:

# 如果是-1壓入運算符棧進入下一次循環

op_stack.append(e)

break

elif tag == 0:

# 如果是0彈出運算符棧內最后一個(, 丟掉當前),進入下一次循環

op_stack.pop()

break

elif tag == 1:

# 如果是1彈出運算符棧內最后兩個元素,彈出數字棧最后兩位元素。

op = op_stack.pop()

if op == ‘lg’ or op == ‘ln’ or op == ‘√’:

num1 = num_stack.pop()

num_stack.append(calculate(op, num1))

else:

num2 = num_stack.pop()

num1 = num_stack.pop()

# 執行計算

# 計算之后壓入數字棧

num_stack.append(calculate(op, num1, num2))

# 處理大循環結束后 數字棧和運算符棧中可能還有元素 的情況

while len(op_stack) != 0:

op = op_stack.pop()

if op == ‘lg’ or op == ‘ln’ or op == ‘√’:

num1 = num_stack.pop()

num_stack.append(calculate(op, num1))

else:

num2 = num_stack.pop()

num1 = num_stack.pop()

# 執行計算

# 計算之后壓入數字棧

num_stack.append(calculate(op, num1, num2))

return num_stack, op_stack

用戶界面

使用pyqt5庫和qt designer,仿照手機計算器完成的用戶界面。

class MyWindows(QtWidgets.QMainWindow, Ui_MainWindow):

def __init__(self, parent=None):

# 忽略pycharm檢測失誤導致的警告信息

# noinspection PyArgumentList

QtWidgets.QMainWindow.__init__(self, parent)

self.setupUi(self)

self.e = str(math.e)

self.pi = str(math.pi)

self.zero_button.clicked.connect(lambda: self.get_formula(‘0’))

self.one_button.clicked.connect(lambda: self.get_formula(‘1’))

self.two_button.clicked.connect(lambda: self.get_formula(‘2’))

# 共29個按鍵,隱藏部分相似代碼,全部代碼見上文中的碼云鏈接

self.clear.clicked.connect(self.clean_screen)

self.back_space.clicked.connect(self.delete_char)

self.equa_button.clicked.connect(self.get_result)

self.formula = ‘’

def set_cursor(self):

# 設置輸出框游標

self.showout.ensureCursorVisible()

cursor = self.showout.textCursor()

pos = len(self.showout.toPlainText())

cursor.setPosition(pos)

self.showout.setTextCursor(cursor)

def get_formula(self, param):

# 獲取輸入

if param == ‘lg’ or param == ‘ln’:

temp_param = param + ‘(’

elif param == ‘re’:

temp_param = ‘^(-1)’

else:

temp_param = param

self.formula += temp_param

self.showout.insertPlainText(temp_param)

self.set_cursor()

# print(self.formula)

def clean_screen(self):

# 清空輸出框

self.formula = ‘’

self.showout.clear()

self.set_cursor()

def delete_char(self):

# 退格

self.showout.ensureCursorVisible()

cursor = self.showout.textCursor()

cursor.deletePreviousChar()

self.formula = self.formula[:-1]

def get_result(self):

# 運算

formula_list = formula_format(self.formula)

# print(formula_list)

result, _ = final_calc(formula_list)

# print(result[0])

show_result = ‘=’ + str(result[0])

self.showout.append(show_result)

self.formula = ‘’

self.showout.insertPlainText(‘\n’)

self.set_cursor()

if __name__ == ‘__main__’:

app = QtWidgets.QApplication(sys.argv)

main_window = MyWindows()

main_window.setFixedSize(main_window.width(), main_window.height())

main_window.show()

sys.exit(app.exec_())

在qt designer中設計的.ui文件如下圖所示:

(4)程序結果

如下圖所示,圖片左邊為我的程序結果,右邊為手機計算器的運算結果。從兩者對比來看,本程序的運算能力有所保障。

3. 實驗過程中遇到的問題和解決過程

問題1:輸出框不能自動滾動到最底部

問題1解決方案:在博客園找到了解決方案,雖然不完全貼合我的情況,但稍加改動后就實現了想要的效果。

問題2:不知道如何實現退格功能

問題2解決方案:在一位大佬的個人博客里找到了實現的方法,在文章大概中間的位置介紹了如何實現QTextEdit的兩種刪除操作。

問題3:在pyqt5啟動的用戶界面下,程序運算出錯時進程會直接崩潰退出,且不會在cmd中trace back,給debug帶來了很多麻煩。

問題3解決方案:不要直接運行,而是使用調試模式,這樣出錯能夠看到trace back。這也提醒了我在調試程序階段不要直接運行,使用調試模式更穩妥。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 程序設計
    +關注

    關注

    3

    文章

    261

    瀏覽量

    30421
  • python
    +關注

    關注

    56

    文章

    4802

    瀏覽量

    84889
收藏 人收藏

    評論

    相關推薦

    ID讀卡器Python程序開發

    液顯ID讀卡器UDP協議開發Python程序。代碼如下: ? # pip install netifacesimport subprocessimport structimport
    的頭像 發表于 01-10 16:05 ?89次閱讀

    RK3568國產處理器實驗平臺:語音識別控制實驗

    一、實驗目的1、熟悉Qt程序的開發流程。2、掌握QtCreator的基礎開發使用。3、通過編寫Qt程序實現語音識別的顯示界面。、實驗原理Q
    的頭像 發表于 01-02 19:04 ?168次閱讀
    RK3568國產處理器<b class='flag-5'>實驗</b>平臺:語音識別控制<b class='flag-5'>實驗</b>

    國產Cortex-A55實驗箱操作案例分享:LED程序開發

    一、實驗目的(1)熟悉Qt程序的開發流程。(2)掌握QtCreator的基礎開發使用。(3)通過編寫Qt程序實現LED控制的顯示界面。、實驗
    的頭像 發表于 11-01 08:10 ?192次閱讀
    國產Cortex-A55<b class='flag-5'>實驗</b>箱操作案例分享:LED<b class='flag-5'>程序</b>開發

    第5章 MATLAB程序設計.ppt

    第5章 MATLAB程序設計
    發表于 10-24 16:40 ?0次下載

    TMS320DM6441功耗摘要應用程序報告

    電子發燒友網站提供《TMS320DM6441功耗摘要應用程序報告.pdf》資料免費下載
    發表于 10-15 11:45 ?0次下載
    TMS320DM6441功耗摘要應用<b class='flag-5'>程序</b><b class='flag-5'>報告</b>

    加法運放電路實驗報告數據分析

    加法運放電路實驗報告的數據分析主要包括對實驗結果的觀察、與理論值的對比以及誤差原因的分析。以下是一個基于常見加法運放電路實驗的數據分析示例: 一、實驗目的與原理
    的頭像 發表于 09-03 10:03 ?964次閱讀

    Python建模算法與應用

    上成為理想的腳本語言,特別適用于快速的應用程序開發。本文將詳細介紹Python在建模算法中的應用,包括常見的建模算法、Python在建模中的優勢、常用庫以及實際案例。
    的頭像 發表于 07-24 10:41 ?610次閱讀

    python訓練出的模型怎么調用

    Python中,訓練出的模型可以通過多種方式進行調用。 1. 模型保存與加載 在Python中,訓練好的模型需要被保存,以便在其他程序或會話中使用。以下是一些常用的模型保存和加載方法。 1.1
    的頭像 發表于 07-11 10:15 ?2134次閱讀

    最簡單的C程序設計

    電子發燒友網站提供《最簡單的C程序設計.pptx》資料免費下載
    發表于 05-28 16:41 ?10次下載

    算法-程序設計的靈魂

    電子發燒友網站提供《算法-程序設計的靈魂.pptx》資料免費下載
    發表于 05-28 16:39 ?3次下載

    程序設計基礎教程

    電子發燒友網站提供《程序設計基礎教程.pptx》資料免費下載
    發表于 05-28 16:37 ?1次下載

    DSP軟件 MATLAB仿真實驗報告

    電子發燒友網站提供《DSP軟件 MATLAB仿真實驗報告.pdf》資料免費下載
    發表于 03-24 09:49 ?13次下載

    愛立信消費者實驗報告發布

    近日,愛立信發布了最新一期《愛立信消費者實驗報告》,該報告首次在全球范圍內對消費者對5G固定無線接入(FWA)的看法進行了深入調查。該研究覆蓋了19個國家,代表了12億人居住區域的3.7億個家庭,為運營商提供了寶貴的洞察和策略
    的頭像 發表于 03-06 09:19 ?764次閱讀

    Python:從串口讀取數據并以16進制格式展示

    本文凌順實驗室(lingshunlab.com)簡單實現Python讀取串口數據,并且按16進制格式顯示出來。
    的頭像 發表于 03-05 14:25 ?1160次閱讀
    <b class='flag-5'>Python</b>:從串口讀取數據并以16進制格式展示

    如何使用linux下gdb來調試python程序

    如何使用linux下gdb來調試python程序? 在Linux下,可以使用GDB(GNU調試器)來調試Python程序。GDB是一個強大的調試工具,可以幫助開發者診斷和修復
    的頭像 發表于 01-31 10:41 ?2693次閱讀
    主站蜘蛛池模板: 国产日韩三级| 亚洲视频在线一区二区三区| 色批| 国产一区在线mmai| 欧美性黑人极品hd网站| 久久久这里有精品999| 老司机狠狠k免费毛片| 久久99爱爱| 天天插天天搞| 久久精品福利| 欧美小网站| 男女免费观看视频| 亚洲无线码一区在线观看| 四虎成人影院网址| 五月天亚洲| 亚洲成a人片毛片在线| 久久精品国产99精品最新| 曰本黄色一级| 男人j桶进女人j的视频| 在线免费成人| 日日噜噜噜夜夜爽爽狠狠视频| 性欧美videofree丝袜| 日韩欧免费一区二区三区| 色秀网站| 久久这里只有精品1| 免费人成观看在线网| 麒麟色欧美影院在线播放| 精品国产乱码一区二区三区| 91高清在线成人免费观看| 久久综合爱| 中文字幕亚洲一区婷婷| 一级特黄色片| 五色网| 毛片网子| 国产一级特黄一级毛片| 99精品久久久久久久婷婷| 91色多多| 国产在线免| 久久国产精品免费专区| 色老头影院| 成成人看片在线|