《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。