Программа
PROGRAM Calendar;
TYPE Date=record { Тип дата }
Year,Month,Day:longint; { Год, месяц, день }
end;
VAR Date1,Date2:Date; { Даты }
YearDay:word; { Номер дня года }
BufDate:Date; { Буфер для обмена }
FUNCTION CorrectDate(D:Date):boolean; { Функция проверки корректности даты }
Begin
with D do
if (Year>=1)and(1<=Month)and(Month<=12)and(1<=Day)
then case Month of
2: CorrectDate:=(Day<=28)or((Year mod 4=0)and(Day=29));
4,6,9,11:CorrectDate:=Day<=30;
else CorrectDate:=Day<=31
end
else CorrectDate:=FALSE
End;
{
***************
* *
* П У С К *
* *
***************
:
:
:
*
* * ┌─
* * │
Нет * * Да │ (Year>=1)and(1<=Month)
∙∙∙∙∙<∙∙∙∙∙* *∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙│ and(Month<=12)and(1<=Day)
: * * : │
: * * : │
: * * * └─
: * * *
: * *
: * *
: * Month *
: * *
***************** * *
* * * *
* CorrectDate * *
* * :
* :=FALSE * :
* * 2 4,6,9,11 : else
***************** .∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙.
: : : :
: : : :
: ***************** ***************** *****************
: * CorrectDate:= * * * * *
: * (Day<=28)or * * CorrectDate:= * * CorrectDate:= *
: *((Year mod 4=0)* * * * *
: * and(Day=29)) * * Day<=30 * * Day<=31 *
: * * * * * *
: ***************** ***************** *****************
: : : :
: : : :
`∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙'
:
:
***************
* *
* К О Н Е Ц *
* *
***************
}
PROCEDURE InputDate(var D:Date); { Процедура ввода даты }
Var Buf:String; { Буфер для ввода даты }
Error:boolean; { Флаг ошибки }
Code:integer; { Номер неправильного символа при преобразовании даты }
Begin
repeat { Цикл ввода даты }
Write('Введите дату [ДД.ММ.ГГГГ] '); { Вывод приглашения ввести дату }
ReadLn(Buf); { Ввод строки даты }
while Buf[1]=' ' do Buf:=Copy(Buf,2,Length(Buf)-1);
{ Удаление начальных пробелов }
while Buf[Length(Buf)]=' ' do Buf:=Copy(Buf,1,Length(Buf)-1);
{ Удаление конечных пробелов }
Error:=Length(Buf)>12; { Проверка корректности даты по длине записи }
Val(Copy(Buf,1,Pos('.',Buf)-1),D.Day,Code);
{ Выделение и преобразование числа месяца }
Error:=Code<>0; { Проверка корректности преобразования числа }
Delete(Buf,1,Pos('.',Buf)); { Удаление числа месяца }
Val(Copy(Buf,1,Pos('.',Buf)-1),D.Month,Code);
{ Выделение и преобразование месяца }
Error:=Error or (Code<>0); { Проверка корректности преобразования месяца }
Delete(Buf,1,Pos('.',Buf)); { Удаление месяца }
Val(Buf,D.Year,Code); { Преобразование года }
Error:=Error or (Code<>0); { Проверка корректности преобразования года }
Error:=Error or not CorrectDate(D); { Проверка корректности даты }
if Error then WriteLn(#7'ОШИБКА') { Если при преобразовании введенной
строки обнаружена ошибка, то вывод сообщения }
until not Error { Выход из цикла при получении корректной даты }
End;
{
***************
* *
* П У С К *
* *
***************
:
:
:∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙<∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙.
: :
: :
: :
***************** :
:
*Вывод приглаше-* :
ния и ввод :
* даты * :
:
***************** :
: :
: :
:∙∙∙∙∙∙∙∙∙<∙∙∙∙∙∙∙∙∙∙∙. :
: : :
: ***************** :
: * Удаление * :
: * первого * :
: * символа * :
* * в строке * :
* * * * :
* * ***************** :
* * Да : :
* Buf[1]=' ' *∙∙∙∙∙∙∙∙∙∙∙∙∙' :
* * :
* * :
* * :
* :
: Нет :
: :
: :
:∙∙∙∙∙∙∙∙∙<∙∙∙∙∙∙∙∙∙∙∙. :
: : :
: ***************** :
: * Удаление * :
: * последнего * :
: * символа * :
* * в строке * :
* * * * ┌─ :
* * ***************** │ :
* * Да : │ Последний :
* *∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙│ символ в строке - :
* * │ - пробел :
* * │ :
* * └─ :
* :
: Нет :
: :
***************** :
* * :
* Error:= * :
* Length(Buf)>12* :
* * :
* * :
***************** :
: :
: :
: :
***************** :
* * :
* Выделение и * :
* преобразование* :
* числа месяца * :
* * :
***************** :
: :
: :
: :
***************** :
* Проверка * :
* корректности * :
* преобразования* :
* числа * :
* * :
***************** :
: :
: :
: :
***************** :
* * :
* Удаление * :
* числа * :
* месяца * :
* * :
***************** :
: :
: :
: :
***************** :
* * :
* Выделение и * :
* преобразование* :
* месяца * :
* * :
***************** :
: :
: :
: :
***************** :
* Проверка * :
* корректности * :
* преобразования* :
* месяца * :
* * :
***************** :
: :
: :
: :
***************** :
* * :
* Удаление * :
* месяца * :
* * :
* * :
***************** :
: :
: :
: :
***************** :
* * :
* Преобразование* :
* года * :
* * :
* * :
***************** :
: :
: :
: :
***************** :
* Проверка * :
* корректности * :
* преобразования* :
* года * :
* * :
***************** :
: :
: :
: :
***************** :
* * :
* Проверка * *****************
* корректности *
* даты * * *
* * ОШИБКА
***************** * *
:
: *****************
: :
* :
* * :
* * :
* * Нет :
* not Error *∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙>∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙'
* *
* *
* *
*
: Да
:
:
:
***************
* *
* К О Н Е Ц *
* *
***************
}
FUNCTION GetYearDay(D:Date):word; { Функция вычисления дня года }
Var YearDay:word; { Переменная для набора результата }
Begin
case D.Month of { Подсчет количества дней в целых месяцах данного года }
1:YearDay:=0;
2:YearDay:=31;
3:YearDay:=31+28;
4:YearDay:=31+28+31;
5:YearDay:=31+28+31+30;
6:YearDay:=31+28+31+30+31;
7:YearDay:=31+28+31+30+31+30;
8:YearDay:=31+28+31+30+31+30+31;
9:YearDay:=31+28+31+30+31+30+31+31;
10:YearDay:=31+28+31+30+31+30+31+31+30;
11:YearDay:=31+28+31+30+31+30+31+31+30+31;
12:YearDay:=31+28+31+30+31+30+31+31+30+31+30
end;
if (D.Year mod 4 =0) and (D.Month>2) then YearDay:=YearDay+1;
{ Корректировка високосного года }
YearDay:=YearDay+D.Day; { Количество дней в данном месяце }
GetYearDay:=YearDay { Определение значения функции }
End;
{
***************
* *
* П У С К *
* *
***************
:
:
:
*
* *
* *
* *
* Month *
* *
* *
* *
*
:
.∙∙∙∙∙∙∙∙'
:
:
: *****************
: * *
: 1 * *
:∙∙∙∙∙* YearDay:=0 *∙∙∙∙∙.
: * * :
: * * :
: ***************** :
: ***************** :
: * * :
: 2 * * :
:∙∙∙∙∙* YearDay:=31 *∙∙∙∙∙:
: * * :
: * * :
: ***************** :
: ***************** :
: * * :
: 3 * * :
:∙∙∙∙∙* YearDay:=31+28*∙∙∙∙∙:
: * * :
: * * :
: ***************** :
: ***************** :
: * * :
: 4 * YearDay:= * :
:∙∙∙∙∙* 31+28+31 *∙∙∙∙∙:
: * * :
: * * :
: ***************** :
: ***************** :
: * * :
: 5 * YearDay:= * :
:∙∙∙∙∙* 31+28+31+30 *∙∙∙∙∙:
: * * :
: * * :
: ***************** :
: ***************** :
: * * :
: 6 * YearDay:= * :
:∙∙∙∙∙* 31+28+31+30+ *∙∙∙∙∙:
: * 31 * :
: * * :
: ***************** :
: ***************** :
: * * :
: 7 * YearDay:= * :
:∙∙∙∙∙* 31+28+31+30+ *∙∙∙∙∙:
: * 31+30 * :
: * * :
: ***************** :
: ***************** :
: * * :
: 8 * YearDay:= * :
:∙∙∙∙∙* 31+28+31+30+ *∙∙∙∙∙:
: * 31+30+31 * :
: * * :
: ***************** :
: ***************** :
: * * :
: 9 * YearDay:= * :
:∙∙∙∙∙* 31+28+31+30+ *∙∙∙∙∙:
: * 31+30+31+31 * :
: * * :
: ***************** :
: ***************** :
: * YearDay:= * :
: 10 * 31+28+31+30+ * :
:∙∙∙∙∙* 31+30+31+31+ *∙∙∙∙∙:
: * 30 * :
: * * :
: ***************** :
: ***************** :
: * YearDay:= * :
: 11 * 31+28+31+30+ * :
:∙∙∙∙∙* 31+30+31+31+ *∙∙∙∙∙:
: * 30+31 * :
: * * :
: ***************** :
: ***************** :
: * YearDay:= * :
: 12 * 31+28+31+30+ * :
`∙∙∙∙∙* 31+30+31+31+ *∙∙∙∙∙:
* 30+31+30 * :
* * :
***************** :
:
:
:
.∙∙∙∙∙∙∙∙∙∙∙∙∙'
:
:
*
* * ┌─
* * │
* * Да │ Год високосный
* *∙∙∙∙∙∙∙∙∙∙∙∙∙.∙∙∙∙∙∙∙∙∙∙∙│ и месяц больший
* * : │ февраля
* * : │
* * ***************** └─
* * *
: Нет * YearDay:= *
: * *
: * YearDay+1 *
: * *
: *****************
: :
: :
:∙∙∙∙∙∙<∙∙∙∙∙∙∙∙∙∙∙∙∙∙'
:
:
*****************
* *
* Определение *
* значения *
* функции *
* *
*****************
:
:
:
***************
* *
* К О Н Е Ц *
* *
***************
}
FUNCTION GetEraDay(D:Date):longint; { Функция вычисления дня эры }
Var EraDay:longint; { День эры }
Begin
EraDay:=(D.Year-1)*365+(D.Year-1) div 4; { Количество дней в целых годах }
EraDay:=EraDay+GetYearDay(D); { Количество дней данного года }
GetEraDay:=EraDay { Определение значения функции }
End;
{
***************
* *
* П У С К *
* *
***************
:
:
:
:
*****************
* *
* EraDay:= *
* (Year-1)*365+ *
* (Year-1)div 4 *
* *
*****************
:
:
:
*****************
* *
* EraDay:= *
* EraDay+ *
* GetYearDay(D) *
* *
*****************
:
:
*****************
* *
* Определение *
* значения *
* функции *
* *
*****************
:
:
:
***************
* *
* К О Н Е Ц *
* *
***************
}
FUNCTION GetQuantityYear(D1,D2:Date):word;
{ Функция вычисления полных лет между датами }
Var QuantityYear:word; { Число лет }
Begin
QuantityYear:=D1.Year-D2.Year; { Подсчет числа лет по годам дат }
if (D1.Month<D2.Month)or((D1.Month=D2.Month)and(D1.Day<D2.Day))
{ Если дата болшего года меньше, то корректировка числа полных лет }
then QuantityYear:=QuantityYear-1;
GetQuantityYear:=QuantityYear { Определение значения функции }
End;
{
***************
* *
* П У С К *
* *
***************
:
:
:
:
*****************
* *
* Подсчет числа *
* лет по *
* годам дат *
* *
*****************
:
:
:
:
*
* * ┌─
* * │
* * Да │
* *∙∙∙∙∙∙∙∙∙∙∙∙.∙∙∙∙∙∙∙∙∙∙│ День большего года меньше
* * : │
* * : │
* * ***************** └─
* * *
: Нет * QuantityYear:=*
: * QuantityYear-1*
: * *
: * *
: *****************
: :
: :
:∙∙∙∙∙∙∙∙∙<∙∙∙∙∙∙∙∙∙∙'
:
:
:
*****************
* *
* Определение *
* значения *
* функции *
* *
*****************
:
:
:
***************
* *
* К О Н Е Ц *
* *
***************
}
FUNCTION GetWeekDay(D:Date):string; { Функция определения дня недели }
Begin
case (GetEraDay(D)-1) mod 7 of { Определение значения функции }
0:GetWeekDay:='ВОСКРЕСЕНЬЕ';
1:GetWeekDay:='ПОНЕДЕЛЬНИК';
2:GetWeekDay:='ВТОРНИК';
3:GetWeekDay:='СРЕДА';
4:GetWeekDay:='ЧЕТВЕРГ';
5:GetWeekDay:='ПЯТНИЦА';
6:GetWeekDay:='СУББОТА'
end
End;
{
***************
* *
* П У С К *
* *
***************
:
:
:
:
*
* * ┌─
* * │
* * │
* * ∙∙∙∙∙│ (GetEraDay(D)-1) mod 7
* * │
* * │
* * └─
*
:
.∙∙∙∙∙∙∙∙∙∙∙∙∙'
:
:
: *****************
: * *
: 0 * GetWeekDay:= *
:∙∙∙∙∙* *∙∙∙∙∙.
: * 'ВОСКРЕСЕНЬЕ' * :
: * * :
: ***************** :
: ***************** :
: * * :
: 1 * GetWeekDay:= * :
:∙∙∙∙∙* *∙∙∙∙∙:
: * 'ПОНЕДЕЛЬНИК' * :
: * * :
: ***************** :
: ***************** :
: * * :
: 2 * GetWeekDay:= * :
:∙∙∙∙∙* *∙∙∙∙∙:
: * 'ВТОРНИК' * :
: * * :
: ***************** :
: ***************** :
: * * :
: 3 * GetWeekDay:= * :
:∙∙∙∙∙* *∙∙∙∙∙:
: * 'СРЕДА' * :
: * * :
: ***************** :
: ***************** :
: * * :
: 4 * GetWeekDay:= * :
:∙∙∙∙∙* *∙∙∙∙∙:
: * 'ЧЕТВЕРГ' * :
: * * :
: ***************** :
: ***************** :
: * * :
: 5 * GetWeekDay:= * :
:∙∙∙∙∙* *∙∙∙∙∙:
: * 'ПЯТНИЦА' * :
: * * :
: ***************** :
: ***************** :
: * * :
: 6 * GetWeekDay:= * :
`∙∙∙∙∙* *∙∙∙∙∙:
* 'СУББОТА' * :
* * :
***************** :
:
:
:
.∙∙∙∙∙∙∙∙∙∙∙∙∙'
:
:
:
:
:
***************
* *
* К О Н Е Ц *
* *
***************
}
BEGIN
WriteLn;WriteLn;WriteLn; { Пропуск строк }
{ Вывод заголовка: }
WriteLn('Вычисление количества дней и полных лет между двумя датами');
WriteLn('----------------------------------------------------------');
{ Ввод дат: }
InputDate(Date1);
InputDate(Date2);
if (Date1.Year<Date2.Year)or
((Date1.Year=Date2.Year)and((Date1.Month<Date2.Month)or((Date1.Month=Date2.Month)and(Date1.Day<Date2.Day))))
{ Если первая дата меньше второй, то перестановка дат }
then begin BufDate:=Date1; Date1:=Date2; Date2:=BufDate end;
WriteLn('Количество дней между датами: ',GetEraDay(Date1)-GetEraDay(Date2));
{ Вычисление и вывод количества дней между датами }
WriteLn('Количество полных лет между датами: ',GetQuantityYear(Date1,Date2));
{ Вычисление и вывод количества полных лет между датами }
WriteLn; { Пропуск строки }
{ Вывод заголовка: }
WriteLn('Определение номера дня с начала года и количества дней до конца года');
WriteLn('--------------------------------------------------------------------');
InputDate(Date1); { Ввод даты }
YearDay:=GetYearDay(Date1); { Получение номера дня с начала года }
WriteLn('Количество дней прошедших с начала года: ',YearDay);
WriteLn('Количество дней оставшихся до конца года: ',365-YearDay+Ord(Date1.Year mod 4 =0));
WriteLn; { Пропуск строки }
WriteLn('Определение дня недели'); { Вывод заголовка }
WriteLn('----------------------');
InputDate(Date1); { Ввод даты }
WriteLn('День недели: ',GetWeekDay(Date1)); { Вычисление и вывод дня недели }
END.
***************
* *
* П У С К *
* *
***************
:
:
:
:
*****************
* Вывод *
* заголовка *
*****************
:
:
:
:
*****************
* * * *
* * Ввод * *
* * * *
* *Date1,Date2* *
* * * *
*****************
:
:
:
:
*
* * ┌─
* * │
* * Да │
* *∙∙∙∙∙∙∙∙∙∙∙∙.∙∙∙∙∙∙∙∙∙∙│ Date1 меньше Date2
* * : │
* * : │
* * ***************** └─
* * *
: Нет * BufDate:=Date1*
: * Date1:=Date2 *
: * Date2:=BufDate*
: * *
: *****************
: :
: :
:∙∙∙∙∙∙∙∙∙<∙∙∙∙∙∙∙∙∙∙'
:
:
:
:
*****************
* *Вывод * *
* *количества * *
* *дней между * *
* *датами * *
* * * *
*****************
:
:
:
*****************
* *Вывод * *
* *количества * *
* *лет между * *
* *датами * *
* * * *
*****************
:
:
:
*****************
* Вывод *
* заголовка *
*****************
:
:
:
:
*****************
* * * *
* * Ввод * *
* * * *
* * Date1 * *
* * * *
*****************
:
:
:
*****************
* *Получение * *
* *номера дня * *
* *с начала * *
* *года * *
* * * *
*****************
:
:
:
*****************
* Вывод *
номера дня
* года *
*****************
:
:
:
*****************
* Вычисление и *
вывод количества
* дней до конца *
года
*****************
:
:
:
:
:
:
*****************
* Вывод *
* заголовка *
*****************
:
:
:
:
*****************
* * * *
* * Ввод * *
* * * *
* * Date1 * *
* * * *
*****************
:
:
:
*****************
* Вычисление и *
вывод дня
* недели *
*****************
:
:
:
***************
* *
* К О Н Е Ц *
* *
***************
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию