![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Исходные данные находятся в таблице1 типа TStringGrid, под которой располагаются обработчики Сохранить, Загрузить и Очистить. Результаты отображаются в таблице2 типа TStringGrid, под которой так же располагаются обработчики Сохранить, Загрузить и Очистить.
Сведения об автомобиле состоят из его марки, номерного знака, фамилии владельца и даты проведения технического осмотра. Дан массив регистрации, содержащий сведения о нескольких автомобилях. Cоздать массив сведений о количестве автомобилей каждой марки. |
|
#2
|
|||
|
|||
|
Ой, ну это-то можно было и самому сделать.
Не оптимальный, но простой способ: 1. Пробегаемся по массиву регистрации и собираем список марок. 2. Второй шаг. Внешний цикл по списку марок, внутрений - по массиву регистраций. При совпадении занчения марки в обоих массивах/списках увеличиваем соотв. счетчик 3. Выводим результат. Да, не оптимально, но понятно что делать. Вот тут чуть более сложный, но более быстрый способ: Код:
type
TRegistrationInfo = record
MakerName : String;
LicPlate : String;
OwnerName : String;
InspectionDate : String; // Для простоты просто как строка
end;
TMakerInfo = record
Name : String;
Count : Integer;
end;
var
Src : Array Of TRegistrationInfo; // Это наши исходные данные в виде массива
procedure TForm1.Button1Click(Sender : TObject);
var
MkrSum : Array Of TMAkerInfo;
I, Idx : Integer;
function GetIdx(S : String; A : Array Of TMakerInfo) : Integer;
var
I : Integer;
begin
Result := -1;
For I := Low(A) To High(A) Do
If A[i].Name = S Then
Begin
Result := I;
Break;
End;
end;
begin
SetLength(MkrSum,0);
For I := Low(Src) To High(Src) Do
Begin
Idx := GetIdx(Src[i].MakerName,MkrSum);
If Idx = -1
Then
Begin
SetLength(MkrSum,Length(MkrSum)+1);
MkrSum[High(MkrSum)].Name := Src[i].MakerName;
MkrSum[High(MkrSum)].Count := 1;
End
Else
Begin
MkrSum[Idx].Count := MkrSum[Idx],Count + 1;
End;
End;
// Теперь собранную информацию выводим в грид
// Предполагаем, что грид настроен, заголовок существует и в гриде 2 столбца
StringGrid2.RowCount := Length(MrkSum) + 1; // +1 - на заголовок
For I := Low(MkrSum) To High(MkrSum) Do
Begin
StringGrid2.Cells[0,I+1] := MkrSum[i].Name;
StringGrid2.Cells[1,I+1] := IntToStr(MkrSum[i].Count);
End;
end;PS. Можно при сборе информации "бежать" прямо по гриду (StringGrid1), но это будет чуть медленнее (на больших данных), т.к. при этом коду придется "разрешать" 2 ссылки, а по массиву идет прямая адресация. Последний раз редактировалось lmikle, 31.05.2022 в 23:38. |