Всех приветствую!
Задание было дано вот такое:
Необходимо реализовать структуру 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;
}