5.5. Определение номера дня в году
5.5. Определение номера дня в году
Проблема
Требуется определить номер дня в году. Например, 1 января — это первый день в году, 5 февраля это 36-й день в году, и так далее. Но так как некоторые годы — високосные, то после 28 февраля указанный день может иметь не такой же номер, как и в другие годы.
Решение
Решение этой проблемы требует одновременного решения сразу нескольких проблем. Во-первых, требуется знать, сколько дней в каждом месяце, что в свою очередь требует определить, является ли год високосным. Пример 5.9 содержит процедуры, выполняющие эти вычисления.
Пример 5.9. Процедуры, определяющие номер дня в году
#include <iostream>
using namespace std;
enum MonthEnum {
jan = 0, feb = 1, mar = 2, apr = 3, may = 4, jun = 5,
jul = 6, aug = 7, sep = 8, oct = 9, nov = 10, dec = 11
};
bool isLeapYear(int y) {
return (y % 4 == 0) && ((y % 100 != 0) || (y % 400 == 0));
}
const int arrayDaysInMonth[] = {
31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
int n;
int arrayFirstOfMonth[] = {
n = 0,
n += arrayDaysInMonth[jan],
n += arrayDaysInMonth[feb],
n += arrayDaysInMonth[mar],
n += arrayDaysInMonth[apr],
n += arrayDaysInMonth[may],
n += arrayDaysInMonth[jun],
n += arrayDaysInMonth[jul],
n += arrayDaysInMonth[aug],
n += arrayDaysInMonth[sep],
n += arrayDaysInMonth[::oct],
n += arrayDaysInMonth[nov]
};
int daysInMonth(MonthEnum month, int year) {
if (month == feb) {
return isLeapYear(year) ? 29 : 28;
} else {
return arrayDaysInMonth[month];
}
}
int firstOfMonth(MonthEnum month, int year) {
return arrayFirstOfMonth[month] + isLeapYear(year);
}
int dayOfYear(MonthEnum month, int monthDay, int year) {
return firstOfMonth(month, year) + monthDay - 1;
}
int main() {
cout << "1 июля 1971 г. был " << dayOfYear(jul, 1, 1971);
cout << днем года" << endl;
}
Программа из примера 5.9 выводит следующее.
1 июля 1971 г. был 181 днем года
Обсуждение
Код примера 5.9 довольно прост, но содержит набор полезных функций для работы с датами в високосных годах. Обратите внимание, что я отбросил подход, который я называю «задокументируй и молись», использованный в предыдущих рецептах. Под этим я подразумеваю, что месяцы больше не представляются индексами, вместо которых используются перечисления. Это значительно снижает вероятность программистской ошибки при передаче месяца в функцию в качестве ее аргумента.
Вычисление високосного года, показанное в примере 5.9, выполняется в соответствии с современным григорианским календарем. Каждый четвертый год — високосный, за исключением каждого сотого, если он не делится на 400 (т.е. 1896 год был високосным, 1900 не был, 2000 был, 2004 был, 2100 год не будет).
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
День рождения 365 раз в году
День рождения 365 раз в году Метки: темы блога, вниманиеЕсли ваш блог читает не слишком много людей, то поздравить каждого из них с днем рождения вам будет нетрудно, зато вы сделаете им приятно. Если у блога аудитория большая, задача усложняется, особенно без специальных
7.9. Определение порядкового номера дня в году
7.9. Определение порядкового номера дня в году Порядковый номер дня в году иногда еще называют юлианской датой, хотя это не имеет прямого отношения к юлианскому календарю, давно вышедшему из употребления. Многие считают, что такое название неправильно, поэтому мы им больше
7.11. Определение недели в году
7.11. Определение недели в году Что такое «порядковый номер недели», не вполне ясно. Разные компании, коалиции, правительственные учреждения и органы стандартизации по-разному определяют это понятие. Путаница связана с тем, что год может начинаться с любого дня недели. Все
Почему не будет в России никакого экономического кризиса в 2014 году Сергей Голубицкий
Почему не будет в России никакого экономического кризиса в 2014 году Сергей Голубицкий Опубликовано 09 января 2014 Первый «Битый Пиксель», запланированный ещё в разгар общенародного праздничного безделья, я собирался посвятить самой актуальной и
Биологическая обувь, которую мы будем носить в 2050 году Николай Маслухин
Биологическая обувь, которую мы будем носить в 2050 году Николай Маслухин Опубликовано 13 декабря 2013 Лондонский дизайнер и исследователь Шамиз Аден представил совместную с профессором Мартином Хантсичем из Университета Южной Дании работу —
Была ли общая теория относительности подтверждена в 1919 году Дмитрий Вибе
Была ли общая теория относительности подтверждена в 1919 году Дмитрий Вибе Опубликовано 17 ноября 2013 Начало ноября 2013 года ознаменовалось солнечным затмением, полоса которого пересекла Атлантику и ступила на африканский континент на территории
Компьютерра №33 (605) Тема номера: Выставки ТЕМА НОМЕРА SIGGRAPH 2005
Компьютерра №33 (605) Тема номера: Выставки ТЕМА НОМЕРА SIGGRAPH 2005 В начале августа в Лос-Анджелесе прошла выставка SIGGRAPH 2005. Полное название этого мероприятия звучит следующим образом: 32-я Международная конференция по компьютерной графике и интерактивным технологиям
Кому достались Нобелевские премии в 2010 году Алла Аршинова
Кому достались Нобелевские премии в 2010 году Алла Аршинова Опубликовано 12 октября 2010 года В 1895 году изобретатель динамита и обладатель огромного состояния Альфред Бернхард Нобель написал в своем завещании: «Все мое движимое и недвижимое имущество
Платформа ПК: чего ждать в 2011 году Олег Нечай
Платформа ПК: чего ждать в 2011 году Олег Нечай Опубликовано 21 декабря 2010 года Накануне каждого нового года маркетологи компьютерных компаний убеждают нас, что грядущий год обещает стать переломным для индустрии высоких технологий. Эти прогнозы
В 2011 году каждый сможет обзавестись флаером Михаил Карпов
В 2011 году каждый сможет обзавестись флаером Михаил Карпов ОпубликованоМихаил Карпов Представители компании Terrafugia объявили о готовности начать серийное производство «летающих автомобилей», которые уже находятся в разработке в течение
Google Instant придумали в Yahoo в 2005 году Михаил Карпов
Google Instant придумали в Yahoo в 2005 году Михаил Карпов ОпубликованоМихаил Карпов 8 сентября 2010 года в поиске Google появилась новая возможность — мгновенная выдача результатов поиска в то время, когда пользователь продолжает его вводить. Поисковик также
Экспорт софта в 2013 году десятикратно обогнал экономику! Михаил Ваннах
Экспорт софта в 2013 году десятикратно обогнал экономику! Михаил Ваннах Опубликовано 27 января 2014 Посмотришь отечественные телеканалы — и складывается печальная картина; впору с искажённым лицом бежать к пруду… Официоз радостно как-тосообщает,
Будет ли в российских автомобилях доступ в интернет к 2020 году? Степан Чижов
Будет ли в российских автомобилях доступ в интернет к 2020 году? Степан Чижов Опубликовано 28 июня 2013 Прошло уже более 80 лет с момента выхода романа Ильфа и Петрова «Золотой телёнок», однако лозунг «Автомобиль – не роскошь, а средство передвижения»
Инфографика от HTC объясняет, почему ваш Android-смартфон вряд ли обновится в следующем году Николай Маслухин
Инфографика от HTC объясняет, почему ваш Android-смартфон вряд ли обновится в следующем году Николай Маслухин Опубликовано 31 декабря 2013 Одна из главных проблем Android как системы — невозможность для большинства телефонов получить обновление до
Роуминг отменят в 2013 году Максим Букин
Роуминг отменят в 2013 году Максим Букин Опубликовано 05 февраля 2013Переступая всего лишь административные границы между соседними регионами страны мы сразу «попадаем на деньги» — исходящие/входящие вызовы на телефон становятся ощутимо дороже. Отменить этот «налог на