@tortyana

Не работает case в switch. Как решить проблему?

Есть такой код :
int main() {
float x, eps, summa = 0, summa1 = 0;
int z = 1;
cout << "x = ";
cin >> x;
cout << "eps = ";
cin >> eps;
cout << "choose a method of print: \n1 - while\n2 - do while" << endl;
int choose;
cin >> choose;
switch (choose) {
case 1: {
while (fabs(cos(z * x) / pow(z, 2)) > eps) {
summa += cos(z * x) / pow(z, 2);
z += 2;
}
cout << "1 answer = " << summa << endl; }
case 2: {
int u = 1;
do {
summa1 += cos(u * x) / pow(u, 2);
u += 2;
} while (fabs(cos(u * x) / pow(u, 2)) > eps);
cout << "2 answer = " << summa1 << endl; }
}
return 0;
}

когда для choose я пишу 1, выводит "1 answer" и "2 answer"
В чем проблема?
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
@dima20155
you don't choose c++. It chooses you
У вас не хватает break в конце блока case
Вот пример:
https://en.cppreference.com/w/cpp/language/switch
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Блоки case в операторе switch это просто аналог меток для goto. Соответственно после перехода на какой-то case выполнение программы продолжается по всем строкам кода подряд. И если вы не предусмотрели явный выход из блока case (с помощью break или return), то выполнение продолжится и в следующем case и т.д.

Современные компиляторы умеют выдавать ошибки или предупреждения для таких случаев, т.к. очень часто в коде действительно присутствует ошибка - пропуск оператора break или return (как у вас). В gcc для этого служит опция -Wimplicit-fallthrough. Иногда проваливание в следующий case бывает полезно и используется на практике программистами, тогда (при использовании опции -Wimplicit-fallthrough) надо явно указать на это компилятору. В документации gcc в описании этой опции указано как это сделать.

Вообще рекомендую ужесточать проверки компилятора, как минимум с помощью стандартных опций: -Wall -Wextra.
А так же указывать какому стандарту языка надо придерживаться компилятору: -std=c++17 или -std=gnuc++17
Можно добавить и опцию: -pedantic
По умолчанию многие полезные предупреждения отключены.
Многие предупреждения можно перевести в ошибку или игнорировать.
Есть и другие полезные проверки, которые может делать компилятор, которые не входят в -Wall -Wextra. Но для начала используйте хотя бы их.

Описание опций предупреждений gcc смотри тут: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы