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

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

20 Октябрь 2017, 13:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Сообщений: 8


« Стартовое сообщение: 14 Декабрь 2013, 07:16 »

Собственно вот как удалить определенный элемент из массива, например, одномерного?
Записан
calc4fem
Старожил
****
Offline Offline

Сообщений: 276


« Ответ #1: 16 Декабрь 2013, 20:24 »

присвоить ему другое значение ?
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #2: 17 Декабрь 2013, 13:52 »

Существует несколько алгоритмов для решения этой задачи.
1. "Затратный" - перезапись нужных (оставшихся) значений в новый массив меньшего размера с последующим переприсвоением старому массиву нового значения (указателя на новый массив). Такой способ использован, например, в процедуре RemoveListboxItemByName (модуль Listbox стандартной библиотеки макросов Tools)
2. "Долгий" - перезапись в цикле оставшихся элементов массива ("хвоста") на новое место и после этого переопределение размера массива (ReDim Preserve)
3. "Продвинутый" ("Заумный") - сразу отказаться от использования массива и создавать списки или деревья значений. Алгоритмы исключения элементов для этих случаев хорошо расписаны, например, у Н.Вирта в "Алгоритмы + структуры данных = программы"
Записан

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

Сообщений: 8


« Ответ #3: 27 Декабрь 2013, 13:43 »

Код:
Sub arrayTest
Dim i as Date
Dim n as Integer
Dim arr()

countDates=0

for i="02.09.2013" to "07.09.2013"
 redim preserve arr(countDates) 'так как календарный период изначально не известен, размер приходится переопределять
 arr(countDates)=i
 countDates=countDates+1
next

for n=LBound(arr) to UBound(arr)
 Select Case arr(n)
  Case "03.09.2013"
   print "праздник 3 сентября"
  Case "06.09.2013"
   print "праздник 6 сентября"
 End Select
next
End Sub

Т.е. в такой ситуации (нужно удалить определенные даты из списка, праздничные дни) можно воспользоваться "долгим" способом? Как можно переписать?
« Последнее редактирование: 27 Декабрь 2013, 13:45 от gnus » Записан
gnus
Новичок
*
Offline Offline

Сообщений: 8


« Ответ #4: 27 Декабрь 2013, 14:00 »

и еще, если не затруднит, может продемонстрируете пример создания списка (синтаксис)?
Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

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


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


WWW
« Ответ #5: 27 Декабрь 2013, 14:57 »

Можно так:
Код:
Sub arrayTest
Dim i as Date
Dim n as Integer
Dim ind as Integer
Dim cntEl as Integer
Dim arr()
Dim excludeDates
countDates=0

for i="02.09.2013" to "07.09.2013"
redim preserve arr(countDates) 'так как календарный период изначально не известен, размер приходится переопределять
arr(countDates)=i
countDates=countDates+1
next i

excludeDates = Array(CDate("03.09.2013"), CDate("06.09.2013"))

cntEl = UBound(arr)
for n=LBound(arr) to cntEl
REM Можно было оставить Select Case, но праздников может быть много
REM С массивом в этом случае работать проще
ind = IndexOf(excludeDates, arr(n))
if ind>-1 Then
RemoveItem(arr, n)
cntEl = cntEl - 1 ' Массив стал меньше, значит и цикл будет короче
EndIf
next n
End Sub

REM Функция фозвращает индекс (положение в одномерном массиве
REM sourceArr) первого встреченного элемента,
REM значение которого совпадает с Item, или -1 есле его нет
Function IndexOf(sourceArr, Item)
Dim MaxIndex as Integer
Dim i as Integer
IndexOf() = -1 ' Уверены в неудаче - элемент не будет найден
MaxIndex = Ubound(sourceArr())
For i = 0 To MaxIndex
If Item = sourceArr(i) Then
IndexOf() = i ' Нашли совпадение
Exit Function
End If
Next i
End Function

REM Процедура удаляет из массива sourceArr
REM элемент с индексом index
Sub RemoveItem(sourceArr, index%)
Dim i%, l%
l = UBound(sourceArr)-1
For i = index To l
sourceArr(i)=sourceArr(i+1)
Next i
ReDim Preserve sourceArr(l)
End Sub
и еще, если не затруднит, может продемонстрируете пример создания списка (синтаксис)?
Давай уже в следующем году, ладно? Там не сложно, но нужно внимательно выписывать все эти присвоения-переприсвоения... А времени сейчас, сам понимаешь, не особо
Записан

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

Сообщений: 8


« Ответ #6: 27 Декабрь 2013, 15:32 »

Ловко у тебя получается). Буду изучать. С Новым годом.
Записан
VlhOwn
Ветеран
*****
Offline Offline

Пол: Мужской
Расположение: Ростов-на-Дону
Сообщений: 1 076


« Ответ #7: 28 Декабрь 2013, 02:48 »

ИМХО, не нужно изобретать велосипед - используйте не Basic, а Python, и все динамические структуры данных (списки, кортежи, словари) будут в вашем распоряжении. Трудозатраты на изучение Python с лихвой покроются необходимостью моделировать динамику на Basic.
Записан
gnus
Новичок
*
Offline Offline

Сообщений: 8


« Ответ #8: 28 Декабрь 2013, 09:34 »

Это, кстати, идея. Python еще не пробовал. Но у меня в libreoffice при открытии Макросы python кнопка Создать не активна. Похоже, что python не до конца прикрутили к офису. Его придется писать в другой среде, это не очень удобно, хочется использовать кнопочки всякие, чекбоксы, выпадающие списки в документах офиса...  Вас тоже с наступающим)
« Последнее редактирование: 28 Декабрь 2013, 10:23 от gnus » Записан
Hasim
Ветеран
*****
Offline Offline

Сообщений: 754


Woe from wit


« Ответ #9: 28 Декабрь 2013, 11:39 »

А надо ли удалять?
Есть подозрение, что нужно просто указать, какие дни в году рабочие, какие выходные, а какие праздничные?
Обсуждается метод решения неизвестно какой изначально задачи.
Записан
gnus
Новичок
*
Offline Offline

Сообщений: 8


« Ответ #10: 5 Январь 2014, 16:52 »

Ну, удалять, наверное, необязательно. Просто в дальнейшем нужно будет взять рабочие дни и вставить в таблицу (они еще кстати по дням недели будут фильтроваться).
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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