【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)

前提需求:

【教学类-07-02】20220330 5以内加减法不重复题 及生成word打印docx纸(方法二)(Python VS)_reasonsummer的博客-CSDN博客【教学类-07-02】20220330 5以内加减法不重复题 及生成word打印docx纸(方法二)(Python VS)https://blog.csdn.net/reasonsummer/article/details/123849329?spm=1001.2014.3001.5501在上一份x以内加减法不重复题的生成中,实现了# random.shuffle(selectList) #shuffle 洗牌算法,并把内部的值打乱(不重复随机排列)。并生成多份(如果5以内批量40题,生成2份,第一份的40题排在一起是一组,第二份40题排在一起第二组,两份的内容是不重复的所有数字题,但是每份每题出现的位置不同,类似AB卷)。

但也阿夏遇到一个问题:selectList.sort()#sort 正序排列中,会出现以下情况,

【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第1张图片

 【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第2张图片

 【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第3张图片

 说明sort是以两个数组的第一个数排序的。

那么是否可以让0、1、2、3的顺序从小到大排序呢,特别是在加减混合部分也能以第一个整数为准,从小到大排序?

【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第4张图片

【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第5张图片

破解思路:

在练习“高斯连加”九九乘法表”时,阿夏从乘法口诀表的终端样式(从小到大排序)中汲取经验,把它改成了“加法题”“减法题”,利用“’break”排除重复值的方法,将大于20的题目样式排除,获取的20以内加法题和减法题。 【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第6张图片

 【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第7张图片

 实现代码:

1.“X以内纯加法题(从小到大排序)”

2.“X以内纯减法题(从小到大排序)”

3“X以内加减混合题(从小到大排序)”

'''
author:马清新 阿夏
原理:实现“20以内加减法题目 按第一个数字从小到大排列(利用 九九乘法口诀表) ”
不会出现1+10= 后面直接是10+0=的情况。
时间:2022-4-5 13:31
'''

'''
重要提示:
1。请在主目录下(我是D:\test)新建一个"页码.docx"文档,随便选一个页码插入页脚中间。其他格式不用调整。
2。请在主目录下(我是D:\test)新建一个"页码.docx"文档,随便选一个页码插入页脚中间。其他格式不用调整。
3。请在主目录下(我是D:\test)新建一个"页码.docx"文档,随便选一个页码插入页脚中间。其他格式不用调整。
否则程序不运行!!!

'''
#  10以内
from base64 import b16encode
from binascii import a2b_hqx
import docx
from docx import Document
from docx.shared import Pt 
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
import numpy as np
import random
from re import X
import time
from async_generator import yield_ 

# 需要输入数字 
item=int(input('1.加法题。2.减法题。3,加减混合。\n'))#这里手动写入,可以改成选择题。 
sumMax = int(input('请输入最大数字((≥0)):\n'))# 输入最大值
zero=int(input('是否包含0:包含输入0;不包含输入1\n'))
# sort=int(input('1.打乱排列,2。从到大排列\n'))

tempStr=[]
resultList=[]
alltopic=[]
alltopic2=[]
allanswer=[]
allanswer2=[]
selectList =[]# 把resultList的答案打乱排序或者正序排序,存入selectList被选择过的列表里
selectList_topic=[] # 把selectList的2项内容合并存入selectList_topic  只存入题目
selectList_answer=[]# 把selectList的2项内容合并存入selectList_topic 存入题目和答案
a1=[]
a2=[]
b1=[]
b2=[]
a11=[]
a12=[]

# X以内纯加法题
if item==1:
    name='加法题'
    N=int(input('{}以内{},你需要多少份\n'.format(sumMax,name)))# 如果有10个孩子,就打印10份,或者想给1个孩子
    for zz in range(N):   
        for x in range(zero,sumMax+1):        # 第1个加数
            for y in range(zero,sumMax+1):   # 第2个加数
                # 加法  符合要求的题型是 第一位+第二位<=20         
                tempStr='{}+{}='.format(x,y)         # 有题目 
                resultList='{}+{}={}'.format(x,y,(x+y))# 有题目和结果
                # 如果 第1个加数+第2个加数大于20,就中断,放弃这道题目                  
                if x+y>sumMax:        
                    # print('')            
                    break      # 中断,排除不符合要求的题目                      
                a1.append(tempStr)#空3格实现所有题目全部遍历,正序排序 但终端样式为两层[[''],['']]
                # print(a1)
                a2.append(resultList)#空3格实现所有题目全部遍历,正序排序 但终端样式为两层[[''],['']]
                # print(a2) 
        # random.shuffle(a1) 
        # random.shuffle(a2) 
        # a11.append(a1)         
        # a12.append(a2) 

if item==2:
    name='减法题'
    N=int(input('{}以内{},你需要多少份\n'.format(sumMax,name)))# 如果有10个孩子,就打印10份,或者想给1个孩子
    for zz in range(N):    
        for x in range(zero,sumMax+1):# 第1个减数,比第2个减数更大
            for y in range(zero,sumMax+1): # 第2个减数
                # 减法  符合要求的题型是 0<第一位-第二位<20,第一位>第二位
                tempStr='{}-{}='.format(x,y)         # 有题目
                resultList='{}-{}={}'.format(x,y,x-y)# 题目和结果 
                # 如果 第1个数-第2个>20 第1个数-第2个<0(负数) 或者第一位<第二位,就中断,放弃这道题目            
                if x-y>sumMax or x=y and x-y>=0:              
                    tempStr='{}-{}='.format(x,y)         # 只有题目
                    resultList='{}-{}={}'.format(x,y,x-y)
                    a1.append(tempStr)                  
                    a2.append(resultList)
        # random.shuffle(a1) 
        # random.shuffle(a2)                                  
        # a11.append(a1)         
        # a12.append(a2)         
          
m='从小到大排序'  
# b1=[] # 把题目变成一段一段的,不要连在一起,结果存在这里

for _ in a1:
    b1.append(_)         
    # print(b1) 
for _ in a2:
    b2.append(_)         
    # print(b2) 
         


# 验证生成算式数量70
print('共生成不重复的{}算式的题目数量{}'.format(name,len(b1)))# 选择列表selectList的数量
print('{}最大不重复的算式的限制数量{}'.format(name,len(b1)))#  结果列表resultList的数量
        


print('-------------------第一部分 完成---------------------')
time.sleep(0.5)
print('------------第二部分:"幼儿题目纸”导入docx--------------')
time.sleep(0.5)

# 第2部分word模板样式 模块
import docx
from docx import Document
from docx.shared import Pt 
from docx.shared import RGBColor
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn

# s设置基本模板
doc = docx.Document('页码.docx')# 打开带docx模板(这个模板有页脚的页码,阿夏认为页码是必须的)
for k in b1:     # 用k 在selectList3的列表值(40题*N)内遍历
    # print(k)     # 打印遍历的内容
    doc.add_paragraph(k)     # 把内容按段落输入到doc这个docx文件内
# 上面两行代码来自:CSDN博主「编程亿直爽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# 原文链接:https://blog.csdn.net/qq_58153224/article/details/120655487  
# 感谢它解决困扰我很久的问题——如何把“终端答案/selectList=[]列表的值 直接保存到docx(不通过TXT转存)”

# 字体这一段一定要再写一次
for paragraph in doc.paragraphs:
    for run in paragraph.runs:             
        run.font.size = Pt(28)                # 数字题目字体大小
        run.font.bold = False                    #数字题目字体是否加粗 不加粗,5*8再加粗比较满,压抑了
        run.font.name = 'Arial'           # 控制是英文时的字体
        run.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')  # 控制数字是中文时的字体
        paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # 设置数字页眉居中对齐
        # paragraph.paragraph_format.line_spacing=2.5 #数字中文字的段行距
        paragraph.paragraph_format.line_spacing = Pt(50) #数字段间距

# 设置页眉的内容
header = doc.sections[0].header  # 获取第一个节的页眉
paragraph = header.paragraphs[0] # 获取页眉的第一个段落    
text =paragraph.add_run('(题目){}以内{}-{}-不重复题数量-共{}题\n'
                '姓名:______________学号:_______________班级:___________分数________ '.format(sumMax,name,m,len(b1))) # 添加页面内容
text.font.size = Pt(20)                # 页眉字体大小
text.bold = True                    # 页眉字体是否加粗
text.font.name = 'Arial'           # 控制是英文时的字体
text.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')  # 控制是中文时的字体
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置页眉居中对齐
paragraph.paragraph_format.line_spacing=1.5  #页眉中文字的段间距

# 设置主要页边距 5
from docx.shared import Cm # 导入cm模块
doc.sections[0].top_margin = Cm(1)# sections[1]是第二节=第二页 上边距
doc.sections[0].bottom_margin = Cm(1)# sections[1]是第二节=第二页 下边距
doc.sections[0].left_margin = Cm(1) # sections[1]是第二节=第二页 左边距
doc.sections[0].right_margin = Cm(1.5)# sections[1]是第二节=第二页 右边距
# 设置其他页边距 
doc.sections[0].gutter=Cm(0)# sections[1]是第二节=第二页 装订线 默认为0 左
doc.sections[0].header_distance=Cm(0.8)# sections[1]是第二节=第二页 页眉边距
doc.sections[0].footer_distance=Cm(1.3)# sections[1]是第二节=第二页 页脚边距
# 装订线还有一个位置属性,暂时未发现如何设置,默认为左,如果需求设置成右,可以建个模板docx文档导入。

# 设置纸张方向和大小  LANDSCAPE=横  PORTRAIT纵  默认信纸 纵
from docx.shared import Cm # 导入CM # 
from docx.enum.section import WD_ORIENTATION  # 导入纸张方向
doc.sections[0].page_height = Cm(21)  # 设置A4纸的高度
doc.sections[0].page_width = Cm(29.7)  # 设置A4纸的宽
doc.sections[0].orientation = WD_ORIENTATION.LANDSCAPE # 设置纸张方向为横向 L 

# 设置分栏 如果不要,就把数字该为为1
from docx.oxml.ns import qn
doc.sections[0]._sectPr.xpath('./w:cols')[0].set(qn('w:num'), '5') #把第二节页设置为2栏

# 设置页眉和页脚
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT# 导入文本居中 居左、居右
from docx.shared import Pt 
# 基本模板
doc.save('(题目){}以内{}-{}-不重复题数量-共{}题--共{}份.docx'.format(sumMax,name,m,len(b1),N))

print('-------------------第二部分 题目纸 完成-----------------')
time.sleep(0.5)
print('--------------第三部分:“教师答案纸”导入docx---------------')
time.sleep(0.5)


# 设置基本模板
doc = docx.Document('页码.docx')# 打开带页脚的docx模板(样板要输入数据 才能被保存,)
# “题目docx”和“题目+答案word”都需要同样的格式设置,把设置部分做一个函数体,便于调用。
for l in b2:     # 用k 在selectList3的列表值(40题*N)内遍历
    # print(k)     # 打印遍历的内容
    doc.add_paragraph(l)     # 把内容按段落输入到doc这个docx文件内
# CSDN博主「编程亿直爽」
# 字体这一段一定要再写一次
for paragraph in doc.paragraphs:
    for run in paragraph.runs:             
        run.font.size = Pt(28)                # 数字题目字体大小
        run.font.bold = False                    #数字题目字体是否加粗 不加粗,5*8再加粗比较满,压抑了
        run.font.name = 'Arial'           # 控制是英文时的字体
        run.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')  # 控制数字是中文时的字体
        paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # 设置数字页眉居中对齐
        # paragraph.paragraph_format.line_spacing=2.5 #数字中文字的段行距
        paragraph.paragraph_format.line_spacing = Pt(50) #数字段间距

# 设置页眉的内容
header = doc.sections[0].header  # 获取第一个节的页眉
paragraph = header.paragraphs[0] # 获取页眉的第一个段落    
text =paragraph.add_run('(答案){}以内{}-{}-不重复题数量-共{}题\n'
                '姓名:______________学号:_______________班级:___________分数________ '.format(sumMax,name,m,len(b1))) # 添加页面内容
text.font.size = Pt(20)                # 页眉字体大小
text.bold = True                    # 页眉字体是否加粗
text.font.name = 'Arial'           # 控制是英文时的字体
text.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')  # 控制是中文时的字体
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置页眉居中对齐
paragraph.paragraph_format.line_spacing=1.5  #页眉中文字的段间距

# 设置主要页边距 5
from docx.shared import Cm # 导入cm模块
doc.sections[0].top_margin = Cm(1)# sections[1]是第二节=第二页 上边距
doc.sections[0].bottom_margin = Cm(1)# sections[1]是第二节=第二页 下边距
doc.sections[0].left_margin = Cm(1) # sections[1]是第二节=第二页 左边距
doc.sections[0].right_margin = Cm(1.5)# sections[1]是第二节=第二页 右边距
# 设置其他页边距 
doc.sections[0].gutter=Cm(0)# sections[1]是第二节=第二页 装订线 默认为0 左
doc.sections[0].header_distance=Cm(0.8)# sections[1]是第二节=第二页 页眉边距
doc.sections[0].footer_distance=Cm(1.3)# sections[1]是第二节=第二页 页脚边距
# 装订线还有一个位置属性,暂时未发现如何设置,默认为左,如果需求设置成右,可以建个模板docx文档导入。

# 设置纸张方向和大小  LANDSCAPE=横  PORTRAIT纵  默认信纸 纵
from docx.shared import Cm # 导入CM # 
from docx.enum.section import WD_ORIENTATION  # 导入纸张方向
doc.sections[0].page_height = Cm(21)  # 设置A4纸的高度
doc.sections[0].page_width = Cm(29.7)  # 设置A4纸的宽
doc.sections[0].orientation = WD_ORIENTATION.LANDSCAPE # 设置纸张方向为横向 L 

# 设置分栏 如果不要,就把数字该为为1
from docx.oxml.ns import qn
doc.sections[0]._sectPr.xpath('./w:cols')[0].set(qn('w:num'), '5') #把第二节页设置为2栏

# 设置页眉和页脚
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT# 导入文本居中 居左、居右
from docx.shared import Pt 


doc.save('(答案){}以内{}-{}-不重复题数量-共{}题--共{}份.docx'.format(sumMax,name,m,len(b1),N))

print('-------------------第三部分“答案纸”完成---------------------')
time.sleep(0.5)
print('---------------请到D盘test下查找---------------------')
time.sleep(0.5)

运行过程:

(一)纯加法题 从小到大排序

【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第8张图片

 【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第9张图片【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第10张图片

  答案不会大于20

答案部分【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第11张图片

题目部分

【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第12张图片

  排序样式:第一个整数都是按照0-20排序,第二个整数也是按照0-20排序

(二)纯减法题 从小到大排序

【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第13张图片

 【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第14张图片

 答案部分【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第15张图片

 题目部分【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第16张图片

  排序样式:第一个整数都是按照0-20排序,第二个整数也是按照0-20排序

(三)加减混合题 从小到大排序

【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第17张图片

 【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第18张图片

 【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第19张图片

 答案部分【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第20张图片

 题目部分【教学类-06-05】20220405 20以内加减法“从小到大排序题“(不重复题)(Python VS)_第21张图片

   排序样式:第一个整数都是按照0-20排序,第二个整数也是按照0-20排序,先加后减,不存在的题目跳过,后续加法题或减法题补上直到用完。

存在问题:

1.使用洗牌后,打印20以内加法题两份,将231个+231个两组的内容用EXCEL排序,单组有大量重复题。破解不能,这个代码目前只能单一用于批量“按题目整数从小到大排序-单份”

2.代码太长了,目前吃不透原理,不敢用Def 函数体引用。

你可能感兴趣的:(大班,Python,python)