Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
16
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

1.9. Управляющие операторы

Все операторы можно разделить на те, которые выполняют действия связанные с вычислениями, вводом-выводом, и те которые управляют программой. Последняя фраза, вероятно, требует пояснений. Например, вы решаете квадратное уравнение. Если его дискриминант оказался отрицательным, то процесс вычисления пойдет по другому пути. Короче говоря, все операторы делятся на управляющие и простые иногда их называют последовательными.

Управляющими операторами называются операторы, влияющие на ход выполнения программ. Управляющие операторы могут нарушать последовательность операторов, возвращаясь назад или наоборот передвигаясь вперед, минуя некоторые другие операторы.

Простыми или последовательными операторами называются операторы, которые не управляют выполнением других операторов. Эти операторы выполняются по порядку друг за другом. Каждый последующий выполняется после выполнения предыдущего. Примером могут являться все арифметические операторы, а также операторы ввода и вывода.

Если о простых операторах некоторые знания у нас имеются, то управляющие операторы пока для нас являются диковиной. Вот и рассмотрим их.

Оператор if-else.

Иногда этот оператор еще называют условным или оператором ветвления. На русский язык его можно перевести как если-то. Выглядит он так

if(логическое выражение в круглых скобках)

оператор1, который выполняется если условие имеет значение true ;

else

оператор2, который выполняется если выражение в круглых скобках имеет значение false ;

Обратите внимание, что после оператора1 и оператора2 ставится точка с запятой.

Если логическое выражение выполняется, то программа выполняет оператор1 и переходит к выполнению следующего оператора, стоящего после else, т.е. минуя else и оператор2. Если логическое выражение имеет значение false, то выполняется оператор2 и выполнение программы переходит к следующему оператору.

Приведем пример.

int n=3, m=5;

if (n<= m) cout << “n is little\n”;

else cout << “n is big”;

Выражение в круглых скобках имеет значение true, следовательно на экране появится сообщение «n is little», но естественно без кавычек.

А вот пример того, как оператор if-else реализуются в стиле "С".

#include <iostream>

using namespace std;

int main(void) //пока не обращайте внимание на слово void

{ int d=7;

if (d) cout<<"true\n";

else cout<<"false\n";

}

В результате на экране появится true.Непонятно? Дело в том, что в языке "С" нет чисел true и false хотя логические операторы применяются. Просто вместо false используется ноль, а true это, что угодно, только не ноль. Часто при написании программ в "С++" это приводит к ошибкам.

Если выполнение логического условия оператора if должно повлечь выполнение не одного, а нескольких операторов, то все они заключаются в фигурные скобки. Тоже самое относится ко второй части else. Иначе говоря, в общем виде оператор if-else имеет вид:

if(логическое выражение)

{группа операторов, которые выполняются когда результат логического вырадения равен true}

else

{группа операторов, которые выполняются когда результат равен false}

Фигурные скобки объединяют группы операторов в один составной оператор. После фигурных скобок точка с запятой не ставится.

Оператор if-else также может использоваться в сокращенном виде, при этом используется только первая часть if. Например, n=3, m=5. Посмотрим, какой результат даст фрагмент программы.

if (n==5){n++;

cout << "n=" << n << "\n";

}

m--;

cout << "m=" << m << "\n";

В результате на экране появится m=4.

Теперь у нас есть все возможности, чтобы рассмотреть более серьезный пример. Если вы помните, мы упомянули о возможности ветвления программы при решении квадратного уравнения. Вот и запишем такую программу. Итак, пусть задано уравнение вида ax2+bx+c=0. Требуется найти корни при коэффициентах заданных с клавиатуры.

Программу можно записать так

//Программа для вычисления корней квадратного уравнения

#include <cmath> //это новая библиотека

#include <iostream>

using namespace std;

main(){

double Rex1,Rex2,Imx1,Imx2,a,b,c,diskr;

cout << ”a=”; //Ввод коэффициентов

cin >> a;

cout << ”b=”;

cin >> b;

cout << ”c=”;

cin >> c;

if (a!=0.0) //Предусмотрим возможность а=0

{

diskr=b*b-4*a*c; //Вычислим дискриминант

if (diskr >=0) //Если дискриминант больше нуля

{Rex1=(-b+sqrt(diskr))/(2*a); /*Вычисляем 2 действительных

* корня */

Rex2=-b- sqrt(diskr)/(2*a); /*sqrt()–функция вычисления

квадратного корня */

Imx1=0.0;

Imx2=0.0;

}

else //Если дискриминант меньше нуля

{

Rex1=-b/(2*a);

Rex2= Rex1;

Imx1= sqrt(-diskr)/(2*a);

Imx2= Imx1;

}

cout <<”x1=”<<Rex1<<”+j”<<Imx1<<”\n”;

cout <<”x2=”<<Rex2<<”-j”<<Imx2<<”\n”;

}

else // случай когда а=0

{

Rex1=-c/b;

cout <<”x=”<<Rex1;

}

}

В программе использована новая директива в заголовке #include <cmath>, которая означает, что нужно подключить библиотеку арифметических функций. Именно с ее помощью вычислялся квадратный корень из дискриминанта. Для этого используется функция sqrt().

В результате, при коэффициентах:

a=1

b=2

c=3

получаем корни

x1= -1+j1.41421

x2= -1-j1.41421

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

тип имя_ключа; //объявление переменной, которая будет ключом

(имя_ключа) { //ключ это имя заранее определенной переменной

case <1-е значение ключа>: //обратие внимание на двоеточие

1-я группа операторов

break;

case <2-е значение ключа>:

2-я группа операторов

break;

. . . . .

case <n-е значение ключа>:

n-я группа операторов

break;

}

//Окончание оператора switch

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

default:<исполняемые операторы>; break;

Приведем пример. Создадим программу, которая определяет оценку по введенной цифре.

#include <iostream>

using namespace std;

main()

{

int grade; //объявление переменной, которая будет ключом

cout<<"Input grade ";

cin>>grade;

switch(grade) {//объявление ключа

case 1: cout<<"bad"; break;

case 2: cout<<"bag"; break;

case 3: cout<< "satisfactory"; break;

case 4: cout<< "good"; break;

case 5: cout<< "very well"; break;

default: cout<< "Not grade!"; break;

}

}

Внутри оператора switch могут находиться вложенные управляющие операторы, в том числе и другой оператор switch.

Условная операция (?:)

Условная операция (?:) - единственная трехчленная (тернарная) операция в C++, имеющая три операнда. Ее синтаксис:

условие ? выражение! : выражение_2

Первый операнд является условием, второй операнд содержит значение условного выражения в случае, если условие истинно, а третий операнд равен значению условного выражения, если условие ложно. Например, оператор

string =grade>3? "Ваши знания неплохие" : "Плохо";

Возвращает строку "Ваши знания неплохие" если grade>3 иначе "Плохо" .

Оператор с условной операцией выполняет фактически те же функции, что и оператор if...else. Но в ряде случаев применение условной опе­рации компактнее и нагляднее оператора if...else. К тому же иногда условная опе­рация может использоваться в таких ситуациях, когда применение оператора if...else синтаксически невозможно.

В условной операции условие может быть любым скалярным выражением. Условные выражения могут быть практически любого типа (арифметические, указатели, структуры, объединения), но типы двух выражений в операции должны быть согласованными. В качестве условных выражений могут также фигурировать какие-то исполняемые действия.