Программа
{ Вечный календарь }
PROGRAM Calendar;
VAR Year,Month,Day:word; { Год, месяц, день }
Ch:char;
{$I-} { Отключение проверки ошибок ввода-вывода }
FUNCTION Question(S:string):boolean; { Функция получения ответа на вопрос }
Var Ch:char; { Ответ на вопрос }
Begin
repeat
Write(S,' [Y/N] '); { Вывод вопроса }
ReadLn(Ch) { Ввод символа }
until Ch in ['Y','y','N','n','Н','н','Т','т'];
{ Выход из цикла при получении коректного ответа }
Question:=Ch in ['Y','y','Н','н'] { Определение значения функции }
End;
FUNCTION InputYear:word; { Функция ввода года }
Var YearBuf:real; { Буферная переменная для ввода года }
Begin
Write('год '); { Вывод приглашения ввести год }
ReadLn(YearBuf); { Ввод года }
while (IOResult<>0)or(YearBuf<=0)or(YearBuf>65535)or(Frac(YearBuf)<>0)
do { Цикл повторного ввода года при ошибке }
Begin
{ Вывод сообщений при ошибке }
WriteLn('Параметр неверен',#7);
WriteLn('Повторите ввод');
Write('год '); { Вывод приглашения ввести год }
ReadLn(YearBuf); { Ввод года }
End;
InputYear:=Round(YearBuf) { Определение значения функции }
End;
FUNCTION InputMonth:word; { Функция ввода месяца }
Var MonthBuf:real; { Буферная переменная для ввода месяца }
Begin
Write('месяц '); { Вывод приглашения ввести месяц }
ReadLn(MonthBuf); { Ввод месяца }
while (IOResult<>0)or(MonthBuf<1)or(MonthBuf>12)or(Frac(MonthBuf)<>0) do
{ Цикл повторного ввода месяца при ошибке }
Begin
{ Вывод сообщений при ошибке }
WriteLn('Параметр неверен',#7);
WriteLn('Повторите ввод');
Write('месяц '); { Вывод приглашения ввести месяц }
ReadLn(MonthBuf); { Ввод месяца }
End;
InputMonth:=Round(MonthBuf) { Определение значения функции }
End;
FUNCTION InputDay:word; { Функция ввода числа }
Var DayBuf:real; { Буферная переменная для ввода числа }
Begin
Write('число '); { Вывод приглашения ввести число }
ReadLn(DayBuf); { Ввод числа }
while (IOResult<>0)
or
(DayBuf<1)
or
(DayBuf>31) and (Month in [1,3,5,7,8,10,12])
or
(DayBuf>30) and (Month in [4,6,9,11])
or
(DayBuf>28) and (Month in [2]) and (Year mod 4<>0)
or
(DayBuf>29) and (Month in [2]) and (Year mod 4 =0)
or
(Frac(DayBuf)<>0)
do { Цикл повторного ввода числа при ошибке }
Begin
{ Вывод сообщений при ошибке }
WriteLn('Параметр неверен',#7);
WriteLn('Повторите ввод');
Write('число '); { Вывод приглашения ввести число }
ReadLn(DayBuf); { Ввод числа }
End;
InputDay:=Round(DayBuf) { Определение значения функции }
End;
FUNCTION GetDayWeek(Year:longint;Month,Day:word):string;
{ Функция определения дня недели }
Var EraDay:longint; { День эры }
Begin
begin { Вычисление дня эры }
EraDay:=Round((Year-1)*365)+(Year-1) div 4;
case Month of
1:;
2:EraDay:=EraDay+31;
3:EraDay:=EraDay+31+28;
4:EraDay:=EraDay+31+28+31;
5:EraDay:=EraDay+31+28+31+30;
6:EraDay:=EraDay+31+28+31+30+31;
7:EraDay:=EraDay+31+28+31+30+31+30;
8:EraDay:=EraDay+31+28+31+30+31+30+31;
9:EraDay:=EraDay+31+28+31+30+31+30+31+31;
10:EraDay:=EraDay+31+28+31+30+31+30+31+31+30;
11:EraDay:=EraDay+31+28+31+30+31+30+31+31+30+31;
12:EraDay:=EraDay+31+28+31+30+31+30+31+31+30+31+30
end;
if (Year mod 4 =0) and (Month>2) then EraDay:=EraDay+1;
EraDay:=EraDay+Day
end;
case (EraDay-1) mod 7 of { Определение значения функции }
0:GetDayWeek:='ВОСКРЕСЕНЬЕ';
1:GetDayWeek:='ПОНЕДЕЛЬНИК';
2:GetDayWeek:='ВТОРНИК';
3:GetDayWeek:='СРЕДА';
4:GetDayWeek:='ЧЕТВЕРГ';
5:GetDayWeek:='ПЯТНИЦА';
6:GetDayWeek:='СУББОТА'
end
End;
BEGIN
repeat
WriteLn; { Пропуск строки }
WriteLn('Введите дату: '); { Вывод приглашения ввести дату }
Year:=InputYear; { Ввод года }
Month:=InputMonth; { Ввод месяца }
Day:=InputDay; { Ввод числа }
WriteLn(GetDayWeek(Year,Month,Day)); { Вычисление и вывод результата }
until Question('Закончить работу?')
{ Выход из цикла при получении утвердительного ответа }
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию