Вот развернутое объяснение и решение задачи о нахождении предыдущей даты в не високосном году с использованием языка программирования Pascal и конструкции case
.
1. Постановка задачи:
- У нас есть два целых числа —
D
(день) и M
(месяц), которые представляют корректную дату в не високосном году.
- Нужно определить, какая дата предшествует указанной, и вывести её.
- Учитываем особенности календаря:
- Месяцы разные по количеству дней:
- Январь, март, май, июль, август, октябрь, декабрь — 31 день.
- Апрель, июнь, сентябрь, ноябрь — 30 дней.
- Февраль — 28 дней (не високосный год).
- Если вводим дату 1 числа в каком-то месяце, то предыдущий день будет последним числом предыдущего месяца. Например:
- Для 1 марта предыдущей датой будет 28 февраля.
- Для 1 мая — 30 апреля.
- Для 1 января — 31 декабря предыдущего года.
2. Решение:
Чтобы решить задачу, удобно использовать команду case
, которая подходит для выбора логики в зависимости от месяца. Программа будет работать следующим образом:
- Проверяем, является ли введённая дата первым числом месяца (
D = 1
):
- Если да, то нужно определить последний день предыдущего месяца.
- Если месяц — январь (
M = 1
), то переходим на декабрь прошлого года.
- Для остальных месяцев нужно учитывать количество дней в предыдущем месяце.
- Если дата не первое число месяца (
D > 1
), просто уменьшаем день на единицу (D := D - 1
).
3. Код программы:
program PreviousDate;
var
D, M: integer;
begin
writeln('Введите день и месяц (через пробел):');
readln(D, M);
if (D < 1) or (D > 31) or (M < 1) or (M > 12) then
begin
writeln('Ошибка: некорректная дата.');
exit;
end;
if D = 1 then // Если это первое число месяца
begin
M := M - 1; // Переходим к предыдущему месяцу
if M = 0 then // Если это был январь, то теперь декабрь
begin
M := 12;
D := 31;
end
else
begin
case M of
1, 3, 5, 7, 8, 10, 12: D := 31; // Январь, март, май, июль, август, октябрь, декабрь
4, 6, 9, 11: D := 30; // Апрель, июнь, сентябрь, ноябрь
2: D := 28; // Февраль (не високосный год)
end;
end;
end
else
begin
D := D - 1; // Если это не первое число, просто уменьшаем день
end;
writeln('Предыдущая дата: ', D, '.', M);
end.
4. Объяснение кода:
- Ввод данных:
- Пользователь вводит день и месяц. Проверяем, чтобы значения были в допустимых пределах.
- Проверка первого числа месяца:
- Если день равен 1 (
D = 1
), то переходим на предыдущий месяц:
- Если это январь, то предыдущий месяц — декабрь, устанавливаем дату 31 декабря.
- Для всех других месяцев используем
case
для определения количества дней в предыдущем месяце.
- Обработка остальных случаев:
- Если день больше 1 (
D > 1
), то просто уменьшаем значение дня на 1.
- Вывод результата:
- Программа выводит предыдущую дату в формате
D.M
.
5. Примеры работы программы:
Пример 1:
Ввод:
1 3
Вывод:
Предыдущая дата: 28.2
(1 марта → 28 февраля)
Пример 2:
Ввод:
15 6
Вывод:
Предыдущая дата: 14.6
(15 июня → 14 июня)
Пример 3:
Ввод:
1 1
Вывод:
Предыдущая дата: 31.12
(1 января → 31 декабря)
6. Особенности:
- Программа предполагает, что вводимая дата корректна (например, не проверяем 31 февраля, так как она невозможна).
- Работает только для не високосного года (у февраля всегда 28 дней).
Надеюсь, это решение поможет вам!