Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2012, 07:19   #1
Suny-o
Пользователь
 
Аватар для Suny-o
 
Регистрация: 03.03.2012
Сообщений: 33
По умолчанию Процедуры добавления, удаления строки из динамического массива строк

Код:
//Тип dinarr - динамический массив строк, без него создание процедур delElem, addElem невозможно

//Примечание: обрабатываемый массив также должен иметь тип dinarr

Type
dinarr=array of string;

procedure delElem( var a:dinarr; index:integer);
var last,n:integer;
begin
 last:=length(a);
 For n:=index to (last-1) do
 begin
 a[n]:=a[n+1];
 end;
setlength(a,(last-1));
end;

procedure addElem( var a:dinarr; index: integer; anew:string);
var len,n:integer;
begin
 len:=length(a)+1;
setlength(a,len);
 for n := (len-1) downto index do
 begin
 a[n+1]:=a[n];
 end;
 a[index]:=anew;
end;


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.
QuickSortStr04.rar работа с динамическими 1D,2Dмассивами строк
* быстрая сортировка по любому алфавиту, добавление, удаление элементов.
* чтение, запись(файл<-->дин. массив)

Последний раз редактировалось Suny-o; 04.07.2012 в 03:28.
Suny-o вне форума Ответить с цитированием
Старый 03.07.2012, 07:41   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Да удаление у Вас будет очень медленным. И чем больше строк, тем медленней. И нет проверки индексов. Что если будет индекс -1? Вылет проги обеспечен. Если это внутренние процедуры, то по барабану. Если юнит будет использоваться сторонними людьми, такая проверка ИМХО должна быть.
Кстати, а в чем вопрос-то?

И еще мне уже неудобно, но приходится почти в каждом посте навяливать TStringList. Если это не учебное задание, пользуйте класс, где все Ваши фишки уже давно готовы. А если учебное, то можно просто глянуть как TStringList устроен...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 03.07.2012, 08:05   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Utkin, согласен ПОЛНОСТЬЮ!

и плюс 900000 за TStringList
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.07.2012, 05:15   #4
Suny-o
Пользователь
 
Аватар для Suny-o
 
Регистрация: 03.03.2012
Сообщений: 33
По умолчанию

Код:
//Тип dinarr, dinarr2 - одномерный и двухмерный динамический массив строк, без них создание процедур delElem, delElem2, addElem, addElem2 невозможно
//Примечание: обрабатываемый массив также должен иметь тип dinarr или dinarr2
Type
dinarr=array of string;
dinarr2=array of array of string;

//Процедура удаления в одномерном массиве с проверкой индексов
procedure delElem( var a:dinarr; index:integer);
var last,n:integer;
begin
   last:=length(a);
   if (index<0) or (index>(last-1)) then ShowMessage('Удаление элемента с индексом '+inttostr(index)+' (индексы от 0 до '+inttostr(last-1)+') невозможно')
   else
   begin
    For n:=index to (last-1) do
    begin
      a[n]:=a[n+1];
    end;
    setlength(a,(last-1));
   end;
end;

//Процедуры удаления в 2x мерном массиве с проверкой индексов
//Удаляется индекс (index)
procedure delElem2( var a:dinarr2; mainindex, index:integer);
var last,n:integer;
begin
   last:=length(a[mainindex]);
   if (index<0) or (index>(last-1)) then ShowMessage('Удаление элемента с индексом '+inttostr(index)+' (индексы от 0 до '+inttostr(last-1)+') невозможно')
   else
   begin
    For n:=index to (last-1) do
    begin
      a[mainindex,n]:=a[mainindex,n+1];
    end;
    setlength(a[mainindex],(last-1));
   end;
end;

//Процедура добавления в одномерном массиве с проверкой индексов
procedure addElem( var a:dinarr; index: integer;  anew:string);
var len,n:integer;
begin
   len:=length(a);
   if (index<0) or (index>len) then ShowMessage('Добавление элемента с индексом '+inttostr(index)+' (индексы от 0 до '+inttostr(len)+') невозможно')
   else
   begin
    if index<len then
    begin
     len:=length(a)+1;
     setlength(a,len);
     for n := (len-1) downto index do
     begin
      a[n]:=a[n-1];
     end;
     a[index]:=anew;
    end
    else if index=len then
    begin
     len:=length(a)+1;
     setlength(a,len);
     a[index]:=anew;
     end;
   end;
end;

//Процедура добавления в 2x мерном массиве с проверкой индексов
//Добавляется индекс (index)
procedure addElem2( var a:dinarr2; mainindex, index: integer;  anew:string);
var len,n:integer;
begin
   len:=length(a[mainindex]);
   if (index<0) or (index>len) then ShowMessage('Добавление элемента с индексом '+inttostr(index)+' (индексы от 0 до '+inttostr(len)+') невозможно')
   else
   begin
    if index<len then
    begin
     len:=length(a[mainindex])+1;
     setlength(a[mainindex],len);
     for n := (len-1) downto index do
     begin
      a[mainindex,n]:=a[mainindex,n-1];
     end;
     a[mainindex,index]:=anew;
    end
    else if index=len then
    begin
     len:=length(a[mainindex])+1;
     setlength(a[mainindex],len);
     a[mainindex,index]:=anew;
    end;
   end;
end;
Нашел ошибку - правильный код выделен синим, добавил проверку индексов
QuickSortStr04.rar работа с динамическими 1D,2Dмассивами строк
* быстрая сортировка по любому алфавиту, добавление, удаление элементов.
* чтение, запись(файл<-->дин. массив)

Последний раз редактировалось Suny-o; 05.07.2012 в 08:17. Причина: Нашел ошибку, добавил проверку индексов
Suny-o вне форума Ответить с цитированием
Старый 05.07.2012, 12:09   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Единственное замечание - вывод диагностических сообщений в случае ошибки я бы сделал в отдельных функциях. Разделяйте интерфейс и основную логику программы. Ну это я так на будущее придираюсь . А так мало ли - завтра скажут пиши ошибки на форме, а не отдельным окошком. Или запихни логи работы в файл.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 07.07.2012, 04:42   #6
Suny-o
Пользователь
 
Аватар для Suny-o
 
Регистрация: 03.03.2012
Сообщений: 33
По умолчанию

Код:
//Тип dinarr, dinarr2 - одномерный и двухмерный динамический массив строк, без них создание процедур delElem, delElem2, addElem, addElem2 невозможно
//Примечание: обрабатываемый массив также должен иметь тип dinarr или dinarr2
Type
dinarr=array of string;
dinarr2=array of array of string;

//Процедура удаления в одномерном массиве с проверкой индексов
procedure delElem( var a:dinarr; index:integer);
var last,n:integer;
begin
   last:=length(a);
   if (index<0) or (index>(last-1)) then ShowMessage('Удаление элемента с индексом '+inttostr(index)+' (индексы от 0 до '+inttostr(last-1)+') невозможно')
   else
   begin
    For n:=index to (last-1) do
    begin
      a[n]:=a[n+1];
    end;
    setlength(a,(last-1));
   end;
end;

//Процедуры удаления в 2x мерном массиве с проверкой индексов
//Удаляется индекс (index)
procedure delElem2( var a:dinarr2; mainindex, index:integer);
var last,n:integer;
begin
   last:=length(a[mainindex]);
   if (index<0) or (index>(last-1)) then ShowMessage('Удаление элемента с индексом '+inttostr(index)+' (индексы от 0 до '+inttostr(last-1)+') невозможно')
   else
   begin
    For n:=index to (last-1) do
    begin
      a[mainindex,n]:=a[mainindex,n+1];
    end;
    setlength(a[mainindex],(last-1));
   end;
end;

//Процедура добавления в одномерном массиве с проверкой индексов
procedure addElem( var a:dinarr; index: integer;  anew:string);
var len,n:integer;
begin
   len:=length(a);
   if (index<0) or (index>len) then ShowMessage('Добавление элемента с индексом '+inttostr(index)+' (индексы от 0 до '+inttostr(len)+') невозможно')
   else
   begin
    if index<len then
    begin
     len:=length(a)+1;
     setlength(a,len);
     for n := (len-1) downto (index+1) do
     begin
      a[n]:=a[n-1];
     end;
     a[index]:=anew;
    end
    else if index=len then
    begin
     len:=length(a)+1;
     setlength(a,len);
     a[index]:=anew;
     end;
   end;
end;

//Процедура добавления в 2x мерном массиве с проверкой индексов
//Добавляется индекс (index)
procedure addElem2( var a:dinarr2; mainindex, index: integer;  anew:string);
var len,n:integer;
begin
   len:=length(a[mainindex]);
   if (index<0) or (index>len) then ShowMessage('Добавление элемента с индексом '+inttostr(index)+' (индексы от 0 до '+inttostr(len)+') невозможно')
   else
   begin
    if index<len then
    begin
     len:=length(a[mainindex])+1;
     setlength(a[mainindex],len);
     for n := (len-1) downto (index+1) do
     begin
      a[mainindex,n]:=a[mainindex,n-1];
     end;
     a[mainindex,index]:=anew;
    end
    else if index=len then
    begin
     len:=length(a[mainindex])+1;
     setlength(a[mainindex],len);
     a[mainindex,index]:=anew;
    end;
   end;
end;
Нашел ошибку - правильный код выделен синим (процедуры addElem и addElem2 выдавали ошибку если index=0)
QuickSortStr04.rar работа с динамическими 1D,2Dмассивами строк
* быстрая сортировка по любому алфавиту, добавление, удаление элементов.
* чтение, запись(файл<-->дин. массив)
Suny-o вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос добавления\удаления людей в табель madex Microsoft Office Excel 5 31.03.2011 18:20
операции над стеком в С - добавления и удаления следующего элемента стека Matadora Помощь студентам 0 04.09.2010 21:16
обработчики добавления и удаления в дерево (TreeView) kayman Компоненты Delphi 10 08.03.2010 11:17
Удаление строки из двумерного динамического массива hidraulik Общие вопросы C/C++ 0 08.12.2009 10:48
процедуры переворотов, добавления, удаления элемента.. для AVL дерева smalsvoloch Помощь студентам 0 03.12.2009 20:28