Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

7 Март 2021, 04:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: массив массивов или вложенный массив  (Прочитано 6298 раз)
0 Пользователей и 1 Гость смотрят эту тему.
calc4fem
Форумчанин
***
Offline Offline

Сообщений: 278


« Стартовое сообщение: 22 Декабрь 2014, 02:53 »

здравствуйте,
существует несколько таблиц с данными, которые считываются макросом в массивы.
предположим, для примера, есть школы и в них в среднем 15-20 групп учащихся. В каждой группе примерно 20-30 учеников (может варьировать).
каждому ученику могут быть сопоставлены отметки по всем из 20 изучаемых предметов. И так далее - такая примерно сложная иерархия.
Вопрос состоит в том, как организовать все в одном массиве, чтобы потом было сравнительно легко оперировать данными.
Как такой массив декларировать, как присваивать значение и потом его возвращать при надобности?
просто с массивами все мне понятно, в том числе с динамическими. А вот как и можно ли сделать чтобы элементом массива являлся другой массив - тут я затруднясь. Если есть массив aaa определенной размерности и в нем элементом aaa(2,3) является массив bbb размером 100x100
то как записать присвоение и вывод элемента bbb(10,10) в общем виде.
Записан
DixiX57
Форумчанин
***
Offline Offline

Сообщений: 64


« Ответ #1: 22 Декабрь 2014, 19:44 »

Простите, а какие конкретные задачи по обработке данных у Вас есть? А то ведь и массивы могут не понадобятся. Если это таблицы реляционной базы данных (да ещё правильно нормализованные), то очень часто пара тройка SQL-запросов всё решает.
Записан
calc4fem
Форумчанин
***
Offline Offline

Сообщений: 278


« Ответ #2: 22 Декабрь 2014, 19:48 »

В принципе со структурой массивов я уже решил вопрос (просто воспользовавшись опцией N мерных массивов)
мне базы данных в данном случае не нужны, а вопрос был примерно такой "как оперировать массивами массивов"
и где об этом можно почитать.
Записан
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #3: 22 Декабрь 2014, 22:31 »

Если я правильно понял вопрос, то оперировать массивами от массивов можно так
Код:
Sub arr_arr
Dim p1(3,3)
p1(0,0)=100
p1(1,0)=110
p1(2,0)=120

p1(0,1)=101
p1(1,1)=111
p1(2,1)=121

p1(0,2)=102
p1(1,2)=112
p1(2,2)=122

Dim p2(3,3)
p2(0,0)=200
p2(1,0)=210
p2(2,0)=220

p2(0,1)=201
p2(1,1)=211
p2(2,1)=221

p2(0,2)=202
p2(1,2)=212
p2(2,2)=222


Dim p3(3,3)
p3(0,0)=300
p3(1,0)=310
p3(2,0)=320

p3(0,1)=301
p3(1,1)=311
p3(2,1)=321

p3(0,2)=302
p3(1,2)=312
p3(2,2)=322

Dim a(3,3)      ' массив массивов
a(0,0)=p1
a(1,0)=p2
a(2,0)=p3
' не закончил массив массивов, т.к долго продолжать

MsgBox a(2,0)(2,2)          ' элемент массива в массиве

a(1,0)(1,2)=1012

MsgBox a(2,0)(2,2)

MsgBox p3(2,2)

End Sub
Записан
calc4fem
Форумчанин
***
Offline Offline

Сообщений: 278


« Ответ #4: 23 Декабрь 2014, 00:51 »

Спасибо! Это как раз и был мой вопрос! Я в принципе нашел способ уйти от вложенных массивов в текущей задаче, но не исключено, что я применю это в будущем. Вы знаете где это описано у Питоньяка или в справке? Как найти где бы почитать о таких массивах и операциях с массивами?
Записан
calc4fem
Форумчанин
***
Offline Offline

Сообщений: 278


« Ответ #5: 23 Декабрь 2014, 01:47 »

У меня есть вопрос вдогонку, видимо очень простой, просто я наверно не могу сообразить
есть операция (во вложенном цикле)

If forces(i,1)=ii And forces(i,2)=j And forces(i,3)=k Then
присвоение
End If

Так вот она забирает массу времени на выполнение. Следующий аналогичный цикл без "And" выполняется за секунду.
Как уйти можно от этого?
Читаю http://myooo.ru/content/view/116/95/ и не могу понять. Похоже If требует много времени на обработку сам по себе
Думаю что если программисты в чате есть - могут посоветовать что то. Потому что ждать минуту или две каждый раз как то стремно.
Записан
bormant
Глобальный модератор
*
Offline Offline

Сообщений: 939



« Ответ #6: 23 Декабрь 2014, 08:29 »

Вы б лучше фрагменты вместе с источником задержки (циклами) показывали.
Записан

Автору на яд. Поддержать форум.
calc4fem
Форумчанин
***
Offline Offline

Сообщений: 278


« Ответ #7: 23 Декабрь 2014, 09:27 »

циклы типа
For i=1 To ...
 For ii=1 To ...
  For j=1 To ...
   For k=1 To ...

If .. Then
Присвоение значение элементам массива
End If

Next...
Next...
....

Ровно такой же цикл но без If - отрабатывается менее чем за секунду. С If-ом зависает минуты на полторы.
Но тут по смыслу сложно уйти от If, так что ничего не поделаешь. Вернее - можно, но надо писать более длинный код.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #8: 23 Декабрь 2014, 11:48 »

Ну, похоже, самая простая оптимизация этой конструкции - преобразование алгоритма "в лоб".
Суть сводится к изменению конструкции If...Then присвоение на конструкцию If...Then внутренний цикл. Просто сложное условие внутри If разваливается на три отдельных If'а и каждый из них выносится за пределы цикла, где эти переменные не меняются.
Что-то вроде
Код:
For i=1 To ...
 For ii=1 To ...
  If forces(i,1)=ii Then
   For j=1 To ...
    If forces(i,2)=j Then
     For k=1 To ...
      If forces(i,3)=k Then
       Присвоение значение элементам массива
      EndIf ' =k
     Next k
    EndIf ' =j
   Next j
  EndIf ' =ii
 Next ii
Next i
Это позволит пропустить (вообще не выполнять) циклы для индексов, которые не соответствуют условиям.
Следующий шаг оптимизации - перераспределение циклов по количеству итераций так, чтобы самые длинные циклы оказались глубже всего. Тогда за счет кучи последовательных проверок на верхних уровнях можно избавить машину от необходимости крутить большие ненужные циклы.
И дальше - следующие шаги, которые потребуют знания архитектуры машины и хорошей фантазии, чтобы почувствовать себя этой самой машиной.

Жаль, что ограничился строчкой "Присвоение значение элементам массива"... Вполне может быть, что там что-то вроде
Код:
a(ii, k, j) = 1
b(ii, k, j) = 1 - a(ii, k, j)
В таком случае легко отказаться и от трех внутренних циклов, и от If'ов
Код:
For i=1 To ...
 a(forces(i,1), forces(i,2), forces(i,3)) = 1
 b(forces(i,1), forces(i,2), forces(i,3)) = 1 - a(forces(i,1), forces(i,2), forces(i,3))
Next i
Выглядит громоздко, но делает то же самое....
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #9: 23 Декабрь 2014, 13:49 »

Вместо абстрактного теоретизирования, может быть, проверите все ваши гипотетические построения на конкретных примерах?
С секундомером в руке.
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #10: 23 Декабрь 2014, 14:00 »

Экий ты грубый - с секундомером... Третий линолеум на дворе! Компьютер и сам может замерить быстродействие любого алгоритма. А в некоторых инструментах - "профайлер" называется - даже отобразить расходы ресурсов на отдельные строки кода.
Насчет абстрактного теоретизирования - это не ко мне, это к Кнуту
И не "выкай"....
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Hasim
Форумчанин
***
Offline Offline

Сообщений: 754

Woe from wit


« Ответ #11: 23 Декабрь 2014, 14:10 »

Под "вы" я имел в виду не только тебя, JohnSUN, а всех, начиная с ТС, кто озаботился этой проблемой.
Я уж сто раз писал: выкладывайте конкретные примеры, чтобы не сидеть и думать: а что там у него такого понаписано, что ни хрена не работает?
Записан
RAN
Участник
**
Offline Offline

Расположение: Н. Новгород
Сообщений: 40

Мяв? Мяв!


« Ответ #12: 23 Декабрь 2014, 19:56 »

JohnSUN, тогда уж так
Код:
 For i = 1 To ...
        For ii = 1 To ...
            If forces(i, 1) = ii Then
                For j = 1 To ...
                    If forces(i, 2) = j Then
                        For k = 1 To ...
                            If forces(i, 3) = k Then
'                                Присвоение значение элементам массива
                                Exit For
                            End If    ' =k
                        Next k
                     End If    ' =j
                Next j
            End If    ' =ii
        Next ii
    Next i
« Последнее редактирование: 25 Декабрь 2014, 11:29 от RAN » Записан
dndn
Форумчанин
***
Offline Offline

Сообщений: 93


WWW
« Ответ #13: 23 Декабрь 2014, 21:27 »

Hasim
JohnSUN

Добрый вечер! А вы не могли бы помочь с ответом на этот вопрос:

http://forumooo.ru/index.php/topic,4272.msg28829.html#msg28829

Мне кажется почему-то кажется, вы его знаете.  Улыбка
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!