Python 编程训练2:二维向量

目标

定义一个 Python 类名为 V2,用于表示二维向量,支持下列向量运算:

  • 由两个实数创建一个二维向量:如:v = V2(1.1, 2.2)
  • 将一个向量转换为字符串形式(使用__str__方法)
  • 分解(得到x和y的值)
  • 两个二维向量相加,得到新的二维向量(使用__add__方法)
  • 支持数乘运算(使用__mul__方法)

编程

Step 1 初始化

使用__init____str__方法,当输入:print V2(1.1, 2.2)时,打印:

V2[1.10, 2.20]

程序设计

class V2():
	x=0
	y=0
	def __init__(self, xVal,yVal):
		self.x = xVal
		self.y = yVal
	def __str__(self):
		return "V2[%.2f, %.2f]" % (self.x, self.y)

效果:

>>> print(V2(1.1,2.2))
V2[1.10, 2.20]
>>> 

Step 2 getX和getY

程序设计

class V2():
	x=0
	y=0
	def __init__(self, xVal,yVal):
		self.x = xVal
		self.y = yVal
	def __str__(self):
		return "V2[%.2f, %.2f]" % (self.x, self.y)
	def getX(self):
		return self.x
	def getY(self):
		return self.y

效果:

>>> v.getX()
1.0
>>> v.getY()
2.0
>>> print(v)
V2[1.00, 2.00]
>>> 

Step 3 add和mul

程序设计

版本一:

class V2():
	x=0
	y=0
	def __init__(self, xVal,yVal):
		self.x = xVal
		self.y = yVal
	def __str__(self):
		return "V2[%.2f, %.2f]" % (self.x, self.y)
	def getX(self):
		return self.x
	def getY(self):
		return self.y
	def add(self, v):
		return "[%.2f, %.2f]" % (self.x+v.x, self.y+v.y)
	def mul(self, k):
		return "[%.2f, %.2f]" % (self.x*k, self.y*k)

验证:

>>> a=V2(1.0,2.0)
>>> b=V2(2.2,3.3)
>>> print(a.add(b))
[3.20, 5.30]
>>> print(a.mul(2))
[2.00, 4.00]
>>> print(a.add(b).mul(-1))
Traceback (most recent call last):
  File "<pyshell#205>", line 1, in <module>
    print(a.add(b).mul(-1))
AttributeError: 'str' object has no attribute 'mul'

问题:

add() 返回的是字符串,无法继续进行。

解决:返回一个二维向量即可

版本二:

class V2():
	x=0
	y=0
	def __init__(self, xVal,yVal):
		self.x = xVal
		self.y = yVal
	def __str__(self):
		return "V2[%.2f, %.2f]" % (self.x, self.y)
	def getX(self):
		return self.x
	def getY(self):
		return self.y
	def add(self, v):
		return V2(self.x+v.x,self.y+v.y)
	def mul(self, k):
		return V2(self.x*k,self.y*k)

验证:

>>> a=V2(1.0,2.0)
>>> b=V2(2.2,3.3)
>>> print(a.add(b).mul(-1))
V2[-3.20, -5.30]

Step 4 重载运算符

使用 __add____mul__

示例:

>>> print V2(1.1, 2.2) + V2(3.3, 4.4)
V2[4.4,6.6]

程序设计

class V2():
	x=0
	y=0
	def __init__(self, xVal,yVal):
		self.x = xVal
		self.y = yVal
	def __str__(self):
		return "V2[%.2f, %.2f]" % (self.x, self.y)
	def getX(self):
		return self.x
	def getY(self):
		return self.y
	def add(self, v):
		return V2(self.x+v.x,self.y+v.y)
	def mul(self, k):
		return V2(self.x*k,self.y*k)
	def __add__(self, v):
		return self.add(v)
	def __mul__(self, v):
		return self.mul(v)

验证:

>>> a=V2(1.0,2.0)
>>> b=V2(2.2,3.3)
>>>> print(a+b)
V2[3.20, 5.30]
>>> print(V2(1.1, 2.2) + V2(5, 6))
V2[6.10, 8.20]
>>> print(V2(1.1, 2.2) * 2)
V2[2.20, 4.40]

测试程序:

生成0~10内随即小数,保留两位

round(random.uniform(0,10),2)

单次测试

def unitTestV2():
	import random
	a=round(random.uniform(0,10),2)
	b=round(random.uniform(0,10),2)
	v1 = V2(a,b)
	a=round(random.uniform(0,10),2)
	b=round(random.uniform(0,10),2)
	v2 = V2(a,b)
	print(v1)
	print(v2)
	k = random.randint(0,9)
	print("k = %d\n" %(k))
	print("add test:")
	addV = v1 + v2
	if (addV.x == (v1.x + v2.x)) and (addV.y == (v1.y + v2.y)):
		print("add test OK!!!")
		print(addV)
	else:
		print("add test Error!!!")
	print("\n")
	print("mul test:")
	mulV1=v1 * k
	if (mulV1.x == (v1.x * k)) and (mulV1.y == (v1.y * k)):
		print("mul v1 test OK!!!")
		print(mulV1)
	else:
		print("mul v1 test Error!!!")
	
	mulV2=v2 * k
	if (mulV2.x == (v2.x * k)) and (mulV2.y == (v2.y * k)):
		print("mul v2 test OK!!!")
		print(mulV2)
	else:
		print("mul v2 test Error!!!")

多次测试

>>> def lotTest(n):
	times = n
	while n:
		print("------------------test %d--------------" %(times-n+1))
		unitTestV2()
		n=n-1

结果

>>> lotTest(5)
------------------test 1--------------
V2[6.39, 4.87]
V2[8.20, 8.90]
k = 7

add test:
add test OK!!!
V2[14.59, 13.77]


mul test:
mul v1 test OK!!!
V2[44.73, 34.09]
mul v2 test OK!!!
V2[57.40, 62.30]
------------------test 2--------------
V2[0.16, 1.44]
V2[3.65, 5.84]
k = 0

add test:
add test OK!!!
V2[3.81, 7.28]


mul test:
mul v1 test OK!!!
V2[0.00, 0.00]
mul v2 test OK!!!
V2[0.00, 0.00]
------------------test 3--------------
V2[1.82, 4.23]
V2[0.90, 0.51]
k = 2

add test:
add test OK!!!
V2[2.72, 4.74]


mul test:
mul v1 test OK!!!
V2[3.64, 8.46]
mul v2 test OK!!!
V2[1.80, 1.02]
------------------test 4--------------
V2[8.21, 9.14]
V2[6.22, 0.88]
k = 8

add test:
add test OK!!!
V2[14.43, 10.02]


mul test:
mul v1 test OK!!!
V2[65.68, 73.12]
mul v2 test OK!!!
V2[49.76, 7.04]
------------------test 5--------------
V2[8.58, 7.01]
V2[1.22, 5.70]
k = 4

add test:
add test OK!!!
V2[9.80, 12.71]


mul test:
mul v1 test OK!!!
V2[34.32, 28.04]
mul v2 test OK!!!
V2[4.88, 22.80]
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值