Не понимаю логики операции сложения ячеек массива

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
Привет.
Попытаюсь сформулировать максимально точно.

Например, возьмем двухмерный массив на 3 ячейки каждый индекс.



















Задаем цикл.
Задаем что то вроде набора чисел в случайном порядке для того, что бы назначить их в переменные
Для наглядности делаем массив ListBox : I будет номер ListBox, F будет строка
Для наглядности так же выводим в Print значения I,f, RND
Затем считаем сумму.
Если считаем так:
z = z + mass(i, f)
То все нормально.
А если так:
z = z + mass(1, 1)
То я не понимаю, как производится расчет.


Код:
Private Sub Command1_Click()
   Dim mass(2, 2) As Integer, i As Single, f As Single, z As Integer
    Cls
    z = 0
       For i = 0 To 2
       For f = 0 To 2
            mass(i, f) = Rnd(1) * (z + 1)
            List1(i).List(f) = mass(i, f)
           Print i, f, Rnd
           z = z + mass(1, 1)
          Text1.Text = z
   Next f, i
End Sub

Примеров пара на скринах
Суммы выводятся в левом верхнем TextBox
Просьба тем, кто видит очевидное дать комментарий...
1515067766511.png
1515067825233.png
1515067859972.png
 
Последнее редактирование:
Я не понимаю, что тебе нужно, и зачем ты 6 раз складываешь одно и то же число само с собой: z = z + mass(1, 1)
И пользуйся стандартными математическими определениями координатной сетки (так удобнее): X - горизонталь (или строка), Y - вертикаль (или колонка).
Зачем тебе i, f - с плавающей точкой?
+ выравнивание кода ужасное. Лучше разнеси Next f, i на разные строки с разным выравниванием.
Что-то посоветовать сложно, не зная, в чём заключается задача.
 
Оформил код.
и зачем ты 6 раз складываешь одно и то же число само с собой:
Видимо тут корень непонимания.
Почему 6 раз?
z=0
Далее уравнение как выглядит?
Хочу просто уметь обращаться к определенной ячейке, столбцу, строке.
Потому что мне нужен многомерный массив, но где то есть недопонимание и на этом примере пытался разобраться.
Я ведь верно визуализировал в виде таблицы?
Два массива по три строки. (0,1,2)
 
Я даже не знаю, что именно ты виртуализуешь.
Ещё раз прошу: опиши задачу полностью.

6 раз 9 раз
(2-0+1) * (2-0+1)
For i = 0 To 2 For f = 0 To 2
Одна и та же ячейка (1,1)

Потому что мне нужен многомерный массив
Чаще всего используют одномерный и двухмерный. Многомерный - это уже объём, графика (объём), 3D и т.д., и даже там нечасто увидишь.
Массивами Листбоксов тоже пользуются в довольно специфических случаях, когда заранее неизвестно их точное кол-во. Если тебе нужна парочка, то просто заведи два отдельных, дав им понятные имена.
 
Последнее редактирование:
-
Т.е. почему получается 5?
Ну так при некоторых итерациях в ячейке (1,1) еще не содержится значение
i=0,f=0 --> значение в ячейке (1,1)=0 --> z=0 ;
i=0,f=1 --> значение в ячейке (1,1)=0 --> z=0;
i=0,f=2 --> значение в ячейке (1,1)=0 --> z=0;
i=1,f=0 --> значение в ячейке (1,1)=0 --> z=0;
i=1,f=1 --> значение в ячейке (1,1)=1 --> z=1;
i=1,f=2 --> значение в ячейке (1,1)=1 --> z=2;
i=2,f=0 --> значение в ячейке (1,1)=1 --> z=3;
i=2,f=1 --> значение в ячейке (1,1)=1 --> z=4;
i=2,f=2 --> значение в ячейке (1,1)=1 --> z=5;
 
Последнее редактирование:
NickM, там вообще, что угодно может получится. В коде стоит рандом.
Честно говоря, я вообще не понимаю, что мы обсуждаем. И приведённый пример вообще не имеет смысла.

Кирилл, вот можешь разобрать такой пример:

Код:
Option Explicit

Private Sub Command1_Click()
    'объявляем динамический массив
    Dim arr()   As Long
    Dim y       As Long
    Dim x       As Long
    
    'переопределяем границы массива (нижняя граница будет = 1)
    ReDim arr(1 To 3, 1 To 4)
    
    'y1,x1   y1,x2  y1,x3   y1,x4
    'y2,x1   y2,x2  y2,x3   y2,x4
    'y3,x1   y3,x2  y3,x3   y3,x4
    
    Cls
    
    'идём построчно
    For y = LBound(arr, 1) To UBound(arr, 1)
        'сперва заполняем всю строку колонки
        For x = LBound(arr, 2) To UBound(arr, 2)
            arr(y, x) = Int(Rnd * 3) + 1 ' случайное число от 1 до 3
            'печатаем на форму (без перевода на новую строку)
            Me.Print arr(y, x), ;
        Next
        'переход на новую строку
        Me.Print
    Next
    
    'вычисляем сумму по столбцам
    
    Dim sum() As Long
    ReDim sum(LBound(arr, 2) To UBound(arr, 2)) As Long
    
    'идём по колонкам
    For x = LBound(arr, 2) To UBound(arr, 2)
        'считаем сумму по вертикали
        sum(x) = 0
        For y = LBound(arr, 1) To UBound(arr, 1)
            sum(x) = sum(x) + arr(y, x)
        Next
        Me.Print sum(x), ;
    Next
    Me.Print
    'последняя строка на форме - сумма по колонкам.
End Sub
 
С одномерным массивом у меня проблем нет.

Откуда берутся эти цифры?
До этого я считал что четко понимаю процесс, но вы меня как то повергли в небольшой хаос.


i (2) f(0)

I(2) f(1)

i(2) f(2)

I (1) f(0)

i(1) f(1)

i(1) f(2)

i (0) f(0)

i(0) (f1)

i(0) f(2)

@Dragokas в твоем примере вроде все прозрачно и понятно.
Я вроде определился с формулировкой:
Мне хочется максимально ясно понимать как обращаться к конкретной ячейке, строке или столбце массива.
Задачи конкретной у меня нет, мне нужен сам навык.
Из твоего примера стало понятнее, я так примерно делал.
Смотрел как другие делают с рандомным числом и ушел в ступор сам не понял на чем.
Почему это sum(x) = sum(x) + arr(y, x) считает сумму то)))
sum(x) = 0 это, видимо, не значение ячейки а точка отсчета?
 
Почему это sum(x) = sum(x) + arr(y, x) считает сумму то)))
Потому что это и есть формула суммы -


sum(x) = 0 это, видимо, не значение ячейки а точка отсчета?
Это инициализация переменной, а в конкретном примере элемента одномерного массива.
 
Мне хочется максимально ясно понимать как обращаться к конкретной ячейке, строке или столбце массива.
Как обращаться к ячейке? В VB нет такого понятия, как ячейка (это понятие из Excel, ну есть правда, ещё DataGrid). В массиве - это называется "элемент массива".
Обращаться просто: указываешь имя массива и в скобках его индекс (или индексы, если речь о массиве с кол-вом размерностей > 1 )

Например, если массив 2-мерный и ты его представляешь себе как координатную сетку (как в Excel), то:

arr(y, x) - это значение элемента массива в колонке № X, строки № Y.
Код:
'y1,x1   y1,x2  y1,x3   y1,x4
'y2,x1   y2,x2  y2,x3   y2,x4
'y3,x1   y3,x2  y3,x3   y3,x4

Поскольку я объявлял массив динамически, то границы массива определял автоматически:
LBound(arr, N) - нижняя граница массива arr размерности № N, т.е.:
LBound(arr, 1) - нижняя граница первой размерности
LBound(arr, 2) - нижняя граница второй
Ubound - верхняя.

Как перечислять "столбцы" условного массива?
Легко:
Код:
'вот я перечисляю стобцы от 1-го до 4-го
For X = 1 to 4

Next

'перечисляю "строки" условного массива от 1 до 3:
For Y = 1 to 3

Next

'перечисляю элементы массива построчно, т.е. вот в таком порядке:

'1  2  3  4
'5  6  7  8
'9  10  11 12

For Y = 1 to 3
  For X = 1 to 4

  Next X
Next Y

'перечисляю элементы массива поколоночно (т.е. я именно так рассчитывал суммы по столбцам), т.е. вот в таком порядке:
'1 4 7 10
'2 5 8 11
'3 6 9 12

For X = 1 to 4
  For Y = 1 to 3

  Next
Next

Почему это sum(x) = sum(x) + arr(y, x) считает сумму то)))
sum(x) = 0 это, видимо, не значение ячейки а точка отсчета?
Это не точка отсчёта и не инициализация.
В VB инициализация переменных происходит в момент их объявления значением по-умолчанию (для целых чисел - это 0).

В моём коде выше это лишнее, больше как правило хорошего тона.
Но если бы я объявил sum не как массив, а как обычную переменную, то её нужно было бы обнулять,
потому что иначе sum в самом конце содержалла бы сумму элементов вообще всего массива, а не колонки.
А в примере выше, каждый эл-т массива sum содержит сумму элементов колонки № X. (sum(x) - сумма эл-тов колонки № x)

---- Автоматическое слияние сообщений ----

Почему это sum(x) = sum(x) + arr(y, x) считает сумму то)))
Поставь точку останова на ней (проставить красную кляксу слева от строки или через F9) и запусти и прокрути цикл пошагово (через F8) и смотри в этот момент в окно локальных переменных (включить через View -> Local Window) и поймёшь как оно считает.
 
Последнее редактирование:
Для таких же как я, кто ушел не в ту сторону при изучении массивов - сделал небольшой наглядный пример)))

1515818406316.png


Пароль 111 к архиву.

VB.NET / VBA:
Private Sub Command1_Click()
   Dim box(2, 3) As Integer, x As Integer, y As Integer, z As Integer
      'Randomize Timer
      Cls
       z = 0
       For x = 0 To 1
       For y = 0 To 3
        box(x, y) = x + 1
        z = z + box(x, y)
        Text4.Text = z
       Print ""
       Print ""
       Print ""
       Print x, y, box(x, y)
     
  Next y, x
End Sub
 

Вложения

  • Двумерные массивы.zip
    3.9 KB · Просмотры: 0
Я бы порекомендовал делать наглядные примеры для массивов макросами Excel-я. Там всё гораздо нагляднее будет видно. Можно, например, подсвечивать ячейки.
 
Ну тоже как вариант, да.
Как оказалось, у меня затык был в том, что я путал содержимое ячейки памяти и координаты ячейки.
А так же был утерян школьный навык, который и обновил в этой теме.
 
Адрес в куче берётся через:
  • varptr(имя_переменной_целого_или_дробного типа)
  • strptr(имя_переменной_строкового типа)
  • objptr(имя_переменной_объектного типа)
Для массива адрес первого элемента берется через varptr/strptr/objptr и в скобках имя первого элемента, например, varptr(arr(0)) для соответствующего типа данных.
Элементы массива в памяти храняться последовательно, т.е. Адрес 2-го эл-та = Адресу 1-го эл-та + размер переменной, например:
Код:
Addr2 = varptr(arr(0)) + LenB(arr(0))
Это для одномерного массива. Массивы в VB6 представляют из себя струткуру SAFE_ARRAY.
Более подробный разбор см. в теме.
 
Назад
Сверху Снизу