C/C++

Всем привет. Помогите пожалуйста с задачей на C++

Новый год - один из любимых праздников Вовочки. Только встретив один, он тут же начинает ждать следующий. Узнайте по текущей дате, сколько еще дней придется провести Вовочке в ожидании нового года.

Формат входных данных
С клавиатуры вводится одна строка - сегодняшняя дата в формате "ДД. ММ. ГГГГ".

Формат выходных данных
Выведите одно число - количество дней до нового года.

Примечания
Не забудьте, что год может быть високосным. Високосный - это тот, который делится на 400 или делится на 4, но не делится на 100.

входные данные
31.12.2019
выходные данные
1
входные данные
01.01.2020
выходные данные
366
Rking *****
Rking *****
14
#include <iostream>
#include <string>
#include <cmath>
#include <cstdlib>

using namespace std;

bool vis_year (string data)
{
int i = 0, j = data.length() - 1;
int year = 0;
while (i < 4 && data[j] != '.')
{
year += (data[j] - '0') * pow(10,i);
i++;
j--;
}

if ( year % 400 == 0 || year % 4 == 0 && year % 100 != 0 )
return true;
return false;
}

int get_mon (string data)
{
int i = data.length()-1;
while (data[i] != '.' && i >= 0) i--;
i--; // пропускаем точку.
char mon[5];
int j = 0;
while (data[i] != '.' && i >= 0)
{
j++;
i--;
}
if (j > 2)
{
cerr << "Неверный формат даты." << endl;
return -1;
}
int x;
for (x = 0; x < j; x++, i++)
mon[x] = data[i+1];
mon [j] = '\0';
//cout << "x = " << x << endl;
//cout << "j = " << j << endl;
int mont = atoi(mon);
if (mont < 1 || mont > 12)
{
cerr << "Неверное значение месяца. " << mont << ' ' << mon << endl;
return -2;
}
return mont;
}

int get_day (string data, int mon, bool vis)
{
int x = 0;
char day[5];
while (data[x] != '.' && x < data.length())
{
day[x] = data[x];
x++;
}
day[x] = '\0';
if (x > 2)
{
cerr << "Неверное значение даты. " << endl;
return -1;
}
int day_i = atoi(day);
if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8
|| mon == 10 || mon == 12)
{
if (day_i > 0 && day_i < 32)
return day_i;
}
else if (mon == 4 || mon == 6 || mon == 9 || mon == 11)
{
if (day_i > 0 && day_i < 31)
return day_i;
}
else if (mon == 2)
{
if (vis)
{
if (day_i > 0 && day_i < 30)
return day_i;
}
else
{
if (day_i > 0 && day_i < 29)
return day_i;
}
}
return -2;
}

int main()
{
int days_mon[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int lost = 0; // сколько осталось дней
string data;
cout << "Введите дату: ";
cin >> data;
bool vis = vis_year(data);

int mon = get_mon (data);
if (mon >= 1 && mon <= 12)
{
int day = get_day(data,mon,vis);
if (day > 0 && day < 32)
{
if (vis)
{
if (mon > 2)
{
for(int x = mon; x < 12; x++)
lost += days_mon[x];
lost += days_mon[mon-1] - day;
}
else
{
for(int x = mon; x < 12; x++)
lost += days_mon[x];
lost += days_mon[mon-1] - day + 1;
lost++;
}
}
else
{
for(int x = mon; x < 12; x++)
lost += days_mon[x];
lost += days_mon[mon-1] - day + 1;
}
}
}

cout << lost << endl;

return 0;
}
Дмитрий Май
Дмитрий Май
57 851
Лучший ответ
Rking ***** код работает, но не совсем корректно, если ввести: 29.02.2016, в ответе вместо 306 выведет 307. или 31.12.2000 выводит 0 вместо 1
Дмитрий Май int main()
{
int days_mon[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int lost = 0; // сколько осталось дней
string data;
cout << "Введите дату: ";
cin >> data;
bool vis = vis_year(data);

int mon = get_mon (data);
if (mon >= 1 && mon <= 12)
{
int day = get_day(data,mon,vis);
if (day > 0 && day < 32)
{
if (vis)
{
if (mon > 2)
{
for(int x = mon; x < 12; x++)
lost += days_mon[x];
lost += days_mon[mon-1] - day + 1;
}
else
{
for(int x = mon; x < 12; x++)
lost += days_mon[x];
lost += days_mon[mon-1] - day + 1;
lost++;
}
}
else
{
for(int x = mon; x < 12; x++)
lost += days_mon[x];
lost += days_mon[mon-1] - day + 1;
}
}
}

cout << lost << endl;

return 0;
}