Операторы 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; просмотров: 861;