1. 程式人生 > 實用技巧 >個人專案

個人專案

GitHub專案地址

https://github.com/hfruhf/software1/blob/master/psp

PSP

PSP2.1

Personal Software Process Stages

預估耗時(分鐘)

實際耗時(分鐘)

Planning

計劃

10 8

· Estimate

· 估計這個任務需要多少時間

10 8

Development

開發

600 650

· Analysis

· 需求分析 (包括學習新技術)

30 40

· Design Spec

· 生成設計文件

30 40

· Design Review

· 設計複審 (和同事稽核設計文件)

20 30

· Coding Standard

· 程式碼規範 (為目前的開發制定合適的規範)

5 5

· Design

· 具體設計

40 60

· Coding

· 具體編碼

300 350

· Code Review

· 程式碼複審

40 70

· Test

· 測試(自我測試,修改程式碼,提交修改)

150 130

Reporting

報告

250 270

· Test Report

· 測試報告+部落格

150 200

· Size Measurement

· 計算工作量

15 15

· Postmortem & Process Improvement Plan

· 事後總結, 並提出過程改進計劃

40 50

合計

專案要求

-能自動生成小學四則運算題目(注意是給小學生用的,要是結果出現負數的話他們會迷茫的!)

- 除了整數外,還要支援真分數的四則運算

解題思路:

1、 隨機生成數字,隨機產生運算子

2、 考慮表示式不成立的情況(不出現負數)

3、 接收使用者輸入的答案,判斷答案與準確答案是否相等並給出正確答案

問題1:

-運用Python隨機函式產生隨機數字及符號

問題2:

-考慮當分母為0時,此時表示式不成立

-防止出現負數

n1,n2 = max(n1,n1),min(n1,n2)#防止出現負數  
f1,f2 = max(f1,f2),min(f1,f2)#防止出現負數  

問題3:

相關資料參考Allinone99的部落格

python中有一個函式eval能計算表示式的結果,但結果可能會為分數,要利用庫fractons中的一個函式Fraction,把輸出的結果全轉成分數,所以整數的不變,小數的變分數.為了防止當小學生輸入帶分數時識別錯誤,所以將大於0的分數轉化為假分數或者帶分數。利用input()函式輸入答案,再用eval和Fraction轉成數字。

通過判斷輸入的每個答案是否與ans中的結果一一對應,判斷其對錯

程式碼說明

核心函式為生成整數表示式和分數表示式以及比較結果

#c1函式(生成整數表示式)

def c1(q, ans):
    symbol = random.choice(['+', '-', '*', '/'])  # 生成隨機符號
    if symbol == '+':
        n1 = random.randint(0, 20)
        n2 = random.randint(0, 20)
        q.append(str(n1) + '+' + str(n2) + '=')
        ans.append(n1 + n2)
    elif symbol == '-':
        n1 = random.randint(0, 20)
        n2 = random.randint(0, 20)
        n1, n2 = max(n1, n1), min(n1, n2)  # 防止出現負數
        q.append(str(n1) + '-' + str(n2) + '=')
        ans.append(n1 - n2)
    elif symbol == '*':
        n1 = random.randint(0, 20)
        n2 = random.randint(0, 20)
        q.append(str(n1) + '×' + str(n2) + '=')
        ans.append(n1 * n2)
    else:
        n1 = random.randint(0, 20)
        if n1 == 0:
            n2 = random.randint(1, 20)
        else:
            n2 = random.randint(1, n1 + 1)
        q.append(str(n1) + '÷' + str(n2) + '=')
        ans.append(Fraction(n1, n2))

#c2函式(生成分數表示式)

def c2(q, ans):
    symbol = random.choice(['+', '-', '*', '/'])
    f1, f2 = createF()
    if symbol == '+':
        while f1 + f2 > 1:
            f1, f2 = createF()
        q.append(str(f1) + '+' + str(f2) + '=')
        ans.append(f1 + f2)
    elif symbol == '-':
        f1, f2 = max(f1, f2), min(f1, f2)  # 防止出現負數
        q.append(str(f1) + '-' + str(f2) + '=')
        ans.append(f1 - f2)
    elif symbol == '*':
        while f1 * f2 > 1:
            f1, f2 = createF()
        q.append(str(f1) + '×' + str(f2) + '=')
        ans.append(f1 * f2)
    else:
        while f1 / f2 > 1:
            f1, f2 = createF()
        q.append(str(f1) + '÷' + str(f2) + '=')
        ans.append(Fraction(f1, f2))

#main函式判斷結果對錯

def main():

    print("輸入題目的數量", end='  ')
    k= int(input())
    print("-------------------------------")
    p = 100 / k
    s = 0
    q = []
    ans = []
    ans2 = []
    count = 0
    for i in range(k):
        n = random.randint(1, 4)
        if n == 1:
            c1(q, ans)
            g = Fraction(ans[i])
            ans2.append(f(g))
        else:
            c2(q, ans)
            g = Fraction(ans[i])
            ans2.append(f(g))  # 記錄帶分數答案
    for i in range(k):
        print("第{}題:{}".format(i + 1, q[i]), end="  ")
        count = count + 1
        a = input()
        if count == k:
            break
        if a == str(ans[i]):
            print('{}:√'.format(i + 1))
            s = s + p
        else:
            print('{}:×'.format(i + 1))
            print('正確的答案為:', ans[i])
    print("最終得分:{}".format(s))
if __name__ == '__main__':
    main()

執行結果

效能分析與分析:

由資料可知,使用者的輸入是影響效能分析中的時間的主要因素

改進

python中random.randint是一個產生隨機數的高效方法,本身沒有多少能夠替換的函式。由於我們只需要random中的randint函式,於是考慮替換import方式:

import random  ->  from random import randint

多方法巢狀本身需要完成的任務較多,實際上對效率並沒有太大影響。

包括括號的三個數運算:

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 12 18:48:47 2019

@author: Alin
"""
# 匯入random模組
import random


# 定義產生真分數的函式
def fraction():
    while (True):
        a = random.randint(1, 100)
        b = random.randint(1, 100)
        if a / b < 1:
            return str(a) + "/" + str(b)
            break


# 定義產生帶括號運算函式
def brackets():
    a = "("
    e = ")"
    b = str(random.randint(1, 100))
    c = random.choice('+-*/')
    d = fraction()
    if eval(b + c + d) > 0:
        return a + b + c + d + e


# 生成並列印四則運算表示式
def main():
    print("請輸入題目數量:")
    k = int(input())
    for i in range(k):
        a = brackets()
        b = str(random.choice('+-*/'))
        c = fraction()
        print("第{}題:".format(i + 1), a, b, c, "=")
    # pr int(a,b,c,"=")
        if eval(a + b + c) >= 0:
            shuzi = input()
            if shuzi == eval(a + b + c):
            # print(a,b,c,"=",shuzi)
                print('{}:√'.format(i + 1))

            else:
                print('{}:×'.format(i + 1))
                print('正確的答案為:', eval(a + b + c))
if __name__ == '__main__':
    main()
# print("最終得分:{}".format(s))

結果顯示:

效能分析:

由圖可知在main函式裡面以及等待輸入的耗時最長;

總結及收穫:

第一次做軟體工程的相關專案,對於一些相關的具體操作不太熟悉,也讓我明白軟體工程的作業的意義,不僅僅是程式,而是要加入軟體工程的要素(複雜性、易變性和其他),有價值的軟體工程的作業必須要觸及這兩個基本要素!

通過實踐操作讓我瞭解了程式碼存在的相關瓶頸以及如何優化自己的程式,雖然最終得出的結果不太理想,所以這個專案還存在著很多的改進空間。通過在這次軟體工程的作業中發現了提升一個軟體的效能可以通過效能分析的出來,所以一定要進行測試以及效能分析。