我有一个用Visual Basic制作的2D数组,该数组已经填充了最多3个索引的值。我提供的代码将每一行和每一列的总和相加,但是当我仅更改For循环的顺序时,我不明白它的工作原理。
Dim columnTotal As Integer
Dim rowTotal As Integer
For row = 0 To 2
For col = 0 To 2
rowTotal += magicSquare(col, row)
Next
MsgBox("Row " & row & " " & rowTotal)
rowTotal = 0
Next
For col = 0 To 2
For row = 0 To 2
columnTotal += magicSquare(col, row)
Next
MsgBox("Column " & col & " " & columnTotal)
columnTotal = 0
Next
我想知道For循环如何遍历2D数组,以及如何通过仅更改For循环的顺序来查找列的总和,从而得到正确的答案。
答案 0 :(得分:1)
如果在执行操作之前打印要累加的值,可能会更容易可视化:
Imports System
Public Module Module1
Public Sub Main()
Dim magicSquare = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
Dim columnTotal As Integer
Dim rowTotal As Integer
For row As Integer = 0 To 2
For col As Integer = 0 To 2
rowTotal += magicSquare(col, row)
Console.WriteLine(" row: {0}, column: {1}: {2}", row, col, magicSquare(col, row))
Next
Console.WriteLine("Row {0}: {1}" , row, rowTotal) : Console.WriteLine()
rowTotal = 0
Next
For col As Integer = 0 To 2
For row As Integer = 0 To 2
columnTotal += magicSquare(col, row)
Console.WriteLine(" column: {0}, row {1}: {2}", col, row, magicSquare(col, row))
Next
Console.WriteLine("Column {0}: {1}" , col, columnTotal) : Console.WriteLine()
columnTotal = 0
Next
End Sub
End Module
实时演示:https://dotnetfiddle.net/1Osand
在第一个嵌套循环中,您将所有值添加到一行中,而第二个循环将所有值添加到一列中。最终,您要遍历所有项目,不同之处在于执行添加的方式/方式。
P.S。 -我最后的回应有些仓促,所以我现在可以详细说明。在您的第一个嵌套循环中,您实际上是在说:我要遍历每一行,然后我想在该行中添加每个值,最后我要打印结果。
在第二个嵌套循环中,您只是在做相反的事情,实际上是在说:我要遍历每列,然后我要在该列中添加每个值,最后我要打印结果。
因此,通过更改循环的嵌套顺序,可以更改上下文。如果您阅读(按照您的解释)从最外层循环到最内层的代码,您可能会说:我正在循环遍历每一行并添加该行中的每个值,或者正在遍历每一列并在该列中添加每个值。
答案 1 :(得分:1)
首先,在VB.Net中,二维数组将第一个索引作为行,将第二个索引作为列,即array[row,col]
(与VBA相反)。因此,我将您的行称为COL,将其称为ROW。希望不要混淆...在第一个循环中,COL = 0而ROW = 0、1、2
如果这是您的数组,
Dim magicSquare = {{2, 7, 6}, {9, 5, 1}, {4, 3, 8}}
' or
Dim magicSquare =
{
{2, 7, 6}, ' first index = 0
{9, 5, 1}, ' first index = 1
{4, 3, 8} ' first index = 2
} ' you can see why the first index corresponds to the row, not col
然后添加的值为magicArray(0, 0) + magicArray(1, 0) + magicArray(2, 0)
或2 + 9 + 4 = 15
。然后,当ROW = 0、1、2时,COL =1。最后,当ROW = 0、1、2、2时,COL = 2。
{
{2, _, _},
{9, _, _},
{4, _, _}
}
{
{_, 7, _},
{_, 5, _},
{_, 3, _}
}
{
{_, _, 6},
{_, _, 1},
{_, _, 8}
}
然后您只需将其切换为,当ROW = 0时COL = 0,1,2,然后ROW = 1时COL = 0,1,2然后ROW = 2则COL = 0,1,2。
{
{2, 7, 6},
{_, _, _},
{_, _, _}
}
{
{_, _, _},
{9, 5, 1},
{_, _, _}
}
{
{_, _, _},
{_, _, _},
{4, 3, 8}
}
顺便说一句,您也可以测试对角线。对于第一个对角线,索引相等。对于第二个对角线,一个是另一个与最大索引之间的差。
For rowcol As Integer = 0 To 2
columnTotal += magicSquare(rowcol, rowcol)
Next
MsgBox("First diagonal " & columnTotal)
columnTotal = 0
For rowcol As Integer = 0 To 2
columnTotal += magicSquare(rowcol, 2 - rowcol)
Next
MsgBox("Second diagonal " & columnTotal)