zoukankan      html  css  js  c++  java
  • Python实验二 20191304商苏赫

    《Python程序设计》实验二报告

    • 学号 2020-2021-2
    • 课程:《Python程序设计》
    • 班级: 1913
    • 姓名: 商苏赫
    • 学号:20191304
    • 实验教师:王志强
    • 实验日期:2021年4月26日
    • 必修/选修: 公选课

    1.实验内容

    ①设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。

    ②考核基本语法、判定语句、循环语句、逻辑运算等知识点

    2. 实验过程及结果

    首先是课上讲解了一个最简易的计算器的实现,功能也十分简单,进行选择运算,然后输入两个数,输出一个结果。具体的代码如下:

    def add(x, y):
        """相加"""
    
        return x + y
    
    
    def subtract(x, y):
        """相减"""
    
        return x - y
    
    
    def multiply(x, y):
        """相乘"""
    
        return x * y
    
    
    def divide(x, y):
        """相除"""
    
        return x / y
    def mo(x, y):
        """求模"""
        return x % y
    # 用户输入
    var = 1
    while var == 1:
        print("选择运算:")
        print("1、相加")
        print("2、相减")
        print("3、相乘")
        print("4、相除")
        print("5、求模")
    
        choice = input("输入你的选择(1/2/3/4/5):")
    
        num1 = int(input("输入第一个数字: "))
        num2 = int(input("输入第二个数字: "))
    
        if choice == '1':
            print(num1, "+", num2, "=", add(num1, num2))
    
        elif choice == '2':
            print(num1, "-", num2, "=", subtract(num1, num2))
    
        elif choice == '3':
            print(num1, "*", num2, "=", multiply(num1, num2))
    
        elif choice == '4':
            print(num1, "/", num2, "=", divide(num1, num2))
        elif choice == '5':
            print(num1, "%", num2, "=", mo(num1, num2))
        else:
            print("非法输入")
        var = int(input("继续(1)or 退出(0)?"))
    

    这个代码其实与计算器还有很大的差距,就比如最简单的没法实现三个数以上的混合运算,其次就是没有引入根号开方,幂运算,也没有去做图形界面点击的内容。不过最大的问题就是没法多个数进行混合运算。
    这个问题具体还没想好怎么解决,所以网上查询资料,有很多制作了界面的比较复杂,暂时还不能明白,最后一个多元混合运算的代码,是这样实现的:

    import re
    def shengchu(str):
      calc = re.split("[*/]",str)   
      OP = re.findall("[*/]",str)  
      ret = None
      for index,i in enumerate(calc):
        if ret:
          if OP[index-1] == "*":
            ret *= float(i)
          elif OP[index-1] == "/":
            ret /= float(i)
        else:
          ret = float(i)
      return ret
    
    def del_double(str):
      str = str.replace("++", "+")
      str = str.replace("--", "-")
      str = str.replace("+-","-")
      str = str.replace("- -","-")
      str = str.replace("+ +","+")
      return str
    # 计算主控制函数
    def calc_contrl(str):
      tag = False
      str = str.strip("()") 
      str = del_double(str) 
      find_ = re.findall("[+-]",str) 
      split_ = re.split("[+-]",str) 
      if len(split_[0].strip()) == 0: 
        split_[1] = find_[0] + split_[1] 
        if len(split_) == 3 and len(find_) ==2:
          tag =True
          del split_[0] # 删除原分割数字
          del find_[0]
        else:
          del split_[0] # 删除原分割数字
          del find_[0] # 删除原分割运算符
      for index, i in enumerate(split_):
        # 去除以*或/结尾的运算数字
        if i.endswith("* ") or i.endswith("/ "):
          split_[index] = split_[index] + find_[index] + split_[index+1]
          del split_[index+1]
          del find_[index]
      for index, i in enumerate(split_):
        if re.search("[*/]",i): # 先计算含*/的公式
          sub_res = shengchu(i) #调用剩除函数
          split_[index] = sub_res
      # 再计算加减
      res = None
      for index, i in enumerate(split_):
        if res:
          if find_[index-1] == "+":
            res += float(i)
          elif find_[index-1] == "-":
            if tag == True:
              res += float(i)
            else:
              res -= float(i)
        else:
          if i != "":
            res = float(i)
      return res
    if __name__ == '__main__':
      calc_input = input("请输入计算公式:" ).strip()
      try:
        if len(calc_input) ==0:
          calc_input = a
        calc_input = r'%s'%calc_input # 做特殊处理,保持字符原形
        flag = True  # 初始化标志位
        result = None  # 初始化计算结果
        # 循环处理去括号
        while flag:
          inner = re.search("\([^()]*\)", calc_input)
          if inner:
            ret = calc_contrl(inner.group()) # 调用计算控制函数
            calc_input = calc_input.replace(inner.group(), str(ret)) 
            print("处理括号内的运算[%s]结果是:%s" % (inner.group(),str(ret)))
            #flag = True
          # 没有括号时计算
          else:
            ret = calc_contrl(calc_input)
            print("最终计算结果为:%s"% ret)
            #结束计算标志
            flag = False
      except:
        print("你输入的公式有误请重新输入!")
    

    这个代码主要有三个函数,第一个函数用来分割用户输入的式子并且找出乘除符号,第二个函数用来去掉重复的+-号,主要是输入有问题的情况告诉计算机如何处理一下。第三个是最主要的函数,首先去掉最外面的括号,获取所有的加减号,正则处理,以加减号分割,然后开始选择分类,当乘除运算都结束时,再进行加减的运算,最后输出结果。

    其他(感悟、思考等):

    这一次的实验可以说很简单也可以很复杂,主要是实现的功能的多少,如果只局限于两个数的加减乘除,那其实很简单,如果涉及多个数的运算,不仅先要区分运算的先后顺序,判断括号,还有确定几个数的运算。再难一些就是做出计算器的界面,点击进行运算,就是更加复杂难度也更大。也是见识到Python的强大与方便,相比于C语言,制作出界面就是很麻烦得事情。还有这次代码书写用到的函数结构,相比与其他语言也是极其方便的。希望自己能够学号Python真正用好Python。

  • 相关阅读:
    Java实现 LeetCode 416 分割等和子集
    Java实现 LeetCode 416 分割等和子集
    在Linux运行期间升级Linux系统(Uboot+kernel+Rootfs)
    【详解】嵌入式开发中固件的烧录方式
    嵌入式系统烧写uboot/bootloader/kernel的一般方法
    Linux下USB烧写uImage kernel
    Xmanager连接CentOS的远程桌面
    命令行利器Tmux
    u-boot中分区和内核MTD分区关系
    uboot环境变量与内核MTD分区关系
  • 原文地址:https://www.cnblogs.com/shoudeyunkaijianyueming/p/14751881.html
Copyright © 2011-2022 走看看