Root /ArchiveAbout
()

Proc 50 - 55

Proc 50 - 55

В Proc50 и Proc51 решаем задачи о времени.
Proc52 - о високосном годе.
Proc53, Proc54, Proc55 - о днях и месяцах года.

Proc50. Описать процедуру TimeToHMS(T, H, M, S), определяющую по времени T (в секундах) содержащееся в нем количество часов H, минут M и секунд S (T — входной, H, M и S — выходные параметры целого типа). Используя эту процедуру, найти количество часов, минут и секунд для пяти данных отрезков времени T1, T2, …, T5.

{ процедура вычисляет по времени T(в секундах) количество H 
содержащихся в них часов, M минут и S секунд }
procedure TimeToHMS(T: integer; var H, M, S: integer);
begin
  H := T div 3600; //целое количество часов
  T := T - H * 3600; //остаток (в секундах)
  M := T div 60; //целое количество минут
  S := T - M * 60 //остаток (в секундах)
end;

var
  T, H, M, S: integer;
  i: byte;
  
begin
  for i := 1 to 5 do begin //количество чисел для вычислений
    write('T', i, ' = ');
    readln(T);
    if T >= 0 then begin
      TimeToHMS(T, H, M, S); //вызываем процедуру
      writeln('  часы:    ', H);
      writeln('  минуты:  ', M);
      writeln('  секунды: ', S)
    end
    else writeln('Ошибка: время не может быть отрицательным!');
    writeln
  end
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 A **div** B - целочисленное деление А на В A **div** B - целочисленное деление А на В **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Proc51. Описать процедуру IncTime(H, M, S, T), которая увеличивает на T секунд время, заданное в часах H, минутах M и секундах S (H, M и S — входные и выходные параметры, T — входной параметр; все параметры — целые положительные). Дано время (в часах H, минутах M, секундах S) и целое число T. Используя процедуру IncTime, увеличить данное время на T секунд и вывести новые значения H, M, S.

{ процедура увеличивает время, заданное в часах H, минутах M и 
секундах S, на T секунд, и возвращает новые значения H, M и S }
procedure IncTime(var H, M, S: integer; T: integer);

  { процедура вычисляет по времени T(в секундах) количество H 
  содержащихся в них часов, M минут и S секунд }
  procedure TimeToHMS(T: integer; var H, M, S: integer);
  begin
    H := T div 3600; //целое количество часов
    T := T - H * 3600; //остаток (в секундах)
    M := T div 60; //целое количество минут
    S := T - M * 60 //остаток (в секундах)
  end;

var
  t1: integer;
{ тело основной  процедуры: }
begin
  t1 := 3600 * H + 60 * M + S; //преобразовываем время в секунды
  t1 := t1 + T; //увеличиваем время на T секунд
  TimeToHMS(t1, H, M, S) //вызываем дополнительную процедуру
end;

var
  H, M, S, T: integer;

begin
  write('Количество часов:  H = ');
  readln(H);
  write('Количество минут:  M = ');
  readln(M);
  write('Количество секунд: S = ');
  readln(S);
  write('T = ');
  readln(T);
  IncTime(H, M, S, T); //вызываем процедуру
  writeln;
  writeln('Результат увеличения времени на ', T, ' секунд:');
  writeln(' H = ', H, ' ч.');
  writeln(' M = ', M, ' мин.');
  writeln(' S = ', S, ' сек.')
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 A **div** B - целочисленное деление А на В A **div** B - целочисленное деление А на В **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Посмотрите задачи Количество прошедших минут и секунд.

Proc52. Описать функцию IsLeapYear(Y) логического типа, которая возвращает True, если год Y (целое положительное число) является високосным, и False в противном случае. Вывести значение функции IsLeapYear для пяти данных значений параметра Y. Високосным считается год, делящийся на 4, за исключением тех годов, которые делятся на 100 и не делятся на 400.

{ Функция возвращает True, если год Y 
високосный, и False в противном случае }
function IsLeapYear(Y: integer): boolean;
begin
  IsLeapYear := (Y mod 4 = 0) and (Y mod 100 <> 0) or (Y mod 400 = 0)
end;

var
  Y: word;
  i: byte;

begin
  for i := 1 to 5 do begin //проверяем 5 значений года
    write('Введите год:  ');
    readln(Y);
    writeln(' ', IsLeapYear(Y)) //вызываем функцию
    writeln
  end
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение. A **mod** B - остаток при целочисленном делении А на В A **mod** B - остаток при целочисленном делении А на В A **mod** B - остаток при целочисленном делении А на В **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Посмотрите пример If28.

Proc53. Используя функцию IsLeapYear из задания Proc52, описать функцию MonthDays(M, Y) целого типа, которая возвращает количество дней для M-го месяца года Y (1 ≤ M ≤ 12, Y > 0 — целые числа). Вывести значение функции MonthDays для данного года Y и месяцев M1, M2, M3.

{ Функция возвращает количество дней M-го месяца года Y }
function MonthDays(M, Y: word): word;

  { Функция возвращает True, если год Y 
  високосный, и False в противном случае }
  function IsLeapYear(Y: word): boolean;
  begin
    IsLeapYear := (Y mod 4 = 0) and (Y mod 100 <> 0) or (Y mod 400 = 0)
  end;

{ тело основной подпрограммы MonthDays(M,Y): }
begin
 { Используем оператор выбора CASE для перебора нужных вариантов: }
  case M of
    2: if IsLeapYear(Y) then MonthDays := 29
       else MonthDays := 28;
    4, 6, 9, 11: MonthDays := 30;
    1, 3, 5, 7, 8, 10, 12: MonthDays := 31;
  end
end;

var
  Y, M: word;
  i: byte;

{ тело программы: }
begin
  write('Y = ');
  readln(Y);{ Если год не положительный, то сообщаем об ошибке: }
  for i :=1 to 3 do begin
   { Вводим значение месяца до выполнения условий M > 0 и M < 13: }
    repeat
      write('M', i, ' = ');
      readln(M);
      if (M < 1) or (M > 12) then { сообщение при неверном вводе: }
        writeln(' Такого месяца не существует!')
    until (M > 0) and (M < 13); //условие выхода
    writeln('Результат: ', MonthDays(M, Y)) //вызываем функцию
  end
end.

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** boolean;: Представляет логическое значение. A **mod** B - остаток при целочисленном делении А на В A **mod** B - остаток при целочисленном делении А на В A **mod** B - остаток при целочисленном делении А на В **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Proc54. Используя функцию MonthDays из задания Proc53, описать процедуру PrevDate(D, M, Y), которая по информации о правильной дате, включающей день D, номер месяца M и год Y, определяет предыдущую дату (параметры целого типа D, M, Y являются одновременно входными и выходными). Применить процедуру PrevDate к трем исходным датам и вывести полученные значения предыдущих дат.

{ Процедура определяет предыдущую дату относительно даты D.M.Y }
procedure PrevDate(var D, M: byte; var Y: word);
 
  { Функция возвращает количество дней M-го месяца года Y }
  function MonthDays(M, Y: word): word;
  
    { Функция возвращает True, если год Y 
    високосный, и False в противном случае }
    function IsLeapYear(Y: word): boolean;
    begin
      IsLeapYear := (Y mod 4 = 0) and (Y mod 100 <> 0) or (Y mod 400 = 0)
    end;
  
  { тело подпрограммы MonthDays(M,Y): }
  begin
   { Используем оператор выбора CASE для перебора нужных вариантов: }
    case M of
      2: if IsLeapYear(Y) then MonthDays := 29
         else MonthDays := 28;
      4, 6, 9, 11: MonthDays := 30;
      1, 3, 5, 7, 8, 10, 12: MonthDays := 31;
    end
  end;

{ тело ОСНОВНОЙ процедуры PrevDate: }
begin
  { Проверяем 1-й день: }
  if D = 1 then begin
   { Находим последний день предшествующего месяца: }
    case M of
    { Для 1-го дня 3-го месяца предшествующим является
     28-й день: }
      3: D := MonthDays(2, Y);
      
    { Для 1-го дня 5-го, 7-го, 10-го и 12-го месяцев
     предшествующим является 30-й день: }
      5,7,10,12:
         D := 30;
      
    { Для 1-го дня 1-го, 2-го, 4-го, 6-го, 8-го, 9-го и
     11-го месяцев предшествующим является 31-й день: }
      1,2,4,6,8,9,11:
         D := 31
    end;
   { Номер предшествующего  месяца. Для M = 1 он  равен 12,
   а для остальных M - 1. Можем использовать такую формулу: }
    M := (M + 10) mod 12 + 1
  end { Остальные дни уменьшаем на 1 (а месяц не изменяется): }
  else dec(D);
  if (D = 31) and (M = 12) then dec(Y)
end;

   { Основная программа: }

var
  D, M, i: byte;
  Y: word;

begin
  writeln('Введите правильную дату:');
  for i := 1 to 3 do begin
    write('введите день:  D = ');
    readln(D);
    write('введите месяц: M = ');
    readln(M);
    write('введите год:   Y = ');
    readln(Y);
    PrevDate(D, M, Y); //вызываем процедуру
    writeln('Предшествующая дата: ');
   { Выводим предыдущую дату в формате D.M.Y: }
    if D < 10 then write(' 0', D, '.')
    else write(' ', D, '.');
    if M < 10 then write('0', M)
    else write(M);
    writeln('.', Y);
    writeln
  end
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** boolean;: Представляет логическое значение. A **mod** B - остаток при целочисленном делении А на В A **mod** B - остаток при целочисленном делении А на В A **mod** B - остаток при целочисленном делении А на В A **mod** B - остаток при целочисленном делении А на В **procedure** Dec(**var** i: integer);: Уменьшает значение переменной i на 1 **procedure** Dec(**var** i: integer);: Уменьшает значение переменной i на 1 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 Сравните Proc54 с задачей Case8 на странице Предшествующая и последующая дата.

Proc55. Используя функцию MonthDays из задания Proc53, описать процедуру NextDate(D, M, Y), которая по информации о правильной дате, включающей день D, номер месяца M и год Y, определяет следующую дату (параметры целого типа D, M, Y являются одновременно входными и выходными). Применить процедуру NextDate к трем исходным датам и вывести полученные значения следующих дат.

{ Процедура определяет следующую дату относительно даты D.M.Y }
procedure NextDate(var D, M: byte; var Y: word);
 
  { Функция возвращает количество дней M-го месяца года Y }
  function MonthDays(M, Y: word): word;
  
    { Функция возвращает True, если год Y 
    високосный, и False в противном случае }
    function IsLeapYear(Y: word): boolean;
    begin
      IsLeapYear := (Y mod 4 = 0) and (Y mod 100 <> 0) or (Y mod 400 = 0)
    end;
  
  { тело процедуры MonthDays(M,Y): }
  begin
   { Используем оператор выбора CASE для перебора нужных вариантов: }
    case M of
      2: if IsLeapYear(Y) then MonthDays := 29
         else MonthDays := 28;
      4, 6, 9, 11: MonthDays := 30;
      1, 3, 5, 7, 8, 10, 12: MonthDays := 31;
    end
  end;
 
var
  CountDay: byte; //количество дней в месяце
{ тело ОСНОВНОЙ процедуры NextDate: }
begin
  { Группируем месяцы по  количеству дней: }
  case M of
   { Второй месяц имеет 28 или 29 дней: }
    2: CountDay := MonthDays(2, Y);
       
   { Следующие месяцы имеют по 30 дней: }    
    4, 6, 9, 11:
       CountDay := 30;
       
   { Следующие месяцы имеют по 31 день: }    
    1, 3, 5, 7, 8, 10, 12:
       CountDay := 31
  end;
 { Если D < CountDay, то увеличиваем день D на единицу;
 если D = CountDay, то следующий день равен 1, а месяц 
 увеличивается на 1 (первый день следующего месяца): }
  if D < CountDay then inc(D)
  else begin
    M := M mod 12 + 1;
    D := 1
  end;
 { Если имеем дату 01.01.Y, то увеличиваем год на 1: }
  if (D = 1) and (M = 1) then inc(Y)
end;

   { Основная программа: }

var
  D, M, i: byte;
  Y: word;

begin
  writeln('Введите правильную дату:');
  for i := 1 to 3 do begin
    write('введите день:  D = ');
    readln(D);
    write('введите месяц: M = ');
    readln(M);
    write('введите год:   Y = ');
    readln(Y);
    NextDate(D, M, Y); //вызываем процедуру
    writeln('Следующая дата: ');
   { Выводим предыдущую дату в формате D.M.Y: }
    if D < 10 then write(' 0', D, '.')
    else write(' ', D, '.');
    if M < 10 then write('0', M)
    else write(M);
    writeln('.', Y);
    writeln
  end
end.

**type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **type** boolean;: Представляет логическое значение. A **mod** B - остаток при целочисленном делении А на В A **mod** B - остаток при целочисленном делении А на В A **mod** B - остаток при целочисленном делении А на В **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 A **mod** B - остаток при целочисленном делении А на В **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 Сравните последнюю задачу с Case9.