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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2017, 11:41   #1
Chikiton
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 14
По умолчанию Сортировка массива пузырьком

Здравствуйте, задача отсортировать массив методом пузырька в формах делфи.
Возникает ошибка
вот код :
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
j,i,k:integer;
a:array of integer;
begin
setlength(a,10);
for i := 1 to length(edit1.Text) do
begin
if (Edit1.Text[i] = ' ') then continue;
a[i]:= strtoint(Edit1.Text[i]);
end;
k:=0;
for i := 1 to (High(a[i])-1) do
    for j := 2 to High(a[i]) do
      if a[j] > a[j + 1] then begin
        k := a[j];
        a[j] := a[j + 1];
        a[j + 1] := k;
      end;

  for i := 1 to High(a[i]) do

edit2.text := inttostr(a[i])+' ';

end;
end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор



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

во-первых, динамические массивы (как у Вас) индексируются от нуля.

во-вторых, не нужно писать High(a[i]) - используйте High(a)

в-третьих,
Цитата:
Код:
for i := 1 to length(edit1.Text) do
begin if (Edit1.Text[i] = ' ') then continue;
   a[i]:= strtoint(Edit1.Text[i]);
end;
а что это за ужас?

во-четвёртых,
в цикле по J от 2 до High() чему будет равно J+1 в выделенной строчке?!

Последний раз редактировалось Serge_Bliznykov; 22.03.2017 в 11:48.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2017, 11:47   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
High(a)
p51x вне форума Ответить с цитированием
Старый 22.03.2017, 15:29   #4
Chikiton
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, динамические массивы (как у Вас) индексируются от нуля.

во-вторых, не нужно писать High(a[i]) - используйте High(a)

в-третьих,а что это за ужас?

во-четвёртых,
в цикле по J от 2 до High() чему будет равно J+1 в выделенной строчке?!
про третье, это попытка перевода строчки из edit в массив целых чисел для дальнейших операций, подскажите как это сделать, если так неправильно
Chikiton вне форума Ответить с цитированием
Старый 22.03.2017, 15:59   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Chikiton Посмотреть сообщение
ро третье, это попытка перевода строчки из edit в массив целых чисел для дальнейших операций
Вы, на мой взгляд, выбрали не совсем подходящий компонент (лучше уж TStringGrid или TMemo было взять),
но, если бы у меня стояла задача разобрать строчку с целыми числами,
то я бы использовал такой код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  TS : TStringList;
  i, n : integer;
  A : array of Integer;
begin

    TS := TStringList.Create;
    TS.Delimiter := ' ';
    TS.DelimitedText := Trim(Edit1.Text); // в Edit1.Text = ' 123   45      78 -3 0'
    n := TS.Count;
    SetLength(A, n);
    for i :=0 to TS.Count-1 do
      A[i] := StrToInt(TS[i]);
    FreeAndNil(TS);

    // это для отладки - вывести массив в Memo1
    //    Memo1.Lines.Clear;
    // for i:= 0 to n - 1 do Memo1.Lines.Append(IntToStr(A[i]));
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2017, 18:07   #6
Chikiton
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Вы, на мой взгляд, выбрали не совсем подходящий компонент (лучше уж TStringGrid или TMemo было взять),
но, если бы у меня стояла задача разобрать строчку с целыми числами,
то я бы использовал такой код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  TS : TStringList;
  i, n : integer;
  A : array of Integer;
begin

    TS := TStringList.Create;
    TS.Delimiter := ' ';
    TS.DelimitedText := Trim(Edit1.Text); // в Edit1.Text = ' 123   45      78 -3 0'
    n := TS.Count;
    SetLength(A, n);
    for i :=0 to TS.Count-1 do
      A[i] := StrToInt(TS[i]);
    FreeAndNil(TS);

    // это для отладки - вывести массив в Memo1
    //    Memo1.Lines.Clear;
    // for i:= 0 to n - 1 do Memo1.Lines.Append(IntToStr(A[i]));


Код:
begin
 TS := TStringList.Create;
    TS.Delimiter := ' ';
    TS.DelimitedText := Trim(Edit1.Text);
    n := TS.Count;
    SetLength(A, n);
    for i :=0 to TS.Count-1 do
      A[i] := StrToInt(TS[i]);
k:=0;
for i := 0 to (High(a)-1) do
    for j := i to High(a) do
      if a[j] > a[j + 1] then begin
        k := a[j];
        a[j] := a[j + 1];
        a[j + 1] := k;
      end;

for i:= 0 to high(a)  do begin

 st :=st+IntToStr(a[i])+' ';
  end;

  edit2.Text:=st;
end;
end.

Сделал так , теперь работает, но не каждый раз , думаю дело в сортировке, что поменять?
Chikiton вне форума Ответить с цитированием
Старый 22.03.2017, 23:14   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а если так сортировку записать?

Код:
for i := 0 to n-2 do
    for j := i+1 to n-1 do
      if a[i] > a[j] then begin
        k := a[i];
        a[i] := a[j];
        a[j] := k;
      end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2017, 23:40   #8
Chikiton
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а если так сортировку записать?

Код:
for i := 0 to n-2 do
    for j := i+1 to n-1 do
      if a[i] > a[j] then begin
        k := a[i];
        a[i] := a[j];
        a[j] := k;
      end;
работает, спасибо!
Chikiton вне форума Ответить с цитированием
Старый 24.03.2017, 23:36   #9
Chikiton
Пользователь
 
Регистрация: 20.10.2016
Сообщений: 14
По умолчанию

Все бы хорошо, но попросили
Код:
TS := TStringList.Create;
    TS.Delimiter := ' ';
    TS.DelimitedText := Trim(Edit1.Text);
    n := TS.Count;
    SetLength(A, n);
    for i :=0 to TS.Count-1 do
      A[i] := StrToInt(TS[i]);
сделать без стринглиста, т.е написать перевод строчного массива в массив целых чисел, я пытаюсь у меня выдается ошибка, вот код перевода
Код:
edit2.Text := '';
  st := edit1.Text;
   while st[1] = ' ' do
        delete(st,1,1);
   while st[length(st)] = ' ' do
        delete(st,length(st),1);

  for i := 1 to length(st) do
    begin
      if (st[i] = ' ')and(st[i+1] = ' ')  then
         repeat
           delete(st,i,1)
         until st[i+1]<>' ';
    end;
  j := 0;
  for i := 1 to length(st) do
    if st[i] = ' ' then inc(j);

  k:=1;
  st1:='';
  setlength(a,j+2);
  st := st+' ';
  for i := 1 to j+1 do
    begin
      while st[k]<>' ' do
        begin
          st1 := st1 + st[k];
          inc(k);
        end;
      inc(k);
      a[i] := strtoint(st1);
      st1:='';
    end;
Chikiton вне форума Ответить с цитированием
Старый 25.03.2017, 01:28   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от Chikiton Посмотреть сообщение
for i := 1 to length(st) do begin if (st[i] = ' ')and(st[i+1] = ' ') then repeat delete(st,i,1) until st[i+1]<>' '; end
Удаление элементов массива (коим и является строка) нельзя производить в прямом цикле for..do!
Можно только в обратном цикле for..downto или в циклах while, repeat.
northener вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка пузырьком строк массива apraxie Помощь студентам 6 05.11.2011 23:09
Сортировка массива пузырьком.АССЕМБЛЕР. RDK1 Помощь студентам 0 30.05.2011 16:01
Сортировка пузырьком Авторитет Общие вопросы .NET 4 15.11.2010 19:50
Сортировка массива выбором и пузырьком (делфи) kira_truelove Помощь студентам 1 05.12.2009 14:00