项目代码地址 / 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一起合作非常开心