Операторы switch и break

 

Часто возникающая в программировании задача – выбор одного варианта из многих. Можно это сделать с помощью вложенных if...else. Однако более удобный способ - использование оператора switch, общий формат которого таков:

switch(switch expression)

{

сase constantl: statementl; [break;]

.......

саse constanti: statementi; [break;]

........

case constantN: statementN; [break;]

[default: statementN+1;]

}

Оператор switch выполняется так. Сначала вычисляется значение выражения switch_expression. Тип значения должен быть одним из целых - char, int, unsigned int, long int и long unsigned.Вычисленное значение сравнивается со значениями констант или константных выражений сonstant1, ..., сonstantN. При совпадении значения switch expression с constani выполняется оператор statementi. Затем управление передается на оператор сразу после switch, если в i-й ветви присутствует оператор break. В противном случае выполняются операторы в ветвях i+1, i+2 и так далее до тех пор, пока в них не встретится оператор break или не будет выполнен оператор statementN+1.

Если значение switch_expression не совпало ни с одной из констант constant1, ..., constantN, выполняется оператор в ветви, помеченной default. При ее отсутствии выполняется следующий после switch оператор.

Приводимая далее программа выводит на экран меню из трех функций: Sin, Соs, Atan; по первой введенной с клавиатуры букве распечатывается информация о функции:

//Prim5_1.cpp

#include <stdio.h>

void main(void)

{

рuts("введите первую букву имени функции:\n"\

" S-Sin\n С-Сos\n А-Atan\n");

switch( getchar() )

{

case's': case'S':

рuts("вычиcление синуса аргумента в радианах");

break;

case'c': case'C':

рuts ("Вычисление косинуса аргумента в радианах");

break;

case'a': case'A':

рuts("Вычисление тангенса аргумента в радианах");

break;

default: рuts("Ошибка\а\n");

}

}

При отсутствии операторов break во всех ветвях происходило бы следующее:

1) ввод с клавиатуры буквы 's' или 'S' вызывал бы вывод на экран сразу четырех сообщений:

Вычисление синуса аргумента в радианах

Вычисление косинуса аргумента в радианах

Вычисление тангенса аргумента в радианах

Ошибка (звучит звуковой сигнал)

2) ввод с клавиатуры буквы 'с' или 'С' вызывал бы вывод на экран сразу трех сообщений:

Вычисление косинуса аргумента в радианах

Вычисление тангенса аргумента в радианах

Ошибка (звучит звуковой сигнал)

3) ввод с клавиатуры буквы 'а' или 'А' вызывал бы вывод на экран сразу двух сообщений:

Вычисление тангенса аргумента в радианах

Ошибка (звучит звуковой сигнал)

 

Операторы цикла

 

Язык С++ имеет удобные операторы организации циклов. Общая форма записи операторов цикла такова:

while(cond_expr) operator;

dо operator while(cond_expr);

for(init_expr; cond_expr; increment_ехрг) operator;

Оператор while организует повторение оператора operator до тех пор, пока логическое выражение cond_expr не примет значение ЛОЖЬ (0). Оператор while называют оператором цикла с предусловием, так как истинность cond_expr проверяется перед входом в цикл. Следовательно, возможна ситуация, когда operator не выполняется ни разу.

Если необходимо обеспечить выполнение цикла xотя бы один раз, используют оператор цикла с постусловием do ... while;. Здесь сначала выполняется operator, а затем проверяется значение выражения cond_ехрг. Повторение тела цикла происходит до тех пор, пока cond_ехрг не примет значение ЛОЖЬ (0).

Наиболее сложная форма оператора цикла - это оператор for. Он эквивалентен следующему фрагменту:

init_ехрг

while(cond_expression)

{

operator

increment_expression

}

Перед вхождением в цикл выполняется init_expression. Затем проверяется значение cond_expression. Повторение тела цикла происходит до тех пор, пока cond_expression не примет значение ЛОЖЬ (0). Циклически повторяемый участок состоит из оператора, заданного после for, и increment_expression, указанного в самом операторе for. Как increment_expression, так и init_expression могут быть любой (в том числе и пустой) последовательностью простых операторов, разделяемых оператором запятая. Наличие инициализирующей части, состоящей из произвольного числа операторов, дает основание утверждать, что любую программу на языке Си можно представить в виде единственного оператора for, однако не следует этого делать.

Различные операторы циклов могут выражаться друг через друга. Выражение оператора for через while уже приводилось. А вот и другие эквивалентные пары:

for(; cond_expr;) эквивалентен while(cond ехрг)

operator operator

 

for(operator;cond_ехрr;) эквивалентен dо

operator

while(cond_expr);

 

Одна из самых неприятных особенностей операторов цикла заключается в возможности образования бесконечного цикла или,как говорят, в зацикливании программы. Причина этого в том, что значение cond_ехрr из-за ошибки в программе никогда не становится ложным. Вот простой пример такой ошибки, приводящей к зацикливанию:

int i=0;

while(i<60);

{

printf("i=%d\n", i); i++;

}

Причина зацикливания - в незаметном знаке';' после oператора while. Компилятор полагает, что повторяемый в цикле оператор - это не составной оператор, заключенный в фигурные скобки, а пустой оператор. Значение i не увеличивается, и логическое выражение i<60 при проверке всегда дает значение ИСТИНА.

Приводимая далее программа и иллюстрирует использование оператора цикла while. Она подсчитывает число русских гласных букв в слове, введенном с клавиатуры:

//Prim5_2.cpp

#include<stdio.h>

void main( )

{

int total=0, rus=0;

char ch;

while((ch=getchar( ))!='\n')

{

total++;

switch(ch)

{

case'A': case'a': case'E': case'e':

case'И': case'u': case'O': case'o':

case'У': case'y': case'Э': case'э':

сase'Ю': case'ю': саsе'Я': сasе'я':

rus++;

}

}

printf("Введено %d символов, из них %d "\

" русских гласных букв\n", total, rus);

}

Приводимая ниже программа демонстрирует использование цикла dо ... while для вывода на экран приглашения

"Продолжаете? (Да/Нет). Esc- отмена выбора.",

приема с клавиатуры и анализа ответа пользователя. При нажатии клавиши с русской буквой 'д' выводится слово "Да",а при нажатии клавиши с русской буквой 'н' - слово "Нет". При нажатии клавиши Esc (Ключ) выводится сообщение "Отмена выбора". При нажатии любых других клавиш звучит сигнал динамика, указывая на ошибку. Программа использует в своей работе библиотечную функцию bioskey(0), возвращающую так называемый код нажатия клавиши.

Для того чтобы программа не зависела от регистра клавиатуры (Рус/Лат), расширено число меток для ветвей "Да" и "Нет". Здесь приведен вариант программы для стандартной русифицированной по альтернативной таблице клавиатуры со 101/102 клавишами:

//Prim5_3.cpp

#include<stdio.h>

#includе <bios.h>

#define YES 0

#define NO 1

#define ESC 27

int main(void)

{

char сh;

puts("Продолжаете? (Д/Н). Esc-отмена выборa");

do

{

сh=bioskey(0);

switch(ch)

{

case'д': case 'Д': case'l: саse 'L':

puts("ДА");

return(YES);

case'н': case 'Н': case'y': саse 'Y:

puts("Hem");

return(NO);

саcе ESC: break;

default: putchar('\a');

}

}

while(ch!=ESC);

рuts("Отмена выбора");

return(ESC);

 








Дата добавления: 2017-01-29; просмотров: 810;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.016 сек.