第一次软件工程作业(改进版)
1、Github項目地址:https://github.com/HardenMVB/3.28
2、PSP
| PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
| Planning | 計劃 | 60 | 90 |
| · Estimate | · 估計這個任務需要多少時間 | 60 | 90 |
| Development | 開發 | 1650 | 2050 |
| · Analysis | · 需求分析 (包括學習新技術) | 200 | 300 |
| · Design Spec | · 生成設計文檔 | 50 | 60 |
| · Design Review | · 設計復審 (和同事審核設計文檔) | 20 | 30 |
| · Coding Standard | · 代碼規范 (為目前的開發制定合適的規范) | 20 | 30 |
| · Design | · 具體設計 | 60 | 50 |
| · Coding | · 具體編碼 | 1200 | 1500 |
| · Code Review | · 代碼復審 | 60 | 50 |
| · Test | · 測試(自我測試,修改代碼,提交修改) | 40 | 30 |
| Reporting | 報告 | 90 | 60 |
| · Test Report | · 測試報告 | 50 | 10 |
| · Size Measurement | · 計算工作量 | 20 | 20 |
| · Postmortem & Process Improvement Plan | · 事后總結, 并提出過程改進計劃 | 20 | 30 |
| 合計 | ? | 1800 | 2200 |
?
3、解題思路
???拿到題目后,先想它能實現哪些功能,再想代碼能分成幾個部分實現,分層次處理。本題中基礎功能就是整數的四則運算,非負數,接著就是加入真分數的部分。
???這兩個功能完成后就可以考慮一些其他功能,比如如果出現假分數,如何轉化成真分數,如何約分,以及判斷題目有無重復等等。
4、設計實現
? ?先建立命令控制模塊,可以控制輸入的題目數量以及數值范圍。再創建一個函數,用來生成隨機數與運算符(+ , - , × , ÷ ),再設計一個函數用來將假分數轉換為真分數。接著生成表達式,進而生成題目和對應的答案,以及查找有無重復。
? ?最后將題目及答案寫入文件中,結果會在文件中顯示出來。
5、代碼說明
1、命令行控制模塊
def get_Parameter():#命令行控制模塊 parser = argparse.ArgumentParser()parser.add_argument('-n', help='設定題目數量',type=int)parser.add_argument('-r', help='設定數值范圍',type=int)return parser.parse_args()
?
2、生成隨機數和運算符
def get_num_sym(i,r):#獲取數值列表和符號列表 nlist=[] #數值列表 slist=[] #符號列表 kh=0 #判斷怎么加括號 jian=0 #判斷是否是減數運算for m in range(i+1): #根據i的值遍歷輸出數值列表 nlist.append(Fraction(random.randint(1, r), random.randint(1, r))) for x in range(i):sy=random.choice(['+','-','×','÷'])if sy=='+'or sy=='-':kh +=10**(i-x-1)else :kh += 2 * (10 ** (i - x - 1))slist.append(sy)if sy=='-':l=1return nlist,slist,kh,i,jian
?
3、分數轉換及運算
def calculate(a,b,s):#計算單元,a,b是數,s是符號 ans=0if s=='+': #加法運算 ans=a+belif s=='-': #減法運算 a,b=max(a,b),min(a,b) #防止結果為負數 ans=a-belif s=='×': #乘法運算 ans=a*belse:ans=a/b #除法運算return ans
?
4、生成題目及答案
def gett(n,r): #用于生成題目和答案列表 E,A,E1,E2=[],[],[],[]global j,kx=1while x<n+1: #循環生成題目和答案列表 i=random.randint(1, 3) #隨機獲取符號數目 num,slist,kh,i,jian=get_num_sym(i,r)num1=numlegal = Trueif jian==1: #用于防止減法運算出現負數 if num[0]<num[1]:num1[0],num1[1]=num[1],num[0]if i>=2 and calculate(num[0],num[1],slist[0])<num[2]:num1[0],num1[1],num1[2]=num[2],num[0],num[1]j=1if i>=3 and calculate(calculate(num[0],num[1],slist[0]),num[2],slist[1])<num[3]:num1[0],num1[1],num1[2],num1[3]=num[3],num[0],num[1],num[2]k=1 ans=num1[0]for y in range(i):cal=calculate(ans,num[y+1],slist[y])if cal>=0:ans=calelse:legal=Falsebreakif legal: #判斷算式是否重復try:num=A.index(ans) #第一個答案的索引except ValueError as e: #可以寫入 A.append(ans)E1.append(slist)E2.append(num1)E.append('%d. %s'%(x,writet(slist,num1,kh)))x+=1else:passreturn E,A
?
5、寫入文件
def savet(fname, d):#fname為寫入文件的路徑,d為要寫入的數據列表 file = open(fname,'a')file.seek(0)file.truncate() #清空for i in range(len(d)):#循環寫入文件fname s = str(d[i]).replace('[','').replace(']','')s = s.replace("'",'').replace(',','') +'\n'file.write(s)file.close()print('%s文件已保存'%fname)
?
6、main函數
def main():#主函數 args = get_Parameter()if args.n:n=args.nprint('共生成%d道題目'%n)if args.r:r=args.rprint('均為%d以內的四則運算'%r)E, A=gett(n,r)for x in range(n):#循環生成答案列表 A[x]='%d. %s'%(x+1,fens(A[x]))savet('Exercises.txt',E)savet('Answers.txt',A)end = time.clock()print('運行時間: %s '%(end-start))if __name__ == '__main__':main()
6、測試運行
7、效能分析
8、改進
?程序一開始出現多元式子時,只計算第一個和最后一個的結果,于是我改進了程序,使得能計算出每個數的值。
此程序中我沒有使用循環將出現負數結果的式子刪除,而是簡單的把此式子的被減數與減數交換,使之計算出正值。
9、收獲
? 在這次實踐中,我體會到了軟件工程的不易。想要一個人真正做好一個項目是要花費大量時間的,想要一周完美的寫好這個項目有點困難,還是有很多漏洞沒有處理;做出的程序也不完整,有很多功能沒有實現。
這也體現出了團隊的重要性,一方面會有人監督,幫你找出錯誤,另一方面分工合作,花費的時間也會減少。不過我還是從這次項目中學到了很多技巧,希望下一次的項目可以完成的更好。
轉載于:https://www.cnblogs.com/HardenMVP/p/10615157.html
總結
以上是生活随笔為你收集整理的第一次软件工程作业(改进版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 情到深出的下一句是什么啊?
- 下一篇: [19/03/30-星期六] IO技术_