课后做业2

个人项目地址是:https://gitee.com/yeyishenzz/personal_project41678/tree/master/Python/2016035107307/srchtml

这是个人PSP表格。python

 

拿到这个题目, 首先想到的是如何进行加减乘除运算,由于最开始写须要测试成功,因此直接写了个类,直接赋值进去。由于每一个模块都须要对应的调用,因此须要输入的问题能够最后用input设置一下。 而后是进行括号的运算,而后进行输入行的整理和测试。git

最后对特殊状况进行处理。正则表达式

分为4个类,具体变量为括号前,括号里,括号后......(主要的这3个) 算法类 分为2种状况有括号和没括号,有括号为一种算法(Calculatemain),没有括号为另一种算法(Calculatemain2),第二种算法须要另外写一个类来对表达式进行处理。(Calculate2)算法

最后一个类为Calculate 计算类。 写了加减乘除的逻辑关系。由于Python自己识别运算的前后顺序,因此只须要考虑括号。本次写的代码一共分为了5个部分,第一个部分为最开始的简单的逻辑运算(First),第二个部分为添加括号运算(Second),第三个部分为ide

给正常运算以及带有括号的运算添加表达式(Third),第四个部分为代码中出现的一些Bug 如:输入的不是数字应该提示错误,除法运算的时候分母不该该等于0,负数运算的时候应该有另一种逻辑关系(没有实现)。(Fourth)。第五个部分为给代码加入能够从函数

cmd直接传入参数的模块及代码。性能

许多性能的代码并不知道在网上借鉴了许多Python中模块的用法,一点一点的本身进行Print输出实验,看输出的是什么东西。用了差很少1个多小时。单元测试

关键函数流程图学习

说明实现算法的关键部分:

def Calculatemain2(String1):
    if(String1.__contains__("*")):
        String1 = Calculate2(String1,"*")
        return Calculatemain2(String1)
    if(String1.__contains__("/")):
        String1 = Calculate2(String1,"/")
        return Calculatemain2(String1)
    if(String1.__contains__("+")):
        String1 = Calculate2(String1,"+")
        return Calculatemain2(String1)
    if(String1.__contains__("-")):
        String1 = Calculate2(String1,"-")
        return Calculatemain2(String1)
    return String1
def Calculate2(String1,fuhao):
    start = String1.index(fuhao)
    left = String1[0:start]
    right = String1[start + 1:]
    if(left.isdigit() and right.isdigit() ):
        leftnum = re.search('\d+$',left).group()
        rightnum = re.search('\d',right).group()
        newnum = left.rstrip(leftnum) + str(Calculate(leftnum,rightnum,fuhao)) + right.lstrip(rightnum)
        return newnum
    else:
        print ("error:请输入正数不能输入特殊符号")

这段代码是非括号运算的 对传入的数据放进列表中,进行运算。 嗯...这段代码其实并非很难,上网查了正则和对字符串中内容判断的知识点。也就OK了,由于以前加了对负数等等进行操做逻辑关系有点混乱(加上懒)就没写,毕竟能够用eval直接写出来(哈哈啊哈哈,不要扣我分)。

单元测试: 每一个模块进行实例化  用最常规的实例进行测试。 

from main import *
import unittest
class Testyunsuan(unittest.TestCase):
    def test_add(self):
        ta = yunsuan("3+1")
        self.assertEqual(ta,'4')
    def test_reduce(self):
        ta = yunsuan("6-2")
        self.assertEqual(ta,'4')
    def test_ride(self):
        ta = yunsuan("6*2")
        self.assertEqual(ta,'12')
    def test_except(self):
        ta = yunsuan("6/3")
        self.assertEqual(ta,'2.0')
    def test_kuohao(self):
        ta = yunsuan("(6-3)*2")
        self.assertEqual(ta,'6')
    def test_kuohao(self):
        ta = yunsuan("6/0")
        self.assertEqual(ta,'分母不能为0')
    def test_add1(self):
        self.assertRaises(BaseException,yunsuan,("-1+2"))
    def test_reduce1(self):
        self.assertRaises(BaseException,yunsuan,("-1-2"))
    def test_ride1(self):
        self.assertRaises(BaseException,yunsuan,("-1*2"))
    def test_except(self):
        self.assertRaises(BaseException,yunsuan,("-1/2"))
if __name__ == "__main__":
    unittest.main()

对加减乘除,进行了测试测试所有经过,分母为0,以及错误报出的异常所有经过,而且有提示。

 

http://www.runoob.com/python/att-string-rindex.html 这是查询如何肯定算法中括号位置的网址。

http://www.cnblogs.com/dplearning/p/5834628.html 这是查询正则表达式如何把算数式表达出来的网址。

https://www.cnblogs.com/wangboqi/p/7455240.html 这是判断字符串中内容的网址。

结合在构建之法中学习到的相关内容与我的项目的实践经历,撰写解决项目的心路历程与收获。

我以为在本次的学习中,首先学会了Git的用法,命令行如何获取参数,以及根据做业须要的知识本身所学到的一些知识,心路历程就是看到这个题目,再看到不让用eval函数,“就很开心”。怎么办我不知道,想了一夜,那就先把最简单的写了算了,写完了次日就查

资料,如何找括号,由于以前写计算器还有一点点印象因此就把算式放在了最后写(哈哈哈哈哈)。总而言之,这次项目让我以为本身仍是有些差距的,有的大佬可能几十分钟就写完了,还得继续努力! 加油!

相关文章
相关标签/搜索