20242402 2024-2025-2 《Python程序设计》实验二报告
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 0 return num1/num2 while 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 None
return math.log(num2, num1)
except TypeError: # 如果出现类型错误说明是复数
return cmath.log(num2, num1)
def mod(num1, num2):
"""取余运算"""
if num2 == 0:
print("错误:除数不能为零")
return None
return 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遇到虚数,会返回TypeError
return 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 -1
return ~int(num) # ~ 是取反运算符
def bit_xor(num1, num2):
"""按位异或"""
if num1 != int(num1) or num2 != int(num2):
print("错误:需要整数")
return -1
return int(num1) ^ int(num2) # ^ 是异或运算符
def bit_left(num1, num2):
"""左移(num1左移num2位)"""
if num1 != int(num1) or num2 != int(num2):
print("错误:位移需要整数")
return None
return int(num1) << int(num2)
def bit_right(num1, num2):
"""右移(num1右移num2位)"""
if num1 != int(num1) or num2 != int(num2):
print("错误:位移需要整数")
return None
return 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 = 1
if 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 = 0
if flag!=0:
print("结果:", result)
if input("继续吗?(输入是继续):") != "是":
break
调试结果如下:

3.上传到Gitee项目中
3. 实验过程中遇到的问题和解决过程
- 问题1:例如取反,三角函数之类的只需输入一个数,但初版程序强制输入两个。
- 问题1解决方案:先选则运算符,再根据运算符判断输入几个数。
- 问题2:如何实现取对运算?
- 问题2解决方案:使用math库中的log函数,虚数使用cmath中的log函数。
其他(感悟、思考等)
Python的函数写法要比C简单很多,甚至可以写临时函数,同时调用库也更加灵活便捷。

浙公网安备 33010602011771号