Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 27.12.2023
Сообщений: 4
1

Дни в определенном месяце

28.12.2023, 10:36. Показов 588. Ответов 9

Author24 — интернет-сервис помощи студентам
В общем, нужно подправить мой код. Честно говоря я не сильно понимаю в чем заключается моя ошибка..

Задача:
Количество дней в месяце
Напишите программу, выводящую количество дней в месяце по заданному номеру месяца и году.

Формат ввода:
На вход программе подается два целых положительных числа: номер месяца (от 1 до 12) и четырёхзначный год.

Формат вывода:
Необходимо вывести одно число — количество дней в заданном месяце.

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
using namespace std;
 
int main() {
    int year, month;
    cin >> month >> year;
 
    if (year % 400 == 0 && year % 4 == 0) {
        if (month % 2 == 0 && month != 2 && month != 8 && month != 10  && month != 12|| month == 9 || month == 11) {
            cout << "30\n";
        }
        else if (month % 2 > 0 && month != 9 && month != 11) {
            cout << "31\n";
        }
        switch (month) {
            case 2:
                cout << "29\n";
                break;
            case 8:
                cout << "31\n";
                break;
            case 10:
                cout << "31\n";
                break;
            case 12:
                cout << "31\n";
                break;
        }
    
    }
    else if (year % 400 > 0 || year % 100 == 0) {
        if (month % 2 == 0 && month != 2 && month != 8 && month != 10  && month != 12|| month == 9 || month == 11) {
            cout << "30\n";
        }
        else if (month % 2 > 0 && month != 9 && month != 11) {
            cout << "31\n";
        }
        switch (month) {
            case 2:
                cout << "28\n";
                break;
            case 8:
                cout << "31\n";
                break;
            case 10:
                cout << "31\n";
                break;
            case 12:
                cout << "31\n";
                break;
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2023, 10:36
Ответы с готовыми решениями:

Распечатать фамилии детей данного детского сада, которые родились в определенном месяце; указать их возраст и группу.
Распечатать фамилии детей данного детского сада, которые родились в определенном месяце; указать их...

Солнечные дни в месяце
помогите написать программу для вывода солнечных дней месяца плиз помогите

Вывести все воскресные дни в текущем месяце
Помогите пожалуйста сделать Вывести все воскресные дни в текущем месяце

Получить кол-во дней в месяце и дни недели
Приветствую. Задумался я над календарем событий на сайте (типа органайзера). Нужно создать массив...

Найти детей, родившихся в определенном месяце
Распечатать фамилии детей данного детского сада, которые родились в определенном месяце; указать их...

9
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
28.12.2023, 11:00 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
if (month == 2)
{
// 28/29
}
else if ((month < 8 && month % 2 == 0) || (month > 8 && month % 2 != 0))
{
// 30
}
else
{
// 31
}
1
0 / 0 / 0
Регистрация: 27.12.2023
Сообщений: 4
28.12.2023, 13:12  [ТС] 3
Попробовал совместить код, все равно пишет, что задача решена неверно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
using namespace std
 
int main() {
    int year, month;
    cin >> month >> year;
    
    if (year % 400 == 0 && year % 4 == 0) {
        if (month == 2) {
        cout << "29\n";
        }
        else if ((month < 8 && month % 2 == 0) || (month > 8 && month % 2 != 0)) {
        cout << "30\n";
        }
        else {
        cout << "31\n";
        }
    }
    else if (year % 400 > 0 || year % 100 == 0) {
        if (month == 2) {
        cout << "28\n";
        }
        else if ((month < 8 && month % 2 == 0) || (month > 8 && month % 2 != 0)) {
        cout << "30\n";
        }
        else {
        cout << "31\n";
        }
    }
}
Мне кажется, что проблема с годами. У меня уже есть готовая программа, которая пишет YES, если год високосный и NO соответственно если не високосный. Вот код программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
int main() {
    int year;
    std::cout << "Напишите год: ";
    std::cin >> year;
 
    if (year % 400 == 0) {
        std::cout << "YES\n";
    } else if (year % 100 == 0) {
        std::cout << "NO\n";
    } else if (year % 4 == 0) {
        std::cout << "YES\n";
    } else {
        std::cout << "NO\n";
    }
}
Легкая.
0
Модератор
2668 / 1787 / 931
Регистрация: 16.10.2013
Сообщений: 5,152
Записей в блоге: 15
28.12.2023, 13:27 4
Лучший ответ Сообщение было отмечено vacation как решение

Решение

Цитата Сообщение от vacation Посмотреть сообщение
Попробовал совместить код
как-то странно вы совместили.
Используйте шаблон из поста #2 и проверку на високосный год делайте только в блоке if (month == 2)
0
случайный прохожий
3021 / 2048 / 623
Регистрация: 20.07.2013
Сообщений: 5,501
28.12.2023, 14:53 5
У меня так получилось (через функцию):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned daysInMonth (int month, int year)
{
  // проверка (можно ее убрать, если она не требуется)
  if (month < 1 || month > 12 || year < 1000 || year > 9999)
    return 0;
 
  if (month != 2)
  {
    bool shift = (month > 7);
    if ((month + shift) % 2)
      return 31;
    return 30;
  }
  else
    if (year % 4 || (!(year % 100) && year % 400))
      return 28;
 
  return 29;
}
0
1037 / 635 / 91
Регистрация: 10.03.2012
Сообщений: 4,274
28.12.2023, 14:56 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
 
int getDaysInMonth(int month, int year) {
    switch(month) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            return 31;
        case 4: case 6: case 9: case 11:
            return 30;
        case 2:
            return isLeapYear(year) ? 29 : 28;
        default:
            return -1;
    }
}
 
int main() {
    int month, year;
    std::cin >> month >> year;
 
    int daysInMonth = getDaysInMonth(month, year);
 
    if (daysInMonth == -1) {
        std::cout << "Некорректный номер месяца." << std::endl;
    } else {
        std::cout << "Количество дней: " << daysInMonth << std::endl;
    }
 
    return 0;
}
1
0 / 0 / 0
Регистрация: 27.12.2023
Сообщений: 4
29.12.2023, 09:04  [ТС] 7
Получился примерно такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
int main() {
    int year, month;
    cin >> month >> year;
    
    if (month == 2) {
        if (year % 400 == 0 && year % 4 == 0)
        cout << "29\n";
        
        else
        cout << "28\n";
    }
        
    else if ((month < 8 && month % 2 == 0) || (month > 8 && month % 2 != 0))
        cout << "30\n";
 
    else
        cout << "31\n";
}
Последняя проверку не проходит..
Миниатюры
Дни в определенном месяце  
0
Модератор
2668 / 1787 / 931
Регистрация: 16.10.2013
Сообщений: 5,152
Записей в блоге: 15
29.12.2023, 09:15 8
Цитата Сообщение от vacation Посмотреть сообщение
Последняя проверку не проходит..
Возможно, надо учесть корректность данных. Например, номер месяца не может быть отрицательным и больше, чем 12. Ну и для года тоже.
0
случайный прохожий
3021 / 2048 / 623
Регистрация: 20.07.2013
Сообщений: 5,501
29.12.2023, 09:18 9
Лучший ответ Сообщение было отмечено vacation как решение

Решение

vacation, проверка на високосность не так делается (у тебя получается, что високосный год раз в 400 лет).
Возможный вариант (который уже был выше в посте №6):
C++
9
        if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
Либо есть проверка на невисокосность в посте №5.

Ну и условие в 16-ой строке кода можно подкорректировать (но это не обязательно).
1
0 / 0 / 0
Регистрация: 27.12.2023
Сообщений: 4
29.12.2023, 09:49  [ТС] 10
Спасибо, я решил! Да, действительно была проблема в проверке на високосный год..
0
29.12.2023, 09:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.12.2023, 09:49
Помогаю со студенческими работами здесь

Написать программу, сообщающую, какие праздничные дни есть в заданном месяце 1991 года
1)Написать программу, сообщающую какие праздничные дни есть в заданном месяце 1991 года. Месяц...

Подсчитать количество дней, которое машина простояла в определенном месяце
Начнем сначала . Опыт работы в МС Аксес у меня довольно скуден, и, как любой новичок, взялся за...

Как часто рождаются люди с определенным именем в определенном месяце
Скачайте файл names.txt. Этот файл содержит список имен и даты рождения. Составьте программу,...

Распечатать фамилии детей детского сада, которые родились в определенном месяце
Распечатать фамилии детей данного детского сада, которые родились в определенном месяце; указать их...

Распечатать фамилии детей детского сада, которые родились в определённом месяце
задание: распечатать фамилии детей дет.сада которые родились в определённом месяце. указать их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru