Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/104: Рейтинг темы: голосов - 104, средняя оценка - 4.87
 Аватар для ZarinZomanu4
10 / 10 / 0
Регистрация: 27.05.2013
Сообщений: 92

По введенным с клавиатуры номеру месяца и дня определить, сколько дней осталось до Нового Года

21.06.2014, 13:48. Показов 19687. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!Написал программу, но как то коряво получилось помогите пожалуйста привести к удобоваримому виду.
Задание:
Напишите программу, которая вводит с клавиатуры номер месяца и день, и определяет, сколько дней осталось до Нового года. При вводе неверных данных должно быть выведено сообщение об ошибке. Считается, что год невысокосный.
Входные данные
Входная строка содержит два целых числа: номер месяца и номер дня в этом месяце.
Выходные данные
Программа должна вывести количество дней, оставшихся до Нового года. Если введены неверные данные, нужно вывести число -1.
Собственно код
C++ (Qt)
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
54
55
56
57
#include <iostream>
using namespace std;
int main ()
{
    int a ,b;
    cin>>a>>b;
    if (b<32 && b>0)
    {
    switch (a)
    {case 1:
    cout<<365-((a*31)-(31-b))<<endl;
            break;
    case 3:
        cout<<365-((2*31+28)-(31-b))<<endl;
            break;
    case 5:
        cout<<365-((3*31+28+30)-(31-b))<<endl;
            break;
    case 7:
        cout<<365-((4*31+28+60)-(31-b))<<endl;
            break;
    case 8:
        cout<<365-((5*31+28)-(31-b))<<endl;
            break;
    case 10:
        cout<<365-((6*31+28+90)-(31-b))<<endl;
            break;
    case 12:
            cout<<365-((7*31+28+120)-(31-b))<<endl;
            break;
    case 4:
            cout<<365-((30+31*2+28)-(30-b))<<endl;
            break;
    case 6:
            cout<<365-((2*30+31*3+28)-(30-b))<<endl;
            break;
    case 9:
            cout<<365-((3*30+31*5+28)-(30-b))<<endl;
            break;
    case 11:
            cout<<365-((4*30+31*6+28)-(30-b))<<endl;
            break;
    case 2:
        if (b<29)
            {cout<<365-((31+28)-(28-b))<<endl;
        break;}
        else
            {cout<<"-1"<<endl;
        break;}
    default:
        cout<<"-1"<<endl;
        break;}
    }
    else 
    cout<<"-1"<<endl;
        return 0;
}
p.s Задача должна решатся через ветвления, но приму любые советы в практике пригодится)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2014, 13:48
Ответы с готовыми решениями:

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

Ввести с клавиатуры номер месяца и день и определить, сколько дней осталось до Нового Года
Напишите программу, которая вводит с клавиатуры номер месяца и день и определяет, сколько дней осталось до Нового Года. При вводе неверных...

Ввести с клавиатуры номер месяца и день и определить, сколько дней осталось до Нового Года
Напишите программу, которая вводит с клавиатуры номер месяца и день и определяет, сколько дней осталось до Нового Года На Cи,желательно с...

8
 Аватар для NanoBreaker
23 / 23 / 10
Регистрация: 11.07.2013
Сообщений: 94
21.06.2014, 16:31
Мне было лень делать дополнительные условия для кол-ва дней в каждом месяце, надеюсь у тебя руки до этого дотянутся = D. Используются фичи C++11.

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
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main(void)
{
    vector<int> months = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int day = 0;
    int month = 0;
 
    cout << "Input day: "; cin >> day;
    cout << "Input month: "; cin >> month;
 
    if ((day < 0 || day > 31) || (month < 0 || month > 12))
    {
        cout << "-1" << endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
 
    int sum = day;
 
    for_each(months.begin(), months.begin() + month - 1, [&sum](int x){ sum += x; });
 
    cout << "Do novogo goda stalosi " << 365 - sum << " dnei(dnea)." << endl;
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 10 минут
Всё, все же сделал правильную проверку, совесть проснулась = D

Используй этот кусок кода, замени тот что в коде на этот, ибо редактировать сообщение уже не могу . . .
C++
1
2
3
4
5
6
    if ((day < 0 || day > months[month - 1]) || (month < 0 || month > 12))
    {
        cout << "-1" << endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
P.S. Ветвления, значит через if,else конструкции, зачем такое извращение? Индийский программистов и так много в мире, больше не надо )
0
 Аватар для ZarinZomanu4
10 / 10 / 0
Регистрация: 27.05.2013
Сообщений: 92
21.06.2014, 16:37  [ТС]
Цитата Сообщение от NanoBreaker Посмотреть сообщение
for_each(months.begin(), months.begin() + month - 1, [&sum](int x){ sum += x; });
а можете это место объяснить?или хотя бы тыкнуть носом где почитать?
0
 Аватар для NanoBreaker
23 / 23 / 10
Регистрация: 11.07.2013
Сообщений: 94
21.06.2014, 16:38
Это лямбда-функция, нововведение в C++11. Очень интересная конструкция, советую использовать и в дальнейшем )
0
 Аватар для ZarinZomanu4
10 / 10 / 0
Регистрация: 27.05.2013
Сообщений: 92
21.06.2014, 16:40  [ТС]
Цитата Сообщение от NanoBreaker Посмотреть сообщение
P.S. Ветвления, значит через if,else конструкции, зачем такое извращение? Индийский программистов и так много в мире, больше не надо )
Да учусь по сайту дистанционной подготовки.Поэтому вот так и получается в условии сказано так, так и делаею, а заодно и узнаю тут как можно сделать по другому и пытаюсь разобраться.
0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
21.06.2014, 17:25
Вариант на Boost.Date_Time
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
 
int main()
{
    using namespace boost::gregorian;
 
    int day;
    int month;
    std::cout << "Input day: ->"; std::cin >> day;
    std::cout << "Input month: ->"; std::cin >> month;
 
    partial_date pd(day, month);
    date today = day_clock::local_day();
    date d = pd.get_date(today.year());
 
    partial_date new_years_day(1, Jan);
    days days_until_year_start = new_years_day.get_date(today.year()+1) - d;
    std::cout << "Days until next Jan 1: " << days_until_year_start.days()
              << std::endl;
 
    return 0;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.06.2014, 18:18
DiffEreD, оооочень сомневаюсь, что ТС будет (сможет) использовать boost. Да и не нужен он для такой простой задачи. Можно конечно заморочиться и посчитать всё вручную (високосные года учесть), но, имхо, достаточно изучить стандартные функции и типы из ctime, чтобы решать подобные задачи.
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
21.06.2014, 18:48
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно конечно заморочиться и посчитать всё вручную (високосные года учесть), но, имхо, достаточно изучить стандартные функции и типы из ctime
так вроде time() учитывает високосные из коробки
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.06.2014, 19:10
gromo, так я обратного и не утверждал. Просто по коду ТС и NanoBreaker вообще стандартные функции для работы с датами не используются. И високосность не учитывается. Хотя можно было бы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.06.2014, 19:10
Помогаю со студенческими работами здесь

Определить, сколько дней осталось от заданного дня до нового года. Проверить программу
Всем здарова! Нужно было написать программу, которая вводит с клавиатуры номер месяца и день, и определяет, сколько дней осталось до Нового...

Напишите программу, которая вводит с клавиатуры номер месяца и день и определяет, сколько дней осталось до Нового Года
Напишите программу, которая вводит с клавиатуры номер месяца и день и определяет, сколько дней осталось до Нового Года. При вводе неверных...

По заданным номеру месяца и дню определить, сколько дней до Нового Года
Напишите программу, которая вводит с клавиатуры номер месяца и день, и определяет, сколько дней осталось до Нового года. При вводе неверных...

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

Определить, сколько дней осталось до Нового года
Напишите программу, в которую передается номер месяца и день. Она должна определить сколько дней осталось до Нового года.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru