1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Составить программу отражения биоритмов человека на заданный интервал времени. Известно, что физическое, эмоциональное и умственное состояния изменяются со дня рождения циклически с периодом 23, 28, 33 дня соответственно. Состояние для Д-го дня со дня рождения определятся по формуле: y=sin(x1), где x1=(Д/Р - [Д/Р])*2П при P=23,28,33.
[Д/Р] - целая часть от деления
C биоритмами ранее сталкивать не приходилось. Пыталась разобраться, но всё тщетно.
procedure iDates(var d0, m0, y0, d, m, y, dd1, dm1, dy1, dd2, dm2, dy2: integer); var isCorr: boolean;
procedure rDate(wel: string; var d, m, y: integer); const ymin = 1800; ymax = 2200; begin repeat Write('Введите ' + wel + ' в формате ДД ММ ГГГГ: '); ReadLn(d, m, y); isCorr := (y >= ymin) and (Y <= ymax) and (m >= 1) and (m <= 12) and (d > 0);
if isCorr then if (m = 2) and (d = 29) and (y mod 4 = 0) then {foo bar, ибо этого дня не существует..} else isCorr := d <= Size_of_Month[m]; if not isCorr then WriteLn('Ошибка в дате'); until isCorr; end;
begin repeat rDate('дату рождения', d0, m0, y0); rDate('текущую дату', d,m,y); {test for corr. input} isCorr := y > y0; if not isCorr and (y = y0) then begin isCorr := m > m0; if not isCorr and (y = y0) then begin isCorr := m > m0; if not isCorr and (m = m0) then isCorr := d >= d0; end; end; until isCorr; rDate('начальную дату диапазона поиска', dd1, dm1, dy1); rDate('конечную дату диапазона поиска', dd2, dm2, dy2); end;
procedure getDays (d0, m0, y0, d, m, y: integer; var days: integer);
Procedure mLoop; var mm: integer; begin mm := m0; while mm < m do begin days := days + Size_of_Month[mm]; if (mm = 2) and (y0 mod 4 = 0) then inc(days); inc(mm); end; end;
procedure ymLoop; var mm, yy: integer; begin mm := m0 + 1; while mm <= 12 do begin days := days + Size_of_Month[mm]; if (mm = 2) and (y0 mod 4 = 0) then inc(days); inc(mm); end; yy := y0 + 1; while yy < y do begin days := days + 365; if yy mod 4 = 0 then inc(days); inc(yy); end; mm := 1; while mm < m do begin days := days + Size_of_Month[mm]; if (y mod 4 = 0) and (mm = 2) then inc(days); inc(mm); end; end;
begin if (y = y0) and (m = m0) then
days := d - d0 else begin days := d + Size_of_Month[m0] - d0; if (y0 mod 4 = 0) and (m0 = 2) then inc(days); if y = y0 then mLoop else ymLoop; end;
end;
procedure parseGraph(d0, m0, y0, dmin, dmax: integer); const pPhisics = 2*3.1416/23.6884; pEmo = 2*3.1416/28.4261; pIntellect = 2*3.1416/33.1638; var dall, dcurr, i: integer; rP, rE, rI: real; begin dall := dmax - dmin; if dall < 0 then begin WriteLn('Ошибка: Начальная точка периода привышает конечную.'); end; for i := 0 to dall do begin dcurr := dmin + dall; rP := sin(dcurr * pPhisics); rE := sin(dcurr * pEmo); rI := sin(dcurr * pIntellect); write(' ['); write(rP); write(' | '); write(rE); write(' | '); write(rI); write('] '); end end;
BEGIN { main proc. } SplashScreen; iDates(d0, m0, y0, d, m, y, dd1, dm1, dy1, dd2, dm2, dy2); getDays(d0, m0, y0, d, m, y, days); getDays(d0, m0, y0, dd1, dm1, dy1, dmin); getDays(d0, m0, y0, dd2, dm2, dy2, dmax); parseGraph(d0, m0, y0, dmin, dmax); read(tstr);