口算題自動生成的小程序分享「口算題生成器哪個好」

編程、寫代碼屬於腦力勞動,做軟體開發似乎是個製作虛擬之物的工作,但電腦程序大都是用途明確的,而且好的程序都是很實用。

學python也講究學以致用,這點越早越好,我們現在就用python編個實用的程序來,不僅僅可以自家重複使用,而且可以發給別人用:給小學生生成口算題。

首先我們要把目標再具體、明確些 – 確定需求:

  1. 生成百以內的加減法口算題
  2. 一次運行,連續出10題供使用的人練習,一題一題地做;
  3. 如果有做錯的題目,把它們列印出來給使用的人看

按照 自學Python進階-把代碼變成程序,軟體 講的方式,我們將把實現這些功能的代碼全部放在一個文件里:mathExam.py。編寫完成後,你就可以把這個文件重複運行,多次使用,也可以發給同學家、好友用。

為了提高程序出題的效果,我們期望每次題目都會有大變化 – 編程里常稱為:隨機。這個功能可以使用python基礎庫里的: random庫,我們僅僅用裡面的 randint 函數來隨機生成一個整數。

這裡我們提到了編程上一個新概念:函數。Python程序代碼里的函數和數學書本上的函數,形式不同,但是功用十分類似。定義Python的一個函數格式如下:

def functionName(p1, p2, p3):
    functionBody
    return result

其中的 def 是python的關鍵字,說明我們要開始定義一個函數了,而後面的 functionName是函數名字 – 這部分你可以自己想個名字的,後面括弧及其裡面逗號隔開的部分就是函數的參數 – 它們可以在使用函數時臨時一一提供,這樣即能重複利用它下面的代碼又能靈活變化,這正是函數的威力和魅力。自學Python進階 - 編個生成口算題的程序

python代碼

函數是所有現代編程語言里最基本、最重要的代碼組織形式,代碼重複利用方式, 它在所有的軟體代碼里幾乎無處不在。前面提到的random庫裡面就提供好些隨機生成數據的函數,我們下面會用到裡面的 randint函數。

函數的 functionBody 部分就是我們要編碼實現功能的地方,最後的 return result 就是把我們工作的結果返回給使用我們函數的人。

就像python自身的基礎庫里有很多函數一樣,我們也可以在我們的mathExam.py里寫多個函數,用函數來組織我們的代碼。

首先 我們定義一個函數解決需求 1 的部分:

# 隨機生成一個口算題及其正確結果的函數
def genOneExercise():  
  opt = random.randint(0, 1)  # 在0和1中隨機取一個值  
  if opt == 1:  # 如果隨機得到的是 1,我們就生成加法口算題    
    a = random.randint(1, 99)    # 注意這裡是 99    
    b = random.randint(1, 100-a)  # 這是保證百以內加法的地方    
    result = a + b    
    return a, opt, b, result  
  else:      # 如果隨機得到的是 0,我們就生成減法口算題    
    a = random.randint(1, 100)    
    b = random.randint(1, 100)    
    if a > b:      
      result = a - b      
      return a, opt, b, result    
    else:      
      result = b - a  # 這裡是避免出現減數不夠的地方      
      return b, opt, a, result

我們這個函數第一行的定義括弧里是空的,意味著使用它時不需要提供參數。這個函數每使用一次,程序員的說法是調用一次,就生成一個滿足上面需求1的結果。裡面的 randint(start, end)函數,調用它可以獲得一個數,這個數是從a開始(包含a)到b結束(包含b)的範圍里隨機選取的。

口算的題目和結果,我們存在一個元組裡了,並用1,0來分別表示加,減運算。我們不能把+,-符號存在變數里,因為這兩個符號在python語言里是特殊的類型符號,它們不同於數字或字元串類型的數據。所以隨機的加減運算在記錄、存儲到變數里時我們轉換了一下,同樣下面輸出提示時也要相應轉換。

下面看看需求2里的代碼長什麼樣:

def doExercises(times):
    random.seed(time.time())  
    # 為了保障隨機效果,每次運行時給隨機系統一個變化的種子
 
    errorList = []  
    i = 0  
    while i < times:
        x, op, y, res = genOneExercise()
        if op == 1:
            tip = str(x) + ' + ' + str(y) + ' = '
        else:
            tip = str(x) + ' - ' + str(y) + ' = '
    
        ret = int(input(tip)) # 注意把輸入的字元串類型轉換成數學計算的整型
        if ret != res:      # 只有口算結果錯了時才記錄
            record = (x, op, y, res, ret)  # 把一次口算錯誤的信息組織成一個元組
            errorList.append( record )    
        i = i + 1
    return errorList

注意這個函數的定義我們指定了參數變數 times – 做口算題的次數,這樣我們在調用的地方就可以方便地規定一次做多少道口算題目了。這裡我們把口算的題目的提示轉換成字元串的日常數學式子後,放在python內部自帶的函數 input里當作參數:輸出到屏幕上,並等待你輸一個數字給程序。

我們把回答不對的口算題記錄在一個列表變數里,做完後就是把這個變數里的記錄信息輸出來查看 – 完成需求3的功能:

# 列印口算結果
def printErrors(errors):
    if len(errors) > 0:
        print("口算錯誤的題目:")
        for error in errors:
            a, op, b, result, yourInput = error  
            if op == 1:     
                tip = str(a) + ' + ' + str(b) + ' = ' + str(result) + ", 你的錯誤答案:" + str(yourInput)      
            else:        
                tip = str(a) + ' - ' + str(b) + ' = ' + str(result) + ", 你的錯誤答案:" + str(yourInput)      
            print(tip)  
    else:    
        print("恭喜你全部答對!")

可以看到,這個函數末尾沒有return語句 – 我們不期望從它獲取什麼返回數據,讓它把信息直接輸出在屏幕上給我們看到即可。

到此我們把需求的3個功能都做完了,離可用起來還差一點:還必須把它們組織保持到文件里, 並在文件的執行入口裡調用(還記得 自學Python進階-把代碼變成程序,軟體 說明的地方么?)。

下面是代碼完整地放到文件里的樣子:

#!/usr/bin/env python3
import time    # 這行代碼讓我們能夠使用python基礎庫的time庫里函數
import random  # 這行代碼讓我們能夠使用python生成隨機數的函數
# 隨機生成一個口算題及其正確結果的函數
def genOneExercise():
  opt = random.randint(0, 1)  # 在0和1中隨機取一個值  
  if opt == 1:  # 如果隨機得到的是 1,我們就生成加法口算題    
    a = random.randint(1, 99)    # 注意這裡是 99    
    b = random.randint(1, 100-a)  # 這是保證百以內加法的地方    
    result = a + b    
    return a, opt, b, result  
  else:      # 如果隨機得到的是 0,我們就生成減法口算題    
    a = random.randint(1, 100)    
    b = random.randint(1, 100)    
    if a > b:      
      result = a - b      
      return a, opt, b, result    
    else:      
      result = b - a  # 這裡是避免出現減數不夠的地方      
      return b, opt, a, result

# 做口算練習, 做的題目個數通過函數參數指定
def doExercises(times):  
  random.seed(time.time())  # 為了保障隨機效果,每次運行時給隨機系統一個變化的種子
  
  errorList = []  
  i = 0  
  while i < times:    
    x, op, y, res = genOneExercise()    
    if op == 1:
      tip = str(x) + ' + ' + str(y) + ' = '    
    else:      
      tip = str(x) + ' - ' + str(y) + ' = '
    ret = int(input(tip))  # 注意把輸入的字元串類型轉換成數學計算的整型 
    if ret != res:      # 只有口算結果錯了時才記錄   
      record = (x, op, y, res, ret)  # 把一次口算錯誤的信息組織成一個元組      
      errorList.append( record )    i = i + 1
  return errorList

# 列印口算結果
def printErrors(errors):  
  if len(errors) > 0:    
    print("口算錯誤的題目:")    
    for error in errors:
      a, op, b, result, yourInput = error      
      if op == 1:        
        tip = str(a) + ' + ' + str(b) + ' = ' + str(result) + ", 你的錯誤答案:" + str(yourInput)      
      else:        
        tip = str(a) + ' - ' + str(b) + ' = ' + str(result) + ", 你的錯誤答案:" + str(yourInput)      
      print(tip)  
  else:    
    print("恭喜你全部答對!")


# 本文件執行時的入口 - 運行時從這裡開始
if __name__ == '__main__':  
  errors = doExercises(10)     # 來 10個 口算題練練吧 :)  
  printErrors(errors)          # 告訴我口算結果如何...

試試把它用起來,你會遇到什麼問題么?歡迎留言,下次一起來解決你的問題,完善我們的口算出題器。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/274262.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-17 14:11
下一篇 2024-12-17 14:12

相關推薦

發表回復

登錄後才能評論