Юрий, я не совсем понял, а в чём проблема? Программа на запросы 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.
Для определённости:
пользователь вводит в качестве номера месяца корректное целое число (положительное, отрицательное или 0);
номер месяца, который вводит пользователь: 1 — январь, ..., 12 — декабрь;
программа выводит одну из пяти строк: название сезона (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: с отрицательными числами не сработает.
Череп, на самом деле в моём коде есть защита от отрицательного значения, там в объявлении переменной стоит unsigned
Череп
Да, согласен, защита от отрицательного значения есть. Извини, проглядел.
Так что единственно, что можно подправить в твоём коде — убрать дублирующуюся строку «Winter» из массива. Лучше пусть дублируется адрес строки, но не сама строка.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Юрий, я не совсем понял, а в чём проблема? Программа на запросы 6...11 выводит корректный ответ( не забываем что 3 — лето, 4 — осень ), но вот нет адекватной реакции на 12. В этом признаю, не доглядел :). Исправляюсь:
Ну и соответственно:
P.S.: на счёт того кода с кучей
if'ов ты был прав :). Я так сильно торопился, что даже не стал проверять на работоспособность, тут и пословица сразу на язык лезет...Ну здесь ты тоже поторопился
0 — зима, n > 12 — тоже зима :)))
porshe do not be hurry:)
На «слабО» — это была явная провокация со стороны Макара. Однако она достигла успеха. И это хорошо. При написании программ надо стремиться писать простой, компактный и эффективный код. А очевидное решение — не всегда лучшее.
Рискну поддержать Макара в начатой им провокации ;)
А слабО решить эту же задачу принципиально иным способом? Пока всё вертится либо вокруг
ifилиswitchс полным перечислением номеров (или диапазонов номеров) месяцев, либо вокруг попытки на основании номера месяца вычислить номер сезона с последующимswitch.Для определённости:
Ну в таком случае предлагаю вот такой код:
Идея хорошая. Реализация подкачала. Можно ещё проще ))
В общем, я думаю, что не используя конструкций if, if else, swith, while & for, вывод можно организовать в одну строку кода, примерно так
Прошу прощенья за заморочку с лишней переменной, я думаю так будет лучше
Череп, выкладывай свой вариант :)))
Ну даже не знаю, как можно ещё проще, присоединяюсь к Юрию, и вот ещё вариант( тот же, только чуть-чуть доделаный )
P.S.: Юрий, а разве тренарная операция это не тот же
if?Не совсем. Тернарный оператор по производительности лучше чем if, по читабельности — нет.
Да ладно? :)
У меня было заготовлено целых два варианта. Правда оба эксплуатируют одну и ту же идею. porshe удалось отойти от очевидного решения задачи, и последний вариант был бы правильный, если бы не ошибка в условии
if: с отрицательными числами не сработает.Вариант 1, совсем простой:
Вариант 2. Почти то же самое, что у porshe:
Ещё обратите внимание, что у меня (в обоих вариантах) в массиве собраны не С-строки, а указатели на С-строки.
Предлагаю продолжить разминку для мозгов. Смотрите ветку форума
Разминка для мозгов: реверс строки
Череп, на самом деле в моём коде есть защита от отрицательного значения, там в объявлении переменной стоит
unsignedДа, согласен, защита от отрицательного значения есть. Извини, проглядел.
Так что единственно, что можно подправить в твоём коде — убрать дублирующуюся строку «Winter» из массива. Лучше пусть дублируется адрес строки, но не сама строка.
superUSer, практически это повторяет код из поста.