结对编程

≡放荡痞女 提交于 2019-11-30 03:37:50
  先附题目:
个人项目:中小学数学卷子自动生成程序
用户:
小学、初中和高中数学老师。
功能:
1、 命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
2、 登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
3、 题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
4、 在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
5、 生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
6、 个人项目9月17日早上8点以前提交至各自负责的助教处。提交方式:工程文件打包,压缩包名为“几班+姓名.rar”。
 
附表-1:账户、密码
账户类型 账户 密码 备注
小学 张三1 123  
张三2 123  
张三3 123  
初中 李四1 123  
李四2 123  
李四3 123  
高中 王五1 123  
王五2 123  
王五3 123  
附表-2:小学、初中、高中题目难度要求
  小学 初中 高中  
难度要求 +,-,*./ 平方,开根号 sin,cos,tan  
备注 只能有+,-,*./和() 题目中至少有一个平方或开根号的运算符 题目中至少有一个sin,cos或tan的运算符  
 

       队友采用python编写,4个python文件实现登录、换年级、生成题目、执行程序功能;1个Account.txt文件,用来存储用户名密码和年级信息。
       先来看login.py代码,登录用户名密码:
# -*- coding: utf-8 -*-
"""
@author: hzj
"""


def LoginAccount(AccountList):
    accowner=''
    while 1:
        string_input=input().split(' ')
        while(len(string_input)!=2):
            print('请输入正确的用户名、密码')
            string_input=input().split(' ')
        sem=0
        i=0
        while(i+2<len(AccountList)):
            if(string_input[0]==AccountList[i].lstrip('account:') and string_input[1]==AccountList[i+1].lstrip('password:')):
                sem=1
                     gradereturn=AccountList[i+2]
                break
            i=i+4
        if sem==1:
            accowner=string_input[0]
            break
        print('请输入正确的用户名、密码')
 #str.lstrip():删除字符串左边的指定字符,括号的写入指定字符,默认空格
    print('当前为'+gradereturn.lstrip('grade:')+'出题')
    return [gradereturn.lstrip('grade:'),accowner]
代码中,使用while循环的保证输入用户名和密码正确,首先判断输入的信息是否为两个元素,否则要求重新输入;之后判断用户名和密码是否正确,如果不正确同样要求重新输入,正确则输出:正在为XX出题,表示登录成功并且进入账号在线状态。

         再看ChangGrade.py代码,切换年级:
def ChangGrade(string_input):
    sem=0
    while(1):
        while(len(string_input)!=5):
            print('请输入小学、初中和高中三个选项中的一个')
            string_input=input()
        if (string_input[3:5]=='小学')or(string_input[3:5]=='初中')or(string_input[3:5]=='高中'):
            sem=1
            grade=string_input[3:5]
        if sem==1:
            break
    return grade
     在console框中输入:切换为XX,XX为小学,初中,高中任一个。代码中截取XX作为判断依据,如果为小学,初中,高中任一个,就返回,表示切换年级成功。

     再看重中之重的生成题目的代码ProQues.py,代码中只有一个方法,首先实现生成文件夹,生成txt文件;然后先用随机数产生1-5个操作数,同时将四则运算符号用不同的标记位表示,接着根据操作数的个数计算出每道题目中的最大括号数,操作数大于3个时才进行添加括号操作。加入括号的方法是首先先用一个数组存放每个括号的位置,使用随机数随机0和1,如果为1则表示尝试添加括号,判断题目中是否已经存在该位置的括号,或者添加括号的位置是否存在逻辑错误:逻辑在于每次添加的括号的都是成对的,并且都是从中间任意一定可以加一个括号的位置开始加括号,所以如果先加入了一个括号之后,下一个括号中的无论"("还是“)”都不能放入前一个括号之间,并且需要考虑每次加入的括号都要先从可放括号的最短距离,可放括号的最长距离进行辨别放入“)”,“(”这两种括号形式;在记录完随机存放的括号之后,就开始进行操作数,运算符号的整合,这里有一个点需要注意,
sumbracandsym=[]
            for j in range(0,numofterm):#每个操作数可能加符号
                sumbracandsym.append([[j,j+1],0])
            for bracket in addbracket:  #每个括号可能加符号
                bracandsym=[]
                bracandsym.append(bracket)
                bracandsym.append(0)
                sumbracandsym.append(bracandsym)
            sumbracandsym.append([[0,numofterm],0])#整个式子可能加符号
代码中首先会先给每个操作数、括号、式子,用0来标志可以加入运算符号(+-*/^2^(1/2) tan sin cos),这样就给后面随机加入符号提供判断依据,判断该处是否还可以放入运算符号。
     最后是查重,python查重比较简单(if(题目 in 试卷))就可以知道是否存在:刚刚随机生成的题目是否已经存在于试卷当中,是则取消当前题目,继续下一题目随机生成,否则将当前题目写入试卷。
if(ex in historyques):
                i-=1
            else:
                historyques+='ex'
                historyques+='\n'
                file.write(str(i+1)+'. '+ex+'\n\n')
                file.flush()

      总体思路:登录和转换年级暂且不谈,因为都是根据题目要求,比较简单,重点在生成题目:随机生成操作数数目(n),根据操作数数目来计算题目(字符串)长度(2*n+1),每个操作数的两边都要预留位置给运算符或者括号用(listex字符串表示);之后就是随机产生括号,记录可以产生括号的位置,然后就可以开始在listex中替换字符来添加运算符号了;最后就是查重。
      代码思路严谨,考虑到题目几乎所有出现的可能性,达到了项目的要求。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!