1. 程式人生 > 資訊 >小鵬汽車收漲10.34%,單月與季度交付量創新高

小鵬汽車收漲10.34%,單月與季度交付量創新高

此作業要求參見:https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11245

要求1 參考《構建之法》第4章兩人合作,結對程式設計上述功能,要求每人釋出隨筆1篇 (程式碼是共同完成的,隨筆有以下兩種方式:(①允許兩人寫一份,得一份分數,二人均分;②如果每人寫一份,內容不得抄襲,體會需要是自己的,分別得到自己部落格的分數)。

(1) 給出每個功能的重點、難點、程式設計收穫。

結對夥伴:韓志超

功能1. 四則運算

重點難點:對於分數和浮點數的處理是該部分的難點,在請教學長和查閱相關資料後瞭解到了Python裡面有專門的模組來進行該部分的處理,fraction模組提供有關有理數的算術表達和計算,

實際上就是分數的表達和計算。同時生成隨機數的方法分別是randint隨機生成整數和uniform隨機生成浮點數。

功能2. 支援括號

重點難點:本功能的重難點在於不同位置括號之間的匹配對齊問題,什麼位置出現了左括號對應的右括號什麼時候出現不能出現兩個左括號或者兩個右括號的問題,在經過商量討論

後在決定在紙上將該部分邏輯表達清楚再寫程式碼,將每個括號出現的位置羅列出來,當某個位置出現括號時其它位置上的括號如何調整。結伴物件先進行改寫完了我在進行測試時發現

有小bug有時會出現左括號而沒有右括號與之匹配,後進行修改完成功能。

功能一功能二程式碼:

def expression():#隨機生成表示式
symbol = ['+', '-', '*', '/'] brackets = ['(', '', ')'] # 隨機產生計算符 s1 = randint(0, 2) s2 = randint(0, 3) s3 = randint(0, 3) #隨機產生括號bt表示左括號,br表示右括號 bt1 = randint(0, 1) bt2 = randint(0, 1) bt3 = randint(0, 1) br1 = randint(1, 2) br2 = randint(1, 2) br3 = randint(1, 2)
if bt1 == 0: bt2 = 1 bt3 = 1 if br1 == 2: br2 = 1 br3 = 1 else: br2 = 2 br3 = 1 else: if bt2 == 0: bt3 = 1 br1 = 1 if (br2 == 2): br3 = 1 else: br3 = 2 else: bt3 = 0 br1 = 1 br2 = 1 br3 = 2 num1 = uf(0, 1) # 對隨機產生的分子分母做最大限制 num1 = fr(num1).limit_denominator(10) num2 = uf(0, 1) num2 = fr(num2).limit_denominator(10) num3 = randint(1, 10) num4 = randint(1, 10) # 產生隨機表示式 ran_exp = brackets[bt1] + str(num1) + symbol[s1] + brackets[bt2] + str(num2) + brackets[br1] + \ symbol[s2] + brackets[bt3] + str(num3) + brackets[br2] + symbol[s3] + str(num4) + brackets[br3] ran_exp = str(ran_exp) return ran_exp

def fixed(): #固定20道題目
    right = 0
    for j in range(20):
        exp = expression()
        print(exp,"=")
        in_answ = input("?")
        re_answ = answer(exp)
        if in_answ == re_answ:
           print("答對了你真是一個天才")
           right = right +1
        else:
            print("你答案錯了,再算一算吧,答案是", end= ' ')
            print(dict_split(re_answ))
    print("一共20道題,你一共答正確了", right, "道題

執行結果截圖:

功能3. 限定題目數量,"精美"列印輸出,避免重複

重點難點:本部分難點在於實現精美列印時的輸出對齊問題從網上查詢資料嘗試了幾種辦法最後找到解決方法

功能4. 支援分數出題和運算

重點難點:這裡的難點在於判斷輸入的題目數量是否是正整數,如果輸入的是負數、浮點數、字母之類的都不合格,這裡使用了isdigit()函式來進行判斷輸入題目是否

是整數,以及標準列印時的輸出對齊問題耗費時間較久。同時實現了女神要求的答案約分問題處理這裡的時候將答案分子分母拆開進行運算後重新輸出。

指定輸入題目程式碼如下:

def deft_input(num):#指定輸入多少個題目
    right = 0
    data = open("data.txt",'w+')
    if str.isdigit(str(num)):
        num1 = int(num)
        for i in range(num1):
            exp = expression()
            exp1 = exp + '='
            re_answ = answer(exp)
            print('{:<50}{:<25}'.format(exp1, dict_split(re_answ)))
            print('{:<50}{:<25}'.format(exp1, dict_split(re_answ)), file=data)
    else:
        print("題目數量必須是 正整數。")

實現約分程式碼如下:

def dict_split(str1):#將分子和分母分別儲存到不同的兩個字典中輸出約分
    d1 = {}
    d2 = {}
    count1 = 0
    count2 = 0
    pred = 1
    sign = 0
    for s in str1:
        if s == '-':
            sign = s
            continue
        if s == '/':
            pred = 0
            continue
        if pred == 1:
            d1[count1] = s
            count1 = count1 + 1
        else:
            d2[count2] = s
            count2 = count2 + 1
    numerator = take_integer(d1)
    # 分母
    denominator = take_integer(d2)
    answer1 = -10000
    if denominator == 0:
        return numerator
    else:
        we1 = numerator // denominator
        we2 = numerator % denominator
        if sign == '-':    #判斷結果是否為負
            if we1 == 0:
                answer1 = sign + str(we2) +'/' + str(denominator)
                return answer1
            else:
                answer1 = sign + str(we1) + ' ' + str(we2) + '/' + str(denominator)
                return answer1
        else:
            if we1 == 0:
                answer1 = str(we2) + '/' + str(denominator)
                return answer1
            else:
                answer1 = str(we1) + ' ' + str(we2) + '/' + str(denominator)
                return answer1

def take_integer(dicts={}):#將字典儲存的數還原為十進位制數
    a1 = dicts
    j = len(a1) - 1
    sum1 = 0
    for ss in range(0, len(a1)):
        if j < 0:
            break
        sum1 = int(a1[j]) * int(math.pow(10, ss)) + sum1
        j = j - 1
    return sum1

分別拆開分數的分子和分母進行重新約分計算方法比較笨但是可以實現該功能。

功能四結果截圖:

功能5未來

還有可能把程式改造成GUI版,把程式改造為web版,把程式移植為android/ios版。今天留好介面,明天就不發愁。 (0分)

(2)給出結對程式設計的體會

結對程式設計是和之前自己完成作業完全不一樣的體驗,由於自己本來是拖延症晚期每次完成作業都在最後一天提交,但是在結對程式設計過程中由於必須考慮到隊友的感受

所以我們很早就開始了這次的作業,結對程式設計相對於獨自程式設計碰到困難只能自己找資料搜尋來說碰到困難更容易解決,可能這個問題是自己的知識盲點但隊友就可以幫助到

自己很快的克服難題,結對程式設計是一個互相幫助不斷進步的過程。

(3) 至少5項在編碼、爭論、複審等活動中花費時間較長,給你較大收穫的事件。 (10分)

1、由於之前做作業時體會到了Python語言的魅力和其功能的強大所以這次我們經過商量都決定選用python完成。

2、在針對是否使用逆波蘭進行求解問題上進行討論最終沒有使用逆波蘭完成。

3、結對過程中各自時間的安排出現衝突。

4、針對於選做題女神的功能約分是否完成進行討論最後選擇完成。

5、對於某些變數的命名進行討論是否足以表明變數代表的功能。

要求2給出結對開發的截圖證據,要求截圖能夠證明你們是在結對程式設計。 (5分)

要求3使用coding.net做版本控制。checkin 前要求清理 臨時檔案、可執行程式,通常執行 build-clean可以達到效果。(25分)

雖然只有5分,但此題如果做錯,因為教師得不到你的程式碼,所以會導致“功能實現”為負分。
程式碼要求在 coding.net 做版本控制。要求push&pull時使用git客戶端,不允許使用web頁面。
要求頻繁checkin。要求在PSP中記錄的每次離開鍵盤30分鐘以上,需要checkin。如果你持續長達4小時不離開鍵盤,教師要求展示此項能力。量化的可考核的指標要求: 每個功能,要求有4次以上 checkin,展示(1)逐步實現功能和(2)修復bug時的過程; 每次checkin都要求可以成功編譯。
推薦git客戶端tortoisgit。
推薦先pull [https://github.com/weijunying2019102969/novelsfortest.git],裡面有測試用例

地址:https://github.com/suihao228491/homework3.git