Ваша программа очень сложна, потому что вы используете строки для числовых значений и потому, что существует множество тестов без всяких других (если вы знаете, что находитесь в данном месяце, зачем проверять, есть ли вы в других после?).Вы также проверяете pinfo.day < "1"
для всех месяцев, достаточно сделать только один раз.
Есть также некоторые ошибки, такие как
if (pinfo.month == "2" && (pinfo.day > "31" || pinfo.day < "1"))
в февраленикогда не 31 день, и если приведенный выше тест верен и указывает на ошибку в феврале, вы все равно делаете
int number = atoi(pinfo.year.c_str());
if (pinfo.month == "2" && number % 4 == 0)
{
cout << pinfo.year << " -> Leap Year!" << endl;
}
if (pinfo.month == "3" && (pinfo.day > "31" || pinfo.day < "1"))
cout << pinfo.day << "is not a valid day of March" << endl;
, поэтому вы проверяете случай скачка слишком поздно и также проверяете случай Марса (ошибка копирования / вставки, вероятно).
Я рекомендую вам преобразовать день и месяц в числа и иметь массив, содержащий максимально возможное число дней / месяцев в индексе, соответствующем месяцу, а также специальное управлениеза февраль, если вам просто нужно приближение, иначе используйте доступную библиотеку для проверки.
Когда вы печатаете сообщение об ошибке, сбрасывайте его с новой строки, в противном случае следующий отпечаток свернут.
ВыСпособ запустить снова или нет также сложен, и зачем прерывать выход, если последняя строка ввода через getline не пуста?