Показать сообщение отдельно
  #5  
Старый 09.06.2010, 00:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, у тебя тоже через массивы сделано

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

честно говоря лень писать код.
идея такова.
1. Идем по ячейкам и переносим все нечетные числа в другой грид, заменяя их пустой строкой.
2. Убираем все пустые строки из первого грида путем переноса заполненных ячеек вверх. Тут нетривиальный алгоритм.
3. Сортируем оба грида.

Код:
procedure MoveOdds(AGrid1, AGrid2 : TStringGrid);
var
  I, N : Integer;
begin
  AGrid2.RowCount := 0;
  For I := 0 To AGrid1.RowCount-1 Do
    Begin
       N := strToInt(AGrid1.Cells[0,I]);
       If Not (N mod 2 = 0) Then
          Begin
            AGrid2.RowCount := AGrid2.RowCount + 1;
            AGrid2.Cells[0,AGrid2.RowCount-1] := AGrid1.Cells[0,I];
            AGrid1.Cells[0,I] := '';
          End;
    End;
end;

procedure CompactGrid(AGrid : TStringGrid);
var
  I, Sh : Integer;
begin
  Sh := 0;
  For I := 0 To AGrid.RowCount-1 Do
    If AGrid.Cells[0,I] <> '' 
      Then AGrid.Cells[0,I] := AGrid.Cells[0,I+Sh]
      Else Inc(Sh);
end;

procedure SordGrid(AGrid : TStringGrid);
var
  I, J : Integer;
  Buf : String;
begin
  For I := 0 To AGrid.RowCount-2 Do
    For J := I + 1 To AGrid.RowCount-1 Do
       If StrToInt(AGrid.Cells[0,I]) > StrToInt(AGrid.Cells[0,J]) Then
         Begin
            Buf := AGrid.Cells[0,I];
            AGrid.Cells[0,I] := AGrid.Cells[0,J];
            AGrid.Cells[0,J] := Buf;
         End;
end;

procedure ProcessGrids(AGrid1, AGrid2 : TStringGrid);
begin
   MoveOdds(AGrid1, AGrid2);
   CompactGrid(AGrid1);
   SordGrid(AGrid1);
   SordGrid(AGrid2);
end;
Ответить с цитированием