русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Инструкция switch.


Дата добавления: 2015-06-12; просмотров: 2107; Нарушение авторских прав


Как уже упоминалось выше, данная инструкция служит для выбора одного из многих путей. Рассмотрим её формат.

Листинг 6.1

switch (выражение) {

case констное выражение: операторы

case констное выражение: операторы

default: операторы

}

Как видите, инструкция switch состоит из двух частей: заголовок switch, тело инструкции, записанное в составном операторе (фигурных скобках). В заголовке нас интересует только выражение в скобках. Именно от значения этого выражения зависит, какая из ветвей программы будет выполняться. Для этого выражения существует одно ограничение.

Там может быть записана любое выражение, или переменная символьного или целочисленного типа.

Ниже приведены примеры правильного и неправильного заголовков.

Листинг 6.2.

int c,a;

char s;

double g;

switch (c) //Правильно (целая переменная)

switch ((a+c)+2) //Правильно (выражение целого типа)

switch (g) //Неправильно (вещественная переменная)

switch (s) //Правильно (символьная переменная)

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

Тут тоже есть ограничение, константные выражения каждой из ветки case должны быть разными между собой.

Т.е. следующий пример ошибочен (так как для двух веток (первой и третей) константные выражения совпадают :



Листинг 6.3

{

case 10: a+10; break;

case 34: a+34; break;

case 10: a-23; break;

}

В теле оператора switch может быть еще одна ветка default. Она необязательна. Её операторы выполняются, если выражение в заголовке оператора switch не совпало ни с одним из константных выражений в ветках case. Если же такой ветки не будет, а ни одно из константных выражений не подходит, то просто ничего не будет делаться. И программа продолжит свое выполнение.

Обобщим вышесказанное. Оператор switch, в первом приближении, работает следующим образом. Сначала вычисляется выражение в заголовке, далее оно сравнивается с каждым из константных выражений внутри тела оператора. Если оно совпадает с одним из них, то выполняются операторы этой ветки, если совпадений нет, то выполняется ветка default, если она имеется, если ветки default нет, то выполнение оператора заканчивается. И программа продолжает работать дальше.

Для лучшего усвоения понимая работы оператора switch, и иллюстрации некоторых особенностей, давайте напишем программу которая реализует управление в какой-то гипотетической игре, потом при изучении циклов и функций мы переделаем это меню. Оно будет оболочкой для всех остальных программ. А пока, что примем следующие клавиши управления: W – вперед, A – влево, S – вниз, D – вправо. Так как это символы для их хранения потребуется переменная типа char.

Листинг 6.4

#include <stdio.h>

int main(void) {

char c;

printf("Vvedite komandu: ");

c=getchar();

switch (c) {

case 'w': printf("\nVpered\n");

case 'a': printf("\nVlevo\n");

case 's': printf("\nVniz\n");

case 'd': printf("\nVpravo\n");

default: printf("\nNeizvestnaya komanda\n");

}

return (0);

}

На рисунке ниже вы видите, как работает программа при нажатии клавиши a.

 

Рис. 6.1 Иллюстрация сквозного выполнения инструкции switch.

Как видите, на экране появилось, не то, что предполагалось. Эта программа иллюстрирует одну из особенностей инструкции switch – сквозное выполнение. Т.е. после того, как нашлось совпадение в одном из case, если явно не указан выход из оператора switch, то программа выполняет последовательно все остальные ветки записанные ниже той, с которой выполнено совпадение, пока не закончится оператор switch или пока не будет явно указан выход из оператора. В нашем случае мы нажали клавишу a, программа выполнила ветку с выражение a, и продолжила выполнять последовательно все ветки, которые записаны в коде после этой, т.е. ветки s,d,w и ветку default. Эта особенность может играть как отрицательную роль, как в нашем случае, так и положительную (мы применим её чуть позже).

Для выхода из оператора switch используется оператор безусловного выхода break. Он так же применяется и в других конструкциях, например, в циклах, но об этом мы еще будем говорить. Как только программа встретит данный оператор, она закончит выполнение инструкции switch. Поэтому, нам нужно в каждую веточку дописать этот оператор выхода. Я настоятельно рекомендую писать break во все без исключения ветки. С учетом внесенных изменений программа примет следующий вид:

Листинг 6.5

#include <stdio.h>

int main(void) {

char c;

printf("Vvedite komandu: ");

c=getchar();

switch (c) {

case 'w': printf("\nVpered\n"); break;

case 'a': printf("\nVlevo\n"); break;

case 's': printf("\nVniz\n"); break;

case 'd': printf("\nVpravo\n"); break;

default: printf("\nNeizvestnaya komanda\n"); break;

}

return (0);

}

Теперь если запустить программу она будет работать так, как и предполагалось.

Сейчас поговорим об еще одной особенности оператора switch. Внутри тела оператора, порядок написания case и default не важен. Т.е. Сначала можно написать ветку default, а затем ветки case. Или же ветку default можно пометить между других веток case. Программа Листинг 6.6 работает так же как и программа Листинг 6.5:

Листинг 6.5

#include <stdio.h>

int main(void) {

char c;

printf("Vvedite komandu: ");

c=getchar();

switch (c) {

case 'w': printf("\nVpered\n"); break;

case 'a': printf("\nVlevo\n"); break;

default: printf("\nNeizvestnaya komanda\n"); break;

case 's': printf("\nVniz\n"); break;

case 'd': printf("\nVpravo\n"); break;

}

return (0);

}

Теперь разберемся с ситуацией когда сквозное выполнение оператора switch играет полезную роль. Представим ситуацию, что у пользователя нажата клавиша Caps Lock. Поэтому все вводимы буквы будут в верхнем регистре. Но компьютер различает буквы в верхнем и нижнем регистре, и поэтому если в нашей программе написать W, то мы увидим на экране надпись о неизвестной команде. Для того чтобы исправить эту оплошность, надо добавить еще 4 ветки case. Перепишем программу.

Листинг 6.7

#include <stdio.h>

int main(void) {

char c;

printf("Vvedite komandu: ");

c=getchar();

switch (c) {

case 'W': printf("\nVpered\n"); break;

case 'w': printf("\nVpered\n"); break;

case 'A': printf("\nVlevo\n"); break;

case 'a': printf("\nVlevo\n"); break;

case 'S': printf("\nVniz\n"); break;

case 's': printf("\nVniz\n"); break;

case 'D': printf("\nVpravo\n"); break;

case 'd': printf("\nVpravo\n"); break;

default: printf("\nNeizvestnaya komanda\n"); break;

}

return (0);

}

Сейчас она будет работать так, как надо. А вот теперь вспомним о сквозном выполнении оператора switch. Рассмотрим на примере команды «Вперед».

Имеем^

Листинг 6.8

case 'W': printf("\nVpered\n"); break;

case 'w': printf("\nVpered\n"); break;

Если в верхней строчке Листинг 6.8 убрать оператор break, то из-за свойства сквозного выполнения, выполнится сначала одна функция printf, а затем вторая из ветки с маленькой w. Потом программа встретит break и закончит выполнение оператора. Теперь уберем первую функцию printf.

Листинг 6.9

case 'W':

case 'w': printf("\nVpered\n"); break;

Теперь программа будет работать независимо от того в каком регистре введена буква. Т.е. мы как бы для одной ветки сделали два условия. Если какое-либо из них выполнится, то эта ветка выполнится. Т.е. если мы нажмем W то программа выполнит сначала операторы ветки W. Там их нет и оператор break отсутствует, программа начнет выполнять следующую ветку w. И потом встретив оператор break выйдет из инструкции switch. Таким же образом поступим с остальными ветками. Программа приобретет следующий вид:

Листинг 6.10

#include <stdio.h>

int main(void) {

char c;

printf("Vvedite komandu: ");

c=getchar();

switch (c) {

case 'W':

case 'w': printf("\nVpered\n"); break;

case 'A':

case 'a': printf("\nVlevo\n"); break;

case 'S':

case 's': printf("\nVniz\n"); break;

case 'D':

case 'd': printf("\nVpravo\n"); break;

default: printf("\nNeizvestnaya komanda\n"); break;

}

return (0);

}

Теперь немножко о преимуществах и недостатках оператора switch.

Инструкция switch наглядно показывает ветвление на несколько вариантов. Но она имеет один существенный недостаток. Если в инструкции if мы могли использовать некоторые условия и логические операторы, то в операторе swith это невозможно. Нам необходимо заранее для каждого значения написать конкретный набор действий. Т.е. выражение в заголовке является критерием выбора, причем оно должно быть строго, либо целого типа, либо символьного. И в зависимости от этого критерия выбирается ветка. Поэтому не во всех случаях мы сможем использовать данную инструкцию. В таких случаях приходится использовать несколько инструкций if-else.

Резюме урока:

Узнали об операторе множественного выбора switch

Разобрались с нюансами его работы.

Научились использовать оператор безусловного выхода break.

Поговорили о области применимости инструкций switch и if-else.

Задание для практической работы:

Написать программу простейший калькулятор для следующих действий +,-,*,/. На вход программе подается два числа и знак действия. Например: 4 23.5 *. Программа должна вывести результат арифметического действия. При недопустимой арифметической команде вывести ERROR.



<== предыдущая лекция | следующая лекция ==>
Приоритет логических операций. | Занятие 7.Циклические конструкции. Цикл со счетчиком for.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.374 сек.