20222227 实验二《Python程序设计》实验报告
20222227 2024-2025-2 《Python程序设计》实验二报告
课程:《Python程序设计》
班级: 2222
姓名: 赫连紫阳
学号:20242325
实验教师:王志强
实验日期:2025年3月26日
必修/选修: 公选课
一、实验内容
设计并完成一个完整的计算器,完成加减乘除模等运算,功能多多益善。
考核基本语法、判定语句、循环语句、逻辑运算等知识点。
创建工程项目,使用Python语言实现具体的操作运算,并完成程序调试和运行,代码托管到码云。
在华为ECS服务器(OpenEuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
二、实验过程
(一) 计算器代码编写
核心运算功能:
基础运算:支持加减乘除和取模运算
科学计算:包含平方根、指数、对数、三角函数等
单位转换:实现温度、长度、重量单位的相互转换
高级功能:
完整的历史记录系统
输入验证和错误处理
交互式菜单系统
数据持久化(历史记录)
2) 重点详解
科学计算模块
def scientific_calculation():
print("a. 平方根 b. 平方 c. 立方...")
choice = input("请选择计算类型: ").lower()
try:
if choice in ['a', 'b', 'c', 'g', 'h', 'i']:
num = float(input("输入数字: "))
if choice == 'a': # 平方根
if num < 0:
raise ValueError
result = math.sqrt(num)
...
elif choice == 'd': # 阶乘
num = int(input("输入整数: "))
if num < 0:
raise ValueError
result = math.factorial(num)
...
except ValueError as ve:
print("错误:输入值不符合要求!")
多级菜单:字母选项对应不同科学计算类型
类型验证:
平方根要求非负数
阶乘要求非负整数
数学函数:
math.sqrt():平方根
math.factorial():阶乘
math.sin(math.radians()):角度转弧度后计算三角函数
单位转换模块
def unit_converter():
print("1. 温度转换(℃↔℉)")
choice = input("请选择转换类型: ")
try:
value = float(input("输入需要转换的数值: "))
if choice == '1': # 温度
direction = input("转换方向(1.℃→℉ 2.℉→℃): ")
if direction == '1':
result = value * 9/5 + 32
else:
result = (value - 32) * 5/9
...
转换公式:
温度:℃与℉的线性转换公式
长度:1米 = 3.28084英尺
重量:1公斤 ≈ 2.20462磅
方向选择:通过子菜单选择转换方向
历史记录系统
def show_history():
if not calculation_history:
print("暂无历史记录")
return
for index, record in enumerate(calculation_history, 1):
print(f"{index}. {record}")
历史存储:所有计算记录以字符串形式存入列表
遍历显示:使用enumerate()带序号输出历史
清空功能:calculation_history.clear()实现一键清空
主控流程
def main():
while True:
show_menu()
choice = input("请输入选项: ")
if choice == '0':
break # 退出
elif choice == '1':
basic_calculation()
... # 其他功能分支
input("\n按回车键继续...") # 暂停控制
循环控制:while True保持程序持续运行
选项分发:通过if-elif链路由到不同功能模块
交互友好:input()暂停防止界面闪退
3) 全部代码
import math
from datetime import datetime
calculation_history = []
def show_menu():
"""显示主菜单"""
print("\n" + "=" * 40)
print("多功能科学计算器".center(40))
print("=" * 40)
print("1. 基础运算(加减乘除模)")
print("2. 科学计算(指数/对数/三角函数)")
print("3. 单位转换")
print("4. 查看历史记录")
print("5. 清空历史记录")
print("0. 退出程序")
print("=" * 40)
def basic_calculation():
"""基础四则运算"""
print("\n【基础运算模式】")
try:
num1 = float(input("输入第一个数字: "))
operator = input("选择运算 (+ - * / %): ")
num2 = float(input("输入第二个数字: "))
result = None
if operator == '+':
result = num1 + num2
elif operator == '-':
result = num1 - num2
elif operator == '*':
result = num1 * num2
elif operator == '/':
if num2 == 0:
raise ZeroDivisionError
result = num1 / num2
elif operator == '%':
result = num1 % num2
else:
print("无效运算符!")
return
record = f"{num1} {operator} {num2} = {result}"
calculation_history.append(record)
print(f"计算结果: {result}")
except ValueError:
print("错误:请输入有效数字!")
except ZeroDivisionError:
print("错误:除数不能为零!")
def scientific_calculation():
"""科学计算功能"""
print("\n【科学计算模式】")
print("a. 平方根 b. 平方 c. 立方")
print("d. 阶乘 e. 指数 f. 对数")
print("g. sin h. cos i. tan")
choice = input("请选择计算类型: ").lower()
try:
if choice in ['a', 'b', 'c', 'g', 'h', 'i']:
num = float(input("输入数字: "))
if choice == 'a':
if num < 0:
raise ValueError
result = math.sqrt(num)
record = f"√{num} = {result}"
elif choice == 'b':
result = num ** 2
record = f"{num}² = {result}"
elif choice == 'c':
result = num ** 3
record = f"{num}³ = {result}"
elif choice == 'g':
result = math.sin(math.radians(num))
record = f"sin({num}°) = {result}"
elif choice == 'h':
result = math.cos(math.radians(num))
record = f"cos({num}°) = {result}"
elif choice == 'i':
result = math.tan(math.radians(num))
record = f"tan({num}°) = {result}"
elif choice == 'd':
num = int(input("输入整数: "))
if num < 0:
raise ValueError
result = math.factorial(num)
record = f"{num}! = {result}"
elif choice == 'e':
base = float(input("输入底数: "))
exp = float(input("输入指数: "))
result = base ** exp
record = f"{base}^{exp} = {result}"
elif choice == 'f':
num = float(input("输入真数: "))
base = float(input("输入底数: "))
if num <= 0 or base <= 0 or base == 1:
raise ValueError
result = math.log(num, base)
record = f"log_{base}({num}) = {result}"
else:
print("无效选择!")
return
calculation_history.append(record)
print(f"计算结果: {result}")
except ValueError as ve:
print("错误:输入值不符合要求!")
def unit_converter():
"""单位转换工具"""
print("\n【单位转换模式】")
print("1. 温度转换(℃↔℉)")
print("2. 长度转换(米↔英尺)")
print("3. 重量转换(公斤↔磅)")
choice = input("请选择转换类型: ")
try:
value = float(input("输入需要转换的数值: "))
if choice == '1':
direction = input("转换方向(1.℃→℉ 2.℉→℃): ")
if direction == '1':
result = value * 9 / 5 + 32
record = f"{value}℃ = {result}℉"
else:
result = (value - 32) * 5 / 9
record = f"{value}℉ = {result}℃"
elif choice == '2':
direction = input("转换方向(1.米→英尺 2.英尺→米): ")
if direction == '1':
result = value * 3.28084
record = f"{value}米 = {result}英尺"
else:
result = value / 3.28084
record = f"{value}英尺 = {result}米"
elif choice == '3':
direction = input("转换方向(1.公斤→磅 2.磅→公斤): ")
if direction == '1':
result = value * 2.20462
record = f"{value}公斤 = {result}磅"
else:
result = value / 2.20462
record = f"{value}磅 = {result}公斤"
else:
print("无效选择!")
return
calculation_history.append(record)
print(f"转换结果: {record}")
except ValueError:
print("错误:请输入有效数字!")
def show_history():
"""显示计算历史"""
print("\n【计算历史记录】")
if not calculation_history:
print("暂无历史记录")
return
for index, record in enumerate(calculation_history, 1):
print(f"{index}. {record}")
print(f"\n总计 {len(calculation_history)} 条记录")
def main():
print("欢迎使用多功能计算器!")
while True:
show_menu()
choice = input("请输入选项: ")
if choice == '0':
print("感谢使用,再见!")
break
elif choice == '1':
basic_calculation()
elif choice == '2':
scientific_calculation()
elif choice == '3':
unit_converter()
elif choice == '4':
show_history()
elif choice == '5':
calculation_history.clear()
print("历史记录已清空!")
else:
print("无效输入,请重新选择!")
input("\n按回车键继续...")
if __name__ == "__main__":
main()
(二)配置华为云ECS弹性云服务器

(三)将代码上传至云虚拟机中并尝试运行

成功运行。
(四)代码上传至Gitee

三、实验结果
(一)基础运算(加减乘除模)
欢迎使用多功能计算器!
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 1
【基础运算模式】
输入第一个数字: 1
选择运算 (+ - * / %): +
输入第二个数字: 1
计算结果: 2.0
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 1
【基础运算模式】
输入第一个数字: 2
选择运算 (+ - * / %): -
输入第二个数字: 1
计算结果: 1.0
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 1
【基础运算模式】
输入第一个数字: 2
选择运算 (+ - * / %): *
输入第二个数字: 2
计算结果: 4.0
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 1
【基础运算模式】
输入第一个数字: 2
选择运算 (+ - * / %): /
输入第二个数字: 2
计算结果: 1.0
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 1
【基础运算模式】
输入第一个数字: 2
选择运算 (+ - * / %): %
输入第二个数字: 1
计算结果: 0.0
(二)科学计算(指数/对数/三角函数)
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 2
【科学计算模式】
a. 平方根 b. 平方 c. 立方
d. 阶乘 e. 指数 f. 对数
g. sin h. cos i. tan
请选择计算类型: a
输入数字: 4
计算结果: 2.0
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 2
【科学计算模式】
a. 平方根 b. 平方 c. 立方
d. 阶乘 e. 指数 f. 对数
g. sin h. cos i. tan
请选择计算类型: b
输入数字: 2
计算结果: 4.0
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 2
【科学计算模式】
a. 平方根 b. 平方 c. 立方
d. 阶乘 e. 指数 f. 对数
g. sin h. cos i. tan
请选择计算类型: c
输入数字: 2
计算结果: 8.0
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 2
【科学计算模式】
a. 平方根 b. 平方 c. 立方
d. 阶乘 e. 指数 f. 对数
g. sin h. cos i. tan
请选择计算类型: d
输入整数: 3
计算结果: 6
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 2
【科学计算模式】
a. 平方根 b. 平方 c. 立方
d. 阶乘 e. 指数 f. 对数
g. sin h. cos i. tan
请选择计算类型: e
输入底数: 3
输入指数: 4
计算结果: 81.0
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 2
【科学计算模式】
a. 平方根 b. 平方 c. 立方
d. 阶乘 e. 指数 f. 对数
g. sin h. cos i. tan
请选择计算类型: f
输入真数: 3
输入底数: 3
计算结果: 1.0
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 2
【科学计算模式】
a. 平方根 b. 平方 c. 立方
d. 阶乘 e. 指数 f. 对数
g. sin h. cos i. tan
请选择计算类型: g
输入数字: 30
计算结果: 0.49999999999999994
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 2
【科学计算模式】
a. 平方根 b. 平方 c. 立方
d. 阶乘 e. 指数 f. 对数
g. sin h. cos i. tan
请选择计算类型: h
输入数字: 60
计算结果: 0.5000000000000001
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 2
【科学计算模式】
a. 平方根 b. 平方 c. 立方
d. 阶乘 e. 指数 f. 对数
g. sin h. cos i. tan
请选择计算类型: i
输入数字: 45
计算结果: 0.9999999999999999
按回车键继续...
(三)单位转换
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 3
【单位转换模式】
1. 温度转换(℃↔℉)
2. 长度转换(米↔英尺)
3. 重量转换(公斤↔磅)
请选择转换类型: 1
输入需要转换的数值: 36
转换方向(1.℃→℉ 2.℉→℃): 1
转换结果: 36.0℃ = 96.8℉
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 3
【单位转换模式】
1. 温度转换(℃↔℉)
2. 长度转换(米↔英尺)
3. 重量转换(公斤↔磅)
请选择转换类型: 2
输入需要转换的数值: 12
转换方向(1.米→英尺 2.英尺→米): 1
转换结果: 12.0米 = 39.37008英尺
按回车键继续...
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 3
【单位转换模式】
1. 温度转换(℃↔℉)
2. 长度转换(米↔英尺)
3. 重量转换(公斤↔磅)
请选择转换类型: 3
输入需要转换的数值: 20
转换方向(1.公斤→磅 2.磅→公斤): 1
转换结果: 20.0公斤 = 44.0924磅
按回车键继续...
(四)查看历史纪录
========================================
多功能科学计算器
========================================
1. 基础运算(加减乘除模)
2. 科学计算(指数/对数/三角函数)
3. 单位转换
4. 查看历史记录
5. 清空历史记录
0. 退出程序
========================================
请输入选项: 4
【计算历史记录】
1. 1.0 + 1.0 = 2.0
2. 2.0 - 1.0 = 1.0
3. 2.0 * 2.0 = 4.0
4. 2.0 / 2.0 = 1.0
5. 2.0 % 1.0 = 0.0
6. √4.0 = 2.0
7. 2.0² = 4.0
8. 2.0³ = 8.0
9. 3! = 6
10. 3.0^4.0 = 81.0
11. log_3.0(3.0) = 1.0
12. sin(30.0°) = 0.49999999999999994
13. cos(60.0°) = 0.5000000000000001
14. tan(45.0°) = 0.9999999999999999
15. 36.0℃ = 96.8℉
16. 12.0米 = 39.37008英尺
17. 20.0公斤 = 44.0924磅
总计 17 条记录
四、实验总结
心得
体会模块化设计的优势:功能解耦后便于单独调试与扩展
学习全局变量管理技巧:通过集中存储历史记录,降低数据传递复杂度
认识到输入验证的重要性:用户输入可能包含各种意外值(如非数字、零除数)
掌握异常分层处理方法:针对ValueError、ZeroDivisionError等类型分别处理
数学库应用:熟悉math.sqrt()、math.factorial()等科学计算函数
类型转换技巧:灵活运用int()、float()处理用户输入
字符串格式化:通过f"{num}² = {result}"实现计算过程可视化存储
问题与解决方案
1.用户可能输入非数字、无效运算符或越界值
解决:
使用while循环强制重新输入(如单位转换方向选择)
通过isdigit()初步过滤非法字符
在try-except中嵌套条件判断(如阶乘运算要求非负整数)
2.需要记录不同功能的计算过程且格式统一
解决:
设计标准化记录模板(如f"√{num} = {result}")
使用列表的append()和clear()方法实现增删
3.三角函数计算时用户可能误用角度值
解决:
通过math.radians()隐式转换角度为弧度
在记录中保留"°"符号提示用户原始输入单位
4.calculation_history可能被意外修改
解决:
限定只有特定函数(如basic_calculation())可修改历史
通过show_history()只提供只读访问
浙公网安备 33010602011771号