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