![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() картинка во вложении
|
#7
|
|||
|
|||
![]() Ну дык переделай - мой код ориентирован на вертикальный столбец. Перепиши на горизонтальный (собственно colcount вместо Rowcount и поменять местами координаты при обращении к Cell). я не собираюсь за тебя все делать.
|