[Visual Basic]矩阵与矩阵转置
矩阵这一块相对于高考考生来说,烦是真的烦。
但是个人觉得,主要还是靠自己理解题目的意思,然后慢慢推。课上讲的普通矩阵不会一模一样拿出来考的。
So请看下面8
定义
Ps:这块内容既枯燥又枯燥,建议直接跳过(我只是为了完善笔记而已Ctrl+V)

在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。这一概念由 19 世纪英国数学家凯利首先提出。
由 m×n 个数排成的 m 行 n 列的数表称为 m 行 n 列的矩阵,简称 m×n 矩阵
这 m×n 个数称为矩阵 A 的元素,简称为元,数 a(i,j)位于矩阵 A 的第i 行第 j 列,称为矩阵 A 的(i,j)元。
普通矩阵的生成
m = Val(Text1.Text)
n = Val(Text2.Text)
For i = 1 To m * n
r=Int(Rnd *90)+10
a(i) = r
s = s + Str(a(i))
If i Mod n =0 Then
List1.AddItem s
s = ""
End If
Next i
End Sub
下面的公式是重点啦!请自行推一遍!
行号:H=(i-1)\n + 1
列号:L=(i-1) mod n + 1
数组下标:i=(H-1)*n+L
数组下标与位置关系为(所在行数-1)*列数+所在列
特别要注意最后一列数据的处理
矩阵翻转
相信你读完上面也觉得矩阵不怎么难嘛,那么下面的翻转对于你来说肯定也没问题啦~
顺便吐槽一下,VB里其实是有二维数组的,但SB出题人就偏偏只喜欢用一维数组,所以添加了好多好多麻烦!QAQ
垂直翻转

垂直翻转是这样子转滴!相当于你倒立了!这是关于行的变换
仿二维法
新数据在第i行, 原数据在第m-i+1行
b((i-1)*n+j)=a((m-i)*n+j)
'数组下标与位置关系为(所在行数-1)*列数+所在列
一维线性法
新数据 b(i)
行: (i-1)\n+1
列: (i-1) mod n+1
原数据a (?)
行:m-((i-1)\n+1)+1=m-(i-1)\n
列:(i-1) mod n+1
b(i)=a((m-(i-1)\n-1)*n+(i-1) Mod n+1
'数组下标与位置关系为(所在行数-1)*列数+所在列
别问,问就是我也记不住。一维的方法真的很不符合思维的规律哎
水平翻转

这就是从你看到了镜子中的自己,是关于列的变换
同样也有两种方法,这里只贴代码了:
仿二维法
b((i-1)*n+j) =a((i-1)*n+n-j+1)
'数组下标与位置关系为(所在行数-1)*列数+所在列
一维线性法
b(i)=a((i-1)\n*n+n-(i-1) mod n)
'数组下标与位置关系为(所在行数-1)*列数+所在列
矩阵旋转
顺时针旋转90度

仿二维法:b((i-1)m+j)=a((m-j)n+i)
一维线性法:b(i)=a((m-(i-1) Mod m-1)*n+(i-1)\m+1)
逆时针旋转90度

仿二维法:b((i-1)m+j)=a(jn+n-i+1)
一维线性法:b(i)=a((i-1) Mod m)*n+n-(i-1)\m)
旋转180度(中心对称)

仿二维法:b((i-1)n+j)=a((m-i)n+n-j+1)
一维线性法:b(i)=a((m-(i-1)\n-1)*n+n-(i-1) Mod n)
或b(i) = a(m * n + 1 - i)
转置(行列互换)

仿二维法:b((i-1)m+j)=a((j-1)n+i)
一维线性法:b(i)=a(((i-1) Mod m)*n+(i-1)\m+1)
懒得写了…光记这个公式其实挺乏味的……还是手动模拟一遍怎么转转吧。就题而推。
2020/04/01 From差点超神篇
题目:
小王用VB 编写了一个考场座位编排程序,实现从考生数据库里读出所有学生的姓名和前一次考试成绩,分别存入数组xm 和数组cj,按成绩从高到低排序后显示在List1 中,输入考场规格和考场号,单击“考场座位编排”按钮后,从第一位考生开始按S 型(如图a 所示)依次安排座位,并在List2 中输出该考场的座位表,每个姓名输出占4 个汉字字符宽度,不足4 个字符的在姓名后面补充空格(如图b 所示),尾试场多余位置显示“空”字。请补充代码:


Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim n As Integer, xm(1 To 1000) As String, cj(1 To 1000) As Integer
Function fm(s As String, k As Integer) As String
x = Len(s)
fm = s + Mid(" ", 1, (k - x) * 2) '此处空格字符串长度足够
End Function
Private Sub Form_Load()
Dim i As Integer, j As Integer, t1 As Integer, t2 As String
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;DATA Source=" &App.Path & "\cjk.accdb"
conn.Open
Set rs.ActiveConnection = conn
rs.Open "select * from 总分表"
n = 0
Do While Not rs.EOF
n=n+1
xm(n) = rs.Fields(1): cj(n) = rs.Fields(2)
rs.MoveNext
Loop
rs.Close
conn.Close
Text4.Text = "共有考生" & n & "人"
'此处代码实现将xm 和cj 数组按成绩降序排序并从List1 输出,代码略。
End Sub
Private Sub Command1_Click()
Dim kc As Integer 'kc 为考场号
Dim p As Integer,q As Integer 'p 为行数,q 为列数
Dim i As Integer, num As Integer, ks As Integer
List2.Clear
List2.AddItem " 讲 台 "
List2.AddItem " "
p = Val(Text1.Text): q = Val(Text2.Text): kc = Val(Text3.Text)
ks = p * q * (kc - 1)
For i = 1 To p
ks = ks + 1
s = fm(xm(ks), 4) '输出的信息占4 个汉字字符宽度
For j = 1 To q - 1
If j Mod 2 = 1 Then
num = ks + p * 2 * (j + 1) \ 2 - 1 - (i - 1) * 2
Else
num = ③
End If
If num > n Then
s = s + fm("空", 4)
Else
s = s + ④
End If
Next j
List2.AddItem s
List2.AddItem "---------------------------------------"
Next i
End Sub

浙公网安备 33010602011771号