![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Просто вручную или рандомно вводятся числа. по клику(если вручную вводим) нечетные числа должны быстренько свалить в стрингрид 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. |
|
#2
|
|||
|
|||
|
Тебе надо именно только в 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
|
|||
|
|||
|
нужно только стрингриде....это главное условие(
|
|
#4
|
|||
|
|||
|
ищу помощь господа
|
|
#5
|
|||
|
|||
|
Ну, у тебя тоже через массивы сделано
![]() На самом деле это не принципиально. просто придется на каждом шаге производить конвертацию в числовой формат, да чистить стринг лист подругому. честно говоря лень писать код. идея такова. 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
|
|||
|
|||
|
картинка во вложении
|