20242312 2024-2025- 2《Python程序设计》实验二报告
课程:《Python程序设计》
班级: 2423
姓名: 周梓濠
学号:20242312
实验教师:王志强
实验日期:2025年3月26日
必修/选修: 公选课
1.实验内容
1.设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
2.考核基本语法、判定语句、循环语句、逻辑运算等知识点
2. 实验过程
(1)编写计算器程序
1.题目分析:
①:计算器计算数的范围应分为两种:实数和复数;
②:由于实数和复数计算规则有部分不同,我便分开讨论:
计算复数时,我设计了4种运算符,即基本的加减乘除;
计算实数时,我总共设计了9种运算符,包括加减乘除、取模、指对运算、sin及cos计算;
③:从用户角度出发,比如指数运算是谁做底数,谁做指数;三角函数是取谁做值,要输入弧度制还是角度制;python中复数的输入形式是n+j,而非n+i……对于这些需要特别注意的点,我还做了前置说明;
④:由于本节实验的侧重点是在函数,我便将计算的部分封装为多个函数,尽量使“主函数”看起来简洁。
2.具体代码:
# -*- coding: utf-8 -*-print("""# File : 计算器.py# Author : 电科院吴彦祖# Create Time : 2025.03.26 19:28:45# Python Version : 3.8.10————MAN!What can i say?""")print("""这是一个由超级大帅哥做的计算器,有几点前提说明:1.**运算是以num1为底数,num2为指数进行运算2.log运算是num1的以num2为底的对数运算3.三角函数默认以num1为!角度值4.复数是类似“1+j”的形式,不是“1+i”!以上规则请牢记在心!""")import mathdef Csum(num1,num2):return num1 + num2def Csub(num1,num2):return num1 - num2def Cmulti(num1,num2):return num1 * num2def Cdiv(num1,num2):if num2==0 :print("除数不能为0")return 0else:return num1/num2def Cmol(num1,num2):return num1 % num2def Cmi(num1,num2):return num1 ** num2 #num1 的num2次方def Clog(num1,num2):return math.log(num1,num2) #math.log(x, base)def cal1(num1,num2):choice =input("请输入运算符(+、-、*、/、%、**、log、sin、cos):")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 == "%":print("num1",choice,"num2 = ",Cmol(num1,num2))elif choice == "**":print("num1",choice,"num2 = ",Cmi(num1,num2))elif choice =="log":print("num1",choice,"num2 = ",Clog(num1,num2))elif choice =="sin":num2=math.radians(num1)print("sin",num1,"°=",math.sin(num2))elif choice =="cos":num2=math.radians(num1)print("cos",num1,"°=",math.cos(num2))else:print("您的操作有有误")def cal2(num1,num2):choice =input("请输入运算符(+、-、*、/):")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))else:print("您的操作有有误")flag="y"while flag=="y":pd=int(input("实数运算请扣1,复数运算请扣2\n"))if(pd==1):num1=int(input("请输入一个数:"))num2=int(input("请输入另一个数:"))cal1(num1,num2)elif(pd==2):num1=complex(input("请输入一个数:"))num2=complex(input("请输入另一个数:"))cal2(num1,num2)flag=input("是否继续:y/n?\n")
3. 实验结果
1.终端运行结果(尽量涵盖所有分支):
4.实验过程中遇到的问题和解决过程
问题一: 对于sin、cos、指对运算符的使用语法不清楚
解决方案:询问sider,让它用简单的语言及例子向我介绍运算符的用法
以下是我的个人总结:
首先都得调用数学库,即import math
指数运算:num1 ** num2,其中num1为底数,num2为指数
对数运算:math.log(x, base),其中base为底数
sin函数:首先得先将角度制转换为弧度制—— Radian=math.radians(Angle)
再使用math.sin(Radian)语句
cos函数同理
问题二: 当我选择实数sin运算时,我输入30,终端的输出结果不是sin30°=0.5,而是0.499999999991
解决方案:询问sider,他告诉我,根本原因是浮点数的精度限制:①计算机在存储小数时,部分小数位会被截断 ②math.sin()采用的是泰勒展开的数学方法,像这样的迭代计算会放大初始的浮点误差。
他给我的建议是:控制显示精度,利用round()函数隐藏误差
5.参考资料
王志强老师学习通word文档
Sider AI