Биоритмы
Дело в том, что диапазон возможных значений данных типа INTEGER составляет от -32768 до +32767. Средняя продолжительность жизни человека – около 70 лет, т.е. 25550 дней. Это значение еще можно представить в Переменной типа INTEGER, однако часы, минуты и тем более секунды средней продолжительности жизни далеко превышают этот диапазон. Чтобы получить вывод достоверных данных, необходимо расширить диапазон значений целых чисел. Для этого в Турбо Паскале предусмотрен специальный тип данных LONGINT ("длинный" целый), имеющий диапазон значений от -2147483648 до +2147483647 (см. гл. 4).
Поэтому в процедуре WRITEDATES следует предусмотреть вспомогательную переменную этого типа, присвоить ей значение переменной DAYS и уже затем использовать "длинную" переменную для вычисления (и вывода) часов, минут, секунд. В результате начальный вариант процедуры WRITEDATES может быть таким:
Procedure WriteDates (dmin,dmax,days: Integer); {Определение и вывод дат критических дней. Вывод дополнительной информации о количестве прожитых дней, часов, минут и секунд } {---------------------} Procedure WriteDate (text: String; dd: Integer); {Определение даты для дня DD от момента рождения. В глобальных переменных d, m и у имеется текущая дата, в переменной DAYS – количество дней, прошедших от момента рождения до текущей даты.Выводится сообщение TEXT и найденная дата в формате ДД-МЕС-ГГГГ} begin {WriteDate} end; {WriteDate} {---------------------} var LongDays: Longlnt; {"Длинная" целая переменная для часов,минут и секунд } begin {Wri teDates} LongDays: = days; WriteLn('Прошло: ', LongDays,' дней, ', longDays*24, ' часов, ', LongDays*24*60, ' минут, ', LongDays*24*60*60, ' секунд'); WriteDate ('Наименее благоприятный день: ', drain); WriteDate ('Наиболее благоприятный день: ',dmax) end; {WriteDates}
Реализация процедуры WRITEDATE не вызывает особых сложностей:
Procedure WriteDate (text: String; dd: Integer); const Names_of_Monthes: array [1..12] of String [3] = ('янв','фев','мар','апр','мая', 'июн','июл','авг','сен','окт', 'ноя','дек'); var d0,m0,y0,ddd: Integer; begin {WriteDate} d0: = d; m0: = m; y0: = y; ddd: = days; while ddd<>dd do begin inc(d0); {Наращиваем число} if (y0 mod 4 <> 0) and (d0 > Size_of_Month[m0]) or (y0 mod,4=0) and (d0=30) then begin {Корректируем месяц} d0: = 1; inc(m0); if m0 = 13 then {Корректируем год} begin m0: = 1; inc(y0) end end; inc(ddd) end; WriteLn(text,d0,'-',Names_of_Monthes[m0],'-',y0) end; {WriteDate }
Собрав воедино отдельные части, получим полный текст программы (прил.5.2), предназначенной для определения биоритмов.