
Не могу написать проверку на високосный/не високосный год для февраля. Пыталась вводить и без
проверки, но даже так февраль не выводится. Вот условие: Напишите программу, которая запрашивает день, месяц, год и осуществляет проверку на корректный ввод данных (даты). Необходимо учитывать количество дней согласно месяцу, високосный/не високосный год. Значение года – четырехзначное положительное число. При вводе некорректных данных – сообщение. Если же дата введена верно, вывести на экран с названием месяца. Например, 9 июля 2021 г. int day, month, year; cout << "Введите день, месяц и год: "; cin >> day >> month >> year; if (year > 0) { if (month <= 12 && month >= 1) { if (day <= 31) { if (day >= 1 || day == 31) switch (month) { case 1: cout << day << " января " << year; break; case 3: cout << day << " марта " << year; break; case 5: cout << day << " мая " << year; break; case 7: cout << day << " июля " << year; break; case 8: cout << day << " августа " << year; break; case 10: cout << day << " октября " << year; break; case 12: cout << day << " декабря " << year; break; default: cout << "Неверный день."; } else if (day >= 1 || day == 30) switch (month) { case 4: cout << day << " апреля " << year; break; case 6: cout << day << " июня " << year; break; case 9: cout << day << " сентября " << year; break; case 11: cout << day << " ноября " << year; break; default: cout << "Неверный день."; } else if (day >= 1 || day == 29 && year %4 ==0 && year%100 !=0) switch (month) { case 2: cout << day << " февраля " << year; break; default: cout << "Неверный день."; } } else cout << "Неверный день."; } else cout << "Неверный месяц."; } else cout << "Неверный год.";

Ответы на вопрос

У тебя конструкция такая:
if(day <= 31) {
if(day >= 1 || day == 31) {
//Январь, март, май, июль, авгус, октябрь, декабрь
} else if(day >= 1 || day == 30) {
// Апрель, июнь, сентябрь, ноябрь
} else if(...) {
// февраль
} else {
//Неверно
}
Если мы вводим правильный день месяца, то мы всегда заходим в первый же if и игнорируем все последующие if-else, поскольку в первый уже зашли. Например, не только 31 января соответствует условию if(day >= 1 || day == 31), но и 2 апреля, и даже 29 февраля. Только все, кто не попал в switch-case внутри первого if, будут выкидывать "неверный день"
Если не слишком переписывать код, то надо заменить конструкции else if на простые if, и убрать внутри default. Но как только мы нашли совпадение, т.е. зашли в одну из веток switch-case и вывели в консоль дату, надо из функции или программы делать return.
А вообще раазумнее и короче было бы сначала проверять введенный месяц, а затем уже проверять, соответствует ли день введенному месяцу. Извини за псевдокод, но так должно быть понятнее:
if год > 0 {
if месяц in (январь, март, май, июль, авгус, октябрь, декабрь) {
if день in 1..31 { // выводим дату } else { // неверный день }
}
else if месяц in (апрель, июнь, сентябрь, ноябрь) {
if день in 1..30 { // выводим дату } else { // неверный день }
}
else if месяц == февраль {
if проверка_на_обычный_год OR проверка_на_високосный год { // выводим дату } else { // неверный день }
}
else { // неверный месяц }
}
else { // неверный год }



bool check_intercalary(int k){
return (k % 4 == 0 && k % 100 != 0) || (k % 400 == 0);
}
signed main(){
map<int, string> u;
u[1] = "января";
u[2] = "февраля";
u[3] = "марта";
u[4] = "апреля";
u[5] = "мая";
u[6] = "июня";
u[7] = "июля";
u[8] = "августа";
u[9] = "сентября";
u[10] = "октября";
u[11] = "ноября";
u[12] = "декабря";
int d, m, y;
cin >> d >> m >> y;
bool ok = true;
if(m == 2 && d > 28 + check_intercalary(y))
ok = false;
else if(((m % 2 == 1 && m < 8) || (m % 2 == 0 && m >= 8)) && d > 31)
ok = false;
else if(d > 30)
ok = false;
if(ok)
cout << d << " " << u[m] << " " << y << " г.";
else
cout << "Неверный ввод";
}



Проблема в вашем коде связана с использованием оператора условия "или" (||
) вместо "и" (&&
) в некоторых частях кода, а также с неправильной проверкой високосного года. Вот исправленный код:
cpp#include <iostream>
using namespace std;
int main() {
int day, month, year;
cout << "Введите день, месяц и год: ";
cin >> day >> month >> year;
if (year > 0) {
if (month >= 1 && month <= 12) {
if (day >= 1 && day <= 31) {
bool isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if ((month == 2 && isLeapYear && day <= 29) || (month == 2 && !isLeapYear && day <= 28)) {
switch (month) {
case 1:
cout << day << " января " << year;
break;
case 2:
cout << day << " февраля " << year;
break;
case 3:
cout << day << " марта " << year;
break;
case 4:
cout << day << " апреля " << year;
break;
case 5:
cout << day << " мая " << year;
break;
case 6:
cout << day << " июня " << year;
break;
case 7:
cout << day << " июля " << year;
break;
case 8:
cout << day << " августа " << year;
break;
case 9:
cout << day << " сентября " << year;
break;
case 10:
cout << day << " октября " << year;
break;
case 11:
cout << day << " ноября " << year;
break;
case 12:
cout << day << " декабря " << year;
break;
default:
cout << "Неверный месяц.";
}
} else {
cout << "Неверный день для февраля.";
}
} else {
cout << "Неверный день.";
}
} else {
cout << "Неверный месяц.";
}
} else {
cout << "Неверный год.";
}
return 0;
}
В этом исправленном коде используются правильные операторы сравнения и проверка високосного года выполняется корректно.


Похожие вопросы
Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili