• 结对编程1---基于Flask的四则运算题目生成器


    项目代码地址 / WEB应用地址 / 合作伙伴iFurySt博文链接


    需求分析

    本次程序是基于原有的控制台四则运算器的基础上,改成WEB的形式,同时还增加了一些新的功能。同时因为交互方式的改变,代码也需要作出相应的调整。

    程序设计

    相比之前的程序,这次的版本多出了一些功能:

    • 多语言界面
    • 答题计时
    • 错题记录
    • 支持小数计算
    • 难度分级
    • 拒绝非法输入

    在合作分工上,我负责的是数据处理的功能模块,iFurySt负责WEB界面交互的部分。
    我的工作就是接收页面传来的用户输入参数并处理数据,并提供接口以供iFurySt对数据进行访问,以及数据库的存取操作。
    Flask框架将功能模块和视图界面分离开,这样对功能代码进行维护的时候,并不会影响到视图界面的代码。

    以下是整个应用的树形目录结构

    pair_work
    ├── data
    │   └── calc.db  
    ├── func.py
    ├── README.md
    ├── static
    │   └── timer.js
    ├── templates
    │   ├── error_question.html
    │   ├── layout.html 
    │   ├── index.html
    │   ├── question_paper.html
    │   └── result.html
    └── views.py
    3 directories, 10 files
    

    data目录下是数据库文件
    func.py是功能模块的代码
    static目录下是用于计时功能的js代码
    templates目录下是页面的html文件
    views.py是视图模块的代码

    代码展示

    根据分工,在新增的功能中,我负责错题记录,支持小数计算,难度分级这几个功能

    • 难度分级:

    根据不同的难度分级构造题目:
    简单 - 整数二元四则运算
    中等 - 整数多元四则运算
    困难 - 整数与分数(或小数)的混合多元四则运算

    if level==1:
    	mul = 1
    else:
    	mul = random.randint(2,3)
    float_fraction = random.choice([True,False])
    for i in range(mul+1):
    	int_temp = random.randint(1,10)
    	if level==3:
    		a = random.randint(1,9)
    		b = random.randint(a+1,10)
    		if float_fraction:
    			float_temp = Fraction(a,b)
    		else:
    			fa = str(random.randint(1,9))
    			fb = str(random.randint(0,9))
    			fc = str(random.randint(0,9))
    			float_temp = eval(fa+'.'+fb+fc)
    		digit_temp = random.choice([int_temp,float_temp])
    	else:
    		digit_temp = int_temp
    	digit.append(digit_temp)
    	if i!=0:
    		sign.append(random.choice(sign_list))
    sign_order = list(range(1,mul+1))
    random.shuffle(sign_order)
    ques = ques_builder(digit, sign, sign_order)
    key = ques_key(digit,sign,sign_order)
    
    
    • 数据库存取操作:

    根据传入的参数,对不同表不同数据进行存取操作

    def db_operate(op,pkg):
    	con = sqlite3.connect('./data/calc.db')
    	if op==1:
    		con.execute('delete from question')
    		for i in pkg:
    			sql = "insert into question (id,question,real_answer) values ('%s','%s','%s')" % (i['id'],i['question'],i['real_answer'])
    			con.execute(sql)
    	if op==2:
    		sql = 'select id,question,real_answer from question'
    		result = con.execute(sql)
    		for row in result:
    			i = dict(id=row[0],question=row[1],real_answer=row[2])
    			pkg.append(i)
    		return pkg
    	if op==3:
    		for i in pkg:
    			sql = "insert into error (question,real_answer,user_answer) values ('%s','%s','%s')" % (i['question'],i['real_answer'],i['user_answer'])
    			con.execute(sql)
    	if op==4:
    		sql = 'select question,real_answer,user_answer from error'
    		result = con.execute(sql)
    		for row in result:
    			i = dict(question=row[0],real_answer=row[1],user_answer=row[2])
    			pkg.append(i)
    		return pkg
    	con.commit()
    	con.close()
    
    • 错题记录:

    error_record()由compare()答案比较函数调用,将比对后结果错误的题目记录存入数据库
    error_reader()由flask框架代码调用,读取错题记录

    def error_record(pkg):
    	error_list = []
    	for i in pkg:
    		if not i['flag']:
    			error = dict(question=i['question'],real_answer=i['real_answer'],user_answer=i['user_answer'])
    			error_list.append(error)
    	num = len(error_list)
    	error_list_old = db_operate(4,[])
    	error_list.extend(error_list_old)
    	db_operate(3,error_list)
    	return num
    
    def error_reader():
    	error_list = db_operate(4,[])
    	return error_list
    

    程序运行




    PSP

    小结感受

    第一次合作编程,体验很不错。和iFurySt一起合作非常开心

  • 相关阅读:
    这篇是Mark刚写的文档,原文为http://blogs.technet.com/markrussinovich/archive/2009/11/03/3291024.aspx
    自动加域批处理脚本[转]
    一次moveuser的使用经历[转]
    How to create fully custom Role, User, Event, Resource classes for use with the Security and Scheduler modules
    VBS脚本批处理创建域用户【可自动设置用户密码,创建OU】[转]
    eXpress App Framework Team
    客户端【脚本】自动加入域[转]
    XAF 如何控制自定义按钮的使用权限[转]
    How to make crossthread calls. (多线程操控窗体控件之不可行)
    改变TFS本地映射路径.
  • 原文地址:https://www.cnblogs.com/jahowz/p/6532563.html
Copyright © 2020-2023  润新知