Операторы break нужны не всегда Существует одна стандартная ситуация, когда оператор break после метки case не нужен, а программа должна выполнять код нескольких меток. Речь идет о случае, когда та же последовательность действий должна выполняться для нескольких возможных значений. С меткой case может быть связано только одно значение. Чтобы указать диапазон значений, метки case располагают последовательно, одна после другой. Смотрите пример 6.35. Ситуация, когда оператор break преднамеренно пропускают для того, чтобы последовательно выполнять код нескольких разделов case, начиная с текущего случая, встречается крайне редко. Рекомендация:Случаи, когда оператор break пропускают преднамеренно, довольно редки, поэтому их следует обязательно комментировать, объясняя логику действий. Метка default Меткаdefaultявляется эквивалентом директивы else.Если ни одна из меток caseне соответствует значению выражения оператора switch,выполняются операторы, расположенные после метки default. Раздел default имеет смысл создавать всегда, даже если в нем не происходит никаких действий. Впоследствии это однозначно укажет читателю кода, что случай default не был забыт, т.е. для остальных случаев никаких действий предпринимать не нужно. Метка не может быть автономный; она должна предшествовать оператору. Если оператор switch заканчивается разделом default, в котором не осуществляется никаких действий, за меткой default должен следовать пустой оператор. Выражение выбора switch и метки case Выражение выбора оператора switch может иметь любую сложность. В частности, здесь можно определить и инициализировать переменную. switch (int ival = get__response () ) В данном случае создается целочисленная переменная ival, которая инициализируется результатом обращения к функции get__response (). Именно это значение и будет сравниваться со значением каждой метки case. Переменная ival существует на протяжении всего оператора switch, но не вне его. Метки case должны содержать целочисленные выражения. Например, примеры следующих меток приводят к ошибкам во время компиляции. // недопустимые значения меток case case 3.14: // не целое число case ival: // не константа Ошибкой будет также случай, когда две метки case содержат одинаковое значение. Рассмотрим примеры решения задач с использованием оператора выбора. Пример 6.32 Фрагмент, приведенной ниже программы, иллюстрирует использование вложенных операторов if для выбора выражения в соответствии со знаком арифметической операции: char ZNAC; int x,y,z; if (ZNAC == '-') x = y - z; else if (ZNAC == '+') x = y + z; else if (ZNAC == '*') x = y * z; else if (ZNAC == '/') x = y / z; else ... Реализуем эти же действия с помощью оператора switch: char ZNAC; int x,y,z; switch (ZNAC) { case '+': x = y + z; break; case '-': x = y - z; break; case '*': x = y * z; break; case '/': x = u / z; break; default : ; } Отметим, что во втором случае структура программы стала более понятной и однозначной для восприятия. Пример 6.33 Следующая программа LR6-33.cpp использует оператор switch для вывода сообщения, основываясь на текущей оценке студента/ /* Пример 6.33*/ #include <iostream.h> int main() { char grade = 'В'; switch (grade) { case 'A': cout << "Поздравляем, вы получили А" << endl; break; case 'В': cout << "Хорошо, у вас В" << endl; break; case 'С': cout << "У вас всего лишь С" << endl; break; case 'D': cout << "Плохо, у вас D" << endl; break; default: cout << "Ужасно! Учите лучше!" << endl; break; } getch(); return(); } Найдите время для эксперимента с этой программой, изменяя оценку и наблюдая поведение программы. Если же ни один из указанных вариантов не соответствует условию, то выполняется вариант default. Обратите внимание на использование оператора break в каждом варианте предыдущей программы. Оказывается, если C++ встречает вариант, соответствующий условию оператора switch, то он подразумевает, что все последующие варианты тоже соответствуют условию. Оператор break указывает C++ завершить текущий оператор switch и продолжить выполнение программы с первого оператора, следующего за оператором switch. Если вы удалите операторы break из предыдущей программы, то программа выведет не только требуемое сообщение, но и сообщение для всех последующих вариантов (потому что если один вариант является истинным, то и все последующие варианты в C++ рассматриваются как истинные). Пример 6.34 Покажем, как можно использовать оператор switch для управления алгоритмом с консоли, например, при организации меню пользователя. Значение кода нажатой пользователем клавиши управляет выбором ветви алгоритма. Код клавиши возвращает функция getch(). Если нажата одна из функциональных (управляющих) клавиш, то функция возвращает 0 (0хЕ0). Ее повторный вызов получает расширенный код клавиши. //Пример 6.34 int main () {int key; do { printf ("Выберите действие\n"); key = getch(); if ( key = = 0 ) // Нажата управляющая клавиша. { key = getch(); // Ввод не повторяется, символ получен из буфера ввода. switch key // Значение key управляет ветвлением. { case 77: {printf ("Стрелка вправо\n"; break;)} case 75: {printf ("Стрелка влево\n"; break;)} case 72: {printf ("Стрелка вверх\n"; break;)} case 80: {printf ("Стрелка вниз\n"; break;)} case 27: {printf ("Esc\n"; break;)} default: {printf ("Не стрелка\n"; } } } } while (key != 27); // Выход из цикла по нажатию Esc. } // End of main Пример 6.35. Задан номер текущего дня недели. Вывести названия дней, оставшихся до конца недели, включая текущий день. Решение. Возможные значения номера дней недели (обозначим их через n) – это числа 1-7. При вводе числа 1 программа должна выводить названия "Понедельник ", "Вторник ", …, "Воскресенье", при вводе числа 2 – названия "Вторник ", …, "Воскресенье". И т.д. При вводе числа 7 – только название "Воскресенье". При вводе любого другого числа – сообщение "Неправильно введен номер дня недели". Реализация выбора из такого множества вариантов может быть осуществлена с помощью оператора switch (k). Ниже приведен текст программы с оператором switch(k), в котором только после последнего case есть оператор break;, по которому и происходит выход из switch и переход на следующий оператор программы (fflush(stdin);) для k=1-7. Если k1-7, то выполнится оператор puts ("Неправильно введен номер дня недели");, стоящий после default, затем следующий оператор программы (fflush(stdin);). /* Программа задачи 6.35 */ #include <stdio.h> #include <math.h> main() { int k; // Номер дня недели puts("Введите номер дня недели"); scanf("%d",&k); printf("До конца недели:\n"); switch (k) { case 1: puts("Понедельник "); case 2: puts ("Вторник "); case 3: puts ("Среда "); case 4: puts ("Четверг "); case 5: puts ("Пятница "); case 6: puts ("Суббота "); case 7: puts ("Воскресенье \n"); break; default: puts ("Неправильно введен номер дня недели"); } fflush(stdin); getchar(); return(0); } Пример 6.36. Ввести символ и определить, является ли он цифрой. Данный пример показывает, что после case ki : может не быть оператора. Решение. Пусть k – вводимый символ. В программе использованы операторы ввода-вывода в стиле Си. /*Программа примера 6.36 #include <stdio.h> main() { char k; puts("Введите символ"); k=getchar(); switch (k) { case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0':printf("Это число %c\n",k); break; default: printf("%c-не число\n",k); } fflush(stdin); getchar(); return(0); } Пример 6.37. Дано целое число в диапазоне 1 – 5. Вывести строку — словесное описание соответствующей оценки (1 — "плохо", 2 — "неудовлетворительно", 3 — "удовлетворительно", 4 — "хорошо", 5 — "отлично"). В примере используется оператор выбора с оператором break после каждого case ki : Решение. В программе N- число, которое вводится, а затем анализируется. Если ввести, например 4, то программа выведет слово "Хорошо", а если ввести 7, то программа выведет строку "Нет оценки" и т.д. В программе использованы операторы ввода-вывода в стиле Си++. /*Программа примера 6.37 #include <stdio.h> #include <iostream.h> main() { int N; cout << "\nВведите число "; cin >> N; switch (N) { case 1: cout << "\nПлохо"; break; case 2: cout << "\nНеуд."; break; case 3: cout << "\nУдовл."; break; case 4: cout << "\nХорошо"; break; case 5: cout << "\nОтлично"; break; default: cout << "\nНет оценки "; } fflush(stdin); getchar(); return(0); } 1.13. Использование отступов для улучшения удобочитаемости вашей программы Рассматривая программы, представленные в данной лабораторной работе, Вы увидите, что в них применяются отступы перед операторами, которые следуют за if, else или левой фигурной скобкой. Сдвигая подобным образом операторы на несколько позиций в своих программах, Вы упрощаете процесс чтения ваших программ. Например, рекомендуется выделять связанные группы операторов, как показано ниже: if (test_score >= 90) { cout << "Поздравляем, вы получили А!" << endl; cout << "Ваши тестовые очки были " << test_score << endl; } else { cout << "Вы должны работать усерднее!" << endl; cout << "Вы потеряли " << 100 - test_score << " очков " << endl; } При создании программ используйте подобные отступы, чтобы программы были удобочитаемыми. Отступы нужны не компилятору с языка C++, а предполагаемым пользователям (программистам), которые возможно в последствии будут пользоваться Вашей программой, и попытаются понять Ваш код. 2. ЗАДАНИЕ 2.1. Изучить теоретические сведения. 2.1.1. Изучить операции сравнения. 2.1.2. Изучить логические операции. 2.1.3. Изучить приоритет операций. 2.1.4.Изучить понятие оператора перехода. 2.1.5. Изучить понятие составного оператора. 2.1.6. Изучить понятие пустого оператора. 2.1.7. Изучить понятие разветвляющегося вычислительного процесса. 2.1.8. Изучить средства языка С++ для реализации разветвляющегося вычислительного процесса. 2.1.9. формы условного оператора if/ 2.1.10. Изучить оператор выбора switch. 2.2. Разобрать и выполнить примеры к данной лабораторной работе. 2.3. Написать и отладить семь программ на языке С++. |