20241216 实验二《Python程序设计》实验报告
20241216 2024-2025-2 《Python程序设计》实验二报告
课程:《Python程序设计》
班级: 2412
姓名: 曾楷
学号:20241216
实验教师:王志强
实验日期:2024年3月26日
必修/选修: 公选课
(一) 实验内容
1.设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
2.考核基本语法、判定语句、循环语句、逻辑运算等知识点
(二) 实验过程及结果
上课跟老师同步敲了个初始代码
import math
def Csum(num1, num2):
return num1 + num2
def Csub(num1, num2):
return num1 - num2
def Cmulti(num1, num2):
return num1 * num2
def CDiv(num1, num2):
if num2 == 0:
print("除数不能为0")
return 0
return num1 / num2
def logab(a,b):
return math.log(a,b)
flag = True
while flag:
if input("请问:需要复数(1)还是整数(2)运算?\n")=="1":
num1 = complex(input("请输入一个数:"))
num2 = complex(input("请输入另一个数:"))
else:
num1 = int(input("请输入一个数:"))
num2 = int(input("请输入另一个数:"))
choice = input("请输入运算符(+-*/ log):")
if choice == "+":
print("num1 ",choice, " num2 = ", Csum(num1, num2))
elif choice =="-":
print("num1 ",choice, " num2 = ", Csub(num1, num2))
elif choice == "*":
print("num1 ",choice, " num2 = ", Cmulti(num1, num2))
elif choice == "/":(
print("num1 ",choice, " num2 = ", CDiv(num1, num2)))
elif choice == "log":
print("log以",num2,"为底",num1, "的对数 = ", logab(num1, num2))
conti = input("是否继续?Y/N\n")
if conti == "Y" or conti == "y":
flag = True
else:
flag = False
运行结果如下
觉得太简单了,就参考计算器,做了可以一直输入算式直到输入=
import math
def Csum(num1, num2):
return num1 + num2
def Csub(num1, num2):
return num1 - num2
def Cmulti(num1, num2):
return num1 * num2
def Cdiv(num1, num2):
if num2 == 0:
print("除数不能为0")
return 0
return num1 / num2
def logab(a,b):
if b <= 0 or a <= 0:
print("输入数不合法!")
return 0
return math.log(a,b)
flag = True
index = 1
while flag:
cul_num = []
cul_choice = []
if input("请问:需要复数(1)还是整数(2)运算?\n")=="1":
while True:
num1 = complex(input())
choice1 = input()
cul_choice.append(choice1)
cul_num.append(num1)
if choice1 == "=":
break
else:
while True:
num1 = int(input())
choice1 = input()
cul_num.append(num1)
cul_choice.append(choice1)
if choice1 == "=":
break
accmlt = cul_num[0]
while True:
choice = cul_choice[index-1]
if choice == "=":
print(accmlt)
break
num = cul_num[index]
if choice == "+":
accmlt = Csum(accmlt, num)
elif choice =="-":
accmlt = Csub(accmlt, num)
elif choice == "*":
accmlt = Cmulti(accmlt, num)
elif choice == "/":
accmlt = Cdiv(accmlt, num)
elif choice == "log":
accmlt = logab(accmlt, num)
index = index + 1
conti = input("是否继续?Y/N\n")
if conti == "Y" or conti == "y":
flag = True
else:
flag = False
调试一直出问题,第二遍运算一直出错,发现index = 1应该放在while循环内部T-T
下面就是正确的代码了
import math
def Csum(num1, num2):
return num1 + num2
def Csub(num1, num2):
return num1 - num2
def Cmulti(num1, num2):
return num1 * num2
def Cdiv(num1, num2):
if num2 == 0:
print("除数不能为0")
return 0
return num1 / num2
def logab(a,b):
if b <= 0 or a <= 0:
print("输入数不合法!")
return 0
return math.log(a,b)
flag = True
while flag:
index = 1
cul_num = []
cul_choice = []
if input("请问:需要复数(1)还是整数(2)运算?\n")=="1":
while True:
num1 = complex(input())
choice1 = input()
cul_choice.append(choice1)
cul_num.append(num1)
if choice1 == "=":
break
else:
while True:
num1 = int(input())
choice1 = input()
cul_num.append(num1)
cul_choice.append(choice1)
if choice1 == "=":
break
accmlt = cul_num[0]
while True:
choice = cul_choice[index-1]
if choice == "=":
print(accmlt)
break
num = cul_num[index]
if choice == "+":
accmlt = Csum(accmlt, num)
elif choice =="-":
accmlt = Csub(accmlt, num)
elif choice == "*":
accmlt = Cmulti(accmlt, num)
elif choice == "/":
accmlt = Cdiv(accmlt, num)
elif choice == "log":
accmlt = logab(accmlt, num)
index = index + 1
conti = input("是否继续?Y/N\n")
if conti == "Y" or conti == "y":
flag = True
else:
flag = False
运行结果如下
但是如上图所示,只能按照顺序依次运算,不能识别乘除的优先级,于是有了计算器第三版
import math
def Csum(num1, num2):
return num1 + num2
def Csub(num1, num2):
return num1 - num2
def Cmulti(num1, num2):
return num1 * num2
def Cdiv(num1, num2):
if num2 == 0:
print("除数不能为0")
return 0
return num1 / num2
def logab(a, b):
if b <= 0 or a <= 0:
print("输入数不合法!")
return 0
return math.log(a, b)
def evaluate_expression(numbers, operators):
i = 0
while i < len(operators):
op = operators[i]
if op in ('*', '/', 'log'):
num1 = numbers[i]
num2 = numbers[i + 1]
if op == '*':
result = Cmulti(num1, num2)
elif op == '/':
result = Cdiv(num1, num2)
elif op == 'log':
result = logab(num1, num2)
numbers[i] = result
del numbers[i + 1]
del operators[i]
else:
i += 1
result = numbers[0]
for i in range(len(operators)):
op = operators[i]
num = numbers[i + 1]
if op == '+':
result = Csum(result, num)
elif op == '-':
result = Csub(result, num)
return result
index = 1
flag = True
while flag:
cul_num = []
cul_choice = []
if input("请问:需要复数(1)还是整数(2)运算?\n") == "1":
while True:
num1 = complex(input())
choice1 = input()
cul_choice.append(choice1)
cul_num.append(num1)
if choice1 == "=":
break
else:
while True:
try:
num1 = float(input())
choice1 = input()
cul_choice.append(choice1)
cul_num.append(num1)
if choice1 == "=":
break
except ValueError:
print("请输入有效数字!")
continue
try:
result = evaluate_expression(cul_num.copy(), cul_choice[:-1].copy())
print(result)
except Exception as e:
print(f"计算错误: {e}")
conti = input("是否继续?Y/N\n")
if conti.lower() != 'y':
flag = False
运行结果如下
上传到git
https://gitee.com/masterzk01/py-homework/blob/master/实验2.py
(三) 实验过程中遇到的问题和解决过程
- 问题1:不知道代码怎么通过markdown形式上传(上次用仓库)
- 问题1解决方案:搜索发现在代码前后增加三个反单引号```,同时注明语言
- 问题2:使用中文符号导致报错
- 问题2解决方案:注意中英文切换
- 问题3:if判断太冗杂了,写的脑子要炸了
- 问题3解决方案:学习了try这种python的报错判断,包括一些异常类型
异常类型 | 更新 | 版本 |
---|---|---|
ValueError | 值不符合预期 | int("abc") |
ZeroDivisionError | 除数为零 | 1 / 0 |
TypeError | 类型操作无效 | "1" + 2 |
IndexError | 索引越界 | lst = []; lst[0] |
FileNotFoundError | 文件不存在 | open("nonexistent.txt") |
KeyError | 字典键不存在 | d = {}; d["missing"] |
(四) 其他(感悟、思考等)
为了让计算器同时支持常规数字和复数,调试的时候经常要切换思维模式,经常会忘记复数是(a+bj)而不是(a+bi),调整优先级运算也让我更好了解判断语句和循环语句
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步