![]() |
|
Модераторы: bsa |
![]()
|
|
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
Здравствуйте, ниже представленный код рисует календарь. Мне нужно, чтобы при нажатии клавиши влево - показывался предыдущий месяц, вправо - следующий. На kbhit не реагирует, что я делаю не так? Как это исправить?
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Честно, не знаю, что за константы такие KEY_RIGHT и KEY_LEFT...
Зачем так извращаться? Пользуйтесь _getch()...
Ну так у Вас там: Сначала этот iYear введите, а уж потом к kbhit приступайте... По поводу дня недели, можно посмотреть здесь... Добавлено через 7 минут и 47 секунд Да, когда iMonth++ или iMonth-- делаете, не забывайте проверять диапазон 1 <= iMonth <= 12 (изменяя год, если нужно) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| zeitgeistz |
|
||||||||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
Я не заметил, что пишу после
Перед ним написал
и всё это впихнул в бесконечный цикл
только не знаю как два if'a там примирить, если один if, то работает, если два if'а, то работает какой-то один. что я делаю не так?
при таком раскладе: вводим 5 2013, рисуется май, если жмакаем стрелку влево - рисуется апрель, ещё раз влево - март, всё как и надо, но стрелка вправо просто так не работает: нужно нажать enter и потом стрелка вправо сработает, как миновать нажатия enter'а? Это сообщение отредактировал(а) zeitgeistz - 3.5.2013, 20:01 |
||||||||
|
|||||||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Ну это не правильно же... На каждый if свой _getch()??? Вот и приходится жать, чего не поподя...
Добавлено через 3 минуты и 22 секунды Как насчет
? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
Да, Вы правы, теперь стрелки как положено заработали. Сейчас с годом помудрю и отпишусь минут через 15. Только я так и не понял, почему в том случае приходилось enter нажимать перед стрелкой, в чём дело было?
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Трудно сказать с уверенностью, поскольку сами стрелки порождают последовательность { 0xe0, 75/77 }, да ещё и в каждый if было запихнуто по _getch()'у (то есть на каждый if нужно было ввести по своему символу)... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| zeitgeistz |
|
||||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
А что такое 0xe0?
Насчёт года, для стрелки влево дописал
для вправо наоборот. Только для стрелки вправо немного неправильно написал, при переходе на след. год появляется промежуточное пустое окошко с заголовками дней недели, после ещё одной стрелки отрисовывается январь Как от этого избавиться можно?
Это сообщение отредактировал(а) zeitgeistz - 3.5.2013, 21:20 |
||||
|
|||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Ну если уже значение 0 неприемлемо для iMonth, то почему if (iMonth < -1)???
Посмотрел начало кода: Это в корне не верно, если Вы собираетесь показывать календарь и для другого года. У Вас должны быть два набора неизменяемых массивов - для невисокосного года и отдельно для високосного. Соответственно, когда год меняется, нужно определить подходящий набор. Потом. Високосность не определяется простым делением на 4 (например, 1900 год не был високосным), правило сложнее -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
Там для стрелки влево я ещё до Вашего ответа отредактировал, вправо стрелка не так работает, давайте с этим разберёмся, а потом за високосный возьмёмся
|
|||
|
||||
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
Ну чевой там, есть идеи?
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Ну совершенно аналогично:
Почему 0? Ведь месяцы начинаем отсчитывать от 1... Добавлено через 35 секунд Да, лечь спать))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
Ай спасибо большое! Заработало как надо!
Рано ещё спать, високосные криво работают
Это сообщение отредактировал(а) zeitgeistz - 4.5.2013, 14:00 |
|||
|
||||
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
up
|
|||
|
||||
| feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Гм. Я бы поправил всё)))) Первым делом - оформление кода. Вторым - ввёл бы подпрограмму отрисовки месяца календаря:
Тогда программа значительно упроститься и приобретёт более благородный вид. Например:
В-третих, я бы поправил определение дня недели у текущего месяца - оно делается неверно: два смежных месяца не стыкуются друг с другом по дням недели. То есть написал бы dayOfWeek для произвольного месяца-года. В-четвёртых, я бы сразу показывал бы текущий месяц, а ввод произвольного месяца-года убрал бы внутрь цикла. Править текущий код я не могу - ничего в нём не понимаю))) Это сообщение отредактировал(а) feodorv - 4.5.2013, 14:38 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
А как isLeapYear будет выглядеть?
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Так, например:
Добавлено через 1 минуту и 25 секунд Или так... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Смотрю, энтузиазм угас)))
Вот моё видение программы:
Можно сходить к вечному календарю, провериться... Это сообщение отредактировал(а) feodorv - 4.5.2013, 23:56 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| zeitgeistz |
|
||||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
Не угас
Я не сильно долго сиплюсплюсю, поясните пожалуйста, что за штуки такие в
вот это ещё
Я повыше уже спрашивал, Вы, наверно, не заметили, что такое 0xe0? |
||||
|
|||||
| feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
С этим ключевым словом подпрограмма встраивается в код в месте вызова (то есть сколько вызовов, столько раз возникает код данной подпрограммы). Замена #define'а в С (хотя в C тоже можно инлайнить). Без инлайна можно, сильно хуже не будет. Не нравится это ключевое слово - удаляйте... Это бесконечный цикл, аналог while(1){ } или Вашего do{ }while(1); Выглядит попроще, вот и предпочитаю его...
Здесь все внутренние выражения можно опустить, остаются одни точки с запятыми, вот и получается for(;;){ }
Это Вы у Microsoft спросите, не меня:
Взято отсюда. Согласно этому описанию и проводится проверка на 0xe0... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
А можете подробнее рассказать о формулах в dayOfWeek? Тяжело понимается, особенно первая строка внутри скобок
|
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Распишите подробнее:
Что за формула? Вычисляется число дней, прошедших с 1 января 1-го года нашей эры по 1-е число интересующего нас месяца, при том что известно, что 01.01.0001 - это понедельник (сходите в тот же "вечный календарь"). Чему равно число таких дней? Если бы не было поправок на високосность, то просто (year-1)*365 + (число дней от начала года до начала месяца). Потом мы всё равно будем делать %7 (это если, как следует порядочным программистам C/C++, отсчитывать от нуля: 0-понедельник, 1-вторник, ..., 6-воскресенье). Поскольку 365 % 7 = 1, то формула упрощается до безобразия: year-1+yDay (здесь yDay - то самое число дней от начала года до начала интересующего нас месяца, то есть DayForwUniversal[month-1]). (У меня, кстати, неправильно написано year+6 Осталось учесть високосность. Високосным год признаётся, если он без остатка делится на 4, за исключением особых лет, которые делятся на 100, но не делятся на 400 (без остатка). То есть, например, 1600 и 2000 - високосные года, а 1700, 1800, 1900 - не високосные. Сколько же дополнительных високосных дней, случившихся за период с 01.01.0001 по начало текущего года, нужно учесть? Во-первых, високосность текущего года уже учтена, когда определялась переменная DayForwUniversal, следовательно номер текущего года нужно сократить на 1 (например, чтобы для какого-либо месяца 2012 года не учитывать ещё раз високосность этого 2012 года): И уже потом добавим число лет, делящихся на 4 без остатка: Но из этого числа нужно вычесть года, чьи последние две цифры - нули: Однако, делящиеся на 400 нужно оставить, получается полная формула: Ну а потом определяем день недели путём %7 (это в измерении 0-понедельник, 1-вторник, ..., 6-воскресенье). Чтобы перевести это в измерение 1-понедельник, 2-вторник, ..., 7-воскресенье (как у Вас), нужно добавить единицу: Получаем день недели 1-го числа интересующего нас месяца интересующего нас года (из расчёта 1-понедельник, 2-вторник, ..., 7-воскресенье) Добавлять к weekDay значение понедельника (то есть 0) не обязательно))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
Потрясающе, спасибо большое, как прозрел)
А возможно ли как-то реализовать выделение другим цветом праздничных дней? |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Можно, через SetConsoleTextAttribute, но зачем? Тогда придётся придётся и праздничные дни выделять красным, а в России праздники непостоянны... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| zeitgeistz |
|
|||
|
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 36 Регистрация: 23.4.2013 Репутация: нет Всего: нет |
Ладно, закончим на этом, спасибо большое за помощь
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |