20193312朱文昱实验二报告

20193312 2020-2021-2 《Python程序设计》实验二报告

课程:《Python程序设计》
班级: 1933
姓名: 朱文昱
学号:20193312
实验教师:王志强
实验日期:2021年5月9日
必修/选修: 公选课

1.实验内容

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

2. 实验过程及结果

1.计算器的整体框架用循环和条件分支选择搭建:

while x != "-1":
    x = input(
        """
**************************************************
    -----------欢迎使用计算器(智慧版)-----------
        计算器指令目录:
                   加法(多元加法)##1
                   减法(可连减)####2
                   乘法(多元乘法)##3
                   除法(可连除)###4
                   求模###########5
                   解一元二次方程###6
                   指数运算########7
**************************************************
                     退出计算器(-1)
**************************************************
        请输入指令:
        """
    )
    if x == '1':   #加法运算
        lis = list(map(float, input('请输入每一个加数并将其用空格分开:').split()))
        ac(lis, '+')
        x = ed()
    elif x == '2':  #减法运算
        lis = list(map(float, input('请首先输入被减数而后输入每一个减数并将其用空格分开:').split()))
        ac(lis, '-')
        x = ed()

其中的while循环构成了对用户的选择消息检索,用if连接计算器的每一个功能以便于用户直接进行选择

2.主要功能模块的实现方案:
四则运算(子函数部分):

# 多重四则运算器

def ac(lis, ctt):
    if ctt == '+':
        sum1 = 0.0
        for item in lis:
            sum1 = sum1 + float(item)
        print("累加后的结果为:" + str(sum1))
    elif ctt == '-':
        sum1 = 2 * lis[0]
        for item in lis:
            sum1 = sum1 - float(item)
        print('连减后的结果为:' + str(sum1))
    elif ctt == '*':
        sum1 = 1
        for item in lis:
            sum1 = sum1 * float(item)
        print('连乘后的结果为:' + str(sum1))
    elif ctt == '/':
        sum1 = lis[0] ** 2
        for item in lis:
            sum1 = sum1 / float(item)
        print('连除后的结果为:' + str(sum1))********

四则运算器(主函数部分)

    if x == '1':   #加法运算
        lis = list(map(float, input('请输入每一个加数并将其用空格分开:').split()))
        ac(lis, '+')
        x = ed()
    elif x == '2':  #减法运算
        lis = list(map(float, input('请首先输入被减数而后输入每一个减数并将其用空格分开:').split()))
        ac(lis, '-')
        x = ed()
    elif x == '3':  #乘法运算
        lis = list(map(float, input('请输入每一个因数并将其用空格分开:').split()))
        ac(lis, '*')
        x = ed()
    elif x == '4':  #除法运算
        lis = list(map(float, input('请首先输入被除数而后输入每一个除数并将其用空格分开:').split()))
        ac(lis, '/')
        x = ed()

通过列表传递每个操做数,同时在引用此函数的时候预先将算子定好
这里也是使用if将每一个运算法则和主函数连接,将其模块化,防止代码的冗余
通过列表传递计算数的一大好处就是可以进行基本四则运算的多重计算,只要提醒用户应以何种格式将操作数输入即可



模运算:

 elif x == '5':  #模运算
        mood = int(input('请输入模:'))
        z = '0'
        while z != '-1':
            if z == '0':
                num2 = int(input('请输入运算数:'))
                print('模运算后为:' + str(num2 % mood))
            elif z == '1':
                mood = int(input('请输入模:'))
                num2 = int(input('请输入运算数:'))
                print('模运算后为:' + str(num2 % mood))
            z = input(
                """
**************************************************
                     退出模运算(-1)
                     更换模(1)
                     继续当前的模运算(0)
**************************************************
                """
            )
        x = ed()

因为可复用性不强,故直接将模运算的函数体写入了主函数中
在此函数体中,考虑到用户可能存在对同一模底进行多次不同操作数的需求,故采用和主函数体一样的消息循环机制
同时加入了更改模底的选择,这使得用户如果想要继续使用计算器的模运算功能,可直接输入命令代码继续下一次计算
而不用重新退出到计算器的主界面重新选择和设置模底

解一元二次方程:

def eq( a , b , c ):  #一元二次方程----有复根解
    if b ** 2 - 4 * a * c < 0:
        print('该方程不存在实数根,其两虚数根分别为:\n'
              + str(- b / 2 / a) + ' + ' + str(math.sqrt(4 * a * c - b ** 2) / 2 / a) + 'i\n'
              + str(- b / 2 / a) + ' - ' + str(math.sqrt(4 * a * c - b ** 2) / 2 / a) + 'i'
              )
    elif b ** 2 - 4 * a * c == 0:
        print(
            '该方程两实根相等:' +str(- b / 2 / a)
        )
    elif b ** 2 - 4 * a * c > 0:
        print (
            '该方程有两不等的实根且分别为:\n' +
            str(- b / 2 / a + math.sqrt(b ** 2 - 4 * a * c) / 2 / a) + '\n' +
            str(- b / 2 / a - math.sqrt(b ** 2 - 4 * a * c) / 2 / a)
        )

该函数体还是利用了解一元二次方程的老方法——公式法
先判断根的情况后说明,然后直接套公式解方程
与以往有所不同的是,这个子函数中加入了复根情况的运算,并且在我呕心沥血的调试下,复根的功能实现得比较完善


指数运算:

    elif x == '7':  #幂函数运算
        bes = int(input('底数为:'))
        mit = int(input('幂次为:'))
        print(str(bes) + '的' + str(mit) + '次幂为' + str(bes ** mit))
        x = ed()

同样由于可复用性不强且内容实现起来较为简单,直接将其写入了主函数体中
其实现也非常简单,直接用python中自带的幂运算符“**”即可

3.辅助功能的实现方案:

继续使用模块:

#结尾判断函数
def ed():
    input()
    return input(
        """
**************************************************
                     继续使用(0)
                     退出程序(-1)
**************************************************
        """
    )

在每次结束计算后都让用户选择是否继续使用计算器
如果继续使用则会直接回到主界面
如果选择退出程序则计算器停止工作,并显示亲切的问候语
继续使用:

退出程序:

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

  • 问题1:进行四则运算时想通过*para实现传递不定参数,但是未能实现对不定参数的输入赋值;
  • 问题1解决方案:
    运用列表的方法.split()将用户输入的若干个以空格为间隔的操作数识别出来,
    再利用map()将它们转换成float型数据,而后将这些数据填入一个列表中即可
    lis = list(map(float, input('请输入每一个因数并将其用空格分开:').split()))
    而后只需要将列表传递给子函数即可实现不定参数的传递
    ac(lis, '*')
  • 问题2:在进行一元二次方程的求解时,将程序运行至计算方程复根时函数突然报错中止;
  • 问题2解决方案:
    在运用公式法计算函数的根时引入了扩展库math中的sqrt(),该函数对传递的参数有要求,必须为不小于零的数才能进行运算
    而此处产生的报错也是因为如此,在写代码时错误地将一条必小于零的表达式填入了sqrt()中,更改后如下:
print('该方程不存在实数根,其两虚数根分别为:\n'
              + str(- b / 2 / a) + ' + ' + str(math.sqrt(4 * a * c - b ** 2) / 2 / a) + 'i\n'
              + str(- b / 2 / a) + ' - ' + str(math.sqrt(4 * a * c - b ** 2) / 2 / a) + 'i'
              )

而后程序能够正常运行了

其他(感悟、思考等)

这次实验我熟悉了python中的循环的使用,尤其是利用其建立对交互消息的扫描
同时在使用条件分支语句时也随着程序的深入编写逐渐得心应手,现在我慢慢地开始在python上找到以前使用C编程使的感觉了
这次计算器的设计与实现让我逐渐找回在编程上的自信心,虽然很遗憾的是我没能成功地在这个实验上实现可视化编程,但是为了在以后能成功地用python做一次属于自己的游戏
会积极地去网上寻找解决方案然后将可视化掌握的

Gitee代码链接:

https://gitee.com/besti-cs/zhuwenyu20193312/blob/master/counter.py

参考资料

posted on 2021-05-09 21:36  我就注册试试  阅读(50)  评论(0编辑  收藏  举报