Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2021, 16:04   #1
CarpenterMaxi92
Новичок
Джуниор
 
Регистрация: 22.04.2021
Сообщений: 1
По умолчанию C++. Проблемы при реализации струкктуры DateTime.

Всех приветствую!
Задание было дано вот такое:
Необходимо реализовать структуру DateTime.
В структуре необходимо реализовать:

Год
Месяц
День
Часы
Минуты
Функции:
Прибавить дни к дате
Вычислить количество дней между датами
Високосный год или нет
Количество дней между датами

Код компилируется и работает, не выдавая ошибок.
НО! Всегда есть НО! И, подозреваю, что вся проблема в расчетах.
Во-первых, если в функционал получения даты от количества дней вводить такой набор, что должно выдать 29.02 какого-либо високосного года, то оно перескакивает на 01.03 этого года (например 28.02.2020 г. + 1 день = 01.03.2020 г.). И также, если просто задавать количество дней, которое содержит в себе 29.02. - то программа его не учитывает (например, 27.02.2020 г. + 4 дня = 03.03.2020 г.).
И во-вторых, более ужасающий меня момент, когда пытается посчитать количество дней между заданными датами, - выдает какую-то белиберду, которая видна невооруженным взглядом.
Кто что заметит в коде не замыленным глазом?
Код:
#include <iostream>
#include <conio.h>
#include <ctime>
#include <iomanip>
#include <cstdlib>
#include <windows.h>
 
using namespace std;
 
int main()
{
setlocale (LC_ALL, "RUS");
 
{
    time_t t;
    time(&t);
    tm *tme = localtime(&t);
    cout << "Текущие время и дата: " << tme->tm_hour << ":" << tme->tm_min << "\n" << tme->tm_mday << "." << tme->tm_mon << "." << tme->tm_year + 1900 << "." << endl;
}
    
    struct DateTime
    {
    int year;
    int month;
    int day;
    int hour;
    int minute;
    };
 
DateTime add; // добавление дней к дате
{
    int sum;
    int daysPerMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    cout << "Введите день, месяц, год через пробелы: ";
    cin >> add.day >> add.month >> add.year;
    cout << "Ваша дата: " << add.day << "." << add.month << "." << add.year << endl;
    cout << "Введите количество дней, которое желаете прибавить: ";
    cin >> sum;
    
    int leap_year(add.year); {
        if (add.year % 400 == 0 || add.year % 100 != 0 && add.year % 4 == 0) {
            cout << "Год високосный!\n";
        }
        else cout << "Год не високосный!\n";
    }
    
    for (int i = 0; i < sum; i++)
    {
        add.day++;
        if (add.day > daysPerMonth[add.month-1] || (add.month == 2 && add.day == 29 && leap_year))
        {
            add.day = 1;
            add.month++;
            if (add.month == 13)
            {
                add.month = 1;
                add.year++;
            }
        }
        if (leap_year && add.month == 2)
        daysPerMonth[2] = {29};
    }
    cout << "Через " << sum << " дней будет: "<< add.day << "." << add.month << "." << add.year << endl;
}
 
DateTime diff; // количество дней между датами
{
    int delta;
    int daysPerMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
    cout << "Введите дату отсчета (день, месяц, год через пробелы): ";
    cin >> add.day >> add.month >> add.year;
    cout << "Ваша дата отсчета: " << add.day << "." << add.month << "." << add.year << endl;
    cout << "Введите конечную дату (день, месяц, год через пробелы): ";
    cin >> diff.day >> diff.month >> diff.year;
    cout << "Ваша конечная дата: " << diff.day << "." << diff.month << "." << diff.year << endl;
    
    bool IsLeapYear(diff.year); {
    bool IsLeapYear = false;
    if (diff.year % 4 == 0) {
        if (diff.year % 100 == 0) {
        if (diff.year % 400 == 0) {
            IsLeapYear = true;
         }
      } 
        else IsLeapYear = true;
    }
    }
    
    if(add.year == diff.year)
    {
        if(add.month == diff.month)
            delta = diff.day - add.day;
        else
        {
            for(int i = add.month; i < diff.month-1;i++)
                delta += daysPerMonth[i];
            delta += daysPerMonth[add.month-1] - add.day + diff.day;
        }
    }
    else
    {
        for(int i = 0; i < diff.month - 1; i++)
            delta += daysPerMonth[i];
        for(int i = add.month; i < 12; i++)
            delta += daysPerMonth[i];
        if(diff.year - add.year >= 0)
            if (IsLeapYear)
            delta += (diff.year - add.year - 1) * 365.25 + daysPerMonth[add.month - 1] - add.day + diff.day;
            else delta += (diff.year - add.year - 1) * 365 + daysPerMonth[add.month - 1] - add.day + diff.day;
    }
    cout << "Количество дней между датами: " << delta << endl;
}
 
DateTime leap; // проверка на високосный год
{
    cout << "Введите любой год для проверки на високосность: ";
    cin >> leap.year;
    
    if (leap.year % 4 != 0)
    {
    cout << leap.year << " - не високосный год!" << endl;
    }
    else if ((leap.year % 100 == 0) && (leap.year % 400 != 0))
    {
    cout << leap.year << " - не високосный год!" << endl;
    }
    else
    {
        cout << leap.year << " - високосный год!" << endl;
    }
}
    getch ();
return 0;
}
CarpenterMaxi92 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы в реализации А* алгоритма поиска пути sdfteh Общие вопросы C/C++ 3 09.01.2017 17:14
Метод простой итерации, ошибка при реализации ИВэТэшка Паскаль, Turbo Pascal, PascalABC.NET 4 05.10.2012 18:05
Мой проект "Учет пациентов",проблемы реализации TasKKiLLeR13 БД в Delphi 5 08.08.2012 23:30
проблема с определением параметра при реализации запроса Margarett Помощь студентам 3 14.03.2010 17:56