Материал: ЛР 3 Информатика 2 сем 2020

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

4 Лабораторная работа №3. Управляющие конструкции. Ветвление.

4.1Цели и задачи работы:

Цель данной лабораторной работы — научиться использовать конструкции языка для реализации ветвлений (условие, выбор и т.п.).

Задача данной лабораторной работы — выполнить выданные типовые задания, алгоритм решения которых содержит ветвления.

4.2Теоретическая часть

Втех случаях, определѐнные блоки программного кода должны выполняться или пропускаться в зависимости от определенного условия нужно использовать инструкцию «if-else». Ее синтаксис:

// условие

if ( выражение )

{

// Выполняется, если значение выражения true

}

else

{

// Выполняется, если значение выражения false

}

Например: по условию задачи, если значение переменной A равно 5, нужно вывести на экран слово «Privet!», а если переменная A имеет любое другое значение - «Poka!». Тогда в программе можно написать:

...

if (A == 5)

{

printf("Privet!");

}

else

{

printf("Poka!");

}

...

40

Если результат выражения в круглых скобках имеет не булевый тип, то он приводится к булевому типу. Например, для числовых типов значение 0 соответствует false, а все остальные значения – true.

Блок «else» не обязателен.

При оформлении кода рекомендуется всегда употреблять фигурные скобки при использовании инструкций if-else, чтобы не допустить возможности неправильной интерпретации кода.

В случае, когда инструкция «if-else» используется лишь для выбора одного из двух однотипных значений, еѐ можно заменить оператором условия (выбора) «?:». Оператор условия имеет три операнда. Его использование выглядит следующим образом:

выражение1 ? выражение2 : выражение3;

Сначала вычисляется значение выражения «выражение1». Если оно – имеет значение true, тогда вычисляется значение выражения «выражение2», если false - тогда вычисляется значение выражения «выражение3». Вычисленное значение «выражение2» или «выражение3» – результат работы оператора ?: Например, выражение (5 > 3) ? 1 : 2 имеет значение 1, а выражение (3 > 5) ? 1 : 2 имеет значение 2.

Если значение выражения «выражение1» не булевого типа, то оно к нему приводится.

Для примера, перепишем ранее рассмотренный фрагмент пограммы, который выводит на экран слово «Privet!», если значение переменной A равно 5, и «Poka!», если переменная A имеет любое другое значение:

...

//%s обозначает, что функцией printf мы выводим строку

//"Privet!" и "Poka!" – строковые литралы printf("%s", A == 5? "Privet!" : "Poka!");

...

Длинные цепочки инструкций «if-else», когда в блоки if и else вкладываются другие блоки if и else, трудны для восприятия и являются потенциальным источником ошибок. В качестве альтернативы таким цепочкам в отдельных случаях можно использовать инструкцию «switch».

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

{

case константа1:

//Выполняется, если значение выражения

//константа1

break; // для выхода из switch, что бы следующий

41

// блок не выполнялся

case константа2:

//Выполняется, если значение выражения

//константа2

break; // для выхода из switch, что бы следующий // блок не выполнялся

default:

//Выполняется, если значение выражения

//не совпало ни с одним из вышеперечисленных

}

Если почему-либо нужно, чтобы одна из секций не заканчивалась инструкцией «break», рекомендуется написать в этом месте разумный комментарий.

Данные, которые вводит пользователь, нужно проверять на корректность. Так же в определѐнных ситуациях нужно проверять данные, полученые при промежуточных вычислениях, чтобы, например, при вычислениях не получилось деления на ноль, взятия корня чѐтной степени от отрицательного числа, вычисления арксинуса от числа большего единицы и т.п.

Для реализации таких проверок в программе, в языке «C++» удобно использовать конструкцию «исключения». Для создания и обработки исключений используются выражения try, throw и catch.

...

// Вспомогательные переменные type1 A;

type2 B; type3 C;

...

try // блок, в котором необходимо отследить определённую ситуацию (напр., деление на 0)

{

... // здесь каким-либо образом определяется, что такая ситуация происходит

throw A; // создание «исключения», A - переменная какого-то типа, её значение будет нужно для обработки этой ситуации

... // здесь каким-либо образом определяется, что другая ситуация происходит

throw B; // создание «исключения», B - переменная другого типа, её значение будет нужно для обработки этой ситуации

42

... // ещё одна ситуация throw C; // аналогично

}

catch(type1 a) // блок для обработки

{

... // обработка первой ситуации, в a будет записано значение A

}

catch(type2 b) // блок для обработки

{

... // обработка второй ситуации, в b будет записано значение B

}

catch(...) // блок для обработки

{

... // обработка всех остальных ситуаций

}

...

Блок try используется для включения одного или нескольких выражений, которые могут создавать («бросать») исключения.

Выражение throw означает, что исключительное условие произошло в блоке try. В качестве операнда выражения throw можно использовать выражение любого типа. Значение выражения обычно несѐт информацию о возникшей ошибке

Для обработки исключений, которые могут быть созданы, необходимо реализовать один или несколько блоков catch сразу после блока try. Каждый блок catch указывает тип исключения, которое он может обрабатывать. Если в круглых скобках блока catch стоит троеточие – этот блок предназначен для обработки исключений любого типа.

Пример:

float a;

std::cout << "input a: "; std::cin >> a;

float b;

std::cout << "input b: "; std::cin >> b;

try // блок, в котором необходимо отследить исключения

{

if (b == 0) // если делитель равен нулю

{

throw 1; // «бросаем» исключение

}

43

// если b==0, то следующая строчка не выполнится std::cout << "a / b = " << a / b;

}

catch (int err) // блок обработки исключения указанного типа.

{

if(err == 1)

{

std::cout << "error: division by zero (b ==

0)";

}

else

{

std::cout << "error: any error";

}

}

catch (char) // Подобных блоков разных типов может быть несколько

{

std::cout << "any simbol error";

}

catch (...)// Если нужно обработать все возможные исключения

// одним блоком, в качестве аргумента используется троеточие

{

std::cout << "unknown error";

}

Если пользователь введѐт значение переменной b = 0, на экран будет выведено «error: division by zero (b == 0)», в остальных случаях будет выведено частное значений переменных a и b.

Если в вышеприведѐнном коде изменить «throw 1» на «throw 2», то при b == 0 на экране будет выведено «error: any error», а если на «throw 1.5» - будет выведено «unknown error».

Допускается бросать исключения внутри вызываемой функции, а отлавливать их в вызывающей.

void myfuncA()

{

...

throw "error";

...

44

Источник: https://studfile.net/preview/16421893/