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。

posted @ 2021-05-10 17:15  20191304商苏赫  阅读(105)  评论(0编辑  收藏  举报
Live2D