20242322 2024-2025-2 《Python程序设计》实验二报告
20242322 2024-2025-2 《Python程序设计》实验二报告
课程:《Python程序设计》
班级: 2423
姓名: 郭智汶
学号:20242322
实验教师:王志强
实验日期:2025年3月26日
必修/选修: 公选课
一、实验内容
-
设计并完成一个完整的计算器,完成加减乘除模等运算,功能多多益善。
-
考核基本语法、判定语句、循环语句、逻辑运算等知识点。
二、实验过程
(一) 计算器代码编写
(1) 功能分析
-
根据实验要求,我设计的计算器代码具有以下功能:
-
支持整数,浮点数,复数的数据类型。
-
支持加,减,乘,除,求余,次方,对数以及三角函数的运算。
-
支持输入完整表达式,数字与运算符用空格分开,程序自动识别数据类型及算法。
-
对于整数答案采用整数输出,对于小数答案保留小数后六位输出,对于复数答案采用复数输出。
-
识别 格式不正确的表达式输入,提醒用户重新输入。
-
识别不正确的运算,提醒用户限制条件。
-
一轮运算结束后,用户能够决定是否再次进行运算。
-
(2) 全部代码
import math
import re
def get_input():
while True:
expression = input("请输入一个完整的表达式(数字与运算符用空格分开),输入 'q' 退出: ")
if expression.lower() == 'q':
return None
if re.match(r'[a-zA-Z0-9.j+-*/%()\s]+$', expression):
return expression
print("输入格式不正确,请重新输入。")
def parse_expression(expression):
tokens = expression.split()
numbers = []
operators = []
i = 0
while i < len(tokens):
token = tokens[i]
try:
if 'j' in token:
num = complex(token)
else:
num = float(token)
if num.is_integer():
num = int(num)
numbers.append(num)
except ValueError:
if token in ('+', '-', '', '/', '%', '^', 'log', 'sin', 'cos', 'tan'):
operators.append(token)
else:
print("输入包含不支持的运算符,请重新输入。")
return None, None
i += 1
return numbers, operators
def calculate(numbers, operators):
precedence = {'+': 1, '-': 1, '': 2, '/': 2, '%': 2, '^': 3, 'log': 4, 'sin': 4, 'cos': 4, 'tan': 4}
while operators:
max_prec = max(precedence[op] for op in operators)
index = next((i for i, op in enumerate(operators) if precedence[op] == max_prec), None)
op = operators.pop(index)
if op in ('+', '-', '', '/', '%', '^'):
num1 = numbers.pop(index)
num2 = numbers.pop(index)
if op == '+':
result = num1 + num2
elif op == '-':
result = num1 - num2
elif op == '':
result = num1 * num2
elif op == '/':
if num2 == 0:
print("错误:除数不能为零,请重新输入。")
return None
result = num1 / num2
elif op == '%':
if isinstance(num1, complex) or isinstance(num2, complex):
print("错误:不支持复数求余,请重新输入。")
return None
result = num1 % num2
elif op == '^':
result = num1 ** num2
numbers.insert(index, result)
elif op in ('log', 'sin', 'cos', 'tan'):
num = numbers.pop(index)
if op == 'log':
if num <= 0:
print("错误:对数的真数必须大于零,请重新输入。")
return None
result = math.log(num)
elif op == 'sin':
result = math.sin(num)
elif op == 'cos':
result = math.cos(num)
elif op == 'tan':
result = math.tan(num)
numbers.insert(index, result)
if len(numbers) != 1:
print("输入格式不正确,请重新输入。")
return None
return numbers[0]
def format_result(result):
if isinstance(result, int):
return result
elif isinstance(result, float):
return round(result, 6)
elif isinstance(result, complex):
return result
def main():
while True:
expression = get_input()
if expression is None:
break
numbers, operators = parse_expression(expression)
if numbers is None or operators is None:
continue
result = calculate(numbers, operators)
if result is not None:
formatted_result = format_result(result)
print(f"计算结果: {formatted_result}")
while True:
choice = input("是否要再次进行运算?(y/n): ").lower()
if choice == 'y':
break
elif choice == 'n':
return
else:
print("请输入 y 或 n。")
if name == "main":
main()
(二) 程序调试
1.在调试过程中发现我在是否再次运算时输入错误字母会直接退出程序,所以我修改代码后实现输入错误会重新弹出选择
2.调试结果
(1)加法
(2)减法
(3)乘法
(4)除法
(5)求余
(6)次方
(7)对数
(8)三角函数
(9)结果是小数
(10)输入数据是浮点数
(三) 代码上传至gitee
三、实验总结
(一)遇到的问题和解决过程
- 问题1:不清楚Python中怎么调用数学库
- 解决方法:查阅资料后了解到用下列代码可以将math库中的所有函数和常量都导入进来,后续使用时需要加上math.前缀。
import math
result = math.sqrt(16)
print(result)
print(math.pi)