Добрый день, уважаемые эксперты! Не могу найти ошибку в программке. Задание следующее: «Переменные y ,m, d имеют смысл год, месяц, день. Переменной t присвоить значение true, если тройка y ,m, d образует правильную дату, и false – в противном случае». Почему-то если ввести неправильную дату (например 34 25 2000), то она все равно выдается на экран (если ввести буквы, то тогда программа работает). Проверку соответствия максимального числа соответствующему месяцу я пока не добавил. Заранее спасибо.
Доброго времени суток, Евгений! Это происходит из-за того, что {$I-} - проверка правильности ввода/вывода. А ошибка должна возникать в связи с превышением диапазона, за это отвечает {$R+} и {$R-}. Но или я не знаю, или нету такой переменной, типа IOResult, для этой директивы. Могу посоветовать одно - вводи день и месяц в переменную типа byte, а потом: if (d<=31) and (m<=12) then t:=true; Ответ отправлен: 26.01.2003, 20:04 Отправитель: X-RayMan Отвечает Ayl
Доброе время суток, Евгений! Можешь, конечно, написать как в Приложении, возложив ответственность за проверку на компилятор. Но, боюсь, что это немного не то, что тебе нужно. Потому что при возникновении ошибки выхода за пределы диапазона программа будет завершена. Поэтому тебе придется, скорее всего, писать проверку самому. Насчет проверки соответствия дня месяца - лучше всего, наверное, использовать массив количества дней в месяце. Соответственно, вся проверка будет выглядить так: t := (m in [1..12]) and (d in [1..dm [m]); где dm - массив дней. При этом немного повозится нужно будет с февралем и високосными годами. Напоминая, что по Григорианскому календарю (современному, новый стиль) год считается високосным, если его номер делится без остатка на 400 или делится на 4, но не делится на 100. Введен с 15.10.1582 года.
Приложение: Ответ отправлен: 27.01.2003, 10:55 Отправитель: Ayl Отвечает hackishD
Доброе время суток, Евгений! Попробуй переменные d, m, y заменить на обычные, скажем integer, а month и day вообще убрать, а проверку сделать, например, такой if (y<1) or (y>3000) then WriteLn('Неправильная дата'); и что-нибудь вроде того. А вообще посмотри приложение. Там описана моя программа, она тебе должна помочь. Удачи.
Приложение: Ответ отправлен: 27.01.2003, 10:56 Отправитель: hackishD Отвечает Tancho
Приветствую Вас, Евгений! Опция компилера $i в твоем случае не годиться. Та опция которая тебе нужна - {$R}. На место {$i-} -> {$R+}, а на место {$i+} -> {$R-}, тогда если индекс месяц вне интервала [1,12], а индекс дня вне [1,31] то прога при выполнений даеть ошибка 'Run-time error 201', но сколко я зная здесь IOresult не годиться. Если все таки надо контролировать дня и месяцу, то я предлагаю тебе немножко модифицировать твоя прогу. Смотри приложение!
Приложение: Ответ отправлен: 28.01.2003, 16:18 Отправитель: Tancho Отвечает Byter
Здравствуйте, Евгений. Дело в том, что типовый предел,которы ты указываешь для месяца и дня может быть превышен,без возникновения иошной ошибки.Если возмешь тип байт и загонешь туда число 256(хотя там максимум 255) , там бедет не 256 ,а 0.Так что лучше проверяй, чтобы месяц и год не превышали допустимые значения. Ответ отправлен: 29.01.2003, 15:26 Отправитель: Byter
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.