91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

《Python程序設(shè)計(jì)》實(shí)驗(yàn)二報(bào)告

li5236 ? 來源:博客園 ? 作者:博客園 ? 2022-03-30 15:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.實(shí)驗(yàn)內(nèi)容

(1)設(shè)計(jì)并完成一個(gè)完整的應(yīng)用程序,完成加減乘除模等運(yùn)算,功能多多益善。

(2)考核基本語法、判定語句、循環(huán)語句、邏輯運(yùn)算等知識(shí)點(diǎn)。

2. 實(shí)驗(yàn)過程及結(jié)果

(1)設(shè)計(jì)思路

該實(shí)驗(yàn)?zāi)繕?biāo)是制作一個(gè)計(jì)算器,能夠完成加減乘除、求余等運(yùn)算,我選擇參考手機(jī)系統(tǒng)自帶的計(jì)算器進(jìn)行實(shí)現(xiàn)。簡(jiǎn)單的運(yùn)算能夠使用運(yùn)算符直接計(jì)算,開平方根等復(fù)雜運(yùn)算通過Python的標(biāo)準(zhǔn)庫math實(shí)現(xiàn)。另一方面,使用pyqt5實(shí)現(xiàn)計(jì)算器的UI界面,便于用戶使用和規(guī)范用戶輸入。輸入完成后,對(duì)字符串進(jìn)行識(shí)別并完成相應(yīng)的計(jì)算過程。在設(shè)計(jì)階段設(shè)想能否在用戶輸入的同時(shí)處理算式,簡(jiǎn)化代碼,但由于要給用戶提供退格功能,無法實(shí)現(xiàn)這個(gè)設(shè)想。于是采用了大三在編譯原理課程上學(xué)到的知識(shí):使用符號(hào)優(yōu)先表和雙棧算法來解決此問題。

(2)算法邏輯

雙棧算法,即“邊存邊看,邊走邊算”,設(shè)置符號(hào)棧和數(shù)字棧,符號(hào)棧中存儲(chǔ)運(yùn)算符,數(shù)字棧中存儲(chǔ)數(shù)字。同時(shí)設(shè)置符號(hào)優(yōu)先表,為所有可能出現(xiàn)的符號(hào)設(shè)置優(yōu)先級(jí)。程序從左到右掃描算式,遇到數(shù)字則將其壓進(jìn)數(shù)字棧;遇到符號(hào)則比較該符號(hào)與符號(hào)棧棧頂元素的優(yōu)先級(jí),若當(dāng)前符號(hào)的優(yōu)先級(jí)高,則將其壓棧,否則取數(shù)字棧棧頂元素,與符號(hào)一起完成計(jì)算,并將結(jié)果壓入數(shù)字棧。迭代整個(gè)過程,直到算式被識(shí)別完畢。

(3)主要代碼介紹

部分代碼有參考。

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

計(jì)算函數(shù):

完成數(shù)字、運(yùn)算符彈棧后的計(jì)算操作,階乘、對(duì)數(shù)、開平方根等復(fù)雜運(yùn)算通過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

符號(hào)優(yōu)先級(jí)判斷函數(shù):

根據(jù)符號(hào)優(yōu)先表,對(duì)比判斷當(dāng)前符號(hào)與符號(hào)棧棧頂符號(hào)的優(yōu)先級(jí),對(duì)數(shù)運(yùn)算與平方根運(yùn)算是一元運(yùn)算,因此比乘、除等二元運(yùn)算優(yōu)先級(jí)高。

def decision(last_op, new_op):

“”“

:param last_op: 運(yùn)算符棧的最后一個(gè)運(yùn)算符

:param new_op: 從算式列表取出的當(dāng)前運(yùn)算符

:return: 1 代表彈棧運(yùn)算,0 代表彈運(yùn)算符棧最后一個(gè)元素, -1 表示入棧

”“”

# 定義5種運(yùn)算符級(jí)別

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:

# 說明連續(xù)兩個(gè)運(yùn)算優(yōu)先級(jí)不一樣,需要入棧

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 # 只要棧頂元素為(,當(dāng)前元素不是)都應(yīng)入棧。

else:

return -1

過程函數(shù):

實(shí)現(xiàn)了雙棧算法的函數(shù),主要思路如上文所述。與二元運(yùn)算不同的是,對(duì)數(shù)運(yùn)算、平方根運(yùn)算等一元運(yùn)算只需要數(shù)字棧棧頂?shù)囊粋€(gè)元素即可。另外由于乘方運(yùn)算的特殊性,函數(shù)中代表乘方運(yùn)算的“!”符號(hào)一旦出現(xiàn),就與數(shù)字棧棧頂?shù)脑匾黄鹜瓿蛇\(yùn)算,并將結(jié)果壓入數(shù)字棧,即乘方運(yùn)算是不進(jìn)入符號(hào)棧的。

def final_calc(formula_list):

num_stack = [] # 數(shù)字棧

op_stack = [] # 運(yùn)算符棧

for e in formula_list:

operator = is_operator(e)

if not operator:

# 壓入數(shù)字棧

# 字符串轉(zhuǎn)換為符點(diǎn)數(shù)

num_stack.append(float(e))

else:

# 如果是運(yùn)算符

while True:

# 如果該運(yùn)算符是“!”,則不進(jìn)入符號(hào)棧,馬上算出數(shù)字棧棧頂元素的乘方,并將結(jié)果壓入數(shù)字棧

if e == ‘!’:

num1 = num_stack.pop()

num_stack.append(calculate(e, num1))

break

# 如果運(yùn)算符棧等于0無條件入棧

if len(op_stack) == 0:

op_stack.append(e)

break

# decision 函數(shù)做決策

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

if tag == -1:

# 如果是-1壓入運(yùn)算符棧進(jìn)入下一次循環(huán)

op_stack.append(e)

break

elif tag == 0:

# 如果是0彈出運(yùn)算符棧內(nèi)最后一個(gè)(, 丟掉當(dāng)前),進(jìn)入下一次循環(huán)

op_stack.pop()

break

elif tag == 1:

# 如果是1彈出運(yùn)算符棧內(nèi)最后兩個(gè)元素,彈出數(shù)字棧最后兩位元素。

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()

# 執(zhí)行計(jì)算

# 計(jì)算之后壓入數(shù)字棧

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

# 處理大循環(huán)結(jié)束后 數(shù)字棧和運(yùn)算符棧中可能還有元素 的情況

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()

# 執(zhí)行計(jì)算

# 計(jì)算之后壓入數(shù)字棧

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

return num_stack, op_stack

用戶界面

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

class MyWindows(QtWidgets.QMainWindow, Ui_MainWindow):

def __init__(self, parent=None):

# 忽略pycharm檢測(cè)失誤導(dǎo)致的警告信息↓

# 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個(gè)按鍵,隱藏部分相似代碼,全部代碼見上文中的碼云鏈接

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):

# 設(shè)置輸出框游標(biāo)

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):

# 運(yùn)算

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中設(shè)計(jì)的.ui文件如下圖所示:

(4)程序結(jié)果

如下圖所示,圖片左邊為我的程序結(jié)果,右邊為手機(jī)計(jì)算器的運(yùn)算結(jié)果。從兩者對(duì)比來看,本程序的運(yùn)算能力有所保障。

3. 實(shí)驗(yàn)過程中遇到的問題和解決過程

問題1:輸出框不能自動(dòng)滾動(dòng)到最底部

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

問題2:不知道如何實(shí)現(xiàn)退格功能

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

問題3:在pyqt5啟動(dòng)的用戶界面下,程序運(yùn)算出錯(cuò)時(shí)進(jìn)程會(huì)直接崩潰退出,且不會(huì)在cmd中trace back,給debug帶來了很多麻煩。

問題3解決方案:不要直接運(yùn)行,而是使用調(diào)試模式,這樣出錯(cuò)能夠看到trace back。這也提醒了我在調(diào)試程序階段不要直接運(yùn)行,使用調(diào)試模式更穩(wěn)妥。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 程序設(shè)計(jì)
    +關(guān)注

    關(guān)注

    3

    文章

    262

    瀏覽量

    31027
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86794
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)

    程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》重點(diǎn)闡述了三大方向內(nèi)容: 1. C語言學(xué)習(xí)中的痛點(diǎn):針對(duì)當(dāng)前工程師在C語言學(xué)習(xí)中的痛點(diǎn),如指針函數(shù)與函數(shù)指針,如何靈活應(yīng)用結(jié)構(gòu)體等。從變量的三要素(變量的類型,變量的值和變量
    發(fā)表于 05-13 16:45

    零基礎(chǔ)入門:如何在樹莓派上編寫和運(yùn)行Python程序

    在這篇文章中,我將為你簡(jiǎn)要介紹Python程序是什么、Python程序可以用來做什么,以及如何在RaspberryPi上編寫和運(yùn)行一個(gè)簡(jiǎn)單的Pyth
    的頭像 發(fā)表于 03-25 09:27 ?761次閱讀
    零基礎(chǔ)入門:如何在樹莓派上編寫和運(yùn)行<b class='flag-5'>Python</b><b class='flag-5'>程序</b>?

    是否可以使用OpenVINO?部署管理器在部署機(jī)器上運(yùn)行Python應(yīng)用程序

    使用 OpenVINO?部署管理器創(chuàng)建運(yùn)行時(shí)軟件包。 將運(yùn)行時(shí)包轉(zhuǎn)移到部署機(jī)器中。 無法確定是否可以在部署機(jī)器上運(yùn)行 Python 應(yīng)用程序,而無需安裝OpenVINO? Toolkit 和 Python
    發(fā)表于 03-05 08:16

    有沒有什么方案能實(shí)現(xiàn)直接用matlab或python調(diào)用D4100_usb.dll?

    是32位程序而我的電腦是64位的。 由于實(shí)驗(yàn)中主要用matlab編程,使用C++程序很不方便,如果能直接用matlab或python調(diào)用D4100_usb.dll就會(huì)好很多。 因此,我
    發(fā)表于 02-27 06:59

    ID讀卡器Python程序開發(fā)

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

    RK3568國產(chǎn)處理器實(shí)驗(yàn)平臺(tái):語音識(shí)別控制實(shí)驗(yàn)

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

    在RK3568教學(xué)實(shí)驗(yàn)箱上實(shí)現(xiàn)基于YOLOV5的算法物體識(shí)別案例詳解

    一、實(shí)驗(yàn)目的 本節(jié)視頻的目的是了解YOLOv5模型的用途及流程,并掌握基于YOLOV5算法實(shí)現(xiàn)物體識(shí)別的方法。 實(shí)驗(yàn)原理 YOLO(You Only Look Once!) YOLOv5 是一種
    發(fā)表于 12-03 14:56

    國產(chǎn)Cortex-A55實(shí)驗(yàn)箱操作案例分享:LED程序開發(fā)

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

    第5章 MATLAB程序設(shè)計(jì).ppt

    第5章 MATLAB程序設(shè)計(jì)
    發(fā)表于 10-24 16:40 ?1次下載

    TMS320DM6441功耗摘要應(yīng)用程序報(bào)告

    電子發(fā)燒友網(wǎng)站提供《TMS320DM6441功耗摘要應(yīng)用程序報(bào)告.pdf》資料免費(fèi)下載
    發(fā)表于 10-15 11:45 ?0次下載
    TMS320DM6441功耗摘要應(yīng)用<b class='flag-5'>程序</b><b class='flag-5'>報(bào)告</b>

    深度探索RK3568嵌入式教學(xué)平臺(tái)實(shí)戰(zhàn)案例:設(shè)備驅(qū)動(dòng)開發(fā)實(shí)驗(yàn)

    一、產(chǎn)品簡(jiǎn)介TL3568-PlusTEB人工智能實(shí)驗(yàn)箱國產(chǎn)高性能處理器64位4核低功耗2.0GHz超高主頻1T超高算力NPU兼容鴻蒙等國產(chǎn)操作系統(tǒng)實(shí)驗(yàn)目的1、熟悉基本字符設(shè)備的驅(qū)動(dòng)程序設(shè)計(jì)
    的頭像 發(fā)表于 09-24 08:05 ?878次閱讀
    深度探索RK3568嵌入式教學(xué)平臺(tái)實(shí)戰(zhàn)案例:設(shè)備驅(qū)動(dòng)開發(fā)<b class='flag-5'>實(shí)驗(yàn)</b>

    加法運(yùn)放電路實(shí)驗(yàn)報(bào)告數(shù)據(jù)分析

    加法運(yùn)放電路實(shí)驗(yàn)報(bào)告的數(shù)據(jù)分析主要包括對(duì)實(shí)驗(yàn)結(jié)果的觀察、與理論值的對(duì)比以及誤差原因的分析。以下是一個(gè)基于常見加法運(yùn)放電路實(shí)驗(yàn)的數(shù)據(jù)分析示例: 一、實(shí)驗(yàn)目的與原理
    的頭像 發(fā)表于 09-03 10:03 ?1841次閱讀

    屆大會(huì)回顧第25期 | OpenHarmony上的Python設(shè)備應(yīng)用開發(fā)

    Python以其簡(jiǎn)單、易學(xué)和功能強(qiáng)大而聞名,有著廣泛的用戶群體。采用Python開發(fā)有助于降低OpenHarmony的學(xué)習(xí)門檻。如何在OpenHarmony上用Python開發(fā)設(shè)備應(yīng)用,有哪些關(guān)鍵技術(shù)?電
    的頭像 發(fā)表于 08-27 11:53 ?1229次閱讀
    第<b class='flag-5'>二</b>屆大會(huì)回顧第25期 | OpenHarmony上的<b class='flag-5'>Python</b>設(shè)備應(yīng)用開發(fā)

    STM32項(xiàng)目分享:智慧農(nóng)業(yè)(機(jī)智云)系統(tǒng)

    目錄一、前言、項(xiàng)目簡(jiǎn)介1、功能詳解2、主要器件三、原理圖設(shè)計(jì)四、PCB硬件設(shè)計(jì)1、PCB圖2、PCB板打樣焊接圖五、程序設(shè)計(jì)六、實(shí)驗(yàn)效果七、資料內(nèi)容項(xiàng)目分享一、前
    的頭像 發(fā)表于 07-27 08:10 ?1496次閱讀
    STM32項(xiàng)目分享:智慧農(nóng)業(yè)(機(jī)智云)系統(tǒng)

    Python建模算法與應(yīng)用

    上成為理想的腳本語言,特別適用于快速的應(yīng)用程序開發(fā)。本文將詳細(xì)介紹Python在建模算法中的應(yīng)用,包括常見的建模算法、Python在建模中的優(yōu)勢(shì)、常用庫以及實(shí)際案例。
    的頭像 發(fā)表于 07-24 10:41 ?1274次閱讀
    主站蜘蛛池模板: 欧美成人精品欧美一级乱黄 | 女人色网 | 日本黄色大片免费看 | 偷操| 国产美女精品久久久久久久免费 | 色色网视频 | 欧美日韩一日韩一线不卡 | 免费黄色a视频 | 韩国三级视频在线 | 国产女人视频免费观看 | 日本人爽p大片免费看 | 99热网站| 69国产成人综合久久精品 | 妖精视频永久在线入口 | 日本人爽p大片免费看 | 性xxxx奶大欧美高清 | 欧美性生活网站 | 日韩免费一区 | 国产精品天天干 | 日韩天堂在线观看 | 黄色小视频免费看 | 婷婷射| 最新大黄网站免费 | 黄页网站视频免费 视频 | 天堂中文在线网 | 香蕉久久精品 | aaaaaa精品视频在线观看 | 国产成人a | 中文天堂在线最新2022更新 | 成人午夜小视频手机在线看 | 日本黄色小说视频 | 一区二区三区高清不卡 | 天天爽夜夜爽人人爽曰喷水 | 五月婷婷色丁香 | 操天天操 | 嫩草影院永久入口在线观看 | 手机看片1024在线 | 中文三 级 黄 色 片 | 色婷婷色 | 成人午夜大片免费7777 | 黑人边吃奶边扎下面激情视频 |