20242402 2024-2025-2 《Python程序设计》实验二报告
课程:《Python程序设计》
班级: 2424
姓名: 张宇涵
学号:20242402
实验教师:王志强
实验日期:2024年3月27日
必修/选修: 公选课
1.实验内容
-
设计并完成一个计算器程序,完成加减乘除模等运算,功能多多益善。
-
考核基本语法、判定语句、循环语句、逻辑运算、函数实现、运算的实现等知识点
2. 实验过程及结果
-
课上跟随老师完成了最基础的加减乘除以及虚数判断,程序如下:
# -*- coding: utf-8 -*- # @Time : 2025/3/26 19:28 # @Author : weare # @Email : 1021149940@qq.com # @File : shiyan2.py # @Project : python-experiment # -*- what can I say -*- def Csum(num1,num2):return num1+num2 def Csub(num1,num2):return num1-num2 def Cmulti(num1,num2):return num1*num2 def Cdev(num1,num2):if num2==0:print("不能为零")return 0return num1/num2while True:if input("输入的是实数还是虚数?实数(1),虚数(2)") == "1":num1 = int(input("请输入一个数: "))num2 = int(input("请输入一个数: "))else :num1 = complex(input("请输入一个数: "))num2 = complex(input("请输入一个数: "))choice =input("请输入运算符(+,-,*,/,log,mod,sin,cos,x^y,|x|,取整): ")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 =",Cdev(num1,num2))elif choice == "log":if input("是否继续?(是/否)") != "是":break
2.之后在查找资料和询问deepseek后,优化了代码,增加了取对,取余,求模,幂指数,绝对值函数,三角函数( sin,cos,arcsin,arccos,sec,csc),位运算(取反,异或,左移,右移),并加入非法字符检测,增强代码鲁棒性。代码如下:
# -*- coding: utf-8 -*-
# @Time : 2025/3/29 09:57
# @Author : weare
# @Email : 1021149940@qq.com
# @File : calculator_1.py
# @Project : python-experiment
# -*- what can I say -*-
# -*- coding: utf-8 -*-
import cmath
import math# ----------------- 基础运算函数 -----------------
def add(num1, num2):"""加法"""return num1 + num2
def sub(num1, num2):"""减法"""return num1 - num2
def mul(num1, num2):"""乘法"""return num1 * num2
def div(num1, num2):"""除法"""if num2 == 0:print("错误:除数不能为零")return None # 返回空值表示错误return num1 / num2
# ----------------- 新加的 ---------------------
def log(num1, num2):"""对数运算(以num1为底,num2为真数)"""# 检查输入是否为复数(通过异常捕获替代isinstance判断)try:if num1 <= 0 or num2 <= 0 or num1 == 1:print("错误:底数需>0且≠1,真数需>0")return Nonereturn math.log(num2, num1)except TypeError: # 如果出现类型错误说明是复数return cmath.log(num2, num1)
def mod(num1, num2):"""取余运算"""if num2 == 0:print("错误:除数不能为零")return Nonereturn num1 % num2
def power(num1, num2):"""幂运算"""return num1 ** num2
def C_abs(num):"""绝对值"""return abs(num)
# ----------------- 三角函数 -----------------
def sin(num):"""正弦函数"""# 通过try-except处理复数输入try:return math.sin(num)except TypeError:# math.sin遇到虚数,会返回TypeErrorreturn cmath.sin(num)
def cos(num):"""余弦函数"""try:return math.cos(num)except TypeError:return cmath.cos(num)
def C_tan(num):"""正弦函数"""try:return math.tan(num)except TypeError:return cmath.tan(num)
def C_arcsin(num):"""反正弦函数"""try:return math.asin(num)except TypeError:return cmath.asin(num)
def C_arccos(num):"""反余弦函数"""try:return math.acos(num)except TypeError:return cmath.acos(num)
def C_csc(num):"""余割函数"""return 1 / sin(num)
def C_sec(num):"""正割函数"""return 1 / cos(num)
# ----------------- 位运算计算器 -----------------
def bit_not(num):"""按位取反(只需要第一个数)"""# 检查是否为整数:通过强制转换后是否相等if num != int(num):print("错误:需要整数")return -1return ~int(num) # ~ 是取反运算符
def bit_xor(num1, num2):"""按位异或"""if num1 != int(num1) or num2 != int(num2):print("错误:需要整数")return -1return int(num1) ^ int(num2) # ^ 是异或运算符
def bit_left(num1, num2):"""左移(num1左移num2位)"""if num1 != int(num1) or num2 != int(num2):print("错误:位移需要整数")return Nonereturn int(num1) << int(num2)
def bit_right(num1, num2):"""右移(num1右移num2位)"""if num1 != int(num1) or num2 != int(num2):print("错误:位移需要整数")return Nonereturn int(num1) >> int(num2)# ----------------- 主程序 -----------------
while True:print("""\n可用运算符:+ - * / log mod x^y |x|sin cos arcsin arccos sec csc取反 异或 左移 右移""")choice = input("请选择运算符:")# 确定需要输入的数字个数need_two = True # 默认需要两个数字if choice in ["取反", "sin", "cos","|x|","sin","cos","arcsin","arccos","sec","csc"]:need_two = False# 处理数字输入try:num_type = input("输入实数吗?(1-是/其他-否):")if num_type == "1":num1 = float(input("输入第一个数:"))if need_two:num2 = float(input("输入第二个数:"))else: # 复数处理num1 = complex(input("输入第一个数(格式如 3+4j):"))if need_two:num2 = complex(input("输入第二个数(格式如 3+4j):"))except: # 捕获所有输入错误print("输入格式错误!")continue# 执行运算flag = 1if choice == "+":result = add(num1, num2)elif choice == "-":result = sub(num1, num2)elif choice == "*":result = mul(num1, num2)elif choice == "/":result = div(num1, num2)elif choice == "log":result = log(num1, num2)elif choice == "mod":result = mod(num1, num2)elif choice == "x^y":result = power(num1, num2)elif choice == "|x|":result = C_abs(num1)elif choice == "arcsin":result = C_arcsin(num1)elif choice == "arccos":result = C_arccos(num1)elif choice == "tan":result = C_tan(num1)elif choice == "csc":result = C_csc(num1)elif choice == "sec":result = C_sec(num1)elif choice == "取反":result = bit_not(num1)elif choice == "异或":result = bit_xor(num1, num2)elif choice == "左移":result = bit_left(num1, num2)elif choice == "右移":result = bit_right(num1, num2)elif choice == "sin":result = sin(num1)elif choice == "cos":result = cos(num1)else:print("不支持的运算符")flag = 0if flag!=0:print("结果:", result)if input("继续吗?(输入是继续):") != "是":break
调试结果如下:
3.上传到Gitee项目中
3. 实验过程中遇到的问题和解决过程
- 问题1:例如取反,三角函数之类的只需输入一个数,但初版程序强制输入两个。
- 问题1解决方案:先选则运算符,再根据运算符判断输入几个数。
- 问题2:如何实现取对运算?
- 问题2解决方案:使用math库中的log函数,虚数使用cmath中的log函数。
其他(感悟、思考等)
Python的函数写法要比C简单很多,甚至可以写临时函数,同时调用库也更加灵活便捷。
参考资料
- Python编程:从入门到实践