Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.06.2010, 23:45
west.by west.by вне форума
Прохожий
 
Регистрация: 07.06.2010
Сообщения: 6
Репутация: 10
По умолчанию Особая сортировка нечетных чисел в стрингриде

Просто вручную или рандомно вводятся числа. по клику(если вручную вводим) нечетные числа должны быстренько свалить в стрингрид 2 , но в первом четные должны дружнеько без пробелов восстановиться

обязательно использовать два стрингрида!(((((
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    BitBtn1: TBitBtn;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  n,k,i:Integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
n:=3;
Edit1.Text:=IntToStr(n);
StringGrid1.ColCount:=n;
StringGrid2.ColCount:=n;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=StrToInt(Edit1.Text);
StringGrid1.ColCount:=n;
StringGrid2.ColCount:=n;

end;

procedure TForm1.Button2Click(Sender: TObject);
Var a,b : Array of Char;  	//преобразование массива
k,i : Integer;
begin
    SetLength(a,n);
  SetLength(b,n);            //и результирующий b массивы
  For k:=0 to n-1 Do         //считывание значений массива а
  a[k]:=StringGrid1.Cells[k,0][1]; //из StringGrid1
  i:=0;
  For k:=0 To n-1 do
     if a[k] in ['0'..'9'] Then Begin
b[i]:=a[k]; 	
Inc(i);
 End;
  For k:=0 To n-1 Do
     if Not(a[k] in ['0'..'9']) Then Begin  // тут сортирую нечетных
      if a[k] mod 2 <> 0 then k:= k+1;
 b[i]:=a[k];
 Inc(i);
 End;
  For k:=0 To n-1 Do         //вывод массива b в StringGrid2
     StringGrid2.Cells[k,0]:=b[k];
   a:=Nil;  b:=Nil;  		   //освобождение памяти
end;



procedure TForm1.Button3Click(Sender: TObject);
begin
if StringGrid1.Cells[0,0]='' then
for i:=0 to n do
StringGrid1.Cells[i,0]:=inttostr(random(100));

end;

end.
Вложения
Тип файла: rar лвс.rar (3.8 Кбайт, 0 просмотров)
Ответить с цитированием
  #2  
Старый 08.06.2010, 02:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тебе надо именно только в StringGrid'e, или можно в них вывести только результат? Если можно обойтись результатом, то можно так:

Код:
procedure SortArray(var A : Array Of Integer);
var
  I, J : Integer;
  Buf : Integer;
begin
  For I := Low(A) To High(A)-1 Do
    For J := I +1 To High(A) Do
      If A[i] > A[J] Then
        Begin
          Buf := A[i];
          A[i] := A[J];
          A[J] := Buf;
        end;
end;

procedure FillGrid(AGrid : TStringGrid; A : Array Of Integer);
var
  I : Integer;
begin
  AGrid.RowCount := Length(A);
  For I := 0 To AGrid.RowCount-1 Do
    AGrid.Cells[0,I] := IntToStr(A[i]);
end;

procedure ProcessNumbers(AGrid1, AGrid2 : TStringGrid);
var
  I, N : Integer;
  A, B : Array Of Integer;
begin
  SetLength(A,0);
  SetLength(B,0);
  For I := 0 To AGrid1.RowCount-1 Do
    Begin
      N := StrToInt(AGrid1.Cells[0,I]);
      If (N Mod 2) = 0
        Then
          Begin
            SetLength(A,Length(A)+1);
            A[High(A)] := N;
          End
        Else
          Begin
            SetLength(B,Length(B)+1);
            B[High(B)] := N;
          End;
    End;

  SortArray(A);
  SortArray(B);

  FillGrid(AGrid1,A);
  FillGrid(AGrid2,B);
end;
Ответить с цитированием
  #3  
Старый 08.06.2010, 23:10
west.by west.by вне форума
Прохожий
 
Регистрация: 07.06.2010
Сообщения: 6
Репутация: 10
По умолчанию

нужно только стрингриде....это главное условие(
Ответить с цитированием
  #4  
Старый 08.06.2010, 23:49
west.by west.by вне форума
Прохожий
 
Регистрация: 07.06.2010
Сообщения: 6
Репутация: 10
По умолчанию

ищу помощь господа
Ответить с цитированием
  #5  
Старый 09.06.2010, 00:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия 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;
Ответить с цитированием
  #6  
Старый 09.06.2010, 01:43
west.by west.by вне форума
Прохожий
 
Регистрация: 07.06.2010
Сообщения: 6
Репутация: 10
По умолчанию

картинка во вложении
Изображения
Тип файла: jpg мроипро.jpg (55.1 Кбайт, 6 просмотров)
Ответить с цитированием
  #7  
Старый 09.06.2010, 02:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну дык переделай - мой код ориентирован на вертикальный столбец. Перепиши на горизонтальный (собственно colcount вместо Rowcount и поменять местами координаты при обращении к Cell). я не собираюсь за тебя все делать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025