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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2014, 20:49   #11
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Ну Серж же сказал, что нужно правильно выбрать типы
Poma][a вне форума Ответить с цитированием
Старый 15.02.2014, 21:01   #12
009
Пользователь
 
Регистрация: 09.02.2014
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Ну Серж же сказал, что нужно правильно выбрать типы
что не нравится? У меня ABCPascal, тип integer принимает значения: -2 147 483 648...+2 147 483 647
Имеете ввиду, что неправильно посчитает для годов типа: 220000?
009 вне форума Ответить с цитированием
Старый 15.02.2014, 21:09   #13
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Это Ваш идиотский АБЦ, а в традиционном турбушке и современном, но придерживающимся основных канонов, Фри(без включенного режима совместимости с дельфином) Integer занимает 2 байта.. а не 4, как у Вас..
Poma][a вне форума Ответить с цитированием
Старый 15.02.2014, 21:21   #14
009
Пользователь
 
Регистрация: 09.02.2014
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Это Ваш идиотский АБЦ
во-первых он не мой (прикладываю руку к сердцу и честно клянусь, что к созданию PascalABC не имею никакого отношения)
во-вторых он совсем не идиотский, даже не догадываюсь чем Вам насолил именно АБЦ?
009 вне форума Ответить с цитированием
Старый 15.02.2014, 21:27   #15
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
во-вторых он совсем не идиотский, даже не догадываюсь чем Вам насолил именно АБЦ?
Оо.. я бы тут поспорил..
Вы пробовали химичить с константными массивами? или использовать приведение типов? Или Вы никогда не сталкивались с необъяснимыми ошибками? или никогда у Вас один и тот же код мог то работать, то вылетать?
Poma][a вне форума Ответить с цитированием
Старый 15.02.2014, 21:47   #16
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Да, забавный способ.
А мне нравится такой способ Можно еще прикольней сделать
Код:
d1 = dd+mm*32+yy*385;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.02.2014, 22:34   #17
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

http://www.cyberforum.ru/turbo-pascal/thread250897.html
Код:
uses crt;
type date=record
          gd:integer;
          ms:byte;
          dn:byte;
          end;
function Menshe(dt1,dt2:date):boolean;
begin
Menshe:=(dt1.gd<dt2.gd)or((dt1.gd=dt2.gd)and(dt1.ms<dt2.ms))
      or((dt1.gd=dt2.gd)and(dt1.ms=dt2.ms)and(dt1.dn<dt2.dn));
end;
procedure Vvod(var dt:date;n:byte);
var k:byte;
begin
writeln('Введите дату ',n);
repeat
  write(' Год (1000-2011):');
  readln(dt.gd);
until (dt.gd>=1000)and(dt.gd<=2011);
repeat
  write('  Месяц (1-12): ');
  readln(dt.ms);
until dt.ms in [1..12];
repeat
  k:=0;
  write('  День: ');readln(dt.dn);
  if ((dt.ms in [1,3,5,7,8,10,12])and not(dt.dn in [1..31]))
  or ((dt.ms in [4,6,9,11])and not(dt.dn in [1..30]))
  or ((dt.ms=2)and(dt.gd mod 4=0)and not(dt.dn in [1..29]))
  or ((dt.ms=2)and(dt.gd mod 4<>0)and not(dt.dn in [1..28]))then k:=1;
until k=0;
clrscr;
end;
procedure Vyvod(var dt:date);
begin
if dt.dn<10 then write('0',dt.dn,'.')else write(dt.dn,'.');
if dt.ms<10 then write('0',dt.ms,'.')else write(dt.ms,'.');
write(dt.gd);
writeln;
end;
 
var d1,d2:date;
    n,i,j,im,k:byte;
begin
clrscr;
Vvod(d1,1);
Vvod(d2,2);
write('Первая дата: ');
Vyvod(d1);
write('Вторая дата: ');
Vyvod(d2);
if Menshe(d1,d2)then write('Первая дата раньше')
else write ('Первая дата не раньше');
readln
end.
Simple Date Routines - Набор функций для работы с датами:
Сравнение и сложение дат, номер и имя дня недели, определение високосного года.


calenfun - Функции календарных вычислений. Набор функций для работы с датами и вычислений по календарю.

Определение принадлежности даты диапазону времени

Последний раз редактировалось Alter; 15.02.2014 в 22:37.
Alter вне форума Ответить с цитированием
Старый 17.02.2014, 21:32   #18
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Небольшое замечание к коду предложенному Alter.
В данном коде есть маленькая, но существенная ошибка.
Високосный год - это год, число которого делится на 4, и делится на 400.
Т.е. 1700, 1800, 1900 - не високосные годы, а вот 1600, 2000 - високосные.
В 2100 году в феврале должно быть 28 дней.
Код:
if ((dt.ms in [1,3,5,7,8,10,12])and not(dt.dn in [1..31]))
  or ((dt.ms in [4,6,9,11])and not(dt.dn in [1..30]))
  or ((dt.ms=2)and(dt.gd mod 4=0)and(dt.gd mod 400=0)and not(dt.dn in [1..29]))
  or ((dt.ms=2)and(dt.gd mod 4<>0)and(dt.gd mod 400<>0)and not(dt.dn in [1..28]))then k:=1;
Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 17.02.2014, 22:06   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
Високосный год - это год, число которого делится на 4, и делится на 400.
что значит, "И делится на 400"?! Это неверно. По вашему, 2012 год не был високосным? Или он делился на 400 ?!
Там всё чуть-чуть сложнее.

И, строго говоря, 4000 год не будет являться високосным.

А если уж нужно охватить много столетий, то я беру за основу код (c) TurboPower:
Код:
{*                    OPDATE.PAS 1.21                    *}
{*     Copyright (c) TurboPower Software 1988, 1992.     *}

  function IsLeapYear(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;
на самом деле там всё ещё сложнее... но это даёт вполне допустимую, по крайней мере в ближайшее тысячелетие, точность

p.s. а вообще, мы попали в достаточно удачное стечение столетий,
если брать даты от 1901 года до 2099 (т.е. те года, которые могут рассматриваться в качестве практически приемлиемых), то високосный год определяется банально делением на 4 (если год в этом диапазоне кратен 4-м, то год - високосный).
Так что, решение выше вполне себе допустимо.

Вы только объясните, где в исходном условии задачи написано, что даты нужно при вводе проверять?! Зачем усложнять явно УЧЕБНУЮ задачу и доводить её до уровня серьёзного, надежного, foolproof, полного, ПРАКТИЧЕСКОГО решения?!

Последний раз редактировалось Serge_Bliznykov; 17.02.2014 в 22:08.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.02.2014, 22:45   #20
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Да, тут я поспешил.
Високосный год - год, число которого делится на 4, или год конца столетия, число столетий в котором делится на 4.
Т.е. 1100 - не високосный год.

Правильно было бы выделить столетия, которые должны делиться на 4.
Т.е. год високосный, если:
Код:
((Year Mod 100) = 0) And (((Year Div 100) Mod 4) = 0) Or
((Year Mod 100) <> 0) And ((Year Mod 4) = 0);
Цитата:
И, строго говоря, 4000 год не будет являться високосным.
Когда доживем, тогда и порассуждаем.
Уже были рассуждения по поводу, того когда праздновать начало 21 века. Совсем недавно.
Цитата:
Так что, решение выше вполне себе допустимо.
Тут достаточно посмотреть на это:
Код:
write(' Год (1000-2011):');
  readln(dt.gd);
until (dt.gd>=1000)and(dt.gd<=2011);
Цитата:
Зачем усложнять явно УЧЕБНУЮ задачу и доводить её ...
Так думаю, что и не зачем. Но учащийся все же должен понять, что за простотой постановки задачи скрывается некоторое кол-во сложностей.
Ежели так ставить вопрос, то вообще зачем сравнивать именно даты? Можно сравнивать просто числа, строки, задача то учебная ...

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить по введенным с клавиатуры координатам точки.ДЕЛФИ. Kagero Помощь студентам 0 11.11.2012 01:40
Определить по введенным с клавиатуры координатам точки Kagero Помощь студентам 1 28.10.2012 22:06
Запрос к двум таблицам, одна из них - соотнесение M-K SQL, базы данных 3 13.02.2012 15:57
Написать сортировки массива- прямое включение и шелла, и сравнить какая из них работает быстрее Noiziya Помощь студентам 3 30.12.2010 01:00
Windows 7 какая из них? melomandk Windows 1 26.04.2010 08:13