设计思路
在(教学类-06-01)测20以内加减法的最大数量(优化版 20220122 VS python 20以内加减法)CSDN 中可以算出20以内加减法混合题的最多题数。
为了更方便地区分20以内加法题、20以内减法题、20以内加减法混合题。阿夏将马老师的代码进行微调修改,从而能够更方便地根据需求,批量出不重复的三类题目(纯加法题、纯减法题、加减法混合题)
一、程序运行测试后的“XX以内加减法、减法题、加法题”的最大不重复题目数量。
一、代码
# -*- coding: utf-8 -*-
"""
@author: 马清新
@file: 阿夏修改(最大不重复算式值 20以内加法题、20以内减法题、20以内加减法混合题(最大不重复算式值).py
@time: 2022/2/4 17.18
# 特别说明
1、选择“1.纯加法题。2.纯减法题。3.加减法混合题(请输入序号)”
2、分开计算,纯加法题数量+纯减法题数量=加减法混合题数量。
3、结果分别保存在相应的TXT内
4、可通过注释,选择txt里面题目是否有答案。
5、本题所有答案都是打乱模式 random.shuffle.如果是10以内加法、减法、加减法可以排序 sort
"""
import random
from re import X
choice=int(input('------------------------------------\n'
'求X以内的加法题、减法题、加减法题的数量?\n'
'1.纯加法题。2.纯减法题。3.加减法混合题(请输入序号)\n'
'------------------------------------\n'))
# 加法题 :20以内不重复的所有加法题
if choice == 1:
sumMax = int(input('请输入纯加法算式最大和((≥0)):\n'))# 输入最大值
regNum = int(input('请输入需要纯加法算式的数量:\n'))# 输入需要的数量
# 生成1个列表,列表从0开始,到算术最大和结束,因为range函数包左不包右,因此如果要包括算式最大和,必须+1
# range函数从0开始,这样列表元素和列表索引一致,减轻算法的难度
numList = [x for x in range(0,sumMax+1)]# 建立整数列表,假设SUMMAX=20 sumMax+1等于21 但实际范围就是1-20,确保列表索引和列表元素一致
# resultList列表用于保存最后需求数量的合规算术式
resultList = []# 储存结果的列表
# 从列表第2个元素开始到列表最后一个元素进行循环遍历
for x in numList[0:]:# 0等于数字1
# 从列表第x个元素开始到列表最后一个元素进行循环遍历
for y in numList[x:]:
# 加法
if (x == y) and (x + y <= sumMax)and (y != 0): # X或Y两者一个或者两个都不能0。没有0+0,0-0
tempStr = str(x) + ' + ' + str(y) + ' = '
resultList.append((tempStr, (x+y)))
elif x + y <= sumMax and (y != 0):# 第一位或者第二位都不为0,也就是没有
tempStr = str(x) + ' + ' + str(y) + ' = '
resultList.append((tempStr, (x+y)))
tempStr = str(y) + ' + ' + str(x) + ' = '
resultList.append((tempStr, (x+y)))
elif y - x == 0 and(y == 0):#此段只有一个答案0+0=0,不需要的话,此段注释掉
tempStr = str(y) + ' + ' + str(x) + ' = '#减法类型3 y-x=0
resultList.append((tempStr, (y+x)))# 带答案的题目,如0+0=0,
# 建立最终符合最终要求的算式列表
selectList = []# 选择列表
if regNum > len(resultList):#如果(输入算式的数量)大于(结果列表的数量)#输入题数大于实际需求,就用shuffle洗牌,
print(f'您的需求大于最大算式生成数量!最大生成算式数量为{len(resultList)}') # 加了最大不重复算式统计值,如果输入的题数大于储存结果的列表的数量,列表加LEN
i = len(resultList)# i的数量等于储存结果的列表的数量
for _ in resultList:# 值在循环储存结果的列表内
selectList.append(_) #选择列表 需要添加循环储存结果列表的内容
random.shuffle(selectList) #shuffle 洗牌算法,把列表所有元素打乱,随机排列
# selectList.sort()#sort 正序排列,只有10以内的能排序,超过10就乱序
for _ in selectList:
# 可选打印带答案的和不带答案啊8
print(_[0])# 不带答案
# print(f'{_[0]}{_[1]}')# 带答案
else:#输入题数小于实际需求,代码自动随机抽取,不会排序,
i = regNum
selectList = random.sample(resultList,i)
for _ in selectList:
# 可选打印带答案的和不带答案啊
print(_[0])# 不带答案
# print(f'{_[0]}{_[1]}')# 带答案2
# 验证生成算式数量70
print(f'共生成不重复的纯加法算式的题目数量{len(selectList)}')# 选择列表的数量
print(f'纯加法最大不重复的算式的限制数量{len(resultList)}')# 结果列表的数量
# 2月4日修改TXT文件名称
str_title = '%d以内的纯加法题(共%d题).txt' % (sumMax, len(resultList)) # 保存带数字提示的题目
with open(str_title,'w') as f:# 打开TXT文件
for a in selectList:# #循环查找答案的内容
f.write(str(a[0])+'\n')# 不带答案
# f.write(str(a[1])+'\n')#只有答案
# f.write(str(a[0])+str(a[1])+'\n')#有题目有答案 TXT里面是题目+答案,终端显示题目 无答案,因为上面选了(0)
f.close()# #关闭TXT
# 减法题 :20以内不重复的所有减法题
if choice==2:
sumMax = int(input('请输入纯减法算式最大和((≥0)):\n'))# 输入最大值
regNum = int(input('请输入需要的纯减法算式的数量:\n'))# 输入需要的数量
# 生成1个列表,列表从0开始,到算术最大和结束,因为range函数包左不包右,因此如果要包括算式最大和,必须+1
# range函数从0开始,这样列表元素和列表索引一致,减轻算法的难度
numList = [x for x in range(0,sumMax+1)]# 建立整数列表,假设SUMMAX=20 sumMax+1等于21 但实际范围就是1-20,确保列表索引和列表元素一致
# resultList列表用于保存最后需求数量的合规算术式
resultList = []# 储存结果的列表
# 从列表第2个元素开始到列表最后一个元素进行循环遍历
for x in numList[0:]:# 0等于数字1
# 从列表第x个元素开始到列表最后一个元素进行循环遍历
for y in numList[x:]:
# 加法
if (x == y) and (x + y <= sumMax)and (y != 0): # X或Y两者一个或者两个都不能0。没有0+0,0-0
tempStr = str(x) + ' - ' + str(y) + ' = '
resultList.append((tempStr, (x-y)))
#加和减 查找 x + y < 算式最大和的加减法,此处考虑加法交换律,减法中去除了相减为0的情况,因为此处y>x
elif x + y <= sumMax and (y != 0):# 第一位或者第二位都不为0,也就是没有
tempStr = str(y) + ' - ' + str(x) + ' = '
resultList.append((tempStr, (y-x)))
# 考虑循环后期,x+y会打印算式要求的最大和,但是减法符合算式要求,处于严谨的考虑没有使用else
# 减法 此处可以考虑直接使用else
elif y - x >= 0 and y != 0: # y可能等于x ,答案为0,但没有0-0
tempStr = str(y) + ' - ' + str(x) + ' = '
resultList.append((tempStr, (y-x)))
elif y - x == 0 and (y == 0):#此段只有一个答案0+0=0,不需要的话,此段注释掉
tempStr = str(y) + ' - ' + str(x) + ' = '#减法类型3 y-x=0
resultList.append((tempStr, (y-x)))# 带答案的题目,如0-0=0,
# 建立最终符合最终要求的算式列表
selectList = []# 选择列表
if regNum > len(resultList):#如果(输入算式的数量)大于(结果列表的数量)#输入题数大于实际需求,就用shuffle洗牌,
print(f'您的需求大于最大算式生成数量!最大生成算式数量为{len(resultList)}') # 加了最大不重复算式统计值,如果输入的题数大于储存结果的列表的数量,列表加LEN
i = len(resultList)# i的数量等于储存结果的列表的数量
for _ in resultList:# 值在循环储存结果的列表内
selectList.append(_) #选择列表 需要添加循环储存结果列表的内容
random.shuffle(selectList) #shuffle 洗牌算法,把列表所有元素打乱,随机排列
# selectList.sort()#sort 正序排列,只有10以内的能排序,超过10就乱序
for _ in selectList:
# 可选打印带答案的和不带答案啊8
print(_[0])# 不带答案
# print(f'{_[0]}{_[1]}')# 带答案
else:#输入题数小于实际需求,代码自动随机抽取,不会排序,
i = regNum
selectList = random.sample(resultList,i)
for _ in selectList:
# 可选打印带答案的和不带答案啊
print(_[0])# 不带答案
# print(f'{_[0]}{_[1]}')# 带答案2
# 验证生成算式数量70
print(f'共生成不重复的纯减法算式的题目数量{len(selectList)}')# 选择列表的数量
print(f'纯减法题目最大不重复的算式的限制数量{len(resultList)}')# 结果列表的数量
# 2月4日修改TXT文件名称
str_title = '%d以内的纯减法题(共%d题).txt' % (sumMax, len(resultList)) # 保存带数字提示的题目
with open(str_title,'w') as f:# 打开TXT文件
for a in selectList:# #循环查找答案的内容
f.write(str(a[0])+'\n')# 不带答案
# f.write(str(a[1])+'\n')#只有答案
# f.write(str(a[0])+str(a[1])+'\n')#有题目有答案 TXT里面是题目+答案,终端显示题目 无答案,因为上面选了(0)
f.close()# #关闭TXT
# 加减法混合:20以内加法减法混合题 的数量
if choice==3:
sumMax = int(input('请输入加减法混合算式题的最大和((≥0)):\n'))# 输入最大值
regNum = int(input('请输入需要生成加减法混合算式题的数量:\n'))# 输入需要的数量
# 生成1个列表,列表从0开始,到算术最大和结束,因为range函数包左不包右,因此如果要包括算式最大和,必须+1
# range函数从0开始,这样列表元素和列表索引一致,减轻算法的难度
numList = [x for x in range(0,sumMax+1)]# 建立整数列表,假设SUMMAX=20 sumMax+1等于21 但实际范围就是1-20,确保列表索引和列表元素一致
# resultList列表用于保存最后需求数量的合规算术式
resultList = []# 储存结果的列表
# 从列表第2个元素开始到列表最后一个元素进行循环遍历
for x in numList[0:]:# 0等于数字11
# 从列表第x个元素开始到列表最后一个元素进行循环遍历
for y in numList[x:]:
# 加法
if (x == y) and (x + y <= sumMax)and (y != 0): # X或Y两者一个或者两个都不能0。没有0+0,0-0
tempStr = str(x) + ' + ' + str(y) + ' = '
resultList.append((tempStr, (x+y)))
tempStr = str(x) + ' - ' + str(y) + ' = '
resultList.append((tempStr, (x-y)))
#加和减 查找 x + y < 算式最大和的加减法,此处考虑加法交换律,减法中去除了相减为0的情况,因为此处y>x
elif x + y <= sumMax and (y != 0):# 第一位或者第二位都不为0,也就是没有
tempStr = str(x) + ' + ' + str(y) + ' = '
resultList.append((tempStr, (x+y)))
tempStr = str(y) + ' + ' + str(x) + ' = '
resultList.append((tempStr, (x+y)))
tempStr = str(y) + ' - ' + str(x) + ' = '
resultList.append((tempStr, (y-x)))
# 考虑循环后期,x+y会打印算式要求的最大和,但是减法符合算式要求,处于严谨的考虑没有使用else
# 减法 此处可以考虑直接使用else
elif y - x >= 0 and y != 0: # y可能等于x ,答案为0,但没有0-0
tempStr = str(y) + ' - ' + str(x) + ' = '
resultList.append((tempStr, (y-x)))
elif y - x == 0 :#等数 相加 相减等于0,不需要的话,此段注释掉
tempStr = str(y) + ' + ' + str(x) + ' = '#减法类型3 y-x=0
resultList.append((tempStr, (y+x)))# 带答案的题目,如0+0=0,
tempStr = str(y) + ' - ' + str(x) + ' = '#减法类型3 y-x=0
resultList.append((tempStr, (y-x)))# 带答案的题目,如0-0=0,
# 建立最终符合最终要求的算式列表
selectList = []# 选择列表
if regNum > len(resultList):#如果(输入算式的数量)大于(结果列表的数量)#输入题数大于实际需求,就用shuffle洗牌,
print(f'您的需求大于最大算式生成数量!最大生成算式数量为{len(resultList)}') # 加了最大不重复算式统计值,如果输入的题数大于储存结果的列表的数量,列表加LEN
i = len(resultList)# i的数量等于储存结果的列表的数量
for _ in resultList:# 值在循环储存结果的列表内
selectList.append(_) #选择列表 需要添加循环储存结果列表的内容
random.shuffle(selectList) #shuffle 洗牌算法,把列表所有元素打乱,随机排列
# selectList.sort()#sort 正序排列,只有10以内的能排序,超过10就乱序
for _ in selectList:
# 可选打印带答案的和不带答案啊8
print(_[0])# 不带答案
# print(f'{_[0]}{_[1]}')# 带答案
else:#输入题数小于实际需求,代码自动随机抽取,不会排序,
i = regNum
selectList = random.sample(resultList,i)
for _ in selectList:
# 可选打印带答案的和不带答案啊
print(_[0])# 不带答案
# print(f'{_[0]}{_[1]}')# 带答案2
# 验证生成算式数量70
print(f'共生成不重复的算式的加减法混合题目数量{len(selectList)}')# 选择列表的数量
print(f'加减法混合题目最大不重复的算式的限制数量{len(resultList)}')# 结果列表的数量
# 2月4日修改TXT文件名称
str_title = '%d以内的加减法混合题(共%d题).txt' % (sumMax, len(resultList)) # 保存带数字提示的题目
with open(str_title,'w') as f:# 打开TXT文件
for a in selectList:# #循环查找答案的内容
f.write(str(a[0])+'\n')# 不带答案
# f.write(str(a[1])+'\n')#只有答案
# f.write(str(a[0])+str(a[1])+'\n')#有题目有答案 TXT里面是题目+答案,终端显示题目 无答案,因为上面选了(0)
f.close()# #关闭TXT
else:
print('输入错误,请重新输入.')
二、使用方法
(一)把代码存在一个py文件内。名字为" 20以内加减法选择题.py." 随意放在任何路径下。
(二)打开" 20以内加减法选择题.py. 右击运行
(三)终端出现第一个问题,选择“纯加法题、纯减法题、加减法混合题”
(二)加法题:如5以内加法题
输入1 选择纯加法题 回车
输入5 选择5以内的纯加法题 回车
输入任意数字,回车 这里是89,代表生成的题目数
终端显示21道加法题 回车
TXT里面的5以内不重复加法题
(二)减法题:如5以内减法题
输入2 选择纯减法题,回车
输入5 选择5以内的纯减法题 回车
输入任意数字,回车 这里是758,代表生成的题目数
终端显示21道减法题 回车
TXT里面的5以内不重复减法题 回车
(三)加减法混合题:如5以内减法题
输入3 选择加减法混合题,回车
输入5 选择5以内的加减法混合题 回车
输入任意数字,回车 这里是123,代表生成的题目数
终端显示42道加减法混合题 回车
TXT里面的5以内不重复加减法混合题 回车
本章总结
本代码可以生成不重复的x 以内2个数字加减法混合题。通过三个选择,分别获得X以内的纯加法题,纯减法题和加减法混合题。在幼儿教具设置时有了更多的选择:
1.符号上的选择:纯加 纯减 加减混合
2.数量上的选择:5以内 10以内 20以内
3.答案上的选择:列示题有答案、列示题有无答案、(通过注释修改)
4.教学常用x以内加减法的数字选择。大班常用 5以内、10以内