【教学类-06-06】20220414 X以内数字分合题(分)总数从小到大排列(Python VS )

21 篇文章 0 订阅

教学需求:

为了让分合题的总和也能从小到大排列,从0的分合开始一直到最大数的分合

 代码展示

'''
author:马清新 阿夏
原理:实现“20以内分合题(减法题)总数从0开始分合,1分合,2分合 从小到大排列(利用 九九乘法口诀表) ”
不会出现1+10= 后面直接是10+0=的情况。
时间:2022-4-14 14:31
'''

#  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=[]



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 = '  '+str(x+y)+'\n' + ' /  ' +  '  \'+'\n'+' __    ' + str(y)+'\n'+'\n'
            # # resultList='  '+str(x+y)+'\n' + ' /  ' +  '  \'+'\n'+str(x)+ str(y)+'\n'+'\n'# 题目和结果
            # if x<=sumMax and x>y and x-y>=0: 
            tempStr = '   '+str(x)+'\n' + '  /   \ '+'\n'+' '+str(y) + '   __'+'\n'
            resultList='   '+str(x)+'\n' + '  /   \ '+'\n'+' '+str(y) + '   '+str(x-y)+'\n'
                # tempStr = '   '+str(x)+'\n' + '  /   \ '+'\n'+'__   '+str(y)+'\n'
                # resultList='   '+str(x)+'\n' + '  /   \ '+'\n'+' '+str(x-y)+'   '+str(y)+'\n'            
            if x>sumMax or x<y or x-y<0:  
                # 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)    

      
          
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.strip('\n'))   # 把内容按段落输入到doc这个docx文件内
    doc.add_paragraph(k)
# 上面两行代码来自: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(25)                # 数字题目字体大小
        run.font.bold = True                    #数字题目字体是否加粗 不加粗,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(32)   #数字段间距
       

# 设置页眉的内容
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'), '6') #把第二节页设置为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.strip('\n'))     # 把内容按段落输入到doc这个docx文件内
    doc.add_paragraph(l)
# CSDN博主「编程亿直爽」
# 字体这一段一定要再写一次
for paragraph in doc.paragraphs:
    for run in paragraph.runs:             
        run.font.size = Pt(25)                # 数字题目字体大小
        run.font.bold = True                    #数字题目字体是否加粗 不加粗,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(32)   #数字段间
        # paragraph.text=paragraph.strip('\n')

# 设置页眉的内容
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)

运行效果

 (题目)答题位置在第二格

  (答案)

答题位置在第二格

 也可以把填空换在第一个位置(上面两行注释掉) 

 

问题:

1.还没有办法把题目混合排序

2.除了数字习题,想不出更多与主题教学活动相关的学具设计了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值