第一次软件工程作业(改进版)
1、Github項目地址:https://github.com/HardenMVB/3.28
2、PSP
| PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
| Planning | 計劃 | 60 | 90 |
| · Estimate | · 估計這個任務需要多少時間 | 60 | 90 |
| Development | 開發(fā) | 1650 | 2050 |
| · Analysis | · 需求分析 (包括學習新技術) | 200 | 300 |
| · Design Spec | · 生成設計文檔 | 50 | 60 |
| · Design Review | · 設計復審 (和同事審核設計文檔) | 20 | 30 |
| · Coding Standard | · 代碼規(guī)范 (為目前的開發(fā)制定合適的規(guī)范) | 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、解題思路
???拿到題目后,先想它能實現(xiàn)哪些功能,再想代碼能分成幾個部分實現(xiàn),分層次處理。本題中基礎功能就是整數(shù)的四則運算,非負數(shù),接著就是加入真分數(shù)的部分。
???這兩個功能完成后就可以考慮一些其他功能,比如如果出現(xiàn)假分數(shù),如何轉化成真分數(shù),如何約分,以及判斷題目有無重復等等。
4、設計實現(xiàn)
? ?先建立命令控制模塊,可以控制輸入的題目數(shù)量以及數(shù)值范圍。再創(chuàng)建一個函數(shù),用來生成隨機數(shù)與運算符(+ , - , × , ÷ ),再設計一個函數(shù)用來將假分數(shù)轉換為真分數(shù)。接著生成表達式,進而生成題目和對應的答案,以及查找有無重復。
? ?最后將題目及答案寫入文件中,結果會在文件中顯示出來。
5、代碼說明
1、命令行控制模塊
def get_Parameter():#命令行控制模塊 parser = argparse.ArgumentParser()parser.add_argument('-n', help='設定題目數(shù)量',type=int)parser.add_argument('-r', help='設定數(shù)值范圍',type=int)return parser.parse_args()
?
2、生成隨機數(shù)和運算符
def get_num_sym(i,r):#獲取數(shù)值列表和符號列表 nlist=[] #數(shù)值列表 slist=[] #符號列表 kh=0 #判斷怎么加括號 jian=0 #判斷是否是減數(shù)運算for m in range(i+1): #根據(jù)i的值遍歷輸出數(shù)值列表 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、分數(shù)轉換及運算
def calculate(a,b,s):#計算單元,a,b是數(shù),s是符號 ans=0if s=='+': #加法運算 ans=a+belif s=='-': #減法運算 a,b=max(a,b),min(a,b) #防止結果為負數(shù) 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: #循環(huán)生成題目和答案列表 i=random.randint(1, 3) #隨機獲取符號數(shù)目 num,slist,kh,i,jian=get_num_sym(i,r)num1=numlegal = Trueif jian==1: #用于防止減法運算出現(xiàn)負數(shù) 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為要寫入的數(shù)據(jù)列表 file = open(fname,'a')file.seek(0)file.truncate() #清空for i in range(len(d)):#循環(huán)寫入文件fname s = str(d[i]).replace('[','').replace(']','')s = s.replace("'",'').replace(',','') +'\n'file.write(s)file.close()print('%s文件已保存'%fname)
?
6、main函數(shù)
def main():#主函數(shù) args = get_Parameter()if args.n:n=args.nprint('共生成%d道題目'%n)if args.r:r=args.rprint('均為%d以內(nèi)的四則運算'%r)E, A=gett(n,r)for x in range(n):#循環(huá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、改進
?程序一開始出現(xiàn)多元式子時,只計算第一個和最后一個的結果,于是我改進了程序,使得能計算出每個數(shù)的值。
此程序中我沒有使用循環(huán)將出現(xiàn)負數(shù)結果的式子刪除,而是簡單的把此式子的被減數(shù)與減數(shù)交換,使之計算出正值。
9、收獲
? 在這次實踐中,我體會到了軟件工程的不易。想要一個人真正做好一個項目是要花費大量時間的,想要一周完美的寫好這個項目有點困難,還是有很多漏洞沒有處理;做出的程序也不完整,有很多功能沒有實現(xiàn)。
這也體現(xiàn)出了團隊的重要性,一方面會有人監(jiān)督,幫你找出錯誤,另一方面分工合作,花費的時間也會減少。不過我還是從這次項目中學到了很多技巧,希望下一次的項目可以完成的更好。
轉載于:https://www.cnblogs.com/HardenMVP/p/10615157.html
總結
以上是生活随笔為你收集整理的第一次软件工程作业(改进版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 情到深出的下一句是什么啊?
- 下一篇: 复方樟脑乳膏治疗湿疹需要疗程使用吗 效果