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

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

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

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

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

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

Друзья , нужна помощь. Я создал процедуру создания динмаического массива CreateMas. Она нормально работает. Теперь нужно создать процедуру вставки элемента в динамический массив. А вот с этим проблемы (. Спасибо тем, кто поможет. Привожу весь код:
Код:
implementation
type
Areal=array of integer;
  var  a:Areal ;
  N,i:integer;
{$R *.dfm}

  procedure CreateMas(Memo1:Tmemo);
begin
SetLength(A,N);
for I:=0 to N-1 do
 begin
  A[i]:=i+1;
  Memo1.Lines.Add(IntToStr(A[i]));
 end;
end;
procedure Ainsert (var A:Areal;R:integer; Ind:integer;Memo2:Tmemo);
begin
         N:=Length(A);
          SetLength(A, N+1);
     for i:=N-1 downto Ind do
         A[i+1]:=A[i];
     A[ind]:=R;
          for I:=0 to N-1 do
        Memo2.Lines.Add(IntToStr(A[i]));
          end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
  n:=StrToInt(Edit1.Text);
CreateMas(Memo1);
Ainsert(A,StrToInt(Edit2.Text),StrToInt(Edit3.Text), Memo2);

  end;

end.
___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 24.03.2011 в 13:27.
Beren42 вне форума Ответить с цитированием
Старый 24.03.2011, 13:39   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) крайне не рекомендую смешивать формальные параметры и глобальные!
(например, в CreateMas вы передаёте Memo1 - но зато во всю исполльзуете сам массив A и переменную N

2) у Вас в процедуре Ainsert N не изменяется!
попробуйте так:
Код:
procedure Ainsert (var A:Areal;R:integer; Ind:integer;Memo2:Tmemo);
begin
    N:=Length(A) + 1;
    SetLength(A, N);
....
p.s. не стал исправлять передачу N (она используется как глобальная переменная), но это в сущности, не очень правильно и красиво! рекомендую переделать.

И ещё, совет на будущее, описывайте все переменные ПОСЛЕ описания процедур, перед главным begin программы.
Тогда при попытке использовать переменную как глобальную - компилятор выдаст ошибку и Вы сможете описать передачу нужной переменной в качестве параметра.
И второе, в этих же целях рекомендую по разному называть формальные параметры и фактические. Ну, например, не procedure Ainsert (var A:Areal ...
а procedure Ainsert (var AMas:Areal
это опять таки позволит избежать невольного использования глобальных переменных.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.03.2011, 13:54   #3
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Ну особенного криминала не вижу в вашем коде. Есть конечно стилистически не очень хорошие моменты. Но в целом должно всё работать. В чём конкретно у вас проблемма?

Единственное замечание при вывод в Memo2 вы теряете последний элемент.

Нужно написать либо
Код:
          ...
          for I:=0 to N do
            Memo2.Lines.Add(IntToStr(A[i]));
          end;
          ...
либо
Код:
          ...
          N := Length(A);
          for I:=0 to N-1 do
            Memo2.Lines.Add(IntToStr(A[i]));
          end;
          ...

Ну а вот в целом немного стиль подправил
Код:
implementation
type
Areal=array of integer;
  var  a:Areal ;
{$R *.dfm}

procedure CreateMas(var A:Areal;integer N);
var I:Integer;
begin
  SetLength(A,N);
  for I:=0 to N-1 do
  begin
    A[i]:=i+1;
    Memo1.Lines.Add(IntToStr(A[i]));
   end;
end;
procedure ShowMas(var A:Areal;Memo:TMemo);
var N:Integer;
     I:Integer;
Begin
  N := Length(A);
  for I:=0 to N-1 do
  begin
    Memo.Lines.Add(IntToStr(A[i]));
  end;
End;
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 do
    A[i+1]:=A[i];
  A[ind]:=R;
end;

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),StrToInt(Edit3.Text));

  Memo2.Clear();
  ShowMas(A,Memo2);  
end;

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

А почему передача N неправильно и некрасиво ?
Beren42 вне форума Ответить с цитированием
Старый 24.03.2011, 14:42   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А почему передача N неправильно и некрасиво ?
потому что передачи N в вашем случае НЕ происходит! Вы используете ГЛОБАЛЬНУЮ переменную.
Вот, ознакомтесь внимательно с примером кода, который привёл val_nnm
Там этой проблемы с использованием глобальных переменных нет!

единственное замечание к его коду - это надо убрать вывод в Memo1 в процедуре CreateMas

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

С этим понятно. А зачем тогда в CreateMas Memo1.Lines.Add(IntToStr(A[i])); ? . Если по сути тоже самое в ShowMas ?
Beren42 вне форума Ответить с цитированием
Старый 24.03.2011, 14:55   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Beren42 Посмотреть сообщение
С этим понятно. А зачем тогда в CreateMas Memo1.Lines.Add(IntToStr(A[i])); ? . Если по сути тоже самое в ShowMas ?
А вот тут я с Вами согласен.
Думаю. что val_nnm это просто пропустил.
Эту строчку надо удалить из процедуры CreateMas
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.03.2011, 14:59   #8
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию

Но не вставляется . При n=5, R=23, Ind=4.
Memo1
1
2
3
4
5
Это правильно.
Но Memo2
1
1
1
1
23
1
Совсем не то
Beren42 вне форума Ответить с цитированием
Старый 24.03.2011, 15:02   #9
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию

Ложная тревога ). Это я не то написал. Извините. Всем спасибо
Beren42 вне форума Ответить с цитированием
Старый 24.03.2011, 15:13   #10
Beren42
Пользователь
 
Регистрация: 14.12.2010
Сообщений: 50
По умолчанию

И крайний вопрос ). Индекс вставки -это куда в Memo2 поставить новый элемент ? При n=5, r=44,ind=1. Как я понимаю на первое место поставить 44 . Так ?. А он
Memo1
1
2
3
4
5
Memo2
1
44
2
3
4
5
То есть на второе место . Но ведь это неправильно ?
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