Определить время, когда пирог будет испечен - Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста решить задачу. Заранее спасибо! Пекарь считает, что для получения рождественского пирога идеальной симетричной формы его нужно вынимать из духовки в тот момент, когда часы показывают «палиндромное» время, которое читается одинаково слева-направо и справа-налево. Напишите программу, которая определяет по времени установки пирога в духовку время, когда будет подходящее время для его извлечения.

Входные данные

В единственной строке входного файла INPUT.TXT записано время установки пирога в духовку в формате HH:MM (00 ≤ HH ≤ 23, 00 ≤ MM ≤ 59).

Выходные данные

В единственную строку выходного файла OUTPUT.TXT нужно вывести ближайшее «палиндромное» время в формате HH:MM.

Примеры

Ввод Вывод
1 00:00 01:10
2 12:34 13:31
3 23:59 00:00

Решение задачи: «Определить время, когда пирог будет испечен»

textual
Листинг программы
program Compare;
 
  function TimeToStr(h, m: integer): string;
  var
    s: string;
  begin
    str(h: 2, TimeToStr);
    if TimeToStr[1] = ' ' then
      TimeToStr[1] := '0';
    str(m: 2, s);
    if s[1] = ' ' then
      s[1] := '0';
    TimeToStr := TimeToStr + ':' + s;
  end;
 
  function ByCyborgDrone(const s: string): string;
  var
    hh, mm: byte;
  begin
    val(copy(s, 1, 2), hh);
    val(copy(s, 4, 2), mm);
    if hh <= mm mod 10 * 10 + mm div 10 then
      Inc(hh);
    if hh = 24 then
      hh := 0
    else if hh mod 10 in [6..9] then
      hh := hh div 10 * 10 + 10;
    mm := hh mod 10;
    hh := hh div 10;
    ByCyborgDrone := TimeToStr(hh * 10 + mm, mm * 10 + hh);
  end;
 
  function ByFPA(const s: string): string;
  var
    hh, mm: string;
    hm: string;
    h:  integer;
    r:  integer;
  begin
    hh := copy(s, 1, 2);
    mm := copy(s, 4, 2);
    val(hh, h, r);
    hm := hh[2] + hh[1];
    if (hm <= mm) or (h in [6..9, 16..19]) then
    begin
      case h of
        5..9: h := 10;
        15..19: h := 20;
        23: h := 0;
        else
          Inc(h);
      end;
      str(h: 2, hh);
      if hh[1] = ' ' then
        hh[1] := '0';
      hm := hh[2] + hh[1];
    end;
    ByFPA := hh + ':' + hm;
  end;
 
var
  s: string;
  hh, mm: integer;
begin
  for hh := 0 to 23 do
    for mm := 00 to 59 do
    begin
      s := TimeToStr(hh, mm);
      if ByFPA(s) <> ByCyborgDrone(s) then
        writeln('Time: ', s, '    ByFPA: ', byFPA(s), '    by CyborgDrone: ',
          ByCyborgDrone(s));
    end;
end.

Объяснение кода листинга программы

  1. Создается процедура TimeToStr с параметрами h, m типа integer и возвращающая значение типа string.
  2. В процедуре TimeToStr создается переменная s типа string.
  3. Выполняется преобразование значений h и m в строку и запись результата в переменную TimeToStr.
  4. Проверяется, если первый символ переменной TimeToStr равен пробелу, то он заменяется на 0.
  5. Выполняется преобразование значения m в строку и запись результата в переменную s.
  6. Проверяется, если первый символ переменной s равен пробелу, то он заменяется на 0.
  7. Значению переменной TimeToStr добавляется символ : и значение переменной s.
  8. Создается функция ByCyborgDrone с параметром s типа string и возвращающая значение типа string.
  9. В функции ByCyborgDrone создаются переменные hh и mm типа byte.
  10. Выполняется преобразование подстроки s от 1 до 2 в число и запись результата в переменную hh.
  11. Выполняется преобразование подстроки s от 4 до 2 в число и запись результата в переменную mm.
  12. Проверяется условие, если hh <= mm mod 10 * 10 + mm div 10, то hh увеличивается на 1.
  13. Проверяется условие, если hh равно 24, то hh становится равным 0.
  14. Проверяется условие, если остаток от деления hh на 10 входит в диапазон [6..9], то hh заменяется на деление его на 10, умноженное на 10, увеличенное на 10.
  15. Значение mm присваивается остатку от деления hh на 10.
  16. Значение hh присваивается результату целочисленного деления hh на 10.
  17. Функции ByCyborgDrone присваивается значение, возвращаемое функцией TimeToStr, с аргументами hh 10 + mm и mm 10 + hh.
  18. Создается функция ByFPA с параметром s типа string и возвращающая значение типа string.
  19. В функции ByFPA создаются переменные hh, mm, hm типа string, h и r типа integer.
  20. Подстрока от 1 до 2 записывается в переменную hh.
  21. Подстрока от 4 до 2 записывается в переменную mm.
  22. Выполняется преобразование значения переменной hh в число и запись результата в переменную h, а остаток от деления в переменную r.
  23. Значению переменной hm присваивается значение первого символа и второго символа переменной hh.
  24. Проверяется условие, если hm меньше или равно значению переменной mm, или значение переменной h входит в диапазон [6..9] или значение переменной h входит в диапазон [16..19], то выполняются действия в блоке begin...end.
  25. В зависимости от значения переменной h выполняется присвоение нового значения переменной h.
  26. Выполняется преобразование значения переменной h в строку и запись результата в переменную hh.
  27. Если первый символ переменной hh равен пробелу, он заменяется на 0.
  28. Значению переменной hm присваивается значение второго и первого символов переменной hh.
  29. Функции ByFPA присваивается значение, равное hh + : + hm.
  30. Объявляются переменные s типа string, hh и mm типа integer.
  31. В цикле для значений от 0 до 23 переменной hh и от 0 до 59 переменной mm выполняются действия в блоке begin...end.
  32. Переменной s присваивается результат функции TimeToStr с аргументами hh и mm.
  33. Если значение функции ByFPA с аргументом s не равно значению функции ByCyborgDrone с аргументом s, выводится сообщение сравнения времени.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы