#include <iostream>
using namespace std;
int main(int argc, char** argv) {
setlocale(LC_ALL, "Rus");
int x,y,s;
cout<<"Введите координату x:";
cin>>x;
cout<<"Введите координату y:";
cin>> y;
switch(x*y)
case 1: {
x*y <= 12;
cout<<"Эти координаты нам подходят!";
break;
case 2:
x*y >= -12;
cout<<"Эти координаты нам подходят!";
break;
}
cout<<"Yes"<<endl;
system("Pause");
return 0;
}
Вот такой не сложный код, вопрос в том, что конструкция switch срабатывает только если вводить данные 1 и 2 или 2 и 1, хотя в условии стоит до 12. я пробовал повышать ещё. а при вводе 3 и 4 не срабатывает, почему?
C/C++
C++ Кто то сможет объяснить, почему конструкция switch срабатывает не по плану?
Ты же указал в коде.
если x * y равно case 2: то исполняй, и так же про 1
если x * y равно case 2: то исполняй, и так же про 1
Владимир Дронов
Я понимаю так, оно будет исполнять если произведение меньше и равно 12, но почему при вводе 3 и 3 не работает?
Где стоит до 12?
Можно диапазон преобразовать в число для switch.
switch ( (x*y<=-12) + (x*y<12) )
{
case 0: ;
case 2: эти координаты подходят; break;
default: эти не подходят;
}
если число <= -12 срабатывают два условия 1+1
если число <12 но больше -12 срабатывает одно условие 0+1
если число >=12 не срабатывает ни одно условие 0+0
switch ( (x*y<=-12) + (x*y<12) )
{
case 0: ;
case 2: эти координаты подходят; break;
default: эти не подходят;
}
если число <= -12 срабатывают два условия 1+1
если число <12 но больше -12 срабатывает одно условие 0+1
если число >=12 не срабатывает ни одно условие 0+0
Ты неправильно понимаешь суть инструкции switch.
Теперь смотрим на твой код.
Возникает вопрос, как добиться того, что хочет автор. Инструкция switch для этого совершенно не подходит, потому что у case должно быть константное выражение, а перебирать все возможные значения x*y не представляется возможным. Нужно использовать if:
switch ( )
{
case :
case :
...
}
В зависимости от ЗНАЧЕНИЯ выражения управление передаётся на метку case с этим значением. Обрати внимание, что это именно передача управления (goto), то есть после выполнения <инструкции 1> будут выполнены и <инструкции 2>. Чтобы этого избежать, в конце <инструкции 1> ставят break;Теперь смотрим на твой код.
switch(x*y)
case 1:
{
...
break;
case 2:
...
break;
}
Прежде всего обращу внимание на странное расположение фигурных скобок. Это работает ТОЛЬКО потому, что case является меткой, то есть не влияет на группировку операторов. Общепринято такое расположение: switch(x*y)
{
case 1:
...
break;
case 2:
...
break;
}
Вычисляется x*y и в зависимости от ЗНАЧЕНИЯ выполняются инструкции соответствующей метки case. Поскольку имеются case только для значений 1 и 2, то и выполняются инструкции ТОЛЬКО если x*y равно 1 или 2.Возникает вопрос, как добиться того, что хочет автор. Инструкция switch для этого совершенно не подходит, потому что у case должно быть константное выражение, а перебирать все возможные значения x*y не представляется возможным. Нужно использовать if:
if(x*y
Итоговый код:
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
setlocale(LC_ALL, "Rus");
int x,y,s;
cout<<"Введите координату x:";
cin>>x;
cout<<"Введите координату y:";
cin>> y;
switch(x*y) {
case 1: {
if (x*y <= 12) {
cout<<"Эти координаты нам подходят!";
}
break;
}
case 2: {
if (x*y >= -12) {
cout<<"Эти координаты нам подходят!";
}
break;
}
default: {
cout<<"Эти координаты нам не подходят!";
break;
}
}
cout<<endl;
system("Pause");
return 0;
}
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
setlocale(LC_ALL, "Rus");
int x,y,s;
cout<<"Введите координату x:";
cin>>x;
cout<<"Введите координату y:";
cin>> y;
switch(x*y) {
case 1: {
if (x*y <= 12) {
cout<<"Эти координаты нам подходят!";
}
break;
}
case 2: {
if (x*y >= -12) {
cout<<"Эти координаты нам подходят!";
}
break;
}
default: {
cout<<"Эти координаты нам не подходят!";
break;
}
}
cout<<endl;
system("Pause");
return 0;
}
Владимир Дронов
Спаисбо, но я не о том, почему не срабатывает при вводе например 3 и 3
Борис Розенберг
Это происходит из-за того, что в данном коде отсутствует проверка на случай, когда значение x*y равно 0. В таком случае, программа не выполняет никаких действий и завершается.
косячный ты
Похожие вопросы
- Помогите решить C++ и если сможете объясните пожалуйста
- Почему изучение C++ как первый язык программирования даёт такое сильное преимущество во всех планах чем изучение
- Почему цикл for срабатывает 2 раза? Код в вопросе
- Циклы C++. Создание программ с циклическими конструкциями.
- C++ задача использующая Switch
- Составить программу C++, с помощью switch/case
- Объясните работу цикла for в c++
- C++. Бинарный поиск. Объясните работу данной программы. Найдите такое число x, что , с точностью не менее 6 зн.С while
- Почему создатель Linux Линус Торвальдс называет C++ ужасным языком, а ядро ОС Linux пишется только на Си?
- Язык С. Что значит данная конструкция? while(*s++=*c++) Заранее спасибо!