![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.66.24] |
![]() |
|
Сообщ.
#1
,
|
|
|
Допустим второй элемент 4 как посчитать количество 4 и вывести в Grid четвертый элемент массива “4444”?
Пример массив: ![]() ![]() var Form1: TForm1; a: array[1..10,1..4] of integer = ((1, 1, 4234,1111), (1, 4, 5423,4444), (1, 3, 6532,3333), (1, 5, 8865,5555), (1, 4, 3456,4444), (1, 3, 7898,3333), (1, 4, 5643,4444), (1, 5, 7542,5555), (1, 3, 7532,3333), (1, 4, 3456,4444)); Если в массиве во втором элемента отсутствует цифра 4, то ничего не выводить. Другими словами сравнить все элементы второго значения узнать, где 4(если их количество больше 0) вывести один раз значение “4444” в StringGrid. Пример: ![]() ![]() unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TForm1 = class(TForm) StringGrid1: TStringGrid; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a: array[1..10,1..4] of integer = ((1, 1, 4234,1111), (1, 4, 5423,4444), (1, 3, 6532,3333), (1, 5, 8865,5555), (1, 4, 3456,4444), (1, 3, 7898,3333), (1, 4, 5643,4444), (1, 5, 7542,5555), (1, 3, 7532,3333), (1, 4, 3456,4444)); implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var i,t:Integer; begin StringGrid1.RowCount:=Length(a); t:=1; for i:=1 to Length(a) do if a[i][2] = 4 then begin //ShowMessage(IntToStr(t)); StringGrid1.Cells[1,t]:=IntToStr(a[i][3]); inc(t); end; end; end. |
Сообщ.
#2
,
|
|
|
Ну ваш пример же уже почти все решает.
![]() ![]() unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TForm1 = class(TForm) StringGrid1: TStringGrid; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a: array[1..10,1..4] of integer = ((1, 1, 4234,1111), (1, 4, 5423,4444), (1, 3, 6532,3333), (1, 5, 8865,5555), (1, 4, 3456,4444), (1, 3, 7898,3333), (1, 4, 5643,4444), (1, 5, 7542,5555), (1, 3, 7532,3333), (1, 4, 3456,4444)); implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var i,j,k,t:Integer; begin StringGrid1.RowCount:=Length(a); t:=0; j:=Low(a)-1; // Начальное значение индекса k:=Low(a)-1; // Начальное значение индекса for i:=1 to Length(a) do if a[i][2] = 4 then begin //ShowMessage(IntToStr(t)); // StringGrid1.Cells[1,t]:=IntToStr(a[i][3]); // Для сохранения первого индекса совпавшего с условием if j < Low(a) then j := i; // Для сохранения последнего индекса совпавшего с условием k := i; inc(t); end; if t > 0 then begin // Дальше можете оставить одну из этих строк // Почему вы добавляете 3 индекс, хотя сами же просили в условии 4-ый? StringGrid1.Cells[1,0]:=IntToStr(a[j][4]); // Значение первого совпавшего с условием элемента StringGrid1.Cells[2,0]:=IntToStr(a[k][4]); // Значение последнего совпавшего с условием элемента end; end; end. |
Сообщ.
#3
,
|
|
|
А как интересно нулевой элемент учитывать в отборе? Я немного изменила массив.
![]() ![]() a: array[1..10,1..4] of integer = ((1, 1, 4234,1111), (1, 4, 5423,4444), (1, 3, 6532,3333), (1, 5, 8865,5555), (2, 4, 3456,4444), (1, 3, 7898,3333), (3, 4, 5643,4444), (1, 5, 7542,5555), (7, 4, 7532,4444), (1, 4, 3456,4444)); При этом подчитывая количество, если больше “0” выводя списком? 1 – 4444 2 – 4444 3 – 4444 7 – 4444. Где первый идентификатор размещается в колонку 1, а второй в колонку 2 StrginGrid. |
Сообщ.
#4
,
|
|
|
Цитата Katerina1993 @ А как интересно нулевой элемент учитывать в отборе? Так t это не индекс, а количество. При этом j и k это индексы в массиве. Цитата Katerina1993 @ При этом подчитывая количество, если больше “0” выводя списком? Тогда надо либо два цикла, либо надо записать все индексы совпавших элементов в другой массив. ![]() ![]() unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TForm1 = class(TForm) StringGrid1: TStringGrid; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a: array[1..10,1..4] of integer = ((1, 1, 4234,1111), (1, 4, 5423,4444), (1, 3, 6532,3333), (1, 5, 8865,5555), (1, 4, 3456,4444), (1, 3, 7898,3333), (1, 4, 5643,4444), (1, 5, 7542,5555), (1, 3, 7532,3333), (1, 4, 3456,4444)); implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var i,j,k,t:Integer; b: array of Integer; // Массив с индексами элементов begin StringGrid1.RowCount:=Length(a); t:=0; j:=Low(a)-1; // Начальное значение индекса k:=Low(a)-1; // Начальное значение индекса SetLength(b, Length(a)); for i:=1 to Length(a) do if a[i][2] = 4 then begin //ShowMessage(IntToStr(t)); // StringGrid1.Cells[1,t]:=IntToStr(a[i][3]); // Для сохранения первого индекса совпавшего с условием if j < Low(a) then j := i; // Для сохранения последнего индекса совпавшего с условием k := i; // Сохраняем в массив индексы всех совпавших элементов b[t] := i; inc(t); end; if t > 0 then begin // Дальше можете оставить одну из этих строк // Почему вы добавляете 3 индекс, хотя сами же просили в условии 4-ый? StringGrid1.Cells[1,0]:=IntToStr(a[j][4]); // Значение первого совпавшего с условием элемента StringGrid1.Cells[2,0]:=IntToStr(a[k][4]); // Значение последнего совпавшего с условием элемента for i := Low(b) to High(b) do // Цикл вывода элементов из массива индексов StringGrid1.Cells[i,3] := IntToStr(a[b[i]][4]); for i := 1 to Length(a) do // Цикл повторного поиска совпадений if a[i][2] = 4 then StringGrid1.Cells[i,4]:=IntToStr(a[i][4]); end; end; end. |
Сообщ.
#5
,
|
|
|
Нулевой элемент также следует учитывать как и 1 элемент - 4. Например у меня несколько разных элементов, есть и 2 и 3 и 7 все они входят в номер 4. Соответственно нужно посчитать и если записей больше 0 вывести список.
Вот например массив. ![]() ![]() a: array[1..10,1..4] of integer = ((1, 1, 4234,1111), (1, 4, 5423,4444), (1, 3, 6532,3333), (1, 5, 8865,5555), (2, 4, 3456,4444), (1, 3, 7898,3333), (3, 4, 5643,4444), (1, 5, 7542,5555), (7, 4, 7532,4444), (1, 4, 3456,4444)); А вот результат: Прикреплённый файл ![]() Это я подразумевала в сообщении выше. |
Сообщ.
#6
,
|
|
|
![]() ![]() unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TForm1 = class(TForm) StringGrid1: TStringGrid; procedure FormShow(Sender: TObject); private procedure FirstOption(); procedure SecondOption(); procedure ThirdOption(); public { Public declarations } end; var Form1: TForm1; a: array[1..10,1..4] of integer = ((1, 1, 4234,1111), (1, 4, 5423,4444), (1, 3, 6532,3333), (1, 5, 8865,5555), (2, 4, 3456,4444), (1, 3, 7898,3333), (3, 4, 5643,4444), (1, 5, 7542,5555), (7, 4, 7532,4444), (1, 4, 3456,4444)); implementation {$R *.dfm} function postincrement(var a: Integer): Integer; inline; begin Result := a; inc(a); end; procedure TForm1.FirstOption(); // Вариант с дополнительным массивом индексов (удобен, если надо обращаться к результатам несколько раз) var i,t:Integer; b: array of Integer; begin t:=0; SetLength(b, Length(a)); StringGrid1.RowCount:=Length(a); for i:=Low(a) to High(a) do if a[i][2] = 4 then b[postincrement(t)] := i; if t > 0 then for i := Low(b) to t + Low(b) - 1 do begin StringGrid1.Cells[1,i + 1 - Low(b)] := IntToStr(a[b[i]][1]); StringGrid1.Cells[2,i + 1 - Low(b)] := IntToStr(a[b[i]][4]); end; end; procedure TForm1.SecondOption(); // Вариант повторным просмотром (удобен при однократном решении) var i,t:Integer; begin t:=0; SetLength(b, Length(a)); StringGrid1.RowCount:=Length(a); for i:=Low(a) to High(a) do if a[i][2] = 4 then inc(t); if t > 0 then begin t := 1; for i := Low(a) to High(a) do if a[i][2] = 4 then begin StringGrid1.Cells[1,t] := IntToStr(a[b[i]][1]); StringGrid1.Cells[2,t] := IntToStr(a[b[i]][4]); inc(t); end; end; end; procedure TForm1.ThirdOption(); // Вариант вывода произвольного набора элементов (так же удобен при однократном решении, но позволяет дополнительно выбрать произвольный набор полей) const b: array [0 .. 1] of Integer = (1, 4); var i,j,t:Integer; begin t:=0; SetLength(b, Length(a)); StringGrid1.RowCount:=Length(a); for i:=Low(a) to High(a) do if a[i][2] = 4 then inc(t); if t > 0 then begin j := 1; for i := Low(a) to High(a) do if a[i][2] = 4 then begin for t := Low(b) to High(b) do StringGrid1.Cells[t + 1 - Low(b),j] := IntToStr(a[i][b[t]]); inc(j); end; end; end; procedure TForm1.FormShow(Sender: TObject); begin // Каждая из них делает то что показано на картинке FirstOption(); // SecondOption(); // ThirdOption(); end; end. |
Сообщ.
#7
,
|
|
|
Только сейчас я стала понимать что мне нужно, поэтому буду дальше думать.
|