Алгоритм программы, подскажите

Юрий, я не совсем понял, а в чём проблема? Программа на запросы 6...11 выводит корректный ответ( не забываем что 3 — лето, 4 — осень ), но вот нет адекватной реакции на 12. В этом признаю, не доглядел :). Исправляюсь:

#include <iostream>
int main()
{
    std::cout << "Enter Mouth number(1-12): \n";
    int n;
    std::cin >> n;
    if ( n >= 12 ) n = 1;
    std::cout << "Your number year time is :" << n / 3 + 1;
}

Ну и соответственно:

#include <iostream>
int main()
{
    std::cout << "Enter Mouth number(1-12): \n";
    int n;
    std::cin >> n;
    if ( n >= 12 ) n = 1;
    switch ( n / 3 + 1 )
    {
        case 1: std::cout << "It is Winter"; break;
        case 2: std::cout << "It is Spring"; break;
        case 3: std::cout << "Is is Summer"; break;
        case 4: std::cout << "It is Autumn"; break;
        default: std::cout << "Fatal error! The operating system will be destroyed!"; break;
    }
}

P.S.: на счёт того кода с кучей if'ов ты был прав :). Я так сильно торопился, что даже не стал проверять на работоспособность, тут и пословица сразу на язык лезет...

Ну здесь ты тоже поторопился

#include <iostream>
int main()
{
    std::cout << "Enter Mouth number(1-12): \n";
    int n;
    std::cin >> n;
    if ( n >= 12 ) n = 1;
    switch ( n / 3 + 1 )
    {
        case 1: std::cout << "It is Winter"; break;
        case 2: std::cout << "It is Spring"; break;
        case 3: std::cout << "Is is Summer"; break;
        case 4: std::cout << "It is Autumn"; break;
        default: std::cout << "Fatal error! The operating system will be destroyed!"; break;
    }
}

0 — зима, n > 12 — тоже зима :)))
porshe do not be hurry:)

На «слабО» — это была явная провокация со стороны Макара. Однако она достигла успеха. И это хорошо. При написании программ надо стремиться писать простой, компактный и эффективный код. А очевидное решение — не всегда лучшее.

Рискну поддержать Макара в начатой им провокации ;)

А слабО решить эту же задачу принципиально иным способом? Пока всё вертится либо вокруг if или switch с полным перечислением номеров (или диапазонов номеров) месяцев, либо вокруг попытки на основании номера месяца вычислить номер сезона с последующим switch.

Для определённости:

  1. пользователь вводит в качестве номера месяца корректное целое число (положительное, отрицательное или 0);
  2. номер месяца, который вводит пользователь: 1 — январь, ..., 12 — декабрь;
  3. программа выводит одну из пяти строк: название сезона (4 строки) или сообщение о некорректном номере месяца (1 строка).

Ну в таком случае предлагаю вот такой код:

#include <iostream>
const char strs[5][7] = { " " ,"Winter", "Spring", "Summer", "Autumn" }; 
int main()
{
    std::cout << "Enter the mouth number:(1-12): ";
    unsigned int n;
    std::cin >> n;
    if ( n == 12 ) n = 1;
    if ( n > 12 || n == 0 ) n == 55;
    if ( n / 3 + 1 >= 1 || n / 3 + 1 <= 4 )     
        std::cout << "Your year time is " << strs[n / 3 + 1];
    else
        std::cout << "Fatal error! OS will be destroyed!";
}

Идея хорошая. Реализация подкачала. Можно ещё проще ))

В общем, я думаю, что не используя конструкций if, if else, swith, while & for, вывод можно организовать в одну строку кода, примерно так

 #include <iostream>

using namespace std;

int main()
{   
    int n, i;
    i = 0;

    cout << "Enter a month (1 - 12): ";
    cin >> n;

    cout << "That's " << ((12 == n || i < n && n < i + 3) ? "winter.\n" :
        ((i + 3) <= n && n < (i + 6)) ? "spring.\n" :
        ((i + 6) <= n && n < (i + 9)) ? "summer.\n" :
        ((i + 9) <= n && n < (i + 12)) ? "autumn.\n" : 
        "unknown month.\n");

    return 0;
}

Прошу прощенья за заморочку с лишней переменной, я думаю так будет лучше

#include <iostream>

using namespace std;

int main()
{   
    int n;

    cout << "Enter a month (1 - 12): ";
    cin >> n;

    cout << "That's " << ((12 == n || 0 < n && n < 3) ? "winter.\n" :
        (3 <= n && n < 6) ? "spring.\n" :
        (6 <= n && n < 9) ? "summer.\n" :
        (9 <= n && n <  12) ? "autumn.\n" : 
        "unknown month.\n");

    return 0;
}

А еще короче слабО? ;)

Череп, выкладывай свой вариант :)))

Реализация подкачала

Ну даже не знаю, как можно ещё проще, присоединяюсь к Юрию, и вот ещё вариант( тот же, только чуть-чуть доделаный )

#include <iostream>
const char strs[5][7] = { "Winter", "Spring", "Summer", "Autumn", "Winter" }; 
int main()
{
    std::cout << "Enter the mouth number:(1-12): ";
    unsigned int n;
    std::cin >> n;
    if ( n <= 12 && n  )    
        std::cout << "Your year time is " << strs[n / 3];
    else
        std::cout << "Fatal error! OS will be destroyed!";
}

P.S.: Юрий, а разве тренарная операция это не тот же if?

Не совсем. Тернарный оператор по производительности лучше чем if, по читабельности — нет.

Тернарный оператор по производительности лучше чем if

Да ладно? :)

У меня было заготовлено целых два варианта. Правда оба эксплуатируют одну и ту же идею. porshe удалось отойти от очевидного решения задачи, и последний вариант был бы правильный, если бы не ошибка в условии if: с отрицательными числами не сработает.

Вариант 1, совсем простой:

#include <iostream>

using namespace std;

const char *winter = "Это зимний месяц.\n";
const char *spring = "Это весенний месяц.\n";
const char *summer = "Это летний месяц.\n";
const char *autumn = "Это осенний месяц.\n";

const char *monmap[] = { winter, winter, spring, spring, spring, summer, summer, summer, autumn, autumn, autumn, winter };

int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Введите номер месяца (1 - 12): ";
    int month;
    cin >> month;

    month--;

    if (month < 0 || month > 11)
        cout << "Такого месяца в году нет.\n";
    else
        cout << monmap[month];

    return 0;
}

Вариант 2. Почти то же самое, что у porshe:

#include <iostream>

using namespace std;

const char *winter = "Это зимний месяц.\n";
const char *spring = "Это весенний месяц.\n";
const char *summer = "Это летний месяц.\n";
const char *autumn = "Это осенний месяц.\n";

const char *seasonmap[] = { winter, spring, summer, autumn, winter };

int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "Введите номер месяца (1 - 12): ";
    int month;
    cin >> month;

    if (month < 1 || month > 12)
        cout << "Такого месяца в году нет.\n";
    else
        cout << seasonmap[month / 3];

    return 0;
}

Ещё обратите внимание, что у меня (в обоих вариантах) в массиве собраны не С-строки, а указатели на С-строки.

Череп, на самом деле в моём коде есть защита от отрицательного значения, там в объявлении переменной стоит unsigned

Да, согласен, защита от отрицательного значения есть. Извини, проглядел.

Так что единственно, что можно подправить в твоём коде — убрать дублирующуюся строку «Winter» из массива. Лучше пусть дублируется адрес строки, но не сама строка.

#include <iostream>
using namespace std;
int main(){
    int n;
    cout << "Введите месяц:";
    cin >> n;
    if((n==12)||(n<3)){
        std::cout << "Зима";
    }
    else if((n>=3)&&(n<6)){
        cout << "Весна";
    }
    else if((n>=6)&&(n<9)){
        cout << "Лето";
    }
    else if((n>=9)&&(n<12)){
        cout << "Осень";
    }
    else
    cout << "Неверное значение";
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.