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

课程:《Python程序设计》
班级: 2224
姓名: 田汝绮
学号:20222415
实验教师:王志强
实验日期:2025年4月26日
必修/选修: 公选课

一、实验内容

1.设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
2.考核基本语法、判定语句、循环语句、逻辑运算等知识点

二、实验过程及结果

1.实现计算器
在考虑我的计算器需要增加哪些功能的时候我是参考的我电脑的计算器。

标准计算器除了包含了基础的加减乘除外,好包括了取反、取倒数、取平方和取平方根这几个功能,倒数可以用除来实现,平方和平方根都属于幂运算,所以在编写时我需要编写加减乘除模幂这几个函数,再在相应的时候调用。下面是各个子函数部分

def jia(num1, num2):
    return num1 + num2
def jian(num1, num2):
    return num1 - num2
def cheng(num1, num2):
    return num1 * num2
def chu(num1, num2):
    if num2 == 0:
        print("除数不能为0")
        return 0
    return num1 / num2
def miyunsuan(num1,num2):
    return math.pow(num1,num2)
def mod(num1,num2):
    return num1 % num2

然后再根据相应的使用者的选择的运算符相应地调用对应的子函数,并套进while里实现循环运行

flag = True
while flag:
    num1 = int(input("请输入一个数:"))
    num2 = int(input("请输入另一个数:"))
    choice = input("请输入运算符(+ - * / log ^ mod):")
    if choice == "+":
        print("num1 ",choice, " num2 = ", jia(num1, num2))
    elif choice =="-":
        print("num1 ",choice, " num2 = ", jian(num1, num2))
    elif choice == "*":
        print("num1 ",choice, " num2 = ", cheng(num1, num2))
    elif choice == "/":(
        print("num1 ",choice, " num2 = ", chu(num1, num2)))
    elif choice == "^":
        print(num2, "的", num1, "次方 = ", miyunsuan(num1, num2))
    elif choice == "mod":
        print(num2, "mod", num1, "=", mod(num1, num2))
        cont = input("是否继续?Y/N\n")
    if cont == "Y" or cont == "y":
        flag = True
    else:
        flag = False

这样一个很简单的计算器就实现了,运行起来是这样的

但是这样子确实有点不符合我们的使用习惯,相比起先输入两个数再输入运算符,还是直接输入式子用起来更舒服,那要直接输入式子,就要对输入的式子进行拆分,提取出两个数和运算符,可以考虑使用正则表达式实现,对于输入的式子,应要满足“数字运算符数字=”这个格式,也要考虑到带小数的情况,那么正则表达式就应该是r'(\d+(\.\d+)?)\s*([+\-*/^]|mod)\s*(\d+(\.\d+)?)',接下来现实这部分

import re
def analy_expression(expression):
    pattern = r'(\d+\.?\d*)\s*([+\-*/^]|mod)\s*(\d+\.?\d*)'
    match = re.match(pattern, expression)
    num1 = match.group(1)
    cho = match.group(2)
    num2 = match.group(3)
    return {
        'num1': float(num1),
        'num2': float(num2),
        'cho': cho
    }

加入调试语句进行测试,确实好使

接下来将原先的输入运算数和运算符的部分替换下就可以了,进行下测试

2.代码托管到码云
和实验一一样的操作,下面是本次代码的链接。
calculator.py

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

  • 问题1:在使用正则表达式提取字符串时,原先的代码部分为
import re
def extract_expression(expression):
    pattern = r'(\d+)([+\-*/^]|mod)(\d+)='
    match = re.match(pattern, expression)
    if match:
        num1 = match.group(1)
        cho = match.group(2)
        num2 = match.group(3)
        return {
            'num1': int(num1),
            'num2': int(num2),
            'cho': cho
        }
    else:
        raise ValueError("输入的算式格式不正确")
expression="000"
while(expression!="q"):
    expression=input("请输入算式(eg:9*8=),输入q退出:\n")
    if(expression!="q"):
        result1 = extract_expression(expression)
        print(f"num1={result1['num1']}, num2={result1['num2']}, cho={result1['cho']}")

这个时候代码测试是ok的,可以正确提取出num1,num2和cho,但是后面我想让计算机可以同时适配小数,就将修改了正则表达式和return部分,代码部分如下

import re
def extract_expression(expression):
    pattern = r'(\d+\.?\d*)\s*([+\-*/^]|mod)\s*(\d+\.?\d*)'
    match = re.match(pattern, expression)
    if match:
        num1 = match.group(1)
        cho = match.group(2)
        num2 = match.group(3)
        return float(num1), float(num2), cho
    else:
        raise ValueError("输入的算式格式不正确")

# 测试
expression="000"
while(expression!="q"):
    expression=input("请输入算式(eg:9*8=),输入q退出:\n")
    if(expression!="q"):
        result1 = extract_expression(expression)
        print(f"num1={result1['num1']}, num2={result1['num2']}, cho={result1['cho']}")

运行后出现报错;

  • 问题1解决方案:设置断点进行debug后发现是能正确提取出我要的数和符号,但是在最后一步print出现了问题,当然报错也告诉我了这是什么情况,就是我尝试用字符串索去访问元组元素,然而元组仅支持整数索引或者切片。对比两端代码,发现我在return部分的代码是不同的,而前者我采用的是字典方式返回多个值,而后者我使用的是元组方式,而我在print时一直是采用的字符串索引(像 'num1'、'num2'、'cho' 这样)去访问,因此在第二次时出现了报错。
    ①修改方式一:使用字典方式返回值
def extract_expression(expression):
    pattern = r'(\d+\.?\d*)\s*([+\-*/^mod])\s*(\d+\.?\d*)'
    match = re.match(pattern, expression)
    if match:
        num1 = match.group(1)
        cho = match.group(2)
        num2 = match.group(3)
        return {
            'num1': float(num1),
            'num2': float(num2),
            'cho': cho
        }
    else:
        raise ValueError("输入的算式格式不正确")

②修改方式二:通过整数索引方式来访问元组元素

expression = "000"
while expression != "q":
    expression = input("请输入算式(eg:9*8=),输入q退出:\n")
    if expression != "q":
        result1 = extract_expression(expression)
        print(f"num1={result1[0]}, num2={result1[1]}, cho={result1[2]}")

经过测试,两种都能解决问题。

三、感悟思考

本次代码对我来说最主要的就是正则表达式和序列的使用,虽然这部分刚刚才学,但是我在使用的时候确实还是遇见了一些问题,这和我上课时只听不用有很大的关系,如果没有真正的上手,我真的不知道我不会到什么程度。当然这次代码越写我越能感受到自己的进步,毕竟这个代码要让之前的我用c语言写不知道要用多少if和for,也再次感叹下python真得很方便。最后感谢我的学习好伙伴豆包,谢谢她在本次实验中为我进行答疑解惑:)

参考资料

posted @ 2025-04-09 16:25  RukiTing  阅读(23)  评论(0)    收藏  举报