Python大数据处理实验报告(二)
- 实验目的
1. 通过编写程序实现矩阵操作,包括矩阵相减和遍历矩阵元素。
2. 练习使用计算机工具求解矩阵的逆,并验证逆矩阵的正确性。
3. 熟悉递归算法的应用,通过解决汉诺塔问题加深对递归的理解。
4. 实践使用循环结构解决约瑟夫问题,加强对循环的掌握。
5. 编写密码检查程序,加强对字符串处理和条件判断的能力。
- 实验要求
- 随机生成两个4*4的矩阵X和Y,要求用for循环取出X,Y矩阵对应位置的值,将其相减后放入新的矩阵Z中
- 随机输入一个矩阵,求它的逆矩阵并验证
- 汉诺塔问题:有3根柱子,第一根有N个盘子,从上往下越来越大。要求把第一根柱子的N个盘子全部移到第三根柱子上,在移动过程中,始终只能小盘子压着大盘子,而且每一次只能移动一个盘子。
- 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到5报数),凡报到5的人退出圈子,问最后留下的是原来的第几号。
- 某网站要求对用户设置的密码进行检查,密码长度介于6到12个字符,且必须同时包含大小写字母、数字、及[@,#,*]三个特殊符号中的一种。输入:一系列以逗号分隔的密码,输出:符合要求的以逗号分隔的密码。
- 实验代码
题目一源代码:
import numpy as np X = np.random.randint(0, 10, (4, 4)) Y = np.random.randint(0, 10, (4, 4)) Z = np.zeros((4, 4), dtype=int) for i in range(4): for j in range(4): Z[i][j] = X[i][j] - Y[i][j] print("X:") print(X) print("Y:") print(Y) print("Z:") print(Z) print("X-Y:") print(X-Y) |
题目二源代码:
import numpy as np # 从键盘输入矩阵 n = int(input("请输入矩阵的阶数: ")) matrix = np.zeros((n, n)) print("请输入矩阵内的元素:") for i in range(n): matrix[i] = input().split() # 判断矩阵是否可逆 if np.linalg.det(matrix) != 0: # 求逆矩阵 Ni_matrix = np.linalg.inv(matrix) # 验证 result = np.dot(matrix, Ni_matrix) print("\n原始矩阵:\n", matrix) print("\n逆矩阵:\n", Ni_matrix) print("\n验证结果:\n", result) else: print("\n该矩阵不可逆。") |
题目三源代码:
def hanoi_tower(N, F, T, S): if N == 1: print(f"Move disc 1 from {F} to {T}") return hanoi_tower(N-1, F, S, T) print(f"Move disc {N} from {F} to {T}") hanoi_tower(N-1, S, T, F) N = int(input("请输入有几个盘子:")) F = 'A' T = 'C' S = 'B' hanoi_tower(N, F, T, S) |
题目四源代码:
def find_last_person(n): people = list(range(1, n+1)) index = 0 while len(people) > 1: index = (index + 4) % len(people) #减少index增量考虑每次pop之后的长度变化 people.pop(index) return people[0] n = int(input("请输入总人数:")) last_person = find_last_person(n) print("最后留下的是原来的第", last_person, "号") |
题目五源代码:
import re def check_password(password): # 使用一个正则表达式同时匹配所有条件:长度6-12位,包含小写字母、大写字母、数字和特殊符号 if re.match("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[@#*])[a-zA-Z0-9@#*]{6,12}$", password): return True else: return False def filter_passwords(passwords): valid_passwords = [password for password in passwords if check_password(password)] return valid_passwords passwords = input("请输入一个或多个以逗号分隔的密码: ").split(",") valid_passwords = filter_passwords(passwords) print("符合要求的密码为: " + ",".join(valid_passwords)) |
- 实验结果
图 1 题目一运行结果截图
图 2 题目二运行结果截图
图 3 题目三运行结果截图
图 4 题目四运行结果截图
图 5 题目五运行结果截图
- 实验体会
1. 通过实现矩阵操作,我加深了对矩阵运算的理解,尤其是使用for循环逐元素操作的方法。这让我更熟练地处理矩阵数据。
2. 求解矩阵的逆矩阵并验证的过程中,我学会了如何使用计算机工具进行线性代数运算,这对我理解线性代数知识起到了很好的辅助作用。
3. 解决汉诺塔问题时,我深刻体会到了递归算法的思想和应用。这让我对递归有了更深入的认识,也提升了我的问题解决能力。
4. 解决围成一圈报数问题,我加强了对循环结构和约瑟夫问题的理解,锻炼了我的逻辑思维能力和编程技巧。
5. 编写密码检查程序让我更加熟练地运用条件判断和字符串处理,同时也提高了我对密码安全性检查的认识,对网络安全有了更深的了解。
总的来说,通过这些实验,我不仅学到了更多关于矩阵操作、递归算法、循环结构和密码安全性的知识,还提升了我的编程能力和问题解决能力。这些实验让我更加熟练地运用编程工具解决实际问题,为我的学习和职业发展打下了坚实的基础。