20242402 2024-2025-2 《Python程序设计》实验二报告

20242402 2024-2025-2 《Python程序设计》实验二报告

课程:《Python程序设计》
班级: 2424
姓名: 张宇涵
学号:20242402
实验教师:王志强
实验日期:2024年3月27日
必修/选修: 公选课

1.实验内容

  1. 设计并完成一个计算器程序,完成加减乘除模等运算,功能多多益善。

  2. 考核基本语法、判定语句、循环语句、逻辑运算、函数实现、运算的实现等知识点

2. 实验过程及结果

  1. 课上跟随老师完成了最基础的加减乘除以及虚数判断,程序如下:

    # -*- coding: utf-8 -*-
    # @Time : 2025/3/26 19:28
    # @Author : weare
    # @Email : 1021149940@qq.com
    # @File : shiyan2.py
    # @Project : python-experiment
    # -*- what can I say -*-
    def Csum(num1,num2):
        return num1+num2
    def Csub(num1,num2):
        return num1-num2
    def Cmulti(num1,num2):
        return num1*num2
    def Cdev(num1,num2):
        if num2==0:
            print("不能为零")
            return 0
        return num1/num2
    
    while True:
        if input("输入的是实数还是虚数?实数(1),虚数(2)") == "1":
            num1 = int(input("请输入一个数: "))
            num2 = int(input("请输入一个数: "))
        else :
            num1 = complex(input("请输入一个数: "))
            num2 = complex(input("请输入一个数: "))
        choice =input("请输入运算符(+,-,*,/,log,mod,sin,cos,x^y,|x|,取整): ")
        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 =",Cdev(num1,num2))
        elif choice == "log":
            if input("是否继续?(是/否)") != "是":
                break
    

2.之后在查找资料和询问deepseek后,优化了代码,增加了取对,取余,求模,幂指数,绝对值函数,三角函数( sin,cos,arcsin,arccos,sec,csc),位运算(取反,异或,左移,右移),并加入非法字符检测,增强代码鲁棒性。代码如下:

# -*- coding: utf-8 -*-
# @Time : 2025/3/29 09:57
# @Author : weare
# @Email : 1021149940@qq.com
# @File : calculator_1.py
# @Project : python-experiment
# -*- what can I say -*-
# -*- coding: utf-8 -*-
import cmath
import math

# ----------------- 基础运算函数 -----------------
def add(num1, num2):
    """加法"""
    return num1 + num2
def sub(num1, num2):
    """减法"""
    return num1 - num2
def mul(num1, num2):
    """乘法"""
    return num1 * num2
def div(num1, num2):
    """除法"""
    if num2 == 0:
        print("错误:除数不能为零")
        return None  # 返回空值表示错误
    return num1 / num2
# ----------------- 新加的 ---------------------
def log(num1, num2):
    """对数运算(以num1为底,num2为真数)"""
    # 检查输入是否为复数(通过异常捕获替代isinstance判断)
    try:
        if num1 <= 0 or num2 <= 0 or num1 == 1:
            print("错误:底数需>0且≠1,真数需>0")
            return None
        return math.log(num2, num1)
    except TypeError:  # 如果出现类型错误说明是复数
        return cmath.log(num2, num1)
def mod(num1, num2):
    """取余运算"""
    if num2 == 0:
        print("错误:除数不能为零")
        return None
    return num1 % num2
def power(num1, num2):
    """幂运算"""
    return num1 ** num2
def C_abs(num):
    """绝对值"""
    return abs(num)
# ----------------- 三角函数 -----------------
def sin(num):
    """正弦函数"""
    # 通过try-except处理复数输入
    try:
        return math.sin(num)
    except TypeError:# math.sin遇到虚数,会返回TypeError
        return cmath.sin(num)
def cos(num):
    """余弦函数"""
    try:
        return math.cos(num)
    except TypeError:
        return cmath.cos(num)
def C_tan(num):
    """正弦函数"""
    try:
        return math.tan(num)
    except TypeError:
        return cmath.tan(num)
def C_arcsin(num):
    """反正弦函数"""
    try:
        return math.asin(num)
    except TypeError:
        return cmath.asin(num)
def C_arccos(num):
    """反余弦函数"""
    try:
        return math.acos(num)
    except TypeError:
        return cmath.acos(num)
def C_csc(num):
    """余割函数"""
    return 1 / sin(num)
def C_sec(num):
    """正割函数"""
    return 1 / cos(num)
# ----------------- 位运算计算器 -----------------
def bit_not(num):
    """按位取反(只需要第一个数)"""
    # 检查是否为整数:通过强制转换后是否相等
    if num != int(num):
        print("错误:需要整数")
        return -1
    return ~int(num)  # ~ 是取反运算符
def bit_xor(num1, num2):
    """按位异或"""
    if num1 != int(num1) or num2 != int(num2):
        print("错误:需要整数")
        return -1
    return int(num1) ^ int(num2)  # ^ 是异或运算符
def bit_left(num1, num2):
    """左移(num1左移num2位)"""
    if num1 != int(num1) or num2 != int(num2):
        print("错误:位移需要整数")
        return None
    return int(num1) << int(num2)
def bit_right(num1, num2):
    """右移(num1右移num2位)"""
    if num1 != int(num1) or num2 != int(num2):
        print("错误:位移需要整数")
        return None
    return int(num1) >> int(num2)

# ----------------- 主程序 -----------------
while True:
    print("""\n可用运算符:+ - * / log mod x^y |x|
        sin cos arcsin arccos sec csc
        取反 异或 左移 右移""")
    choice = input("请选择运算符:")
    # 确定需要输入的数字个数
    need_two = True  # 默认需要两个数字
    if choice in ["取反", "sin", "cos","|x|","sin","cos","arcsin","arccos","sec","csc"]:
        need_two = False

    # 处理数字输入
    try:
        num_type = input("输入实数吗?(1-是/其他-否):")
        if num_type == "1":
            num1 = float(input("输入第一个数:"))
            if need_two:
                num2 = float(input("输入第二个数:"))
        else:  # 复数处理
            num1 = complex(input("输入第一个数(格式如 3+4j):"))
            if need_two:
                num2 = complex(input("输入第二个数(格式如 3+4j):"))
    except:  # 捕获所有输入错误
        print("输入格式错误!")
        continue
    # 执行运算
    flag = 1
    if choice == "+":
        result = add(num1, num2)
    elif choice == "-":
        result = sub(num1, num2)
    elif choice == "*":
        result = mul(num1, num2)
    elif choice == "/":
        result = div(num1, num2)
    elif choice == "log":
        result = log(num1, num2)
    elif choice == "mod":
        result = mod(num1, num2)
    elif choice == "x^y":
        result = power(num1, num2)
    elif choice == "|x|":
        result = C_abs(num1)
    elif choice == "arcsin":
        result = C_arcsin(num1)
    elif choice == "arccos":
        result = C_arccos(num1)
    elif choice == "tan":
        result = C_tan(num1)
    elif choice == "csc":
        result = C_csc(num1)
    elif choice == "sec":
        result = C_sec(num1)
    elif choice == "取反":
        result = bit_not(num1)
    elif choice == "异或":
        result = bit_xor(num1, num2)
    elif choice == "左移":
        result = bit_left(num1, num2)
    elif choice == "右移":
        result = bit_right(num1, num2)
    elif choice == "sin":
        result = sin(num1)
    elif choice == "cos":
        result = cos(num1)
    else:
        print("不支持的运算符")
        flag = 0
    if flag!=0:
        print("结果:", result)
    if input("继续吗?(输入是继续):") != "是":
        break

调试结果如下:

3.上传到Gitee项目

3. 实验过程中遇到的问题和解决过程

  • 问题1:例如取反,三角函数之类的只需输入一个数,但初版程序强制输入两个。
  • 问题1解决方案:先选则运算符,再根据运算符判断输入几个数。
  • 问题2:如何实现取对运算?
  • 问题2解决方案:使用math库中的log函数,虚数使用cmath中的log函数。

其他(感悟、思考等)

Python的函数写法要比C简单很多,甚至可以写临时函数,同时调用库也更加灵活便捷。

参考资料

Python编程:从入门到实践

posted @ 2025-03-29 11:41  weare219  阅读(25)  评论(0)    收藏  举报