Проблема с датами |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Проблема с датами |
Artem7 |
29.02.2012 15:27
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 54 Пол: Мужской Репутация: 0 |
Написал программу которая по введённой дате находит какое число выпадает на завтра, но вот никак не могу пристроить високосный год почему то проверку на дурака не проходит и выдаёт что 'некорректная дата'
Program data; |
Федосеев Павел |
29.02.2012 15:35
Сообщение
#2
|
Бывалый Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: 8 |
Артем, поищи в википедии статью "юлианская дата".
Идея следующая - каждой дате в истории (три числа) сопоставляется одно число. Если к этому числу прибавить 1 - получается "завтра". Выполнив обратное преобразование - получишь дату в привычном формате - число/месяц/год. Или тебе нужно для учебных целей именно через множественные проверки условий? |
Artem7 |
29.02.2012 18:59
Сообщение
#3
|
Пионер Группа: Пользователи Сообщений: 54 Пол: Мужской Репутация: 0 |
Артем, поищи в википедии статью "юлианская дата". Идея следующая - каждой дате в истории (три числа) сопоставляется одно число. Если к этому числу прибавить 1 - получается "завтра". Выполнив обратное преобразование - получишь дату в привычном формате - число/месяц/год. Или тебе нужно для учебных целей именно через множественные проверки условий? Мне на учебе такое задание дали, и я хочу как бы по своему вот как написал)только нужно доработать Добавлено через 18 мин. Program data; Ну вот чуток по другому но проблема терь в том что проверку не проходит если я введу 29 то первое условие висосного года пройдёт а потом наткнётся на ограниче не весокосного в 28дней и выдаст некоректная дата....((( |
мисс_граффити |
29.02.2012 19:46
Сообщение
#4
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
условие должно выглядеть так:
если (месяц=2) и ((дата>29) или ((дата=29) и (год не високосный))) то дата некорректная а вот високосность года я бы для читаемости посоветовала собрать в одной переменной. хотя изврат. посмотри вот здесь идею: Задачи связанные с календарем. там несколько сложнее за счет того, что дней не 1, а сколько угодно... -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Федосеев Павел |
29.02.2012 19:53
Сообщение
#5
|
Бывалый Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: 8 |
Проблема в неправильной проверке високосности.
Давай введём булевскую переменную Leap и вычислим её сразу после ввода Leap:=((vis1=0) AND (vis2<>0)) OR (vis3=0) Потом используй эту переменную вместо длинного выражения в трёх строчках - должно заработать. Кроме того, пройдись по программе пошаговым отладчиком - увидишь, какое условие проверки корректности "сработало". В данном случае это if (d>28)and(m=2) then writeln('Некоректная дата') else Добавь сюда " AND NOT Leap". Сообщение отредактировано: Федосеев Павел - 29.02.2012 20:03 |
Artem7 |
1.03.2012 5:18
Сообщение
#6
|
Пионер Группа: Пользователи Сообщений: 54 Пол: Мужской Репутация: 0 |
Проблема в неправильной проверке високосности. Давай введём булевскую переменную Leap и вычислим её сразу после ввода Leap:=((vis1=0) AND (vis2<>0)) OR (vis3=0) Потом используй эту переменную вместо длинного выражения в трёх строчках - должно заработать. Кроме того, пройдись по программе пошаговым отладчиком - увидишь, какое условие проверки корректности "сработало". В данном случае это if (d>28)and(m=2) then writeln('Некоректная дата') else Добавь сюда " AND NOT Leap". Вооо спасибо терь заработала))))благодаря вашему условие "AND NOT Leap" Добавлено через 4 мин. Проблема в неправильной проверке високосности. Давай введём булевскую переменную Leap и вычислим её сразу после ввода Leap:=((vis1=0) AND (vis2<>0)) OR (vis3=0) Потом используй эту переменную вместо длинного выражения в трёх строчках - должно заработать. Кроме того, пройдись по программе пошаговым отладчиком - увидишь, какое условие проверки корректности "сработало". В данном случае это if (d>28)and(m=2) then writeln('Некоректная дата') else Добавь сюда " AND NOT Leap". ((vis1=0) AND (vis2<>0)) OR (vis3=0)а это условие не совсем правильное потому что может и делится на цело во vis2 окончательная проверка если нацело делится на 400, т.е (vis1=0) AND ((vis2<>0) OR (vis3=0))т.е должно выполнится что то из них))) |
Федосеев Павел |
1.03.2012 9:50
Сообщение
#7
|
Бывалый Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: 8 |
С моей стороны это уже лишнее сообщение, но добавлю:
в условном выражении можно раскрыть скобки (vis1=0) AND ((vis2<>0) OR (vis3=0))=(vis1=0) AND (vis2<>0) OR (vis1=0) AND (vis3=0), но если (vis3=0), то и (vis1=0), значит (vis1=0) AND (vis3=0)=(vis3=0). Итак, получается (vis1=0) AND ((vis2<>0) OR (vis3=0)) = (vis1=0) AND (vis2<>0)) OR (vis3=0). И, надеюсь, при исправлении ты учёл совет Мисс Граффити Цитата условие должно выглядеть так: если (месяц=2) и ((дата>29) или ((дата=29) и (год не високосный))) то дата некорректная |
Artem7 |
1.03.2012 12:47
Сообщение
#8
|
Пионер Группа: Пользователи Сообщений: 54 Пол: Мужской Репутация: 0 |
С моей стороны это уже лишнее сообщение, но добавлю: в условном выражении можно раскрыть скобки (vis1=0) AND ((vis2<>0) OR (vis3=0))=(vis1=0) AND (vis2<>0) OR (vis1=0) AND (vis3=0), но если (vis3=0), то и (vis1=0), значит (vis1=0) AND (vis3=0)=(vis3=0). Итак, получается (vis1=0) AND ((vis2<>0) OR (vis3=0)) = (vis1=0) AND (vis2<>0)) OR (vis3=0). И, надеюсь, при исправлении ты учёл совет Мисс Граффити Зачем учитывать то?он и без этого условия правильно работает...ну вот доработанный вариант Program data; Сообщение отредактировано: Artem7 - 1.03.2012 13:03 |
Текстовая версия | 29.04.2024 0:18 |