Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с записями
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
shyrik
хм,у меня проблемка есть.странно, но я написал код для проги которая считает количество дней после введённой даты а чтоб было до, не могу только месяцы правельно считает а дни и год нет.помогите исправить чтоб считала до а не после.
вот код проги кот считает после введённой даты:


Код
Program L;
Uses crt;
Type god=record
     mes:1..12;
     den:1..31;
     god1:integer;
end;
Var vek:array[1..255] of god;
i,m,j,c,g:integer;
Begin repeat
ClrScr; c:=0;
with vek[1] do begin
 repeat write('месяц '); c:=c+1; readln(mes); until mes<13;
 repeat write('день '); c:=c+1; readln(den); until den<32;
 write('год'); readln(god1); c:=c+1;
end;
repeat write ('‚введите число'); c:=c+1; readln(m); until m<256;
m:=m+1;
for i:=2 to m do
 with vek[i] do begin
  god1:=vek[i-1].god1;
  mes:=vek[i-1].mes;
  den:=vek[i-1].den+1;
  g:=god1 mod 4;
  case mes of
   1,3,5,7,8,10,12:if den>31 then begin
                    den:=den-31; mes:=mes+1; end;
   2:if g=0 then begin
      if den>29 then begin
       den:=den-29; mes:=mes+1; end;
      end
      else
       if den>28 then begin
        den:=den-28; mes:=mes+1; end;
   4,6,9,11:if den>30 then begin
             den:=den-30; mes:=mes+1; end;
  end;
  if mes>12 then begin
   mes:=mes-12; god1:=god1+1;
  end;
 end;
writeln('************************************');
c:=c+1;
write('*  ');
write(vek[m].den,'.');
case vek[m].mes of
 1:write('января.');   2:write('февраля.');
 3:write('марта.');    4:write('апреля.');
 5:write('мая.');      6:write('июня.');
 7:write('июля.');     8:write('августа.');
 9:write('сентебря.'); 10:write('октебря.');
 11:write('ноября.');  12:write('декабря.');
end;
writeln(vek[m].god1);
gotoxy(36,c+1); writeln('*');
writeln('************************************');
write('Exit(1..9) '); readln(i);
until i<>0;
End.
volvo
Цитата(shyrik @ 7.02.05 21:32)
помогите исправить чтоб считала до а не после.

blink.gif Это что значит?

А вообще-то вот тут есть прекрасный модуль для работы с датами. Посмотри, что непонятно - спрашивай...
Модуль для работы с датами
shyrik
Цитата
Это что значит?

это значит чтоб программа выдаёт дату которая будет через н количество дней,а надо наоборот чтоб выводила до. особенно это касается дней, а то у меня при изменений ниже приведённого кода она выдаёт неправильную дату да ещё с минусом,месяцы же считает нормально,а год ваще не считает.
volvo
По ссылке ходил?
volvo
shyrik
Я поменял логику работы программы...
{ Функция проверки, високосный ли год}
function bsYear(n: Word): Boolean;
begin
bsYear := ((n mod 4) = 0) and
not (((n mod 100) = 0) and ((n mod 400) <> 0))
end;

const
monthes: array[1 .. 12] of integer =
(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
month_name: array[1 .. 12] of string[3] =
('jan', 'feb', 'mar', 'apr', 'may', 'jun',
'jul', 'aug', 'sep', 'oct', 'nov', 'dec');

type
TData =
record
day: 1 .. 31;
month: 1 .. 12;
year: word;
end;

var
current: TData;
from_start_year: longint;
to_sub: integer;

m_ix: integer;
begin
{ Ввод даты }
with current do
begin
repeat write('месяц: '); readln(month) until month <= 12;
repeat write('день: '); readln(day); until day <= monthes[month];
write('год: '); readln(year)
end;

write('сколько дней отнять (до 256): '); readln(to_sub);

from_start_year := 0;
for m_ix := 1 to pred(current.month) do
begin
inc(from_start_year, monthes[m_ix]);
if (m_ix = 2) and bsYear(current.year) then
inc(from_start_year);
end;
inc(from_start_year, current.day);
{ Сейчас в переменной from_start_year хранится
число дней от начала года до введенной даты... }

dec(from_start_year, to_sub);
if from_start_year < 0 then
begin
dec(current.year);
inc( from_start_year, 365 + byte(bsYear(current.year)) )
end;

m_ix := 1;
while from_start_year > monthes[m_ix] do
begin
dec(from_start_year, monthes[m_ix]);
if (m_ix = 2) and bsYear(current.year) then
dec(from_start_year);
inc(m_ix)
end;
current.month := m_ix;
current.day := from_start_year;

with current do
writeln( day, ':', month_name[month], ':', year);

end.

Должно работать... Я ее протестировал на 3-4 значениях (и в одном году, и с переходом в предыдущий). Но мало ли что... Найдешь баги - говори, исправим :yes:
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.