Загрузка данных


program ParkingApp;

{$mode objfpc}{$H+}
{$codepage UTF-8}

uses
  {$ifdef unix}cwstring,{$endif}
  SysUtils,
  Parking;

function ReadInteger(const APrompt: string): Integer;
var
  S: string;
begin
  repeat
    Write(APrompt);
    ReadLn(S);
    if not TryStrToInt(S, Result) then
      WriteLn(Format('Ошибка: "%s" — не число. Попробуйте ещё раз.', [S]));
  until TryStrToInt(S, Result);
end;

var
  ParkingLot: TParkingLot;
  InitialCapacity: Integer;
  MenuChoice: Integer;
  License: string;
  SpotNum: Integer;

begin
  InitialCapacity := ReadInteger('Вместимость парковки: ');
  WriteLn; // Пустая строка по примеру вывода Stepik
  
  ParkingLot := TParkingLot.Create(InitialCapacity);
  
  try
    WriteLn(Format('=== Парковка (%d места) ===', [ParkingLot.Capacity]));
    WriteLn('1. Припарковать машину (автоматически)');
    WriteLn('2. Припарковать на конкретное место');
    WriteLn('3. Выехать');
    WriteLn('4. Найти машину');
    WriteLn('5. Переставить машину');
    WriteLn('6. Показать статус парковки');
    WriteLn('0. Выход');
    WriteLn;

    repeat
      MenuChoice := ReadInteger('> ');
      
      try
        case MenuChoice of
          1: 
            begin
              Write('Номер машины: ');
              ReadLn(License);
              SpotNum := ParkingLot.Park(License);
              WriteLn(Format('Машина припаркована на место %d.', [SpotNum]));
            end;
          2:
            begin
              Write('Номер машины: ');
              ReadLn(License);
              SpotNum := ReadInteger('Номер места: ');
              ParkingLot.ParkAtSpot(SpotNum, License);
              WriteLn(Format('Машина припаркована на место %d.', [SpotNum]));
            end;
          3:
            begin
              Write('Номер машины: ');
              ReadLn(License);
              SpotNum := ParkingLot.FindCar(License); 
              ParkingLot.Leave(License);
              WriteLn(Format('Место %d освобождено.', [SpotNum]));
            end;
          4:
            begin
              Write('Номер машины: ');
              ReadLn(License);
              SpotNum := ParkingLot.FindCar(License);
              WriteLn(Format('Машина %s найдена на месте %d.', [License, SpotNum]));
            end;
          5:
            begin
              Write('Номер машины: ');
              ReadLn(License);
              SpotNum := ReadInteger('Новое место: ');
              ParkingLot.MoveCar(License, SpotNum);
              // Операция атомарна. На выходе тишина, если успех — как в примере ТЗ.
            end;
          6:
            begin
              ParkingLot.PrintStatus;
            end;
          0: WriteLn('До свидания!');
        end;
        
      except
        on E: EParkingError do
          WriteLn('Ошибка: ', E.Message, '.');
      end;
      
      if MenuChoice <> 0 then
        WriteLn; // Разделительный перенос строки между итерациями меню

    until MenuChoice = 0;

  finally
    ParkingLot.Free; 
  end;
end.