Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик
Статус: Академик
Рейтинг: 9620
∙ повысить рейтинг »
Орловский Дмитрий
Статус: Мастер-Эксперт
Рейтинг: 7034
∙ повысить рейтинг »
lamed
Статус: Академик
Рейтинг: 5794
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Pascal (Паскаль)

Номер выпуска:1231
Дата выхода:19.02.2012, 02:00
Администратор рассылки:Boriss (Академик)
Подписчиков / экспертов:106 / 129
Вопросов / ответов:1 / 4

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


Консультация # 185442:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Вот суть вопроса: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, 01:27
Вопрос задал: Посетитель - 392290 (Посетитель)
Всего ответов: 4
Страница онлайн-консультации »


Консультирует Юдин Евгений Сергеевич (Студент):

Здравствуйте, Посетитель - 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.

Удачи в понимании! smile

Консультировал: Юдин Евгений Сергеевич (Студент)
Дата отправки: 16.02.2012, 03:01
Рейтинг ответа:

НЕ одобряю +1 одобряю!


Консультирует Алексей К. (3-й класс):

Здравствуйте, Посетитель - 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, то знаете ли вы что на паскале можно писать функции (чтобы сделать свою функцию усечения до целого). Или надо увеличивать код программы, вставляя определение целого прямо в тело программы.

Консультировал: Алексей К. (3-й класс)
Дата отправки: 16.02.2012, 06:51
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует lamed (Академик):

Здравствуйте, Посетитель - 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.

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

Консультировал: lamed (Академик)
Дата отправки: 16.02.2012, 09:55
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Neverov (3-й класс):

Здравствуйте, Посетитель - 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.

Консультировал: Neverov (3-й класс)
Дата отправки: 16.02.2012, 14:38
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное