Помощь - Поиск - Пользователи - Календарь
Полная версия: помогите плиз
Форум «Всё о Паскале» > 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 года, это была суббота, но получается не правильно.
Подкиньте идею плиз
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.