Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
Дмитрий97
Member [заблокирован]

Откуда:
Сообщений: 2
Когда я ввожу число значения массива в Eidt1 то элемент удаляется с этим значением, пытаюсь удалить следующий элемент. Массив создаётся заново и удаляется другой элемент массива. Вообщем сколько раз я бы не вводил, удаляется только один элемент. Как это можно исправить, чтобы при удалении, массив сохранялся с уже удалённым элементом и при повторе удалялся другой элемент, до тех пор пока массив не станет пустым. Основной код привязан к Button2.
+
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TArr = array of integer;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  n: Integer;
   TArr2: Array [1..2] of integer;
  A1: TArr;



implementation

{$R *.dfm}




procedure delElem( var A : TArr; elem: String );
var i,ii, h : Integer;

begin

 for ii:=1 to Length(A)-1 do
 begin
  if IntToStr(A[ii]) = elem then
  begin
     h := High(A);
     if elem = '' then Exit;
     if h = -1 then Exit;
     for i := ii to h - 1 do A[i] := A[i + 1];
     SetLength(A, h);
  end;
 end;


end;

procedure asdf(var A: TArr);
begin
  SetLength(A, 11);
  A[1]:=10;
  A[2]:=11;
  A[3]:=12;
  A[4]:=13;
  A[5]:=14;
  A[6]:=15;
  A[7]:=16;
  A[8]:=17;
  A[9]:=18;
  A[10]:=19;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Arr: TArr; i:Integer;
begin
  //Создаёт массив
  asdf(Arr);
  Memo1.Clear;
  for i:=1 to Length(Arr)-1 do
  begin
    Memo1.Lines.Append( IntToStr(Arr[i]) );
  end;
 
  
end;

procedure TForm1.Button2Click(Sender: TObject);
var Arr: TArr; i:Integer;
begin
  //Создаёт массив
   asdf(Arr);
  //Удадяет массив
  delElem( Arr, Edit1.Text );
  Memo2.Clear;
  for i:=1 to Length(Arr)-1 do
  begin
   Memo2.Lines.Append( IntToStr(Arr[i]) );
  end;
end;

end.


Сообщение было отредактировано: 26 мар 20, 20:19
26 мар 20, 19:50    [22106543]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
Дмитрий97
procedure delElem( var A : TArr; elem: String );
var i,ii, h : Integer;

begin

 for ii:=1 to Length(A)-1 do
 begin
  if IntToStr(A[ii]) = elem then
  begin
     h := High(A);
     if elem = '' then Exit;
     if h = -1 then Exit;
     for i := ii to h - 1 do A[i] := A[i + 1];
     SetLength(A, h);
  end;
 end;


end;

Я не совсем вник в "проблему", но тут вроде как явный косяк. Твой тип TArr - это динамический массив, он индексируется от нуля. Даже если ты в качестве параметра передашь массив, который индексируется иначе.
26 мар 20, 20:04    [22106546]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49543

Дмитрий97
Как это можно исправить

Именно для таких случаев придумали пошаговую отладку. Идёшь по коду и смотришь на значения
переменных пока они не начнут отличаться от тех, которые ты ожидаешь.

Posted via ActualForum NNTP Server 1.5

26 мар 20, 20:07    [22106549]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
Дмитрий97
procedure asdf(var A: TArr);
begin
  SetLength(A, 11);
  A[1]:=10;
  A[2]:=11;
  A[3]:=12;
  A[4]:=13;
  A[5]:=14;
  A[6]:=15;
  A[7]:=16;
  A[8]:=17;
  A[9]:=18;
  A[10]:=19;
end;

И тут, вроде, то же самое, ты про нулевой элемент забыл...
26 мар 20, 20:08    [22106550]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4564
Дмитрий97,
автор
h := High(A);
...
SetLength(A, h);

не вижу уменьшения массива. Просто часть массива перетирается, при этом последний элемент не меняется
26 мар 20, 21:33    [22106585]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
rgreat
Member

Откуда:
Сообщений: 5722
Gerasimenko
не вижу уменьшения массива. Просто часть массива перетирается, при этом последний элемент не меняется
Для тебя High и Length одно и то же? ;)
26 мар 20, 21:57    [22106588]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4564
rgreat,

нет, но у него именно эта проблема
26 мар 20, 21:59    [22106590]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4564
Gerasimenko
rgreat,

нет, но у него именно эта проблема

кстати, он еще и пересоздает массив перед удалением элемента

procedure TForm1.Button2Click(Sender: TObject);
var Arr: TArr; i:Integer;
begin
//Создаёт массив
asdf(Arr);
//Удадяет массив
delElem( Arr, Edit1.Text );
Memo2.Clear;
for i:=1 to Length(Arr)-1 do
begin
Memo2.Lines.Append( IntToStr(Arr[i]) );
end;
end;
26 мар 20, 22:13    [22106595]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
rgreat
Member

Откуда:
Сообщений: 5722
Gerasimenko
rgreat,

нет, но у него именно эта проблема


  var A := [1,2,3];
  var h := High(A);
  Writeln(length(A));
  SetLength(A, h);
  Writeln(length(A));
  Readln;


результат
3
2
26 мар 20, 22:40    [22106599]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4564
rgreat
Gerasimenko
rgreat,

нет, но у него именно эта проблема


  var A := [1,2,3];
  var h := High(A);
  Writeln(length(A));
  SetLength(A, h);
  Writeln(length(A));
  Readln;


результат
3
2

Да, в данном конкретном случае, я тупанул. Пересоздание массива у него.
26 мар 20, 22:47    [22106600]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
Дмитрий97
Member [заблокирован]

Откуда:
Сообщений: 2
В принципе я это и ожидал, что никто мне не поможет. Придут люди воздух потрясут, дадут “вумные” советы и разбегутся. Потому, что никто не знает.
автор
Я не совсем вник в "проблему", но тут вроде как явный косяк. Твой тип TArr - это динамический массив, он индексируется от нуля. Даже если ты в качестве параметра передашь массив, который индексируется иначе.

Если вы не поняли сути проблемы, хотя я максимально подробно объяснил что нужно удалять элементы массива через edit, пока массив не будет пустой. Тогда вряд ли вы знаете как удалять элементы массива.
автор
Именно для таких случаев придумали пошаговую отладку. Идёшь по коду и смотришь на значения
переменных пока они не начнут отличаться от тех, которые ты ожидаешь.

Ваша отладка нафиг никому не нужна меня интересует сам алгоритм, а не отладка кода, я ей пользуюсь только в том случае если серьёзная ошибка и код не запускается, а он работает криво но работает.

Сообщение было отредактировано: 26 мар 20, 23:18
26 мар 20, 23:14    [22106607]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 707
Дмитрий97
Ваша отладка нафиг никому не нужна меня интересует сам алгоритм, а не отладка кода, я ей пользуюсь только в том случае если серьёзная ошибка и код не запускается, а он работает криво но работает.


рукалицо.

Когда код не запускается - его не отлаживают, а исправляют.
А отладка - это как раз для случая криво работающего кода.
26 мар 20, 23:49    [22106612]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2267
Что это было? Эт чё, новая поросль программистов? В трех соснах плутают и отладкой брезгуют с апломбом? Нда...
27 мар 20, 00:04    [22106617]     Ответить | Цитировать Сообщить модератору
 Re: Как при вводе числа в Edit1, по очереди удалять элементы?  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6263
Дмитрий97,

Ты в Edit вводишь что? N элемента массива или элемент массива, который нужно удалить? Если элемент массива - могут ли быть в массиве дубли?

А так-то:

 Function SearchInArr(Arr:TDynamicArray; Searched: integer):integer;
 var i : integer;
 begin 
   Result:=-1;                           // ничего не нашли
   for i:=0 to Length(Arr)-1 do   // помним, что дин. массивы индексируются с 0
     begin
         if  (Arr[i] = Searched) then
             begin
                 Result:=i;
                 break;
             end;
     end;
  end;

 // ну пусть Arr - глобальная переменная
 Procedure DeleteItems;
 var Idx, j : integer;
 begin
  repeat
   Idx:=SearchInArr(Arr, IntToStr(Edit) );  // что ищем. Тут кстати уместнее IntToStrDef() или какой-то MaskEdit / SpinEdit для ввода...
   if (Idx>-1) then                                   // нашли?
     begin
       j:=0;
       for i:=0 to Idx-1 do
          begin
            Arr[j]:=Arr[i];
            inc(j);
          end;
       for i:=Idx+1 to Length(Arr)-1 do
          begin
            Arr[j]:=Arr[i];
            inc(j);
          end;    
       SetLength(Arr,Length(Arr)-1);        // удалили 1 элемент, сократили длину массива на 1.
     end;
  until Idx=-1;                                     // если ничего не нашли - значит не ничего не делаем
 end;


P.S. Писалось на коленке. Не проверялось. Так что отладчик может и пригодится :)
27 мар 20, 09:29    [22106699]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить