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 0return 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 = Trueelse: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 0return num1 / num2
def logab(a,b):if b <= 0 or a <= 0:print("输入数不合法!")return 0return 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 == "=":breakelse:while True:num1 = int(input())choice1 = input()cul_num.append(num1)cul_choice.append(choice1)if choice1 == "=":breakaccmlt = cul_num[0]while True:choice = cul_choice[index-1]if choice == "=":print(accmlt)breaknum = 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 + 1conti = input("是否继续?Y/N\n")if conti == "Y" or conti == "y":flag = Trueelse: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 0return num1 / num2
def logab(a,b):if b <= 0 or a <= 0:print("输入数不合法!")return 0return math.log(a,b)
flag = True
while flag:index = 1cul_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 == "=":breakelse:while True:num1 = int(input())choice1 = input()cul_num.append(num1)cul_choice.append(choice1)if choice1 == "=":breakaccmlt = cul_num[0]while True:choice = cul_choice[index-1]if choice == "=":print(accmlt)breaknum = 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 + 1conti = input("是否继续?Y/N\n")if conti == "Y" or conti == "y":flag = Trueelse: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 0return num1 / num2
def logab(a, b):if b <= 0 or a <= 0:print("输入数不合法!")return 0return math.log(a, b)
def evaluate_expression(numbers, operators):i = 0while 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] = resultdel numbers[i + 1]del operators[i]else:i += 1result = 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 == "=":breakelse:while True:try:num1 = float(input()) choice1 = input()cul_choice.append(choice1)cul_num.append(num1)if choice1 == "=":breakexcept ValueError:print("请输入有效数字!")continuetry: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),调整优先级运算也让我更好了解判断语句和循环语句
(五) 参考资料
-
《makedown使用语法》
-
《零基础学python》
-
...