简易hw1程序对拍器分享
对于hw1的作业而言,题目要求我们去括号并尽可能化简表达式,但在化简过程中由于式子较为复杂,表达式常常会难以判断是否化简正确,所以设计合适的对拍器就显得十分重要。
思路介绍
当我想到这个问题时当时主要有两种思路,第一种是使用赋值法,将变量x,y,z进行赋值(可能选用质数会比较好,数据不容易相同),这也是当时在实验1时我们所解的程序可以达到的功能(当然不完善),这种方法在大部分时间可以使用,但还是相对复杂且需要决定初始变量值,还有一定可能会出现结果相同表达式不同的情况,所以我主要想介绍下第二种思路。
第二种思路就是将输入和自己程序跑出的输出进行相同转化后比较是否相同(例如降幂顺序排列之类的),这样本身当然也有很大的编程难度,但是python中的simpify函数很好的给我们提供了这个功能(注意是simpify[转化]而不是simplify[简化]),借助sympy.sympify()方法,我们能够将字符串类型的表达式转换为通用数学表达式。这样只需要依靠对拍结果字符串比较就知道是否正确了。
附上简易代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import sympy import os
My_path = 'D:/coding_file/study/Lesson/oo_lesson/OO/test/hw1'
def judge_equal(expr_in, expr_out): simpy_in = sympy.core.sympify(expr_in) simpy_out = sympy.core.sympify(expr_out) if (simpy_in.equals(simpy_out)): print("success!!!") else: print("failed!!!") with open(My_path+'/error_log.txt', 'a+') as h: h.write("expr_in:"+str(expr_in)+"\n") h.write("simpy_in:"+str(simpy_in)+"\n") h.write("expr_out:"+str(expr_out)+"\n") h.write("simpy_out:"+str(simpy_out)+"\n") h.write("---------------------------\n")
os.chdir(My_path) os.system('python production.py') os.system('java -jar hw1_test.jar < in.txt > out.txt') with open(My_path+'/in.txt', 'r+') as f: expr_in = f.read().rstrip() with open(My_path+'/out.txt', 'r+') as g: expr_out = g.read().rstrip() judge_equal(expr_in, expr_out)
|
说明
其中error_log.txt为错误数据的日志,hw1_test.jar为自己java工程的工件,in.txt为依靠production.py随机生成的数据,My_Path为该测试文件夹的路径,将这几个文件放于该文件夹下即可使用(当然记得装sympy包,这是成熟6系人的基本素养orz)
PS:在有数据生成器的情况下只需要加入for循环即可完成多次自动化测试
简易hacker机
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import sympy import os
My_path = 'D:/coding_file/study/Lesson/oo_lesson/OO/test/hw1' names = ['hw1_test']
def judge_equal(expr_in, expr_out, name): simpy_in = sympy.core.sympify(expr_in) simpy_out = sympy.core.sympify(expr_out) if (simpy_in.equals(simpy_out)): print(">>>>>The comparison result with "+str(name) + " is:") print("success!!!") else: print(">>>>>The comparison result with "+str(name) + " is:") print("failed!!!") with open(My_path+'/src/error_log.txt', 'a+') as h: h.write(str(name)+":error"+"\n") h.write("expr_in:"+str(expr_in)+"\n") h.write("simpy_in:"+str(simpy_in)+"\n") h.write("expr_out:"+str(expr_out)+"\n") h.write("simpy_out:"+str(simpy_out)+"\n") h.write("---------------------------\n")
num = 0 os.chdir(My_path) while(num <= 5000): print('num = ' + str(num)) i = 0 os.system('python production.py') while i <= len(names)-1: os.system('java -jar '+str(names[i])+'.jar < src/in.txt > src/out.txt') with open(My_path+'/src/in.txt', 'r+') as f: expr_in = f.read().rstrip() with open(My_path+'/src/out.txt', 'r+') as g: expr_out = g.read().rstrip() judge_equal(expr_in, expr_out, names[i]) i = i+1 num = num+1
|