Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.05.2022, 20:02
NeField NeField вне форума
Прохожий
 
Регистрация: 24.05.2022
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
Злость Создать массив сведений о количестве автомобилей каждой марки

Исходные данные находятся в таблице1 типа TStringGrid, под которой располагаются обработчики Сохранить, Загрузить и Очистить. Результаты отображаются в таблице2 типа TStringGrid, под которой так же располагаются обработчики Сохранить, Загрузить и Очистить.

Сведения об автомобиле состоят из его марки, номерного знака, фамилии владельца и даты проведения технического осмотра. Дан массив регистрации, содержащий сведения о нескольких автомобилях. Cоздать массив сведений о количестве автомобилей каждой марки.
Ответить с цитированием
  #2  
Старый 31.05.2022, 23:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ой, ну это-то можно было и самому сделать.
Не оптимальный, но простой способ:
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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter