课后作业2

我的项目地址是:https://gitee.com/yeyishenzz/personal_project41678/tree/master/Python/2016035107307/src

这是我的PSP表格。

 

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

最后对特殊情况进行处理。

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

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

给正常运算以及带有括号的运算添加表达式(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函数,“就很开心”。怎么办我不知道,想了一晚上,那就先把最简单的写了算了,写完了第二天就查

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

转载于:https://www.cnblogs.com/yeyishen/p/9892322.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值