|
|
Регистрация | << Правила форума >> | 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. |