我不太了解2D阵列

时间:2019-06-10 19:49:11

标签: vb.net

我有一个用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循环的顺序来查找列的总和,从而得到正确的答案。

2 个答案:

答案 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)