Разработать проект, запрашивающий дату рождения пользователя и рассчитывающий, в какой день им было прожито 5000 дней.
Аноним:
Обычно такие задачи решают, переводя дату рождения в юлианскую, затем выполняют сложение и результат переводят снова в григорианскую дату. Для этого используют известные алгоритмы, оформляя их в виде пользовательских процедур.
Ответы
Ответ дал:
1
type
Dat = record
d: integer;
m: integer;
y: integer
end;
function jday(pd: Dat): longint;
// Алгоритм 199б
// "Переход от календарной даты к порядковому номеру дня и обратно"
// взят из сборника // "Библиотека алгоритмов 151б-200б", М.И.Агеев и др.,
// М.: Радио и связь, 1981
//
// Алгоритм возвращает порядковый номер дня по Юлианскому календарю.
// Работает для дат, начиная с 01.01.4713 до н.э.
var
c, ya: longint;
begin
with pd do
begin
if m > 2 then m := m - 3
else
begin
m := m + 9;
y := y - 1
end;
c := y div 100;
ya := y mod 100;
Result := ((146097 * c) div 4) + ((1461 * ya) div 4) +
((153 * m + 2) div 5) + d + 1721119
end;
end;
function jdate(j: longint): Dat;
// Алгоритм 199б
// "Переход от календарной даты к порядковому номеру дня и обратно"
// взят из сборника // "Библиотека алгоритмов 151б-200б", М.И.Агеев и др.,
// М.: Радио и связь, 1981
//
// Алгоритм возвращает дату григорианского календаря по
// порядковому номеру дня Юлианского календаря.
// Работает для дат, начиная с 01.01.4713 до н.э.
var
dd, mm, yy: integer;
begin
j := j - 1721119;
yy := (4 * j - 1) div 146097;
dd := (4 * j - 1 - 146097 * yy) div 4;
j := (4 * dd + 3) div 1461;
dd := (4 * dd + 7 - 1461 * j) div 4;
mm := (5 * dd - 3) div 153;
dd := (5 * dd + 2 - 153 * mm) div 5;
yy := 100 * yy + j;
if mm < 10 then mm := mm + 3
else begin mm := mm - 9; yy := yy + 1 end;
Result.d := dd;
Result.m := mm;
Result.y := yy
end;
var
d1,d2: Dat;
begin
Writeln('Введите дату рождения в формате <день месяц год>: ');
Read(d1.d, d1.m, d1.y);
d2:=jdate(jday(d1)+5000);
Writeln('5000 дней прожито ',d2.d,'.',d2.m,'.',d2.y)
end.
Тестовое решение:
Введите дату рождения в формате <день месяц год>:
9 10 1997
5000 дней прожито 18.6.2011
Dat = record
d: integer;
m: integer;
y: integer
end;
function jday(pd: Dat): longint;
// Алгоритм 199б
// "Переход от календарной даты к порядковому номеру дня и обратно"
// взят из сборника // "Библиотека алгоритмов 151б-200б", М.И.Агеев и др.,
// М.: Радио и связь, 1981
//
// Алгоритм возвращает порядковый номер дня по Юлианскому календарю.
// Работает для дат, начиная с 01.01.4713 до н.э.
var
c, ya: longint;
begin
with pd do
begin
if m > 2 then m := m - 3
else
begin
m := m + 9;
y := y - 1
end;
c := y div 100;
ya := y mod 100;
Result := ((146097 * c) div 4) + ((1461 * ya) div 4) +
((153 * m + 2) div 5) + d + 1721119
end;
end;
function jdate(j: longint): Dat;
// Алгоритм 199б
// "Переход от календарной даты к порядковому номеру дня и обратно"
// взят из сборника // "Библиотека алгоритмов 151б-200б", М.И.Агеев и др.,
// М.: Радио и связь, 1981
//
// Алгоритм возвращает дату григорианского календаря по
// порядковому номеру дня Юлианского календаря.
// Работает для дат, начиная с 01.01.4713 до н.э.
var
dd, mm, yy: integer;
begin
j := j - 1721119;
yy := (4 * j - 1) div 146097;
dd := (4 * j - 1 - 146097 * yy) div 4;
j := (4 * dd + 3) div 1461;
dd := (4 * dd + 7 - 1461 * j) div 4;
mm := (5 * dd - 3) div 153;
dd := (5 * dd + 2 - 153 * mm) div 5;
yy := 100 * yy + j;
if mm < 10 then mm := mm + 3
else begin mm := mm - 9; yy := yy + 1 end;
Result.d := dd;
Result.m := mm;
Result.y := yy
end;
var
d1,d2: Dat;
begin
Writeln('Введите дату рождения в формате <день месяц год>: ');
Read(d1.d, d1.m, d1.y);
d2:=jdate(jday(d1)+5000);
Writeln('5000 дней прожито ',d2.d,'.',d2.m,'.',d2.y)
end.
Тестовое решение:
Введите дату рождения в формате <день месяц год>:
9 10 1997
5000 дней прожито 18.6.2011
Вас заинтересует
11 месяцев назад
11 месяцев назад
1 год назад
6 лет назад
7 лет назад