Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2011, 00:00   #1
niktim
Пользователь
 
Регистрация: 13.11.2011
Сообщений: 18
По умолчанию Вывести следующий день, по введенной дате (pascal)

Условие: По введенной дате вычислить завтрашний день и вывести на печать.
Ошибка: Неверно считает 28.02.1994
Код:
Код:
type TMonth = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Decem);
     TYear =  1901..2001;
     TDate = record
              day: 1..31;
              month: TMonth;
              year: TYear;
 end;
var Date:TDate;
function IntToMonth(n: integer): TMonth;
begin
 case N of
  1: IntToMonth := Jan;
  2: IntToMonth := Feb;
  3: IntToMonth := Mar;
  4: IntToMonth := Apr;
  5: IntToMonth := May;
  6: IntToMonth := Jun;
  7: IntToMonth := Jul;
  8: IntToMonth := Aug;
  9: IntToMonth := Sep;
  10: IntToMonth := Oct;
  11: IntToMonth := Nov;
  12: IntToMonth := Decem;
 end;
end;
procedure InputDate(var Date: TDate);
 var n: byte;
 begin
   writeln('Введите сегодняшнюю дату.');
   writeln;
   write('Введите день: ');
    repeat
      readln(date.day);
    until date.day in [1..31] ;
   write('Введите месяц числом (1 - январь, 2 - февраль и т. д.): ');
    repeat
      readln(n);
    until n in [1..12] ;
   date.month := IntToMonth(n);
   write('Введите год (от 1901 до 2001): ');
    repeat
      readln(date.year)
    until (date.year >= 1901) and (date.year <= 2001) ;
 end;
procedure PrintMonth(Date: TDate);
 begin
  case Date.month of
   Jan: write(' января ');
   Feb: write(' февраля ');
   Mar: write(' марта ');
   Apr: write(' апреля ');
   May: write(' мая ');
   Jun: write(' июня ');
   Jul: write(' июля ');
   Aug: write(' августа ');
   Sep: write(' сентября ');
   Oct: write(' октября ');
   Nov: write(' ноября ');
   Decem: write(' декабря ');
  end;
 end;
procedure PrintDate(Date: TDate);
 begin
     write(Date.day);
     PrintMonth(Date);
     write(Date.year, ' года.')
 end; 
function IsLeap(year:integer):boolean;
var res:boolean;
 begin
  res:=(year mod 4=0) and (year mod 400 <> 0);
  IsLeap:=res;
 end;
function DaysInMonth(Date:TDate):integer;
 begin
  case Date.month of Feb:
    begin
      if IsLeap(Date.year) then DaysInMonth := 29
                      else DaysInMonth := 28;
    end;
   Apr, Jun, Sep:
    DaysInMonth := 30;
  else DaysInMonth := 31;
  end;
end;
procedure IncDate(var date: TDate);
begin
   inc(Date.day);
   if (Date.day > DaysInMonth(Date)) then  //день завышен
                                         begin
                                          Date.day:= 1;
                                          inc(Date.month);
                                            if ((ord(Date.month)+1) > 12) then //месяц завышен
                                              begin
                                               Date.month:= Jan;
                                               inc(Date.year);
                                              end;
                                        end;
end;
begin
 InputDate(Date);
 writeln;
 write('Сегодня ');
 PrintDate(Date);
 write(' Завтра ');
 IncDate(Date);
 PrintDate(Date);
 readln;
end.

Последний раз редактировалось niktim; 14.11.2011 в 00:09.
niktim вне форума Ответить с цитированием
Старый 14.11.2011, 00:31   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ух ты. Не часто увидишь в первой же созданной теме,
не только чёткое и правильное название темы, но ещё и такой красивый код.
niktim, Браво!!


Теперь по сути вопроса.
Цитата:
Сообщение от niktim
Ошибка: Неверно считает 28.02.1994
А что, собственно, не так?!
Цитата:
Код:
Введите сегодняшнюю дату.

Введите день: 28
Введите месяц числом (1 - январь, 2 - февраль и т. д.): 2
Введите год (от 1901 до 2001): 1994

Сегодня 28 февраля 1994 года. Завтра 1 марта 1994 года.
P.s. Внимание!
Ваша функция определения високосности года написана с ошибкой!
или выкиньте напрочь проверку на делимость на 400 (это неверная поправка, года, которые делятся на 400 - високосные,
это те, которые деляться на 100 - не високосные, но в диапазоне с 1901 по 2001 год эта поправка не работает (2000 год делится на 400, поэтому ВИСОКОСНЫЙ!)),

либо, тогда уже напишите ПРАВИЛЬНЫЙ код:
Код:
  function IsLeap(Year : Integer) : Boolean;
    {-Return True if Year is a leap year}
  begin
    IsLeapYear := (Year mod 4 = 0) and (Year mod 4000 <> 0) and
      ((Year mod 100 <> 0) or (Year mod 400 = 0));
  end;

Последний раз редактировалось Serge_Bliznykov; 14.11.2011 в 00:39.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.11.2011, 00:36   #3
niktim
Пользователь
 
Регистрация: 13.11.2011
Сообщений: 18
По умолчанию

28 февраля 1994 года является високосным числом, т.е. должно быть не 1 марта, а 29 февраля.
niktim вне форума Ответить с цитированием
Старый 14.11.2011, 00:43   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А с чего бы это 1994 високосный?
клик
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.11.2011, 00:48   #5
niktim
Пользователь
 
Регистрация: 13.11.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Код:
  function IsLeap(Year : Integer) : Boolean;
    {-Return True if Year is a leap year}
  begin
    IsLeapYear := (Year mod 4 = 0) and (Year mod 4000 <> 0) and
      ((Year mod 100 <> 0) or (Year mod 400 = 0));
  end;
все-равно, по неизвестной причине, отказывается выдавать 29е число.
niktim вне форума Ответить с цитированием
Старый 14.11.2011, 00:51   #6
niktim
Пользователь
 
Регистрация: 13.11.2011
Сообщений: 18
По умолчанию

Черт, Аватар, спасибо.
Вопрос снят, ошибка уже моя по-глупости)
niktim вне форума Ответить с цитированием
Старый 14.11.2011, 10:07   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Извиняюсь коли может уже даже не нужно, но хотелось бы добавить пару слов.

Код хорош, не спорю, мои грацы Вам, niktim, но напрягают отступы, советую почитать http://www.gunsmoker.ru/2010/07/blog-post.html

Далее, Вы используете оператор in для дней и месяцев, но не для годов, режет-с.
Слегка режет ((ord(Date.month)+1) > 12), лучше бы (ord(Date.month) >= 12)

Мой любимый(частый), наверное, совет начинающим - используйте везде, где можно, константы; кандидаты, как минимум, 31 и 12.

Ну, и на сладкое : datetime routines + F1 (хотя задание, скорее всего, было сделать самому)

Желаю всяческих успехов в программировании и общении на форуме!

Последний раз редактировалось phomm; 14.11.2011 в 10:12.
phomm вне форума Ответить с цитированием
Старый 14.11.2011, 10:41   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от phomm
Ну, и на сладкое : datetime routines + F1 (хотя задание, скорее всего, было сделать самому)
phomm, Вы намекаете на Delphi? А Паскаль тут при чём?
Или я пропустил "сладкое" ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.11.2011, 11:08   #9
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Ой, да ) что-то я про паскаль-топик забыл )) дейттайм рутинс в дельфи
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
День недели по дате Waickem Паскаль, Turbo Pascal, PascalABC.NET 2 14.10.2011 20:39
Создание документа на каждый день с возможностью просматривания по дате vindizel Microsoft Office Excel 9 01.02.2011 09:43
Как создать запрос для высчитывания возраста по введенной дате? La_pus_ya Microsoft Office Access 1 10.04.2010 08:40
по заданной дате вычислить какой день недели. Pascal. Яська Помощь студентам 4 28.01.2009 23:51
спортсмен пробежал 8 км,каждый следующий день он увеличивал дневную норму на 15% elsibell Паскаль, Turbo Pascal, PascalABC.NET 2 08.11.2008 23:05