Вывести на экран числа этой строки в порядке возрастания их значений

FujiFilm

Задание: Дана строка символов, состоящая из произвольных десятичных чисел, разделенных пробелами. Вывести на экран числа этой строки в порядке возрастания их значений.Мой код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Char(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Char(Sender: TObject; var Key: Char);
var
 s,sl:string;
 a:array of integer;
 i,j,n,k,c,z:integer;
BEGIN
 s:=edit1.text;
 k:=0;
 n:=length(s);
 if n=0 then exit;
 s:=s+' ';
 sl:='';
 n:=n+1;
 for i:=1 to n do
 begin if s[i] <> ' ' then sl:=sl+s[i]
  else begin
  if sl<>'' then begin
   inc(k);
  a[k]:=strtoint(s);
  for z:=2 to k do
 for j:=k downto z do
 if a[j-1]>a[j] then
 begin
  c:=a[j];
  a[j]:=a[j-1];
  a[j-1]:=c;
 end;
 end;
 for z:=1 to k do
  s:=s+inttostr(a[z])+' ';
  end;
  if Key = #13 then Edit2.Text:=s;
 end;

END;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Clear;  Edit2.Clear;
end;

end.
при троссировке ошибка возникает на a[k]:=strtoint(s); но что тут не так - не пойму...Подскажите, пожалуйста...
3 ответа

FujiFilm

Доброго времени суток. Надеюсь Вас устроит мой вариант решения Вашей проблемы, т.к. разбираться в коде нет настроения.
function ParseText(const InputText: string): string;
var
  I, J: Integer;
  CurrentInteger: string;
  IntArray: array of Integer;
  Buffer: Integer;
begin
  Result := '';
  IntArray := nil;
  CurrentInteger := '';
  for I := 1 to Length(InputText) do
  begin
    if (InputText[I] <> ' ') then
      CurrentInteger := CurrentInteger + InputText[I]
    else
    begin
      if CurrentInteger <> '' then
      begin
        SetLength(IntArray, Length(IntArray) + 1);
        IntArray[High(IntArray)] := StrToInt(CurrentInteger);
        CurrentInteger := '';
      end;
    end;
  end;
 
  if CurrentInteger <> '' then
  begin
    SetLength(IntArray, Length(IntArray) + 1);
    IntArray[High(IntArray)] := StrToInt(CurrentInteger);
  end;
 
  for I := 0 to High(IntArray) do
    for J := 0 to High(IntArray) - 1 do
    begin
      if IntArray[J] > IntArray[J + 1] then
      begin
        Buffer := IntArray[J];
        IntArray[J] := IntArray[J + 1];
        IntArray[J + 1] := Buffer;
      end;
    end;
 
  for I := 0 to High(IntArray) do
    Result := Result + IntToStr(IntArray[I]) + ' ';  
end;
Если будут вопросы, пишите...Тест функции может быть такой
 ShowMessage(ParseText('-1 -223    150 33 32 34 0'));


FujiFilm

Чёрный Медведь, спасибо огромное, все понятно, кроме одного момента вот здесь
IntArray[High(IntArray)] := StrToInt(CurrentInteger);
почему мы делаем именно индекс High(IntArray)? что он нам дает?а все, кажется, поняла только почему мы присваеваем StrToInt(CurrentInteger) именно последнему элементу массива?


FujiFilm

Потому, что заполняем динамический массив
SetLength(IntArray, Length(IntArray) + 1); // увеличиваем длину массива
IntArray[High(IntArray)] := StrToInt(CurrentInteger); // присваиваем новому элементу значение
... сортировка пузырьком по возрастанию