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

https://gitee.com/hlzy2004/python/blob/master/计算器.py

三、实验结果

(一)基础运算(加减乘除模)

欢迎使用多功能计算器!

========================================
                多功能科学计算器                
========================================
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()只提供只读访问

五、参考资料

https://chat.deepseek.com/

posted @ 2025-04-08 22:14  望舒、  阅读(49)  评论(0)    收藏  举报