Помощь - Поиск - Пользователи - Календарь
Полная версия: помогите плиз
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Client
М
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
- klem4


Дана дата, есди она правильная то выдать дату, которая была К дней назад.
если было бы вперед на к дней то ото было бы легче, а здесь...
пробовал сам ... результат не совпадает иногда на 2 иногда 1или 3 дня
пробовал менять условие, еще хуже.
uses crt;
var
den,den2,mes,mes2,dmax,mmax:byte;
god,k:integer;
begin
clrscr;
write(' Vvedite den ');
readln(den);
write(' Vvedite mes ');
read(mes);
write(' Vvedite god ');
read(god);
case mes of
1,3,5,7,8,10,12: dmax:=31;{определяю макс дату}
4,5,9,11: dmax:=30;
2: if god mod 4=0 then
dmax:=29
else
dmax:=28;
else;
end;
if (den in[1..dmax]) and (mes in[1..12]) and (god>0) then
writeln(' Data OK')
else
begin
writeln(' Data NO');
readkey;
halt
end;
write(' Vvedite k ');
read(k);
mes2:=mes-1;
repeat
if k> den then
begin
case mes2 of
1,3,5,7,8,10,12: dmax:=31; {макс дата предыдущ месяца}
4,6,9,11: dmax:=30;
2: if god mod 4=0 then
dmax:=29
else
dmax:=28;
else;
end;
if mes2=1 then
begin
mes2:=12;
dec(god)
end
else
dec(mes2);
k:=k-den;
den:=dmax;
end
until k<den;
den:=den - k;
writeln(' ',den,':',mes,':',god);
readkey
end.

Заранее большое спасибо)
volvo
Цитата
было бы вперед на к дней то ото было бы легче
Чем? Метод решения один и тот же: подсчитать номер дня в году для текущей даты, отнять (или прибавить K дней), и подсчитать по номеру нового дня его дату...

У тебя в программе по меньшей мере одна ошибка - в вычислении високосности года... Того, что ты сделал недостаточно. Ищи по форуму, корректная функция IsLeap уже выкладывалась.
Client
вот вроде решил)
volvo
Цитата
вроде решил)
И что это такое? Она ж у тебя даже не компилируется нормально (ну, допустим, TP ее компилирует без ошибок, но это не значит, что тут:

Цитата
     case mes of
1,3,5,7,8,10,12: dmax:=31;
4,5,9,11: dmax:=30;
2: if god mod 4=0 then
dmax:=29
else
dmax:=28;
else;
end;

нет ошибки... Пятерка присутствует в двух метках)

И с високосностью года ты проблему не решил... Вот так она определяется:
function isLeap(n: word): boolean;
begin
isLeap := ((n mod 4) = 0) and
not (((n mod 100) = 0) and ((n mod 400) <> 0))
end;
Как результат - программа кажется работающей, но первая же более глубокая проверка выявит баги...
Client
насчет пятерки-опечатка))
вот исправлено
(вообщем то результат правильный я не нашел ошибки на примерах)
если ее так сдавать она не слишком "навороченная"?
Client
были найдены глюки... и теперь они иправлены.
дату проверял до 2000 дней с интервалами по 50 дней
теперь работает идеально
даже если год до нашей эры
Спасибо volvo за идею!!!
Client
А как можно определить какой день недели будет через К дней назад?
Пробовал сделать по отношению к 1.1.2000 года, это была суббота, но получается не правильно.
Подкиньте идею плиз
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.