Как проверить, является ли год високосным (C++, Python, JavaScript, C)

Проверить, является ли год високосным, можно простым правилом: год делится на 400 или делится на 4, но не на 100. Ниже — краткое объяснение, примеры и готовые решения на C++, Python, JavaScript и C, а также советы, тесты и случаи, когда правило не применяется.
Год считается високосным, если в нём 366 дней — это нужно, чтобы календарь оставался синхронизированным с астрономическим годом. Часто это проверяют программно для валидации дат и расчёта продолжительности периодов.
Задача
Дано: целое число year. Требуется определить, является ли этот год високосным.
Примеры:
- Пример 1: year = 2021 -> 2021 не високосный год.
- Пример 2: year = 1980 -> 1980 високосный год.
Условие для високосного года
Год является високосным, если выполняется хотя бы одно из двух:
- Год кратен 400.
- Год кратен 4 и при этом не кратен 100.
Этот набор правил — часть григорианского календаря, который действует в большинстве стран с конца XVI века.
Важное: для старых дат до введения григорианского календаря (1582 год и ранее) действовали другие правила (юлианский календарь: просто кратность 4). Если вы работаете с историческими датами, учитывайте календарную систему.
C++: программа для проверки високосного года
Ниже — корректный, готовый к компиляции пример на C++ с функцией isLeapYear и тестовыми годами:
// C++: проверка, является ли год високосным
#include
using namespace std;
bool isLeapYear(int y)
{
// Високосный год: кратен 400 или (кратен 4 и не кратен 100)
return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0));
}
int main()
{
int year1 = 2021;
cout << "Year: " << year1 << endl;
if(isLeapYear(year1))
{
cout << year1 << " is a leap year" << endl;
}
else
{
cout << year1 << " is not a leap year" << endl;
}
int year2 = 2012;
cout << "Year: " << year2 << endl;
if(isLeapYear(year2))
{
cout << year2 << " is a leap year" << endl;
}
else
{
cout << year2 << " is not a leap year" << endl;
}
int year3 = 1980;
cout << "Year: " << year3 << endl;
if(isLeapYear(year3))
{
cout << year3 << " is a leap year" << endl;
}
else
{
cout << year3 << " is not a leap year" << endl;
}
int year4 = 1990;
cout << "Year: " << year4 << endl;
if(isLeapYear(year4))
{
cout << year4 << " is a leap year" << endl;
}
else
{
cout << year4 << " is not a leap year" << endl;
}
int year5 = 1600;
cout << "Year: " << year5 << endl;
if(isLeapYear(year5))
{
cout << year5 << " is a leap year" << endl;
}
else
{
cout << year5 << " is not a leap year" << endl;
}
return 0;
} Вывод этой программы:
Year: 2021
2021 is not a leap year
Year: 2012
2012 is a leap year
Year: 1980
1980 is a leap year
Year: 1990
1990 is not a leap year
Year: 1600
1600 is a leap yearPython: простая реализация
Пример на Python с той же логикой и тестами:
# Python: проверка високосного года
def isLeapYear(y):
# Високосный год: кратен 400 или (кратен 4 и не кратен 100)
return (((y % 4 == 0) and (y % 100 != 0)) or (y % 400 == 0))
year1 = 2021
print("Year:", year1)
if isLeapYear(year1):
print(year1, "is a leap year")
else:
print(year1, "is not a leap year")
year2 = 2012
print("Year:", year2)
if isLeapYear(year2):
print(year2, "is a leap year")
else:
print(year2, "is not a leap year")
year3 = 1980
print("Year:", year3)
if isLeapYear(year3):
print(year3, "is a leap year")
else:
print(year3, "is not a leap year")
year4 = 1990
print("Year:", year4)
if isLeapYear(year4):
print(year4, "is a leap year")
else:
print(year4, "is not a leap year")
year5 = 1600
print("Year:", year5)
if isLeapYear(year5):
print(year5, "is a leap year")
else:
print(year5, "is not a leap year")Альтернативный вариант на Python: использовать модуль datetime для валидации дат (например, пробовать создать 29 февраля), если нужен быстрый чек в прикладном коде.
JavaScript: пример для браузера или Node.js
Пример с функцией isLeapYear. В браузере можно выводить в документ, в Node.js — в консоль.
// JavaScript: проверка високосного года
function isLeapYear(y) {
// Високосный год: кратен 400 или (кратен 4 и не кратен 100)
return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0));
}
var year1 = 2021;
console.log("Year:", year1);
if(isLeapYear(year1)) {
console.log(year1 + " is a leap year");
} else {
console.log(year1 + " is not a leap year");
}
var year2 = 2012;
console.log("Year:", year2);
if(isLeapYear(year2)) {
console.log(year2 + " is a leap year");
} else {
console.log(year2 + " is not a leap year");
}
var year3 = 1980;
console.log("Year:", year3);
if(isLeapYear(year3)) {
console.log(year3 + " is a leap year");
} else {
console.log(year3 + " is not a leap year");
}
var year4 = 1990;
console.log("Year:", year4);
if(isLeapYear(year4)) {
console.log(year4 + " is a leap year");
} else {
console.log(year4 + " is not a leap year");
}
var year5 = 1600;
console.log("Year:", year5);
if(isLeapYear(year5)) {
console.log(year5 + " is a leap year");
} else {
console.log(year5 + " is not a leap year");
}C: реализация с stdio
Пример на C с корректными управляющими символами и той же логикой:
// C: проверка високосного года
#include
#include
bool isLeapYear(int y)
{
// Високосный год: кратен 400 или (кратен 4 и не кратен 100)
return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0));
}
int main()
{
int year1 = 2021;
printf("Year: %d\n", year1);
if(isLeapYear(year1))
{
printf("%d is a leap year\n", year1);
}
else
{
printf("%d is not a leap year\n", year1);
}
int year2 = 2012;
printf("Year: %d\n", year2);
if(isLeapYear(year2))
{
printf("%d is a leap year\n", year2);
}
else
{
printf("%d is not a leap year\n", year2);
}
int year3 = 1980;
printf("Year: %d\n", year3);
if(isLeapYear(year3))
{
printf("%d is a leap year\n", year3);
}
else
{
printf("%d is not a leap year\n", year3);
}
int year4 = 1990;
printf("Year: %d\n", year4);
if(isLeapYear(year4))
{
printf("%d is a leap year\n", year4);
}
else
{
printf("%d is not a leap year\n", year4);
}
int year5 = 1600;
printf("Year: %d\n", year5);
if(isLeapYear(year5))
{
printf("%d is a leap year\n", year5);
}
else
{
printf("%d is not a leap year\n", year5);
}
return 0;
} Когда это правило не подходит
- Исторические даты до введения григорианского календаря (до 1582) контролируются юлианским календарём: там год был високосным просто если кратен 4. При преобразовании дат между календарями требуется конвертация.
- Если датам присвоены локальные календарные системы (например, религиозные или региональные), применяется другая логика.
Альтернативные подходы
- Использовать стандартные библиотеки дат: в Python модуль datetime может бросить исключение при попытке создать 29 февраля не-високосного года; в JavaScript в Date можно сравнить длину февраля.
- Для бизнес-логики хранить даты в ISO-формате и полагаться на проверенные библиотеки вместо самописных проверок.
Мини‑методология: как тестировать функцию isLeapYear
- Тестовые позитивные случаи: 2000, 2012, 1980, 1600 (ожидается true).
- Тестовые негативные случаи: 1700, 1800, 1900, 2021 (ожидается false).
- Пограничные случаи: отрицательные года или нулевой год (если нужно поддерживать до нашей эры — уточните требования).
- Интеграционные: использовать валидацию даты (например, 29 февраля) чтобы поймать логические ошибки.
Критерии приёмки
- Функция возвращает true для всех годов, кратных 400.
- Функция возвращает true для годов, кратных 4 и не кратных 100.
- Функция возвращает false для годов, кратных 100, но не кратных 400.
Инструменты и полезные заметки
- Для быстрой проверки в Python: from datetime import date; try: date(year, 2, 29) — если успешно, год високосный.
- В JavaScript: создать дату new Date(year, 1, 29) и проверить, равна ли возвращённая дата 29 (месяцы нумеруются с 0).
Краткий словарь (1‑строчная справка)
- Високосный год: год с 366 днями, содержит 29 февраля.
- Григорианский календарь: современный гражданский календарь с правилами високосности, описанными выше.
- Юлианский календарь: предшественник, где правило было просто кратность 4.
Риск и смягчение
- Риск: неверная обработка исторических дат. Смягчение: явно указывать календарную систему (григорианская/юлианская) и документировать область допустимых дат.
Короткое резюме
- Правило высокосного года: кратность 400 или (кратность 4 и не кратность 100).
- Для прикладных задач используйте стандартные библиотеки дат, чтобы избежать ошибок при граничных и исторических датах.
Короткий список задач для разработчика
- Написать тесты на граничные случаи.
- Задокументировать поведение для дат до 1582 года.
- При интеграции с БД убедиться, что формат даты согласован.
Если вы хотите, я могу:
- сгенерировать тестовый набор в формате unit-test для Python/JS/C++;
- показать краткий пример использования datetime в Python для проверки 29 февраля;
- предоставить диаграмму принятия решений в формате mermaid.
Похожие материалы
Как вести трекер настроения — руководство
Как отключить службу Windows Installer — 3 способа
Запретить смену значков и тем в Windows
MyMonero — лёгкий кошелёк Monero
Жесты мыши в Vivaldi — быстрый справочник