Гид по технологиям

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

4 min read Программирование Обновлено 02 Jan 2026
Проверка високосного года — C++, Python, JavaScript, C
Проверка високосного года — C++, Python, JavaScript, C

Февральский календарь рядом с ноутбуком

Проверить, является ли год високосным, можно простым правилом: год делится на 400 или делится на 4, но не на 100. Ниже — краткое объяснение, примеры и готовые решения на C++, Python, JavaScript и C, а также советы, тесты и случаи, когда правило не применяется.

Год считается високосным, если в нём 366 дней — это нужно, чтобы календарь оставался синхронизированным с астрономическим годом. Часто это проверяют программно для валидации дат и расчёта продолжительности периодов.

Задача

Дано: целое число year. Требуется определить, является ли этот год високосным.

Примеры:

  • Пример 1: year = 2021 -> 2021 не високосный год.
  • Пример 2: year = 1980 -> 1980 високосный год.

Условие для високосного года

Год является високосным, если выполняется хотя бы одно из двух:

  1. Год кратен 400.
  2. Год кратен 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 year

Python: простая реализация

Пример на 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

  1. Тестовые позитивные случаи: 2000, 2012, 1980, 1600 (ожидается true).
  2. Тестовые негативные случаи: 1700, 1800, 1900, 2021 (ожидается false).
  3. Пограничные случаи: отрицательные года или нулевой год (если нужно поддерживать до нашей эры — уточните требования).
  4. Интеграционные: использовать валидацию даты (например, 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.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как вести трекер настроения — руководство
Психическое здоровье

Как вести трекер настроения — руководство

Как отключить службу Windows Installer — 3 способа
Windows

Как отключить службу Windows Installer — 3 способа

Запретить смену значков и тем в Windows
Windows

Запретить смену значков и тем в Windows

MyMonero — лёгкий кошелёк Monero
Криптовалюта

MyMonero — лёгкий кошелёк Monero

Жесты мыши в Vivaldi — быстрый справочник
Браузеры

Жесты мыши в Vivaldi — быстрый справочник

Wahoo RGT — обзор, настройка и советы
Велоспорт

Wahoo RGT — обзор, настройка и советы