20191318实验二 Python程序设计入门

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

课程:《Python程序设计》
班级: 1913
姓名: 王泽文
学号:20191318
实验教师:王志强
实验日期:2020年4月11日
必修/选修: 公选课

1. 实验内容

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

2. 实验过程及结果

  1. 对于一个计算器,其拥有的功能很重要。因此,我首先想到的是实现加减乘除、求模和幂函数这几个简单的功能。这几个功能也比较简单,容易实现

代码如下

# 加法
def add(a, b):
   return a + b
# 减法
def minus(a, b):
   return a - b
# 乘法
def mul(a, b):
   return a * b
# 除法
def div(a, b):
   if b == 0:
       print("Error")
   else:
       return a / b
# 求模
def mod(a, b):
   return a % b
# 幂运算
def power(a, b):
   return a ** b
print("1:加法 2:减法 3:乘法 4:除法 5:求模 6:幂运算
")
s = int(input("请输入运算方法:"))
n1 = float(input("请输入第一个数:"))
n2 = float(input("请输入第二个数:"))
print("结果为:")
   if s == 1:
       print(add(n1, n2))
   if s == 2:
       print(minus(n1, n2))
   if s == 3:
       print(mul(n1, n2))
   if s == 4:
       print(div(n1, n2))
   if s == 5:
       print(mod(n1, n2))
   if s == 6:
       print(power(n1, n2))

一个拥有基本功能的计算器完成了。
效果如图
基本功能效果

  1. 在实现计算器的基本功能后,我继续思考,能不能进行多次计算,即计算一段表达式。于是我进行上网查询,发现可以使用eval()函数来进行运算,但也了解到eval()函数的使用可能会有安全性的问题。

代码如下

# 表达式运算
def test(date):
   result = eval(date)
   return result
print("支持加减乘除和求模(%)与幂函数(**)
示例:3+4-(3-2)**2")
m = input("请输入表达式:")
print("结果为:", test(m))

效果如图
表达式运算效果

  1. 作为一个理科生,仅有简单的计算功能怎么能满足呢,于是,我想加入一些高级的功能,如三角函数、开方等。而这些更高级的功能,简单的代码已经很难实现,于是,就要引入Python中的math函数库。

代码如下

import math
print("1:对数函数 2:开方 3:向下取整 4:向上取整 5:弧度转换角度 6:角度转换弧度 7:正弦函数 8:余弦函数 9:正切函数 10:最大公约数")
s = int(input("请输入运算方法:"))
if s == 1:
   print("对数运算")
   n3 = float(input("请输入运算数:"))
   n4 = float(input("请输入底数:"))
   print("结果为:", math.log(n3, n4))
elif s == 10:
   print("最大公约数")
   n5 = float(input("请输入第一个运算数:"))
   n6 = float(input("请输入第二个运算数:"))
   print("结果为:", math.gcd(n5, n6))
elif 2 <= s <= 9:
   n7 = float(input("请输入运算数(三角函数仅输入弧度制pi前的系数):"))
   if s == 2:
       print("开方运算
结果为:", math.sqrt(n7))
   if s == 3:
       print("向下取整
结果为:", math.trunc(n7))
   if s == 4:
       print("向上取整
结果为:", math.ceil(n7))
   if s == 5:
       print("弧度转换角度
结果为:", math.degrees(n7))
   if s == 6:
       print("角度转换弧度
结果为:", math.radians(n7))
   if s == 7:
       print("正弦函数
结果为:", math.sin(math.pi*n7))
   if s == 8:
       print("余弦函数
结果为:", math.cos(math.pi*n7))
   if s == 9:
       print("正切函数
结果为:", math.tan(math.pi*n7))

效果如图
高级功能

  1. 所需功能均已实现,接下来就是整合到一起了,使用while循环实现计算器的多次使用,再用if语句进行功能选择。
    当需要退出时使用break
   elif i == 0:
      break

代码如下

while True:
    print("计算器")
    i = int(input("基本运算输1,表达式运算输2,高级功能输3,输0退出
请输入:"))
    if i == 1:
        print("1:加法 2:减法 3:乘法 4:除法 5:求模 6:幂运算
")
        s = int(input("请输入运算方法:"))
        n1 = float(input("请输入第一个数:"))
        n2 = float(input("请输入第二个数:"))
        print("结果为:")
        if s == 1:
            print(add(n1, n2))
        if s == 2:
            print(minus(n1, n2))
        if s == 3:
            print(mul(n1, n2))
        if s == 4:
            print(div(n1, n2))
        if s == 5:
            print(mod(n1, n2))
        if s == 6:
            print(power(n1, n2))
    elif i == 2:
        print("支持加减乘除和求模(%)与幂函数(**)
示例:3+4-(3-2)**2")
        m = input("请输入表达式:")
        print("结果为:", test(m))
    elif i == 3:
        print("1:对数函数 2:开方 3:向下取整 4:向上取整 5:弧度转换角度 6:角度转换弧度 7:正弦函数 8:余弦函数 9:正切函数 10:最大公约数")
        s = int(input("请输入运算方法:"))
        if s == 1:
            print("对数运算")
            n3 = float(input("请输入运算数:"))
            n4 = float(input("请输入底数:"))
            print("结果为:", math.log(n3, n4))
        elif s == 10:
            print("最大公约数")
            n5 = float(input("请输入第一个运算数:"))
            n6 = float(input("请输入第二个运算数:"))
            print("结果为:", math.gcd(n5, n6))
        elif 2 <= s <= 9:
            n7 = float(input("请输入运算数(三角函数仅输入弧度制pi前的系数):"))
            if s == 2:
                print("开方运算
结果为:", math.sqrt(n7))
            if s == 3:
                print("向下取整
结果为:", math.trunc(n7))
            if s == 4:
                print("向上取整
结果为:", math.ceil(n7))
            if s == 5:
                print("弧度转换角度
结果为:", math.degrees(n7))
            if s == 6:
                print("角度转换弧度
结果为:", math.radians(n7))
            if s == 7:
                print("正弦函数
结果为:", math.sin(math.pi*n7))
            if s == 8:
                print("余弦函数
结果为:", math.cos(math.pi*n7))
            if s == 9:
                print("正切函数
结果为:", math.tan(math.pi*n7))
    elif i == 0:
        break

效果如图

代码链接

  1. 在实现想要的功能后,我还想让我的计算器更加美观,于是我加入窗口化的运行。
  • 引入tkinter进行窗口化设计。在窗口化时简单的功能可以合并到表达式的计算中去。
  • 高级功能整合到菜单栏或新开一个窗口



  1. 一个计算器的编写就完成了
    代码链接https://gitee.com/python_programming/wzw20191318/blob/2d5c7ef6ddf562d44afaf4bc7c6525afd921511b/计算器gui.py

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

  1. 计算三角函数时为弧度制,使用不方便

解决方法:在计算时引入math.pi进行处理

  1. 在使用eval()函数时能运行命令行,有安全风险

解决方法:在调用函数前先检查是否有非法字符

  1. 在tkinter中设置按钮时无法正常调用函数

解决方法:在要调用的函数前再用lambda:调用

b1 = ttk.Button(win0, text='关闭', command=lambda: win0.destroy())
b1.grid(column=0, row=1)

4. 思考和感悟

  • 在编写代码之前要对自己希望实现的功能和效果有大致的认识,逻辑也需要较为清楚。

参考资料

math库学习https://www.cnblogs.com/xiaoyh/p/9791670.html
https://blog.csdn.net/weixin_42795087/article/details/89931944
https://www.cnblogs.com/mxh1099/p/5386529.html

原文地址:https://www.cnblogs.com/wzwyoshino/p/12681630.html