zoukankan      html  css  js  c++  java
  • 结对编程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一起合作非常开心

  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/jahowz/p/6532563.html
Copyright © 2011-2022 走看看