一、实验目的
使用Python解决简单问题
二、实验要求
自主编写并运行代码,按照模板要求撰写实验报告
三、实验步骤
本次实验共有4题:
- 自行给定一个从小到大排好序的数组,输入一个数并将其插入到原始数组中,新的数组还是满足从小到大的排列顺序
- 随机生成两个4*4的矩阵X和Y,要求用for循环取出X,Y矩阵对应位置的值,将其相减后放入新的矩阵Z中
- 随机输入一个矩阵,求它的逆矩阵并验证猜数字游戏,随机生成一个数x(1<x<10000),玩家每次输入一个数y,如果y大于或小于x,则给出相应提示,如y=x则表示数字猜对了。
四、实验结果
T1
"""
自行给定一个从小到大排好序的数组
输入一个数并将其插入到原始数组中
新的数组还是满足从小到大的排列顺序
"""
import randomlength = random.randint(5, 10) # 生成数组的长度
arr = []
for i in range(0, length):arr.append(random.randint(-100, 100))arr = sorted(arr)
print('原数组如下:' + str(arr))print("请输入一个数:")
num = int(input())
arr.append(num)
arr = sorted(arr)
print('重新排序后:' + str(arr))
T2
"""
随机生成两个4*4的矩阵X和Y
要求用for循环取出X,Y矩阵对应位置的值
将其相减后放入新的矩阵Z中
"""
import randomimport numpy as npx = np.zeros(shape=(4, 4))
y = np.zeros(shape=(4, 4))for i in range(0, 4):for j in range(0, 4):x[i][j] = random.randint(-100, 100)y[i][j] = random.randint(-100, 100)print('随机数组x:')
print(x)
print('随机数组y:')
print(y)# 等价于矩阵相减,此处使用for循环
z = np.zeros(shape=(4, 4))
for i in range(0, 4):for j in range(0, 4):z[i][j] = x[i][j] - y[i][j]
print('x - y = ')
print(z)
T3
按照实验要求,本题测试应该使用随机的矩阵(code 3实现)。但是逆矩阵各数值可能是无理数,且由于浮点数的精度问题,导致求出的逆矩阵各数值只是“近似”,进而导致验证出现问题,求解正确的逆矩阵被判定为求解错误.
故使使用一个相对特殊的情况进行求解(code 3-1实现)
"""
Code 3
随机输入一个矩阵,求它的逆矩阵并验证
遇到精度问题
"""
import randomimport numpy as npline = random.randint(2, 10)
row = line # 方阵才有逆
x = np.random.randint(-100, 100, (line, row))"""
按照实验要求应该使用由随机数生成的矩阵
但是由于浮点数的精度问题,且逆矩阵各数值可能是无理数
所以导致求出的逆矩阵各数值只是“近似”
进而导致验证出现问题
"""
print('原矩阵:')
print(x)inv = np.matrix(np.linalg.inv(x))
print('原矩阵的逆:')
print(inv)res = np.matrix(x) * inv
print(res)"""
Code 3-1
随机输入一个矩阵,求它的逆矩阵并验证
"""
import numpy as npprint('请输入方阵大小:')
size = int(input())
s = ''
irr = 0for i in range(0, int(size)):s = s + input()mat = np.zeros(shape=(size, size))for i in range(0, len(s)):mat[int(irr / size)][irr % size] = s[irr]irr = irr + 1inv = np.matrix(np.linalg.inv(mat))res = mat * inv
print(inv)
print(res)
T4
"""
猜数字游戏,随机生成一个数x(1<x<10000),玩家每次输入一个数y
如果y大于或小于x,则给出相应提示,如y=x则表示数字猜对了。
"""
import randomx = random.randint(1, 10000)def check(flag):if int(flag) > int(x):bigger()return Falseelif int(flag) < int(x):smaller()return Falseelse:print('Congratulations!')return Truedef bigger():print('too big')def smaller():print('too small')while True:y = input()if check(y):exit(0)
五、实验体会
查询资料,显示Python中使用双精度浮点数来存储小数,8字节64位存储空间分配了52位来存储浮点数的有效数字,11位存储指数,1位存储正负号(本质上是二进制表示的科学计数法),舍入(round)的规则为“0 舍 1 入”。
如果需要更高精度,可以使用类型Decimal并使用decimal.Decimal() 来存储精确的数字。或者使用Fraction模块来表示分数进行运算。