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

20183202 2019-2020-2 《Python程序设计》实验二报告

课程:《Python程序设计》
班级: 1842
姓名: 李思远
学号:20183202
实验教师:王志强
实验日期:2020年4月11日
必修/选修: 公选课

1.实验内容

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

2. 实验过程及结果

2.1分析数学计算式,确定代码编写思路及步骤。

(1)对于一个计算式整体,先算括号里面的,再算括号外面的。
   所以我们就可以确定,第一个步骤是将所有内层括号里面的算式找出来。
(2)括号里面应该是先算乘除法,然后再算加减法。
   算出这些值,替换掉原来带括号的式子。再找带括号的式子,重复上述操作。直至式子中不含括号。
(3)最后再进行加减乘除运算

2.2编写代码

(1)导入re模块

(2)计算单个的乘除法
代码如下:

(3)计算单个的加减法
代码如下:

(4)计算加减乘除混合运算
代码如下:

(5)计算乘除法
代码如下:

(6)删除字符串中的空格

(7)处理符号问题

(8)进行计算的输入操作

在编写完成后,全部代码为:
'''
实验二:计算器设计
学号:20183202
姓名:李思远
'''

import re

def ind_mul(sz):
    if '*' in sz:       #计算单个的乘法
        a,b = sz.split('*')
        return str(float(a) * float(b))
    elif '/' in sz:  #计算单个的除法
        a, b = sz.split('/')
        return str(float(a) / float(b))


def add_sub(sz):  #计算加减法
    ret = re.findall('[+-]?\d+(?:\.\d+)?', sz)  #利用正则表达式匹配算式中的带符号的每项数字,返回一个列表
    sz_sum = 0
    for i in ret:
        sz_sum += float(i)   #将列表中的每一项求和
    return sz_sum


def cal(sz):    #计算加减乘除混合运算
    sz = mul_div(sz)  #调用mul_div函数先计算乘除法
    sz = signal_exp(sz)  #调用format_exp处理计算时候的符号
    exp_sum =  add_sub(sz)  #调用add_sub计算加减法
    return exp_sum   # float  #返回计算结果

def mul_div(sz):    #计算乘除法
    while True:
        ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',sz)  #利用正则表达式匹配乘或除法
        if ret:   #如果匹配到的话
            atom_sz = ret.group()  #将这个值拿出来
            res = ind_mul(atom_sz) #调用上面个的atom_cal计算
            sz = sz.replace(atom_sz,res) #将计算的结果把原来的算是替换掉
        else:return sz   #如果匹配不到的话说明乘除法计算完毕,返回计算结果

def main(sz):
    sz = sz.replace(' ','')   #删除字符串中的空格
    while True:
        ret = re.search('\([^()]+\)',sz)  #匹配括号
        if ret :    #如果匹配到的话
            inner_bracket = ret.group() #用group()将匹配到的括号内容取出来
            res = str(cal(inner_bracket))  #调用cal()计算括号中的内容,将返回的结果转换成字符串
            sz = sz.replace(inner_bracket,res)  #将匹配到的括号中的内容用计算结果替换
            sz = signal_exp(sz)  #处理符号
        else:break  #直到没有括号跳出循环
    return cal(sz)  #将剩下的内容进行计算,然后返回

def signal_exp(sz):  #处理符号的问题
    sz = sz.replace('--','+')
    sz = sz.replace('+-','-')
    sz = sz.replace('-+','-')
    sz = sz.replace('++','+')
    return sz

s = str(input('请输入你要计算的式子:'))
ret = main(s)
print(ret)

运行结果如下:
1.输入算式1+2-3*4/6,结果如下:

2.输入算式:(20+3*2-1)/4,结果如下:

3.输入算式(1842+1852)*20-3/2,结果如下:

运行结果与计算器结果一致,则程序编写成功。

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

  • 问题1:数学计算式运算简单,且只包含加减乘除四则运算,但对于算式结构不知道如何拆分,对于将其编成代码没有头绪。
  • 问题1解决方案:
    1.找出一个复杂的,包含加减乘除运算的算式,逐步分析计算的解决方法,将计算步骤拆为从里向外的小括号计算,厘清思路。
    2.在确定了宏观计算步骤后,结合编程语言的特性,再层层细化编程步骤。
    3.编程遇到不确定的方法,尤其是在定义函数时不知道怎么编写,上网查阅了相关资料并与同学讨论。
  • 问题2:编写代码时,对于定义函数,存在一些问题。
  • 问题2解决方案:
    1,通过重新看视频讲解,查阅参考书籍,与同学讨论后,解决了此问题。
  • 问题3:编写代码后运行时频频报错。
    -问题3解决方案:
    1.起初使用python自带的IDLE编译器将代码逐行检查,但人工检查又难免漏掉一些错误,且IDLE不提示,运行时仍会报错。
    2.后来下载安装使用了pyCharm中的debug功能,将代码中的错误找出后,重新编写。
    -问题4:在最初编写程序时,想选择定义简单的四则运算函数,然后将其运用于式子的计算,但没有编译完成。
    问题4解决方案:
    1.加减乘除运算是人脑思维在计算式子时最常用的基本法则,但对于编程语言又是另一种截然不同的逻辑。在思考后舍弃了这种做法。

其他(感悟、思考等)

我的思考如下:
1.对于人脑思维与编程逻辑之间的关联性:
解决问题时的思维步骤与编程逻辑之间不同,但也存在一定的联系。所以在对于目标程序设计时,应先思考出解决问题的步骤,并且需要明确化,具体化。在对于编程没有思路时,可以仔细回想一下解决问题的步骤,然后将其向编程语言中的方法靠拢。
2.对于编译器的选择与使用:
频频报错的原因还主要是由于编写代码时的粗心大意,但可以在一定程度上借用软件的帮助。

参考资料

posted @ 2020-04-11 12:02  Alanne  阅读(544)  评论(0编辑  收藏  举报