Юрий, я не совсем понял, а в чём проблема? Программа на запросы 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, практически это повторяет код из поста.