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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 15:43   #11
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Динамические массивы нумеруються с 0. И как мне кажеться логичнее здесь нумеровать элементы от 0 тоже. Но это вопрос исключительно договорённости.

Но если нужно именно чтобы индекс интерпретировался от 1 то напишите
Код:
procedure Ainsert (var A:Areal;R:integer; Ind:integer);
var N:Integer;
     I:Integer;
begin
  N:=Length(A);
  SetLength(A, N+1);
  for i:=N-1 downto Ind-1 do
    A[i+1]:=A[i];
  A[ind-1]:=R;
end;

либо можно в процедуре интерпретировать индекс от нуля а в графическом интерфейсе от 1.
тогда процедуру Ainsert не меняйте. А напишите в коде обработке нажатия на кнопку

Код:
...
  Ainsert(A,StrToInt(Edit2.Text),StrToInt(Edit3.Text)-1);
...
Второй вариант мне кажеться более правильным.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."

Последний раз редактировалось val_nnm; 24.03.2011 в 15:59.
val_nnm вне форума Ответить с цитированием
Старый 24.03.2011, 16:53   #12
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию

Спасибо большое
Beren42 вне форума Ответить с цитированием
Старый 24.03.2011, 17:06   #13
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию

А теперь я хочу удалить элемент по индексу. Мне хотелось бы сделать его самим ). Я хочу, чтобы Вы меня направили в нужном направлении. То есть надо создать Memo3. В нём будет массив CreateMas после удаления элемента. Намекните, пожалуйста, что нужно поменять в коде
##
procedure Del(var A:Areal; x:integer);
var N:Integer;
I:Integer;
begin
N:=Length(A);
SetLength(A, N-1);
for i:=0 to N-1 do
Finalize (A[x]);
end;
Beren42 вне форума Ответить с цитированием
Старый 24.03.2011, 17:24   #14
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Ну начнём. Для удаления элемента нужно свинуть все элементы которые находяться после удаляемого элемента на 1 позицию назад. Чтобы они закрыли удаляемый элемент собой. (Т.к. функция SetLength добавляет или удаляет элементы только в конце массива. ) И затем изменить Размер результирующего массива на 1.

Здесь N:=Length(A); вы делаете правильно. Строку SetLength(A, N-1); переместите в самый конец.

А вот сдвиуть элементы нужно следующим образом.
A[X] := A[X+1];
A[X+1] := A[X+2];
A[X+2] := A[X+3];
...
A[N-1] := A[N];


для этого нужен цикл.
Есть несколько вариантов как именно организавать такой цикл.
Всё они в общем одинаковые. Ну например сделайте цикл от X до N-1. (можно сделать и от X+1 до N но это уже дело вкуса). Ну и в цикле в зависимости от выбранного вами варианта напишите соответсвующее уравнение для переноса значение из одной ячейки массива в другую.

В общем это в словах чтобы вы сами разобрались. Если у вас не получиться. Я тогда напишу вам готовый код.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 24.03.2011, 17:49   #15
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию

Чего-то не хватает ... (
procedure Del(var A:Areal; x:integer);
var N:Integer;
I:Integer;
begin
N:=Length(A);
for x:=1 to N-1 do

A[i-1]:= A[i];
SetLength(A, N-1);
Beren42 вне форума Ответить с цитированием
Старый 24.03.2011, 17:52   #16
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию

Немного подумав
begin
N:=Length(A);
for i:=x to N-1 do
A[i-1]:= A[i];
SetLength(A, N-1);
end;
Beren42 вне форума Ответить с цитированием
Старый 24.03.2011, 18:26   #17
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Меленькое уточнение.

Если мы индекс считаем с 1 тогда вы совершенно правильно написали
Код:
begin
  N:=Length(A);
  for i:=x to N-1 do
    A[i-1]:= A[i];
  SetLength(A, N-1);
end;
А если индекс считать с 0 тогда
Код:
begin
  N:=Length(A);
  for i:=x to N-2 do
    A[i]:= A[i+1];
  SetLength(A, N-1);
end;
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 24.03.2011, 20:37   #18
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию

Спасибо огромное
Beren42 вне форума Ответить с цитированием
Старый 26.03.2011, 13:20   #19
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию

А как сделать, чтобы процедура Del удаляла элемент исходного массива , а не после вставки элемента. В такой последовательности так происходит
Код
#
procedure TForm1.Button1Click(Sender: TObject);
var
N:integer;
begin
N:=StrToInt(Edit1.Text);
CreateMas(A,N);
Memo1.Clear();
ShowMas(A,Memo1);
Ainsert(A,StrToInt(Edit2.Text),StrT oInt(Edit3.Text)-1);
Memo2.Clear();
ShowMas(A,Memo2);
Del(A,StrToInt(Edit4.Text));
Memo3.Clear ;
ShowMas(A,Memo3);



end;
Beren42 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22
динамический стек. удаление элемента alex(21) Помощь студентам 2 01.11.2010 20:22
Процедура нахождения мах элемента. Другая Помощь студентам 5 11.05.2010 20:03
Динамический массив Zhanna5006 Помощь студентам 7 10.01.2010 14:09