C/C++

ПОМОГИТЕ ПО ПРОГРАММИРОВАНИЮ!! C++

Написать программу, содержащую функцию NextDate(D, M, Y), которая по информации о правильной дате, включающей день D, номер месяца M и год Y, определяет следующую дату
#include <iostream>

using namespace std;
bool is_visokos_year(int Y)
{
return (Y % 4 == 0 && (Y % 100 != 0 || Y % 400 == 0)) ? true : false;
}

int main()
{
int days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31,
30, 31, 30, 31};
bool visokos = false;
int D,M,Y;
cout << "Введите день: ";
cin >> D;
cout << "Введите номер месяца: ";
cin >> M;
cout << "Введите год: ";
cin >> Y;
visokos = is_visokos_year(Y);
// Сначала идёт проверка введенной даты.
if (M < 1 || M > 12)
{
cerr << "Неверное значение месяца." << endl;
return 1;
}
if (visokos)
{
if (M == 2)
{
if (D < 1 || D > 29)
{
cerr << "Неверно указан день." << endl;
return 1;
}
}
else if (D < 1 || D > days_in_month[M-1])
{
cerr << "Неверно указан день." << endl;
return 1;
}
}
else
{
if (D < 1 || D > days_in_month[M-1])
{
cerr << "Неверно указан день." << endl;
return 1;
}
}

// Рассчитываем следующую дату.
if(visokos && M == 2)
{
if(D == 29)
{
D = 1;
M++;
}
else
{
D++;
}
}
else if (D == days_in_month[M-1])
{
D = 1;
M++;
if (M > 12)
{
M = 1;
Y++;
}
}
else
{
D++;
}

// Все расчёты закончены. Выводин результат -- новую дату.
if (D < 10)
cout << '0' << D << '.';
else
cout << D << '.';
if (M < 10)
cout << '0' << M << '.';
else
cout << M << '.';
cout << Y << endl;

return 0;
}
Виталий Мошкаренко
Виталий Мошкаренко
81 676
Лучший ответ
Владимир Ушаков Поздравляю, задача действительно решена.

Код показывает, что Вы не сильны в процедурном программировании.
Зачем многократно повторять один и тот же алгоритм?
Владимир Ушаков   ✓ Вероника, правда, автор ответа пропустил объявление функции NextDate(). Придётся заняться инкапсуляцией кода.

   Код, подлежащий инкапсуляции в функции NextDate, начинается с комментария « // Рассчитываем следующую дату. » и заканчивается над комментарием « // Все расчёты закончены. Выводим результат -- новую дату ».

Предполагаемый заголовок функции:

void NextDate (int& D, int& M, int& Y)
Виталий Мошкаренко В функции нужно было использовать указатели:
void NextDate (int& D, int& M, int& Y, bool visokos)
{
if(visokos && (*M) == 2)
{
if((*D) == 29)
{
(*D) = 1;
(*M)++;
}
else
{
(*D)++;
}
}
else if ((*D) == days_in_month[(*M)-1])
{
(*D) = 1;
(*M)++;
if ((*M) > 12)
{
(*M) = 1;
(*Y)++;
}
}
else
{
(*D)++;
}
}

и вызывать её в main() так:
NextDate (D, M, Y, visokos);
Владимир Ушаков Мм… мда-а-а…

Всё-таки очевидно, что Вы не сильны в процедурном программировании.

Неужели стоило столько писать-трудиться??? Нельзя унифицировать функцию ввода?

Плюс самоуверенность… мдаа…
Владимир Ушаков Для високосного февраля можно всего один раз увеличить число дней (в массиве), после чего и не вспоминать об отличии високосного года от обыкновенного.
Владимир Ушаков • Вариант: вводить все три числа в одной строке и проверять их вместе.
Владимир Ушаков • Вот, что позволяет весь вывод сделать в одну строку:

   В заголовок добавляем две строки:
#include <iomanip>
#define MILF setw(2) << setfill('0')

   В блоке вывода:
cout << MILF << D << '.' << MILF << M << '.' << Y;

• И никаких if.
   Самое сложное в этой задаче — определение високосности.

   Тут не только основной признак: Y % 4 == 0, но и дополнительный критерий Y % 100 == 0, который в свою очередь отсылает к проверке условия Y % 400 == 0. Вот что должно приводить к корректировке числа дней в феврале.

   Всё остальное — тупая рутина.
Роман Щербина
Роман Щербина
16 172