Оператор множественного выбора switch
Оператор switch (переключатель) предназначен для разветвления процесса вычислений на несколько направлений.
Формат оператора:
switch ( выражение ) {
case константное_выражение_1: [список_операторов_1]
case константное_выражение_2: [список_операторов_2]
case константное_выражение_n: [списоко_ператоров_n]
[default: операторы ]
}
Структурная схема оператора приведена на рисунке 1.6.
Рисунке 1.6 - Структурная схема оператора switch
Выполнение оператора начинается с вычисления выражения. Оно должно быть целочисленным. Все константные выражения также должны быть целочисленными и иметь разные значения. Несколько меток могут следовать подряд.
Затем управление передается первому оператору из списка, помеченного константным выражением, значение которого совпало с вычисленным. После этого, если выход из переключателя явно не указан, последовательно выполняются все остальные ветви.
Выход из переключателя обычно выполняется с помощью операторов break или return. Оператор break выполняет выход из самого внутреннего из объемлющих его операторов switch, for, while и do. Оператор return выполняет выход из функции, в теле которой он записан.
Если совпадения не произошло, выполняются операторы, расположенные после слова default, а при его отсутствии управление передается следующему за switch оператору. В случае синтаксической ошибки в слове default сообщение об ошибке не выдается, поскольку компилятор воспримет это слово как допустимую метку оператора.
Пример: простейший калькулятор на 4 действия.
#include <iostream.h>
int main ( ) {
int a, b, res; char op;
cout <<"Введите 1ый операнд: ”; cin >> a;
cout <<"\nВведите знак операции: ”; cin >> op;
cout <<"\nВведите 2ой операнд: ”; cin >> b;
bool f = true;
switch (op){
case '+' : res = а + b; break;
case '-' : res = a - b; break;
case '*' : res = a * b; break;
case '/ ': res = a / b; break:
default : cout <<"\nНеизвестная операция"; f = false;
}
if (f) cout << "\nРезультат: " << res;
return 0;
}
Тема 1.9
Операторы цикла
Цикл с предусловием (while)
Цикл с предусловием имеет вид: while ( выражение ) оператор
Выполнение оператора цикла начинается с вычисления выражения. Его тип должен быть арифметическим или приводимым к нему. Выражение определяет условие повторения тела цикла: если выражение истинно, выполняется тело цикла, которое является простым или составным оператором.
Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выражение равно false, цикл не выполнится ни разу.
Пример: программа печатает таблицу значений функции y = x2 +1во введенном диапазоне.
#include <stdio.h>
int main( ) {
float Xn, Xk, Dx;
printf (“Введите диапазон и шаг изменения аргумента: ”);
scanf (“%f%f%f”, &Xn, &Xk, &Dx);
printf(“| X | Y |\n”); // шапка таблицы
float X = Xn; // установка параметра цикла
while (X <= Xk){ // проверка условия продолжения
printf (“| %5.2f | %5.2f |\n”, X, X*X + 1); // тело цикла
X += Dx; // модификация параметра
}
return 0;
}
Пример: программа находит все делители целого положительного числа.
#include <iostream.h>
int main( ){
int num;
cout << “\nВведите число: ”;
cin >> num;
int half = num / 2; // половина числа
int div = 2; // кандидат на делитель
while (div < = half){
if (!(num % div)) cout << div << “\n”;
div++;
}
return 0;
}
Распространенный прием программирования — организация бесконечного цикла с заголовком while (true) либо while (1) и принудительным выходом из тела цикла по выполнению какого-либо условия.
В круглых скобках после ключевого слова while можно вводить описание переменной. Областью ее действия является цикл:
while (int x = 0){ ... /* область действия х */ }
Цикл с постусловием (do while)
Цикл с постусловием имеет вид: do оператор while выражение;
Сначала выполняется простой или составной оператор, составляющий тело цикла, а затем вычисляется выражение, определяющее условие повторения тела цикла. Тип выражения должен быть арифметическим или приводимым к нему. Если выражение истинно, осуществляется переход к следующей итерации и тело цикла выполняется еще раз. Цикл завершается, когда выражение станет равным false или в теле цикла будет выполнен какой-либо оператор передачи управления.
Пример: программа осуществляет проверку ввода.
#include <iostream.h>
int main( ){
char answer;
do{
cout << “\nКупи слоника!”; cin >> answer;
}while (answer != “y”);
return 0;
}
Пример: программа вычисляет квадратный корень вещественного аргумента X с заданной точностью Eps по итерационной формуле:
где — предыдущее приближение к корню (в начале вычислений выбирается произвольно), — последующее приближение. Процесс вычислений прекращается, когда приближения станут отличаться друг от друга по абсолютной величине менее, чем на величину заданной точности. Для вычисления абсолютной величины используется стандартная функция fabs( ), объявление которой находится в заголовочном файле <math.h>.
#include <stdio.h>
#include <math.h>
int main( ){
double X, Eps; // аргумент и точность
double Yp=1, Y; // предыдущее и последующее приближение
printf (“Введите аргумент и точность:”);
scanf (“%lf,%lf”, &X, &Eps);
do Y = (Yp + X/Yp)/2 while (fabs (Y - Yp) >= Eps);
printf (“\nКорень из %lf равен %lf”, X, Y);
return 0;
}
Цикл с параметром (for)
Цикл с параметром имеет вид:
for (инициализация; выражение; модификации) оператор;
Инициализацияиспользуется для объявления и присвоения начальных значений величинам, используемым в цикле. Инициализация выполняется один раз в начале выполнения цикла.
Можно записать несколько операторов, разделенных запятой:
for (int i = 0, j = 2; ...
int k, m;
for (k = 1, m = 0: ...
Областью действия переменных, объявленных в части инициализации цикла, является цикл.
Выражениеопределяет условие выполнения тела цикла, представленного простым или составным оператором. Если результат вычисления выражения равен true, цикл выполняется. Цикл с параметром реализован как цикл с предусловием.
Модификациивыполняются после каждой итерации цикла и служат обычно для изменения параметров цикла. В части модификаций можно записать несколько операторов через запятую.
Любая из частей оператора for может быть опущена, но при этом точки с запятой надо оставить.
Пример: оператор, вычисляющий сумму чисел от 1 до 100.
for (int i = 1, s = 0; i < = 100; i++) s += i;
Пример: программа печатает таблицу значений функцииy = x2 +1 во введенном диапазоне:
#include <stdio.h>
int main( ){
float Xn, Xk, Dx, X;
printf (“Введите диапазон и шаг изменения аргумента: ”);
scanf (“%f%f%f”, &Xn, &Xk, &Dx);
printf (“\n| X | Y |”);
for (X = Xn; X <= Xk; X += Dx)
printf(“\n| %5.2f | %5.2f |”,. X, X*X + 1);
return 0;
}
Пример: программа находит все делители целого положительного числа.
#include <iostream.h>
int main( ){
int num, half, div;
cout << “\nВведите число: ”; cin >> num;
for (half = num / 2, div = 2; div <= half; div++)
if (!(num % div)) cout << div <<”\n”;
return 0;
}
Два последних примера выполняют те же действия, что и примеры для цикла с предусловием, но записаны более компактно и наглядно: все действия, связанные с управлением циклом, локализованы в его заголовке.
Любой цикл while может быть приведен к эквивалентному ему циклу for и, наоборот, по следующей схеме:
for (b1; b2; bЗ) оператор; b1; while (b2){ оператор; b3;}
Часто встречающиеся ошибки при программировании циклов — использование в теле цикла неинициализированных переменных и неверная запись условия выхода из цикла.
Чтобы избежать ошибок, рекомендуется:
· проверить, всем ли переменным, встречающимся в правой части операторов присваивания в теле цикла, присвоены до этого начальные значения;
· проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;
· предусмотреть аварийный выход из цикла по достижению некоторого количества итераций;
· если в теле цикла требуется выполнить более одного оператора, нужно заключать их в фигурные скобки.
Операторы цикла взаимозаменяемы, но можно привести некоторые рекомендациипо выбору наилучшего в каждом конкретном случае:
· Оператор do while обычно используют, когда цикл требуется обязательно выполнить хотя бы раз (например, если в цикле производится ввод данных).
· Оператором while удобнее пользоваться в случаях, когда число итераций заранее не известно, очевидных параметров цикла нет или модификацию параметров удобнее записывать не в конце тела цикла.
· Оператор for предпочтительнее в большинстве остальных случаев (однозначно - для организации циклов со счетчиками).
Тема 1.10