日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第四次作业-四则运算

發(fā)布時間:2024/6/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第四次作业-四则运算 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

  ?  作業(yè)要求地址:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/997

  ?  結(jié)對伙伴:宋雨http://www.cnblogs.com/songyuu/

  ?  git:https://git.coding.net/Vrocker/f4.git

?


?

?

要求一

  ?  具體要求:參考《構(gòu)建之法》第4章兩人合作,結(jié)對編程上述功能,要求每人發(fā)布隨筆1篇 (代碼是共同完成的,博客是分別完成的)。 (1) 給出每個功能的重點、難點、編程收獲。(2)給出結(jié)對編程的體會,以及 (3) 至少5項在編碼、爭論、復(fù)審等活動中花費時間較長,給你較大收獲的事件。

?

一、每個功能的重點、難點

1.功能一

  實現(xiàn)這個功能的重點是在于隨機生成參與運算的數(shù)字和四個運算符。在Python中,random模塊可以用于生成隨機數(shù)。這樣很方便的使用了這一模塊下的部分函數(shù),來實現(xiàn)這一功能。

  部分代碼如下:

def _f4(self):from random import randint as rfrom random import uniform as rufrom fractions import Fraction as fops = ['+', '-', '*', '/']bra = ['(', '', ')']_l1 = r(0, 1)_l2 = r(0, 1)_l3 = r(0, 1)_r1 = r(1, 2)_r2 = r(1, 2)_r3 = r(1, 2)

  

2.功能二

  這個功能中加入了括號的運算。括號參與運算是最大的難點。

  本科期間學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)這門課程中,在講到棧與隊列的時候,逆波蘭即后綴表達式是棧在表達式求知中的應(yīng)用。這個應(yīng)用是棧比較常見的,而且十分常用。所以看到這個要求加上題目中老師的提醒,我就開始翻找數(shù)據(jù)結(jié)構(gòu)書來尋找相應(yīng)的方法。同時用棧可以很好的解決括號匹配,這樣一來兩者結(jié)合可以通過棧來完成需求。經(jīng)過查閱數(shù)據(jù)結(jié)構(gòu)書加上自己的思考嘗試解決這一難題。

  括號匹配算法總結(jié)如下:

  1、初始化一個空棧,開始順序讀入括號。

  2、如果是右括號,則或者是置于棧頂?shù)淖罴逼绕诖靡韵?#xff0c;或者是不合法的情況(括號序列不匹配,退出程序)。

  3、若是左括號,則作為一個新的更急迫的期待壓入棧中,自然使原有的在棧中的所有未消解的期待的急迫性降了一級。算法結(jié)束,棧為空,否則括號序列不匹配。

  根據(jù)這一算法,可以解決括號匹配的問題。

  同時表達式求值的實現(xiàn)是棧應(yīng)用的一個典型的例子。中綴表達式不僅依賴運算符的優(yōu)先級,同時還要處理括號。后綴表達式的運算符在操作數(shù)后面。在后綴表達式中已考慮了運算符的優(yōu)先級,沒有括號,只有操作數(shù)和運算符。并且中綴表達式和后綴表達式可以相互轉(zhuǎn)換。通過后綴表達式計算相應(yīng)式子的值,其過程為:

  1、順序掃描表達式的每一項

  2、如果是操作數(shù),則將其壓入棧中

  3、如果是操作符<op>,則連續(xù)從棧中推出兩個操作數(shù),x和y,形成運算的指令x<op>y

  4、將計算的結(jié)果重新壓入棧中。

  5、當(dāng)表達式所有的項豆掃描并且處理完畢后,棧頂存放的就是最后的計算結(jié)果。

  根據(jù)書中的介紹,??梢院芎玫慕鉀Q這一需求。在最開始分配任務(wù)的時候,我一開始想用c++來編寫程序,因為自己相對于其他語言比較熟悉c++,所以在考慮這一個問題的時候我當(dāng)時也是想要采用c++來實現(xiàn)。自己根據(jù)書中的范例代碼并且查閱了網(wǎng)上相關(guān)代碼,嘗試進行改寫,來滿足題目需求。

  首先讀取隨機生成的表達式,然后用上次作業(yè)用到的vector,構(gòu)造vector<string>儲存成普通的中綴表達式然后遍歷vector<string>再用剛剛提到的算法利用棧來構(gòu)造后綴表達式。最后遍歷構(gòu)造好的vector<string>中存放在后綴表達式對彈出棧的兩個操作數(shù)進行運算,將結(jié)果壓入棧中。則最后剩余在棧中的一項就是計算的最終結(jié)果。c++的部分代碼如下:

1 for (auto &oper : vec) { 2 if (oper == "+" || oper == "-") { 3 while (true) { 4 if (sta.empty() || sta.top() == "(") 5 break; 6 p_vec.push_back(sta.top()); 7 sta.pop(); 8 } 9 sta.push(oper); 10 } 11 else if (oper == "*" || oper == "/") { 12 while (true) { 13 if (sta.empty() || sta.top() == "+" || 14 sta.top() == "-" || sta.top() == "(") 15 break; 16 p_vec.push_back(sta.top()); 17 sta.pop(); 18 } 19 sta.push(oper); 20 } 21 else if (oper == ")") { 22 while (true) { 23 if (sta.top() == "(") { 24 sta.pop(); 25 break; 26 } 27 p_vec.push_back(sta.top()); 28 sta.pop(); 29 } 30 } 31 else sta.push(oper); 32 } 33 while (!sta.empty()) { 34 p_vec.push_back(sta.top()); 35 sta.pop(); 36 } c++

  

?

?

?

?

  不僅僅是計算,括號的生成順序也是這個要求的難點。也可以定義棧用逆波蘭的方法來解決。

?

?

  因為我和我的結(jié)對伙伴都想用python來完成這次作業(yè),所以如果要用棧那么c++的代碼就要改寫成python的。一開始在看題目要求的時候,觀察到操作數(shù)是固定的四個數(shù)字,就采用直接固定四個操作數(shù),沒有采用棧而是直接判斷括號的優(yōu)先級,來生成括號并且計算。在之后的python編寫中因為我自己對python學(xué)習(xí)還是太少,編寫不出python的逆波蘭方法。在嘗試多次后,甚至想把作業(yè)重新用c++編寫,但是換編程語言的工作量太大,所以就用比較原始的方法完成這個需求。

  在此之后還會不斷嘗試用python實現(xiàn)逆波蘭。

?

3.功能三

  這個功能的主要難點是在于命令行參數(shù)的實現(xiàn)。

  在上次作業(yè)中,c++語言的命令行參數(shù)花費了我很多時間才會完全使用。python中可以用argparse標準庫解決。它是解析命令行參數(shù)和選項的標準模塊。在學(xué)習(xí)argparse模塊的使用方法后,實現(xiàn)了python?的命令行參數(shù)功能??傮w感覺比c++要簡便不少。

  部分代碼如下:

1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.add_argument("-c", "--cin") 4 args = parser.parse_args() 5 if args.cin == None: 6 f4()._f4_input() 7 else: 8 f4()._f4_integer_parser(args.cin)

?

4.功能四

  這個功能中,最重要的就是支持分數(shù)。這個功能宋雨同學(xué)花費了很長時間解決了這個難點很多的功能。經(jīng)過他的講解介紹,用fractions標準庫可以實現(xiàn)這一功能。采用python內(nèi)置函數(shù)eval()。但eval()函數(shù)的輸出為浮點數(shù),故采用這一函數(shù)生成的分數(shù)分子分母位數(shù)都很多。測試之后發(fā)現(xiàn)不滿足題目的要求,所以在宋雨同學(xué)的解決意見下限制輸出的位數(shù)。經(jīng)過實驗,發(fā)現(xiàn)可以實現(xiàn)。所以采用了這一方法。

  部分代碼如下:

1 def _f4_answer(self,eq): 2 from fractions import Fraction as f 3 _answer = f(eval(eq)).limit_denominator(1000) 4 _answer = str(_answer) 5 return(_answer)

?

?

二、體會

  在開始編寫程序的時候,決定選擇了python進行編寫。因為我對python掌握很不好,所以本次主要的代碼都是由宋雨同學(xué)完成,給我了很多幫助,我也在結(jié)對編程的過程中不斷學(xué)習(xí)python。

  因為我自己的原因,相比較python,c++我掌握的相對好一些,所以在遇到難題的時候想把代碼換成c++。但是因為工作量太大,而且我認識到不能回避難題,所以接著用python進行編寫。這次結(jié)對編程我體會到相互合作的重要性,結(jié)對伙伴不僅能給自己幫助也能共同進步一起努力。

?

三、花費時間較長,給你較大收獲的事件

  1、一開始沒有采用面向?qū)ο髞砭帉懘a,在討論之后將代碼改成oop方式。

  2、棧的問題花費的時間很多,對python?掌握還是太差。

  3、分數(shù)功能的實現(xiàn),包括查資料測試都花費了很多時間。

  4、進行單元測試的時候框架換了很多。

  5、一起編寫的時候,宋雨同學(xué)對我講解了很多python的知識。讓我對python的學(xué)習(xí)有了信心。

?


?

?

?

要求二

?

  地點:寢室

  電腦:msi、win10

  軟件:pycharm

  語言:python

?

照片:

?

?


測試截圖

1

?

2

?

3

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/vrocker/p/7650258.html

總結(jié)

以上是生活随笔為你收集整理的第四次作业-四则运算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。