Задача. Вычислить количество дней между датами.

Задача простая: Найти количество дней между двумя датами. Предусмотреть учет високосных лет.

Для практики предлагается два варианта:

  1. Одна из граничных дат описывается только годом. То есть начальная дата вводится полностью (например 25.12.2015), а вторая только год (например 2016). Производится подсчет дней до 01.01.2016
  2. Обе даты полные — описываются днем месяцем годом.

Приведу свой пример, частично решающий первый упрощенный вариант:

Здесь функция DaysCount() принимает в первых трех параметрах начальную дату (год, месяц, день) и последним параметром граничную (год, 1-й день января)

Решать можно любым способом, хоть циклом хоть чем-то еще. А вот решение по второму варианту не покажу :) Пусть оно будет домашним заданием. Удачи!

Вопросы задавайте в комментариях

Задача. Вычислить количество дней между датами.: 11 комментариев

  1. Я чуть-чуть поусердствовал и написал всё с защитами, вводом и прочим… Могли бы Вы оценить и прокоментировать мой вариант решения этой задачи:
    #include «stdafx.h»
    #include
    #include

    int main()
    {
    setlocale (LC_ALL,»rus»);
    using std::cout;
    using std::cin;

    double daus_date = 0;
    double month_date = 0;
    double year_date = 0;

    long long daus_date_int = 0;
    long long month_date_int = 0;
    long long year_date_int = 0;

    //——————————————————————————————————————————-
    //Первая дата
    //——————————————————————————————————————————-
    bool choice = false;
    while (choice == false)
    {
    cout <> year_date;
    (long long) year_date_int = year_date;
    if (year_date_int >= 0)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    choice = false;
    }
    }
    system("cls");
    choice = false;
    while (choice == false)
    {
    cout <> month_date;
    (long long) month_date_int = month_date;
    if (month_date_int == 1 || month_date_int == 2 || month_date_int == 3 || month_date_int == 4 || month_date_int == 5 || month_date_int == 6 || month_date_int == 7 || month_date_int == 8 || month_date_int == 9|| month_date_int == 10 || month_date_int == 11 || month_date_int == 12)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    choice = false;
    }
    }
    system("cls");
    choice = false;
    while (choice == false)
    {
    cout <> daus_date;
    (long long) daus_date_int = daus_date;
    switch (month_date_int)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
    {
    if (daus_date_int >= 1 && daus_date_int <= 31)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    switch (month_date_int)
    {
    case 1:
    cout << "В январе 31 день!\n\n";
    break;
    case 3:
    cout << "В марте 31 день!\n\n";
    break;
    case 5:
    cout << "В мае 31 день!\n\n";
    break;
    case 7:
    cout << "В июле 31 день!\n\n";
    break;
    case 8:
    cout << "В августе 31 день!\n\n";
    break;
    case 10:
    cout << "В октябре 31 день!\n\n";
    break;
    case 12:
    cout <= 1 && daus_date_int <= 30)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    switch (month_date_int)
    {
    case 4:
    cout << "В апреле 30 дней!\n\n";
    break;
    case 6:
    cout << "В июне 30 дней!\n\n";
    break;
    case 9:
    cout << "В сентябре 30 дней!\n\n";
    break;
    case 11:
    cout << "В ноябре 30 дней!\n\n";
    break;
    }
    choice = false;
    }
    break;
    }

    case 2:
    {
    if (year_date_int % 4 == 0)
    {
    if (daus_date_int <= 29)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    cout << "В високосном году, в феврале 29 дней\n\n";
    choice = false;
    }
    }
    else
    {
    if (daus_date_int <= 28)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    cout << "В феврале 28 дней\n\n";
    choice = false;
    }
    }
    break;
    }
    }

    }
    system("cls");

    long long one_daus_date = 0;
    long long one_month_date = 0;
    long long one_year_date = 0;

    one_daus_date = daus_date_int;
    one_month_date = month_date_int;
    one_year_date = year_date_int;

    //——————————————————————————————————————————-
    //Вторая дата
    //——————————————————————————————————————————-
    choice = false;
    while (choice == false)
    {
    cout <> year_date;
    (long long) year_date_int = year_date;
    if (year_date_int >= 0)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    choice = false;
    }
    }
    system("cls");
    choice = false;
    while (choice == false)
    {
    cout <> month_date;
    (long long) month_date_int = month_date;
    if (month_date_int == 1 || month_date_int == 2 || month_date_int == 3 || month_date_int == 4 || month_date_int == 5 || month_date_int == 6 || month_date_int == 7 || month_date_int == 8 || month_date_int == 9|| month_date_int == 10 || month_date_int == 11 || month_date_int == 12)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    choice = false;
    }
    }
    system("cls");
    choice = false;
    while (choice == false)
    {
    cout <> daus_date;
    (long long) daus_date_int = daus_date;
    switch (month_date_int)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
    {
    if (daus_date_int >= 1 && daus_date_int <= 31)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    switch (month_date_int)
    {
    case 1:
    cout << "В январе 31 день!\n\n";
    break;
    case 3:
    cout << "В марте 31 день!\n\n";
    break;
    case 5:
    cout << "В мае 31 день!\n\n";
    break;
    case 7:
    cout << "В июле 31 день!\n\n";
    break;
    case 8:
    cout << "В августе 31 день!\n\n";
    break;
    case 10:
    cout << "В октябре 31 день!\n\n";
    break;
    case 12:
    cout <= 1 && daus_date_int <= 30)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    switch (month_date_int)
    {
    case 4:
    cout << "В апреле 30 дней!\n\n";
    break;
    case 6:
    cout << "В июне 30 дней!\n\n";
    break;
    case 9:
    cout << "В сентябре 30 дней!\n\n";
    break;
    case 11:
    cout << "В ноябре 30 дней!\n\n";
    break;
    }
    choice = false;
    }
    break;
    }

    case 2:
    {
    if (year_date_int % 4 == 0)
    {
    if (daus_date_int <= 29)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    cout << "В високосном году, в феврале 29 дней\n\n";
    choice = false;
    }
    }
    else
    {
    if (daus_date_int <= 28)
    choice = true;
    else
    {
    cout << "\nВы ввели недопустивое значение!\n";
    cout << "В феврале 28 дней\n\n";
    choice = false;
    }
    }
    break;
    }
    }

    }
    system("cls");

    long long two_daus_date = 0;
    long long two_month_date = 0;
    long long two_year_date = 0;

    two_daus_date = daus_date_int;
    two_month_date = month_date_int;
    two_year_date = year_date_int;

    //——————————————————————————————————————————-
    //Счёт дней в первой дате
    //——————————————————————————————————————————-
    double counter_daus_one_date = 0;
    for (long long counter = 0; counter < one_year_date; counter++)
    {
    if (counter % 4 == 0 && counter != 0)
    counter_daus_one_date += 366;
    else
    counter_daus_one_date += 365;
    }
    for (short counter = 0; counter <= one_month_date; counter++)
    {
    switch (counter)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
    counter_daus_one_date += 31;
    break;
    case 4:case 6 :case 9: case 11:
    counter_daus_one_date += 30;
    break;
    case 2:
    if (one_year_date % 4 == 0)
    counter_daus_one_date += 29;
    else
    counter_daus_one_date += 28;
    break;
    }
    }
    counter_daus_one_date += one_daus_date;

    //——————————————————————————————————————————-
    //Счёт дней во второй дате
    //——————————————————————————————————————————-

    double counter_daus_two_date = 0;
    for (long long counter = 0; counter < two_year_date; counter++)
    {
    if (counter % 4 == 0 && counter != 0)
    counter_daus_two_date += 366;
    else
    counter_daus_two_date += 365;
    }
    for (short counter = 0; counter <= two_year_date; counter++)
    {
    switch (counter)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
    counter_daus_two_date += 31;
    break;
    case 4:case 6 :case 9: case 11:
    counter_daus_two_date += 30;
    break;
    case 2:
    if (two_year_date % 4 == 0)
    counter_daus_two_date += 29;
    else
    counter_daus_two_date += 28;
    break;
    }
    }
    counter_daus_two_date += two_daus_date;
    //——————————————————————————————————————————-
    //Счёт количества дней между датами
    //——————————————————————————————————————————-

    cout << "Первая дата: ";
    if (one_daus_date < 10)
    cout << '0' << one_daus_date << '.';
    else
    cout << one_daus_date << '.';
    if (one_month_date < 10)
    cout << '0' << one_month_date << '.';
    else
    cout << one_month_date << '.';
    cout << one_year_date << '\n';

    cout << "Вторая дата: ";
    if (two_daus_date < 10)
    cout << '0' << two_daus_date << '.';
    else
    cout << two_daus_date << '.';
    if (two_month_date < 10)
    cout << '0' << two_month_date << '.';
    else
    cout << two_month_date << '.';
    cout << two_year_date << '\n';

    if (counter_daus_two_date < counter_daus_one_date)
    cout << "Количество дней между датами: " << counter_daus_one_date — counter_daus_two_date < counter_daus_one_date)
    cout << "Количество дней между датами: " << counter_daus_two_date — counter_daus_one_date << '\n';
    if (counter_daus_two_date == counter_daus_one_date)
    cout << "Вы ввели две одинаковые даты!" << '\n';
    _getch();
    return 0;
    }

    1. Извините, не знаю как этот код оформить в стиле С++ (как оформлено в рамке Ваше решение).

      1. Нужно обрамить свой код тэгами code:
        [code]
        … здесь ваш код …
        [/code]
        Только вместо квадратных скобок нужно писать угловые (знаки «меньше» и «больше»).

      2. А вот так (без форматирования) записанный ваш пример никто, естественно, даже смотреть не станет…

        С таким же успехом весь ваш код можно записать и в одну строчку вообще (можете проверить, что при этом он ещё и работает).

  2. Вот более культурная версия моего кода:

  3. #include
    using namespace std;

    int main()
    {
    int den,mes,god;
    int den_1,mes_1,god_1;

    cout<<"vvedite pervuy datu"<<endl;
    cout<<"vvedite den"<>den;
    cout<<"vvedite mesyas"<>mes;
    cout<<"vvedite god"<>god;
    cout<<"————————-"<<endl;
    cout<<"vvedite tekushuy datu"<<endl;
    cout<<"vvedite den"<>den_1;
    cout<<"vvedite mesyas"<>mes_1;
    cout<<"vvedite god"<>god_1;
    double k=0;
    int kol_d=0;
    int kol_m=0;
    int kol_g=0;
    int sum_m=0;
    int sum_d=0;

    if(mes_1==1)
    k=31;
    else if(mes_1==2)
    k=28;
    else if (mes_1==3)
    k=31;
    else if (mes_1==4)
    k=30;
    else if (mes_1==5)
    k=31;
    else if (mes_1==6)
    k=30;
    else if (mes_1==7)
    k=31;
    else if (mes_1==8)
    k=31;
    else if (mes_1==9)
    k=30;
    else if (mes_1==10)
    k=31;
    else if (mes_1==11)
    k=30;
    else if(mes_1==12)
    k=31;

    kol_d=k-den;//считаем сколько дней до завершения введённого месяца предидущей даты
    kol_m=12-mes;//сколько месяцев до завершения года
    kol_g=god_1-(god+1);
    sum_d=kol_d+den_1;
    sum_m=kol_m+mes_1;

    cout<<"dney"<<sum_d<<endl;
    cout<<"mes"<<sum_m<<endl;
    cout<<"godov"<<kol_g<<endl;

    return 0;
    }

  4. Не слишком ли замудрили с кодом? Ведь можно все на много проще сделать с классами. Это в конце концов ООП язык а не бейсик какой нибудь.

    1. ООП не панацея и, чаще всего, не упрощает код, но делает его более понятным и упорядоченным. Гораздо проще задачу можно сделать используя библиотечные API языков C или C++. Но только для начинающих полезней показать как алгоритмически производятся вычисления, чем использовать готовые инструменты.

    2. ООП не панацея, и чаще всего не упрощает код, но делает его более понятным и упорядоченным. За счёт чего действительно можно было бы упростить код, так это использовать API библиотек C или C++ для работы с датами. Но для начинающих полезнее демонстрация алгоритмов вычислений, чем использование готовых инструментов.

Добавить комментарий

Код размещайте в тегах: <pre class="lang:c++ decode:true ">YOUR CODE</pre>