20241216 实验二《Python程序设计》实验报告

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 0
    return 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 = True
    else:
        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 0
    return num1 / num2
def logab(a,b):
    if b <= 0 or a <= 0:
        print("输入数不合法!")
        return 0
    return 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 == "=":
                break
    else:
        while True:
            num1 = int(input())
            choice1 = input()
            cul_num.append(num1)
            cul_choice.append(choice1)
            if choice1 == "=":
                break
    accmlt = cul_num[0]
    while True:
        choice = cul_choice[index-1]
        if choice == "=":
            print(accmlt)
            break
        num = 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 + 1
    conti = input("是否继续?Y/N\n")
    if conti == "Y" or conti == "y":
        flag = True
    else:
        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 0
    return num1 / num2
def logab(a,b):
    if b <= 0 or a <= 0:
        print("输入数不合法!")
        return 0
    return math.log(a,b)
flag = True
while flag:
    index = 1
    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 == "=":
                break
    else:
        while True:
            num1 = int(input())
            choice1 = input()
            cul_num.append(num1)
            cul_choice.append(choice1)
            if choice1 == "=":
                break
    accmlt = cul_num[0]
    while True:
        choice = cul_choice[index-1]
        if choice == "=":
            print(accmlt)
            break
        num = 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 + 1
    conti = input("是否继续?Y/N\n")
    if conti == "Y" or conti == "y":
        flag = True
    else:
        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 0
    return num1 / num2
def logab(a, b):
    if b <= 0 or a <= 0:
        print("输入数不合法!")
        return 0
    return math.log(a, b)
def evaluate_expression(numbers, operators):
    i = 0
    while 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] = result
            del numbers[i + 1]
            del operators[i]
        else:
            i += 1
    result = 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 == "=":
                break
    else:
        while True:
            try:
                num1 = float(input())  
                choice1 = input()
                cul_choice.append(choice1)
                cul_num.append(num1)
                if choice1 == "=":
                    break
            except ValueError:
                print("请输入有效数字!")
                continue
    try:
        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),调整优先级运算也让我更好了解判断语句和循环语句

(五) 参考资料

posted @   masterzk01  阅读(13)  评论(0)    收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示