Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622

Операции с массивами. Может кому пригодится

26.05.2017, 14:55. Показов 854. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Недавно была тут темка - вот невеяло. Код не претендует на гениальность, но для базовой реализации вполне ничего:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
function TextToArray(Text: String): TVarArray;
begin
 SetLength(Result, 0);
 while Pos(' ', Text) > 0
 do begin
    SetLength(Result, Length(Result) + 1);
    Result[High(Result)] := Copy(Text, 1, Pos(' ', Text)-1);
    Text := Copy(Text, Pos(' ', Text)+1, Length(Text));
    end;
 if Text <> ''
 then begin
      SetLength(Result, Length(Result) + 1);
      Result[High(Result)] := Copy(Text, 1, Pos(' ', Text)-1);
      end;
end;
 
function VarIndex(Value: Variant; const AVar: array of Variant): Integer;
var i: Integer;
begin
 Result := -1;
 for i := 0 to Length(AVar) - 1
 do if AVar[i] = Value
    then begin
         Result := i;
         Break;
         end;
end;
 
function ArrCompare(const AVar1, AVar2: array of Variant; Operation: TArrayOperation): TVarArray;
var i: Integer;
begin
 SetLength(Result, 0);
 case Operation of
   aoIntersection:
    for i := 0 to Length(AVar1) - 1
    do if VarIndex(AVar1[i], AVar2) <> -1
       then begin
            SetLength(Result, Length(Result) + 1);
            Result[High(Result)] := AVar1[i];
            end;
   aoUnion:
    begin
    for i := 0 to Length(AVar1) - 1
    do if VarIndex(AVar1[i], Result) = -1
       then begin
            SetLength(Result, Length(Result) + 1);
            Result[High(Result)] := AVar1[i];
            end;
    for i := 0 to Length(AVar2) - 1
    do if VarIndex(AVar2[i], Result) = -1
       then begin
            SetLength(Result, Length(Result) + 1);
            Result[High(Result)] := AVar2[i];
            end;
    end;
   aoDifference:
    begin
    for i := 0 to Length(AVar1) - 1
    do if VarIndex(AVar1[i], AVar2) = -1
       then begin
            SetLength(Result, Length(Result) + 1);
            Result[High(Result)] := AVar1[i];
            end;
    for i := 0 to Length(AVar2) - 1
    do if VarIndex(AVar2[i], AVar1) = -1
       then begin
            SetLength(Result, Length(Result) + 1);
            Result[High(Result)] := AVar2[i];
            end;
    end;
 end;
end;
Использование:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var
  AVar: TVarArray;
  i: Integer;
  AList1,AList2: TVarArray;
begin
 AList1 := TextToArray('красный оранжевый желтый зеленый голубой синий фиолетовый');
 AList2 := TextToArray('красный желтый зеленый');
 
 Memo1.Text := 'Операции с массивами слов'#13#10;
 Memo1.Lines.Add(#13#10'Пересечение');
 AVar := ArrCompare(AList1, AList2, aoIntersection);
 for i := 0 to Length(AVar) - 1 do Memo1.Text := Memo1.Text + VarToStr(AVar[i]) + ' ';
 Memo1.Lines.Add(#13#10'Объединение'#13#10);
 AVar := ArrCompare(AList1, AList2, aoUnion);
 for i := 0 to Length(AVar) - 1 do Memo1.Text := Memo1.Text + VarToStr(AVar[i]) + ' ';
 Memo1.Lines.Add(#13#10'Разность'#13#10);
 AVar := ArrCompare(AList1, AList2, aoDifference);
 for i := 0 to Length(AVar) - 1 do Memo1.Text := Memo1.Text + VarToStr(AVar[i]) + ' ';
 
 Memo1.Lines.Add(#13#10'Операции с массивами чисел'#13#10);
 Memo1.Lines.Add(#13#10'Пересечение');
 AVar := ArrCompare([1,2,3,4,5,6], [10,2,7,8,9,0], aoIntersection);
 for i := 0 to Length(AVar) - 1 do Memo1.Text := Memo1.Text + VarToStr(AVar[i]) + ' ';
 Memo1.Lines.Add(#13#10'Объединение'#13#10);
 AVar := ArrCompare([1,2,3,4,5,6], [10,2,7,8,9,0], aoUnion);
 for i := 0 to Length(AVar) - 1 do Memo1.Text := Memo1.Text + VarToStr(AVar[i]) + ' ';
 Memo1.Lines.Add(#13#10'Разность'#13#10);
 AVar := ArrCompare([1,2,3,4,5,6], [10,2,7,8,9,0], aoDifference);
 for i := 0 to Length(AVar) - 1 do Memo1.Text := Memo1.Text + VarToStr(AVar[i]) + ' ';
end;
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.05.2017, 14:55
Ответы с готовыми решениями:

Может, кому-то пригодится
Есть сайт - порядка 120 страниц по сути статичного HTML. До некоторого времени все страницы лежали в корне, т.е. структура УРЛов сайта была...

Программа вывода рамки! Может кому пригодится.
Программа выводит рамку, по размеру окна а дальше стрелками можно динамически изменять её размер! D_SEG SEGMENT WORD PUBLIC 'DATA' ...

Файловый менеджер в консоли (может кому пригодится исходник)
Может у кого то случалась необходимость открыть файл под консольную программу? Предлагаю исходники (написанные под Dev-C++ 4.9.9.2)....

11
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
26.05.2017, 21:00
функция TextToArray... хорошая функция, но в ней жестко задан символ-разделитель. а если у меня будут слова, разделенные чертой, запятой или еще каким-нибудь из сотни символов? нет гибкости. добавить параметр "разделитель" в параметры функции. к тому же, я могу захотеть разделить такую строку
желтое солнце зеленый лист синее море
на части по два слова. что тогда? )

Добавлено через 9 минут
вообще непонятно использование TVarArray для работы со строками!
тип имеет структуру записи и ни разу не массив!
Pascal
1
2
3
4
5
6
7
8
TVarArray = packed record
  DimCount: Word;
  Flags: Word;
  ElementSize: Integer;
  LockCount: Integer;
  Data: Pointer;
  Bounds: TVarArrayBoundArray;
end;
http://docs.embarcadero.com/pr... Array.html

как ты ему длину-то назначаешь?
в новых версиях есть тип TStringDynArray, являющийся массивом строк. подходит для данной функции. хотя мне он не нравится

Добавлено через 3 минуты
Цитата Сообщение от Пытливый Посмотреть сообщение
Код не претендует на гениальность
в общем, кошмар. не обессудь. лично против тебя ничего не имею
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
26.05.2017, 21:37  [ТС]
У меня TVarArray = array of Variant;
Его описание я че-то забыл кинуть - мой косяк. Совпадение названия с уже существующим случайно вышло.
Конечно много еще чего можно придумать, я потому и назвал данный пример базовым - ваяйте если есть желание.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.05.2017, 00:10
а зачем строки пихать в вариантный массив? все равно там окажутся строки, так какой резон?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
27.05.2017, 03:10  [ТС]
А вот если не строки, а числа? Я примерчик внизу специально для строк и чисел привел.
0
27.05.2017, 06:04

Не по теме:

Эх, вот только кто ее увидит, тему эту, даже если в шапку вытащить: ннешние студни поиском не пользуются - не царское это дело

0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
27.05.2017, 10:48  [ТС]
Ну как минимум 3 человека уже эту темку видели и возможно кому-то ссылочку на нее скинут. Сарафанное радио - лучше рекламы на ТНТ.
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
27.05.2017, 21:57
Оценил, хорошая тема
As for practice, не уверен, что всё проканает.. Хотя бы уже потому, что Variant не всегда удобен. Например, проверка на тривиальность - как проверять будете: на пустоту строки или на нулевое значение?
Но задумка очень понравилась. Не будете в суд вызывать, если воспользуюсь идеей?
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
27.05.2017, 22:02
Цитата Сообщение от Пытливый Посмотреть сообщение
А вот если не строки, а числа?
Цитата Сообщение от Пытливый Посмотреть сообщение
function TextToArray(Text: String): TVarArray;
какие числа? на входе строка. или у меня зрение плохое, не пойму

Не по теме:

Цитата Сообщение от D1973 Посмотреть сообщение
Эх, вот только кто ее увидит, тему эту
вот и хорошо, что не увидят )

0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
27.05.2017, 22:21
Прошу простить, я лопухнулся Показалось, что Вы совместно используете TextToArray и ArrCompare
Цитата Сообщение от DenNik Посмотреть сообщение
какие числа? на входе строка. или у меня зрение плохое, не пойму
Нет, я имел ввиду именно ArrCompare. Там чтобы проверить на пустоту строки, придётся её конвертировать в Str из Var.
И почему эта функция TVarArray ? Для чего она?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
27.05.2017, 23:04  [ТС]
Явно что-то плохое. Смотрите в нижней части кода:
Delphi
1
AVar := ArrCompare([1,2,3,4,5,6], [10,2,7,8,9,0], aoDifference);
Добавлено через 37 минут
Надо добавить к описанию еще это:
Delphi
1
2
3
Type
  TVarArray = array of Variant;
  TArrayOperation = (aoIntersection,aoUnion,aoDifference);
как-то неудачно я опубликовал функцию без типов.

Вообще там основная функция ArrCompare()
Функция как понятно из описания работает с парой вариантных массивов на входе, т.е передавать в нее можно массив из всего что поддерживает вариант:
Delphi
1
2
3
4
[1,2,3,4,5,6]
[Now, Now+1,StrToDate('01.01.2017')]
['Привет','с','большого','Бодуна']
['Раз','два','три','четыре','пять','вышел','зайчик','погулять']
Но не всегда удобно строки передавать в таком виде, вот для этого была сделана функцию TextToArray()
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
29.05.2017, 09:35
Цитата Сообщение от Пытливый Посмотреть сообщение
Надо добавить к описанию еще это:
НЕ НАДО это делать в текущем виде! нужно переименовать тип во избежание конфликтов. я тебе уже приводил описание этого типа от Делфи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2017, 09:35
Помогаю со студенческими работами здесь

Кому-нибудь пригодится (напишите функцию, которая отображает у левого края экрана строку из x звездочек...)
1. Напишите функцию f(int x), которая отображает у левого края экрана строку из x звездочек. 2. Напишите функцию sq(int rows, int cols),...

Восходящий интерполяционный многочлен Ньютона. Может пригодится
В результате выполнения лабы по вычмату создалась такая прога. смотрю на форуме много незаконченных. Может пригодится кому. #include...

Задание с собеса. Может кому интересно
Определите ошибку в приведенном коде.

Компьютер не может ни к кому зайти в сетевом окружении
Раньше всё нормально было, но сейчас странности появились. Комп 1 (проблемный) он может всех пинговать, в удаленный доступ на сервер...

Может кому понадобиться Выключение/перезагрузки компа и завершение сеанса
Копался в windows.h искал чего нибудь интересного вот и нашел.... Вообщем функция для выключения перезагрузки и завершения сеанса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru