python实现四则运算题库
#主函数(main.py)
from generator import Ari_Expression
from infixTosuffix import infix_to_suffix
import Calculate
def main():
max_num = int(input('请输入操作数的最大值:'))
problem = int(input('请输入需要的题目数量:'))
i = 1
correct = []
wrong = []
p = open('Exercises.txt', 'w')
r = open('Answer.txt', 'w')
while i < problem + 1:
ari = Ari_Expression(max_num)
inf = infix_to_suffix()
real_res = Calculate.getResult(inf.str_to_fraction(inf.to_suffix_expression(ari.str)))
if real_res >= 0:
real_res = ari.str_num(real_res)
print(str(i)+'. ' + ari.str, end = '')
p.write(str(i)+'. ' + ari.str + '\n')
r.write(str(i)+'. ' + real_res + '\n')
res = input()
if res == real_res:
correct.append(i)
else:
wrong.append(i)
i += 1
p.close()
r.close()
print('题目正确率:' + str(len(correct)/problem))
g = open('Grade.txt','w')
g.write('Correct:' + str(len(correct))+'(')
for x in correct:
g.write(str(x)+', ')
g.write(')\n')
g.write('Wrong:' + str(len(wrong))+'(')
for x in wrong:
g.write(str(x)+', ')
g.write(')\n')
if __name__ == '__main__':
main()
#模块一(Calculate.py)
from fractions import Fraction
import Stack
def getResult(expression):
stackValue = []
for item in expression:
if item in ["+", "-", "×", "÷"]:
n2 = stackValue.pop()
n1 = stackValue.pop()
result = cal(n1, n2, item)
if result < 0:
return -1
stackValue.append(result)
else:
stackValue.append(item)
return stackValue[0]
def cal(n1, n2, op):
if op == "+":
return n1 + n2
if op == "-":
return n1 - n2
if op == "×":
return n1 * n2
if op == "÷":
return n1 / n2
#模块二(generator.py)
from fractions import Fraction
import random
class Ari_Expression():
'''算术表达式的生成'''
def __init__(self, max_num):
self.init_operators()
self.init_nums(max_num)
self.init_expression()
def init_num(self, max_num):
'''随机生成数'''
denominator = random.randint(1, max_num)
numerator = random.randint(0, max_num)
return Fraction(numerator, denominator)
def insert_bracket(self):
'''插入括号'''
bracket = ['(', 'null', ')']
if len(self.operators) > 1:
x = random.randint(0, len(self.operators))
while x < len(self.operators):
y = random.randint(x, len(self.operators))
low = False
for a in self.operators[x:y + 1]:
if a in ['+', '-']:
low = True
break
try:
if self.operators[y + 1] in ['×', '÷'] and low:
self.operators.insert(x, '(')
self.operators.insert(y + 2, ')')
except IndexError:
pass
x = y + 2
def init_operators(self):
'''随机生成一个运算符并随机插入括号'''
self.operators = []
operator = ['+', '-', '×', '÷', 'null']
for x in range(3):
if x == 1:
self.operators.append(random.choice(operator[:-2]))
else:
y = random.choice(operator)
if y != 'null':
self.operators.append(y)
self.insert_bracket()
def init_nums(self, max_num):
self.nums = []
self.nums.append(self.init_num(max_num))
for x in range(len(self.operators)):
y = self.init_num(max_num)
if self.operators[x] == '÷':
while y.numerator == 0:
y = self.init_num(max_num)
self.nums.append(y)
def str_num(self, num):
'''字符串化一个分数'''
inter = int(num.numerator / num.denominator)
numerator = int(num.numerator % num.denominator)
str_num = ''
if numerator != 0:
str_num += str(numerator) + '/' + str(num.denominator)
if not str_num:
'''如果为空'''
str_num += str(inter)
else:
if inter == 0:
return str_num
else:
str_num = str(inter) + '`' + str_num
return str_num
def init_expression(self):
'''生成一个算术表达式的字符串形式'''
self.str = ''
i = 0
self.exp = []
again = False
for x in self.operators:
if again:
self.str += x + ' '
elif x == '(':
self.str += x + ' '
elif x == ')':
self.str += self.str_num(self.nums[i]) + ' '
i += 1
self.str += x + ' '
again = True
else:
self.str += self.str_num(self.nums[i]) + ' '
self.str += x + ' '
i += 1
self.str += self.str_num(self.nums[-1]) + ' ='
#模块三(infixTosuffix.py)
import Stack
from fractions import Fraction
class infix_to_suffix:
def __init__(self):
self.list_operators = ["+", "-", "×", "÷", "(", ")", "="]
self.pri_operators = {"+": 0, "-": 0, "×": 1, "÷": 1}
def to_suffix_expression(self, expression):
'''生成逆波兰表达式'''
stack_operator = Stack.Stack()
suffix_expression = []
list_temp = []
expression = expression + "="
for element in expression:
if element not in self.list_operators:
list_temp.append(element)
elif element == "=":
if len(list_temp) != 0:
str_temp = ""
for i in range(0, len(list_temp)):
str_temp = str_temp+list_temp.pop(0)
suffix_expression.append(str_temp)
else:
if len(list_temp) != 0:
str_temp = ""
for i in range(0, len(list_temp)):
str_temp = str_temp+list_temp.pop(0)
suffix_expression.append(str_temp)
if stack_operator.isEmpty() or element == "(":
stack_operator.push(element)
elif element != "(" and element != ")":
if stack_operator.peek() != "(" and self.pri_operators[element] > self.pri_operators[
stack_operator.peek()]:
stack_operator.push(element)
else:
while True:
if stack_operator.peek() == "(":
stack_operator.push(element)
break
elif self.pri_operators[element] < self.pri_operators[stack_operator.peek()]:
while not stack_operator.isEmpty() and True:
str_operator = stack_operator.peek()
if str_operator == "(" or self.pri_operators[str_operator] < self.pri_operators[
element]:
break
else:
stack_operator.pop()
suffix_expression.append(str_operator)
else:
suffix_expression.append(stack_operator.pop())
if stack_operator.isEmpty():
stack_operator.push(element)
break
elif element == ")":
while True:
if stack_operator.peek() != "(":
suffix_expression.append(stack_operator.pop())
else:
stack_operator.pop()
break
else:
stack_operator.push(element)
if not stack_operator.isEmpty():
while not stack_operator.isEmpty():
suffix_expression.append(stack_operator.pop())
return suffix_expression
def str_to_fraction(self, suf):
'''字符串转换为fraction类'''
for x in range(len(suf)):
if suf[x] not in self.list_operators:
y = suf[x].strip()
if y.find('`') == -1:
if y.find('/') == -1:
numerator = int(y)
denominator = 1
else:
a = y.split('/')
numerator = int(a[0])
denominator = int(a[1])
else:
a = y.split('`')
inter = int(a[0])
b = a[1].split('/')
denominator = int(b[1])
numerator = int(b[0]) + inter * denominator
new_num = Fraction(numerator,denominator)
suf[x] = new_num
return suf
#模块四(Stack.py)
class Stack:
"""模拟栈"""
def __init__(self):
self.items = []
def isEmpty(self):
return len(self.items) == 0
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
if not self.isEmpty():
return self.items[len(self.items) - 1]
def size(self):
return len(self.items)
代码搬运自python结对编程实现小学生四则运算生成器_aokui4738的博客-CSDN博客
python实现四则运算题库的更多相关文章
- 小学生噩梦——四则运算题库(python 全功能实现)
Github: https://github.com/holidaysss 小组:龙天尧(代码实现),林毓植(浮点转分数函数,代码审查) PSP2.1 Personal Software Proces ...
- Python基础语法题库
引言: 语法练习包括Python基础语法.数据类型.字符编码和简单文件操作等内容. 正文(参考答案附录在题目下方): 1.Python 里用来告知解释器跳过当前循环中的剩余语句,然后继续进行下一轮循环 ...
- 『Python题库 - 填空题』151道Python笔试填空题
『Python题库 - 填空题』Python笔试填空题 part 1. Python语言概述和Python开发环境配置 part 2. Python语言基本语法元素(变量,基本数据类型, 基础运算) ...
- 『Python题库 - 简答题』 Python中的基本概念 (121道)
## 『Python题库 - 简答题』 Python中的基本概念 1. Python和Java.PHP.C.C#.C++等其他语言的对比? 2. 简述解释型和编译型编程语言? 3. 代码中要修改不可变 ...
- Python解答力扣网站题库简单版----第三讲
1041. 困于环中的机器人 题库链接: 1041. 困于环中的机器人. 题干 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方.机器人可以接受下列三条指令之一: "G" ...
- Python面试真题答案或案例
Python面试真题答案或案例如下: 请等待. #coding=utf-8 #1.一行代码实现1--100之和 print(sum(range(1,101))) #2.如何在一个函数内部修改全局变量 ...
- 猿题库 iOS 客户端架构设计
原文: http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=444322139&idx=1&sn=c7bef4d439f4 ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- NOI题库 1768最大子矩阵 题解
NOI题库 1768最大子矩阵 题解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...
随机推荐
- 常见线程池 newScheduledThreadPool 定时执行任务的线程池 简单介绍
一 定时任务 package com.aaa.threaddemo; import static java.util.concurrent.TimeUnit.NANOSECONDS; import ...
- java中的数据模型类
package com.aaa.zxf.ajax.test; import java.io.Serializable; /** * java中的继承. * * 一.数据模型类 * 数据模型类:用来存取 ...
- Windows下cmd/powershell命令混淆绕过
前言 在Windows下绕过杀毒软件的主动防御机制的常见思路. Bypass 1.特殊符号.大小写 常用符号: " ^ , ; 可以绕过一些常规的waf 2.环境变量 拿到一台机器时,可以先 ...
- 尚硅谷全套课件整理:Java、前端、大数据、安卓、面试题
目录 Java 尚硅谷 IT 精英计划 JavaSE 内部学习笔记.pdf 尚硅谷 Java 基础实战之银行项目.pdf 尚硅谷 Java 技术之 JDBC.pdf 尚硅谷 Java 技术之 Java ...
- react 高阶组件的实现
由于强大的mixin功能,在react组件开发过程中存在众多不理于组件维护的因素,所以react社区提出了新的方法来替换mixin,那就是高阶组件: 首先在工程中安装高阶组件所需的依赖: npm in ...
- shell下快捷键
### 1.快捷键 ^C 终止前台运行的程序 ^D 退出 等价于exit ^L 清屏 ^A 光标移动到命令行的最前端 ^E 光标移动到命令行的最后端 ^U 删除光标前所有字符 ...
- new方法实现原理
new方法实现原理 完整的创建一个可用的对象:Person *p=[Person new]; new方法的内部会分别调用两个方法来完成3件事情: (1)使用alloc方法来分配存储空间(返回分配的对象 ...
- Docker的数据管理(下)——docke镜像的创建
Docker的数据管理(下)--docke镜像的创建 1.基于现有镜像创建 2.基于本地模板创建 3.基于 dockerfile 创建 4.Dockerfile 镜像操作常用命令 5.dockerfi ...
- Solution -「NOI 2020」「洛谷 P6776」超现实树
\(\mathcal{Description}\) Link. 对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...
- 自学linux(修改中文)STEP2
登录身份 最好用普通身份登录,而不是root用户,因为root用户权限太高,容易引起安全问题. 不显示中文 安装系统后,在图形化界面设置中文还是不生效.查询资料后如下: 1. 查看 linux 系统下 ...