zoukankan      html  css  js  c++  java
  • 如何用python编写可使用cmd控制台传入参数的简单四则算式计算器

    一、项目码云地址是:https://gitee.com/Steven_me/personal_project41656

    二、PSP预计表:

     

    三、简单的程序流程图: 

    四、下面附上程序部分运行代码样式仅限参考(课题结束|关键函数|已经找回)

    1.定义去除括号和返回运算值部分:

     

     1 def quchu(string):
     2   while 1:
     3     ret = re.search(r'([^(]*?)',string) 
     4     if ret:
     5       re_string = ret.group() 
     6       re_sj = suanfa(re_string.strip('()')) 
     7       string = string.replace(re_string,str(re_sj))
     8       continue
     9     break
    10   re_sj = suanfa(string)
    11   return float(re_sj)
    View Code

     

    2.定义主要算法部分,算法部分优先处理乘除法,如果条件不满足就算加减法(使用正则运算优化):

     1 def suanfa(re_string):
     2   while 1:
     3     ret = re.search(r'd+.*?d*[*/]-?d+.?d*', re_string)
     4     if ret: 
     5       chengchu_string = ret.group() 
     6       res = chengchu(chengchu_string) 
     7       re_string = re_string.replace(chengchu_string, str(res)) 
     8       re_string =chulifuhao(re_string) 
     9       continue
    10     break
    11   num = re.findall(r'[+-]?d+.?d*', re_string)
    12   if len(num) > 1:
    13     my_num = 0
    14     for i in num:
    15       my_num += float(i)
    16     return my_num
    17   else:
    18     return num[0]
    View Code

    3.定义单元算法处理乘除法:

    1 def chengchu(string):
    2   if '*' in string:
    3     x,y = string.split('*')
    4     return float(x)*float(y) 
    5   if '/' in string:
    6     x, y = string.split('/')
    7     return float(x)/float(y)  
    View Code

    4.定义最后的处理符号:

     

     

    因为需要满足cmd传参,而命令行的第0未是为文件路径,所以算式在第1位,最后使用sys.argv[1]方法进行命令行传参,计算器支持带括号的混合运算,程序的实际运行结果:

     

     

    五、开发小结

    遇到的困难:

    1.前期版本的算法部分代码未经过正则运算优化导致臃肿,缓慢,甚至出错,不得已重构。。。。

    2.需求分析出错,本来以为不用eval()可以很快写出来,没想到真的是有点想的太简单了。。。

    3.没有做出正确的代码功能,导致在写代码的时候实现了“负优化”。。。

    4.python的eval()函数真的好用!

    得到的收获:

    1.学习到了正则运算的好处,掌握并运用。

    2.python真的是一门比较好用的编程语言,虽然它现在对数组类型规范的很严格。

    3.python的eval()函数真的不错!

    附上传说中的用eval()函数写的代码(仅供参考):

    1 import sys
    2 re = sys.argv[1]
    3 print (eval(re))
    View Code

     程序运行结果:

     

    六、单元测试:

    单元通过的结果:python程序因为使用过正则运算简化过,结果使用float进行转换,可以保留到小数点的后一位,可以转换符号,任意加减乘除都可以,下面是单元测试结果:

     

     

    单元未通过的结果:因为最后输出的是float值,所以当有string值,就会报错。

     

     

    七、最后的PSP表:

     

    附录 :

    1.1 完整的计算器代码 python3.0+

     1 import sys,re
     2 def quchu(string):
     3   while 1:
     4     ret = re.search(r'([^(]*?)',string) 
     5     if ret:
     6       re_string = ret.group() 
     7       re_sj = suanfa(re_string.strip('()')) 
     8       string = string.replace(re_string,str(re_sj))
     9       continue
    10     break
    11   re_sj = suanfa(string)
    12   return float(re_sj)
    13 def suanfa(re_string):
    14   while 1:
    15     ret = re.search(r'd+.*?d*[*/]-?d+.?d*', re_string)
    16     if ret: 
    17       chengchu_string = ret.group() 
    18       res = chengchu(chengchu_string) 
    19       re_string = re_string.replace(chengchu_string, str(res)) 
    20       re_string =chulifuhao(re_string) 
    21       continue
    22     break
    23   num = re.findall(r'[+-]?d+.?d*', re_string)
    24   if len(num) > 1:
    25     my_num = 0
    26     for i in num:
    27       my_num += float(i)
    28     return my_num
    29   else:
    30     return num[0]
    31 def chengchu(string):
    32   if '*' in string:
    33     x,y = string.split('*')
    34     return float(x)*float(y) 
    35   if '/' in string:
    36     x, y = string.split('/')
    37     return float(x)/float(y)  
    38 def chulifuhao(string):
    39   if '--' in string:
    40     string = string.replace('--','+')
    41   if '++' in string:
    42     string = string.replace('++','+')
    43   if '+-' in string:
    44     string = string.replace('+-','-')
    45   if '-+' in string:
    46     string = string.replace('-+','-')
    47   return string
    48     
    49 if __name__ == "__main__":
    50   kscmd = sys.argv[1]
    51   star_n = kscmd.replace(' ', '')
    52   rets = quchu(star_n) 
    53   print("运算的最后结果为%s"%rets)
    需要带入cmd中打开

     

     1 import sys,re
     2 def quchu(string):
     3   while 1:
     4     ret = re.search(r'([^(]*?)',string) 
     5     if ret:
     6       re_string = ret.group() 
     7       re_sj = suanfa(re_string.strip('()')) 
     8       string = string.replace(re_string,str(re_sj))
     9       continue
    10     break
    11   re_sj = suanfa(string)
    12   return float(re_sj)
    13 def suanfa(re_string):
    14   while 1:
    15     ret = re.search(r'd+.*?d*[*/]-?d+.?d*', re_string)
    16     if ret: 
    17       chengchu_string = ret.group() 
    18       res = chengchu(chengchu_string) 
    19       re_string = re_string.replace(chengchu_string, str(res)) 
    20       re_string =chulifuhao(re_string) 
    21       continue
    22     break
    23   num = re.findall(r'[+-]?d+.?d*', re_string)
    24   if len(num) > 1:
    25     my_num = 0
    26     for i in num:
    27       my_num += float(i)
    28     return my_num
    29   else:
    30     return num[0]
    31 def chengchu(string):
    32   if '*' in string:
    33     x,y = string.split('*')
    34     return float(x)*float(y) 
    35   if '/' in string:
    36     x, y = string.split('/')
    37     return float(x)/float(y)  
    38 def chulifuhao(string):
    39   if '--' in string:
    40     string = string.replace('--','+')
    41   if '++' in string:
    42     string = string.replace('++','+')
    43   if '+-' in string:
    44     string = string.replace('+-','-')
    45   if '-+' in string:
    46     string = string.replace('-+','-')
    47   return string
    48     
    49 if __name__ == "__main__":
    50   print ("=================欢迎使用计算器,计算器初始化中。。。===================")
    51   kscmd = input('请输入算式值!
     输入:')
    52   star_n = kscmd.replace(' ', '')
    53   rets = quchu(star_n) 
    54   print("运算的最后结果为: %s"%rets)
    无需cmd打开版本

    1.2测试代码

     1 from calculate import *
     2 import unittest
     3 class Test_jsq(unittest.TestCase):
     4     def test_jiajian(self):
     5         jj=quchu("95+5")
     6         self.assertEqual(jj,100.0)
     7     def test_jianfa(self):
     8         jj=quchu("88-5")
     9         self.assertEqual(jj,83)
    10     def test_chengfa(self):
    11         jj=quchu("3*5")
    12         self.assertEqual(jj,15.0)
    13     def test_chufa(self):
    14         jj=quchu("3/2")
    15         self.assertEqual(jj,'1.5')
    16 if __name__ == "__main__":
    17     unittest.main()
    unittest 测试代码

    本文于|2018年11月09日|23点01分|修改。 

     

  • 相关阅读:
    数据库(2019年10月30日)
    (面试题)反射(2019年10月28日)
    反射(2019年10月28日)
    常微分复习重点
    重要定理及其证明
    实变函数复习重点
    泛函分析重点定理
    自旋玻璃简介
    Fnight博文发布规范
    [分析力学]解题思路
  • 原文地址:https://www.cnblogs.com/Steven-Tim/p/9926324.html
Copyright © 2011-2022 走看看