Консультация № 185442
16.02.2012, 01:27
92.94 руб.
0 4 4
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Вот суть вопроса:1) есть задание : Известны год, номер месяца и день рождения человека, определить возраст человека(число полных лет).
Сама задача решена, с помощью экспертов данного портала,за что ОГРОМНОЕ спасибо, но возможно ли сделать ее проще(убрать dec так как по программе образовательного учреждения я это не проходил, и все в том же духе) ?

program vozrast;
var
gr,mr,gs,ms,vozrast:integer;
begin
writeln('vvedite god i mesyac rojdeniya');
readln(gr,mr);
writeln('vvedite segodnyashniy god i mesyac');
readln(gs,ms);
vozrast:=gs-gr;
if ms<mr then dec(vozrast);
writeln('vozrast=',vozrast);
readln;
end.

2) эту же программу нужно переделать так, чтобы она выводила на экран подробный возраст человека( вам X дней, Y месяцев, Z лет),доп условие-в любом месяце 30 дней.

Обсуждение

Неизвестный
16.02.2012, 03:01
общий
это ответ
Здравствуйте, Посетитель - 392290!
1)Процедура Dec - Уменьшает значение переменной

Объявление:
Procedure Dec(Var X[ ; N : Longint]);

Замечания:

Параметр X - переменная перечислимого типа или переменная типа PChar, если допускается расширенный синтаксис, а N - выражение целочисленного типа. Значение X уменьшается на 1, если параметр N не определен, или на N, если праметр N определен, то есть Dec(X) соответствует X:=X-1, а Dec(X, N) соответствует X:=X-N.

Отсюда:
Код:
program vozrast;
var
gr,mr,gs,ms,vozrast:integer;
begin
writeln('vvedite god i mesyac rojdeniya');
readln(gr,mr);
writeln('vvedite segodnyashniy god i mesyac');
readln(gs,ms);
vozrast:=gs-gr;
if ms<mr then vozrast:=vozrast-1;
writeln('vozrast=',vozrast);
readln;
end.


2) Вот программа - отладкой занимался около 2х часов(думая я все сделал правильно)
Код:
program vozrast;
var
dr,gr,mr,gs,ms,ds,v1,v2,v3:integer;
begin
writeln('Введите дату рождения dd,mm,gg');
Readln(dr,mr,gr);
writeln('Введите сегодняшнюю дату dd,mm,gg');
readln(ds,ms,gs);
v1:=gs-gr;
v2:=12-mr+ms;
if v2>12 then
begin
v1:=v1+1;
v2:=v2-12;
end;
if v2=12 then
v2:=0;
if ds<dr then
begin
v3:=30-dr+ds;
v2:=v2+1;
if v2>12 then
begin
v1:=v1+1;
v2:=v2-12;
end;
end
else
if ds>dr then
begin
v3:=ds-dr;
end
else v3:=0;
writeln('Дней ',v3,' Месяцев ', v2,' Лет ',v1);
readln;
end.

Удачи в понимании!
Неизвестный
16.02.2012, 06:51
общий
это ответ
Здравствуйте, Посетитель - 392290!
Первую программу сложно поправить по другому, но вторую можно попробовать написать проще.

интересно, вы знаете функцию Pascal trunc:
Усекает значение вещественного типа к значению целочисленного типа.

Объявление
Function Trunc(X : Real) : Longint;

Режим
Windows, Real, Protected

Замечания
X - выражение вещественного типа. Trunc возвращает значение Longint, которое является значением X, усеченного до нуля.

Сначала мы находим общее количество дней, соответствующих дате рождения, и общее количество дней, соответствующих сегодняшней дате рождения.
потом находим их разность. С помощью trunc выделяем года, месяцы.
Код:

program vozrast;
var
dr,gr,mr,gs,ms,ds:longint;
VosDni1,VosDni2 : real;
EndVosrastDni:longint;
EndVosrastMesaz:longint;
EndVosrastGod:longint;
rasnostDni:real;
begin
writeln('vvedite datu rogdenia dd,mm,gggg');
Readln(dr,mr,gr);
writeln('vvedite segodnzshnuu datu dd,mm,gggg');
readln(ds,ms,gs);
VosDni1:= dr+mr*30+gr*360;
VosDni2:=ds+ms*30+gs*360;
rasnostDni:= VosDni2-VosDni1;

EndVosrastGod := trunc(rasnostDni/360);

rasnostDni:=rasnostDni-EndVosrastGod*360;
EndVosrastMesaz:=trunc(rasnostDni/30);
EndVosrastDni:=trunc(rasnostDni-EndVosrastMesaz*30);
writeln('Dney ',EndVosrastDni,' Mesazev ', EndVosrastMesaz,' Let ',EndVosraacstGod);

readln;
end.


Если же не знаете trunc, то знаете ли вы что на паскале можно писать функции (чтобы сделать свою функцию усечения до целого). Или надо увеличивать код программы, вставляя определение целого прямо в тело программы.
давно
Академик
320937
2216
16.02.2012, 09:55
общий
это ответ
Здравствуйте, Посетитель - 392290! Решение второй задачи двумя способами. PascalABC.Net
Код:
program Pvozrast1;
var
dr, gr, mr, gs, ms, ds, dd, gg, mm:integer;
begin
writeln('Введите дату рождения dd,mm,gg');
Readln(dr,mr,gr);

writeln('Введите сегодняшнюю дату dd,mm,gg');
readln(ds,ms,gs);

gg:= gs-gr;
mm:= ms-mr;
dd:= ds-dr;
if dd<0 then
begin
dd:=dd+30;
mm:=mm-1;
end;

if mm<0 then
begin
mm:=mm+12;
gg:=gg-1;
end;

writeln('Лет ', gg, ' Месяцев ', mm,' Дней ', dd);
readln;
end.

Код:
program Pvozrast2;
var
dr, gr, mr, gs, ms, ds, dd, gg, mm:integer;
drVsego, dsVsego, ddVsego : integer;
begin
writeln('Введите дату рождения dd,mm,gg');
Readln(dr,mr,gr);

writeln('Введите сегодняшнюю дату dd,mm,gg');
readln(ds,ms,gs);

drVsego := (gr*12+mr)*30+dr;
dsVsego := (gs*12+ms)*30+ds;
ddVsego := dsVsego - drVsego;

dd := ddVsego mod 30;
mm := ddVsego div 30 mod 12;
gg := ddVsego div (30*12);

writeln('Лет ', gg, ' Месяцев ', mm,' Дней ', dd);
readln;
end.

Если требуются пояснения, задавайте вопросы в мини-форуме. Удачи!

Неизвестный
16.02.2012, 14:38
общий
это ответ
Здравствуйте, Посетитель - 392290!

1) dec означает просто вычитание 1, эту команду можно заменить на vozrast:=vozrast-1.
2)
Код:
 
var d,m,y,td,tm,ty:integer;
begin
write('Введите текущую дату (yyyy mm dd)');
readln(ty,tm,td);
write('Введите дату рождения (yyyy mm dd)');
readln(y,m,d);
d:=(ty-y)*360+(tm-m)*30+td-d; {Общее количество дней между датами}
y:=d div 360; {Число целых лет}
m:=d mod 360 div 30;{Число целых месяцев оставшихся после выделения целых лет}
d:=d mod 30; {Число целых дней оставшихся после выделения целых лет и месяцев}
writeln('Вам ',y,' лет ',m,' месяцев и ',d,' дней')
end.
Форма ответа