1-2 - Разветвляющиеся алгоритмы - 2022

Содержание

Слайд 2

Операция «,» (запятая) Данная операция используется при организации строго гарантированной последовательности

Операция «,» (запятая)
Данная операция используется при организации строго гарантированной последовательности вычислений

(обычно используется там, где по синтаксису допустима только одна операция, например, в операторах цикла). Форма записи:
Выражение_1, … , Выражение_N;
Выражения 1, 2, …, N вычисляются последовательно друг за другом до последнего Выражения_N,
Пример 1:
i = 1, j = i + 1, k = 6, n = i + j + k ;
получим последовательность вычислений, принятых как один оператор.
Слайд 3

Пример 2: Операнд = Выражение_1, … , Выражение_N; Используя «запятую» в

Пример 2:
Операнд = Выражение_1, … , Выражение_N;
Используя «запятую» в операции присваивания,

нужно помнить, что операция присваивания выполняется справа на лево и, не смотря на то, что ВСЕ выражения БУДУТ выполнены, результатом будет Выражение_1.
Слайд 4

Пример ошибки. Вычислить Обозначив числитель a, знаменатель b запишем: a =

Пример ошибки. Вычислить

Обозначив числитель a, знаменатель b запишем:
a = 2

* cos ( x – M_PI / 6 );
b = 0,5 + sin ( y );
t = a / b;
В последней операции будет ошибка «Деление на ноль», т.к. в b = 0,5 + sin ( y );
Выражение_1 = 0, Выражение_2 = 5 + sin ( y ).
В результате b = 0;
Слайд 5

Операции сравнения В языке Си используются следующие операции сравнения (отношения между

Операции сравнения
В языке Си используются следующие операции сравнения (отношения между объектами):
==

Равно; != Не равно;
< Меньше; <= Меньше либо равно;
> Больше; >= Больше либо равно.
Пары символов разделять нельзя.
Общий вид операций отношений:
Операнд_1 Знак_Операции Операнд_2
Операндами могут быть любые арифметические выражения и указатели.
Арифметические выражения перед сравнением вычисляются и преобразуются к одному типу.
Результат операции имеет значение 1 (true), если отношение Истинно, или получено не нулевое значение, в противном случае 0, т.е. Ложно (false).
Слайд 6

В языке Си нет логического типа данных, в С++ это тип

В языке Си нет логического типа данных, в С++ это тип

bool – значения true (1) false (0).
Операции сравнения на равенство и неравенство имеют меньший приоритет, чем остальные операции отношений.
Арифметические операции имеют больший приоритет над операциями сравнения.
Примеры. Какие будут результаты в следующих выражениях:
int a = 2, b = 5, x;
1) x = a % b == 0;
2) x = a * b > 3;
3) x = (a != 0) + (b == 5);
Слайд 7

Логические операции Логические операции в порядке убывания приоритета: ! – Логическое

Логические операции
Логические операции в порядке убывания приоритета:
! – Логическое «НЕ», отрицание

(инверсия);
&& – Логическое «И», конъюнкция (умножение);
|| – Логическое «ИЛИ», дизъюнкция (сложение).
Операндами логических операций могут быть любые скалярные объекты. Ненулевое значение операнда Истинно (1), нулевое – Ложь (0). Результат логической операции 1, или 0.
Общий вид унарной операции отрицания, которая изменяет значение Операнда на противоположный:
! Операнд
Примеры ( ! Истина – Ложь ):
1) ! 0 → 1
2) ! 5 → 0
Слайд 8

Общий вид бинарных операций И и ИЛИ Выражение_1 Операция Выражение_2 1.

Общий вид бинарных операций И и ИЛИ
Выражение_1 Операция Выражение_2
1. В операции

И (&&) результат 1 только если Истинны оба Выражения, иначе – 0 (умножение).
2. В операции ИЛИ (||) результат 0 только если Ложны оба Выражения, иначе – 1 (сложение).
Особенность операций И и ИЛИ – экономное последовательное вычисление Выражений-Операндов:
1) если Выражение_1 операции И Ложно, то результат операции – 0 и Выражение_2 не вычисляется;
2) если Выражение_1 операции ИЛИ Истинно, то результат операции – 1 и Выражение_2 не вычисляется.
Слайд 9

Логические операции «И» и «ИЛИ» имеют меньший приоритет, чем операции сравнения.

Логические операции «И» и «ИЛИ» имеют меньший приоритет, чем операции сравнения.


Примеры:
1) y > 0 && x == 7 → 1, если оба выражения Истинны;
2) y > 0 || x == 7 → 1, если хотя бы одно выражение Истинно.
3) чтобы записать x ∈ [a, b] (a ≤ x ≤ b):
x >= a && x <= b
4) чтобы записать x ∈ [a, b] или x ∈ [с, d]:
(x >= a && x <= b) || (x >= c && x <= d)
Слайд 10

Побитовые логические операции (~, &, |, ^) и операции над битами

Побитовые логические операции (~, &, |, ^)
и операции над битами

(>>, <<)
В языке Си предусмотрен набор операций для работы с отдельными битами. Побитовые логические операции нельзя применять к переменным вещественного типа.
Обозначения операций:
~ Дополнение (унарная операция);
& Побитовое «И»;
| Побитовое включающее «ИЛИ»;
^ Побитовое исключающее «ИЛИ» – сложение по модулю 2;
>> Сдвиг вправо;
<< Сдвиг влево.
Слайд 11

Условный оператор Условный оператор if (если) используется для разветвления процесса на

Условный оператор
Условный оператор if (если) используется для разветвления процесса на два

направления.
Условный оператор может быть простым и полным.
Форма простого оператора:
if (Выражение) Оператор;
Выражение – логическое или арифметическое выражение, вычисляемое перед проверкой.
Если Выражение истинно (не равно 0), то выполняется Оператор, иначе он игнорируется.
Оператор – простой или составной (блок) оператор.
Блок создаем, если необходимо выполнить более одного оператора (заключаем их в фигурные скобки).
Слайд 12

Примеры записи: 1) if (x > 0) y = 0; 2)

Примеры записи:
1) if (x > 0) y = 0;
2) if (i

!= 1) { – Создаем Блок
j++; s = 1;
}
3) if (i != 1) j++, s = 1; – Используем Запятую
Слайд 13

Форма полного (составного) оператора if – else: if (Выражение) Оператор_1 ;

Форма полного (составного) оператора if – else:
if (Выражение) Оператор_1 ;

else Оператор_2 ;
Если Выражение Истинно, то выполняется Оператор_1, иначе (else) – Оператор_2. Операторы 1, 2 могут быть простыми или составными (блоками).
Символ «;» перед словом else в языке Си обязателен.
Слайд 14

Операторами 1, 2 могут быть любые, в том числе и условные.

Операторами 1, 2 могут быть любые, в том числе и условные.

Если есть вложенные операторы if-else, то текущий else принадлежит ближайшему if, не имеющему else. Например:
if (n > 0)
if(a > b) z = a;
else z = b;
Здесь else связан со вторым if (a > b).
Если нужно связать else с внешним if, то используем операторные скобки (блок):
if (n > 0) {
if (a > b) z = a;
}
else z = b;
Обратите внимание, что после заголовка оператора if (Выражение) «;» не ставится!!!
Слайд 15

В следующей цепочке операторов if-else-if Выражения 1,2,3 просматриваются последовательно: if (Выражение_1)

В следующей цепочке операторов if-else-if Выражения 1,2,3 просматриваются последовательно:
if (Выражение_1)

Оператор_1;
else
if (Выражение_2) Оператор_2;
else
if (Выражение_3) Оператор_3;
else Оператор_4 ;
Если какое-то Выражение оказывается истинным, то выполняется относящийся к нему Оператор и этим вся цепочка заканчивается.
Оператор_4 будет выполнен только, если все Выражения (1, 2, 3) Ложны.
Слайд 16

Замечание 1. Наиболее распространенной ошибкой является использование в Выражении операции присваивания

Замечание 1. Наиболее распространенной ошибкой является использование в Выражении операции присваивания

«=» вместо операции сравнения на равенство «==» (два знака равно). Например, в следующем операторе синтаксической ошибки нет
if (x = 5) a++;
но значение а будет увеличено на единицу независимо от значения переменной х, т.к. результатом операции присваивания х = 5 в круглых скобках является значение
5 ≠ 0 – Истина.
Замечание 2. Вычисления по равенству вещественных величин рекомендуются задавать в условии else.
Слайд 17

Пример 1: if (x else if(x > 0) cout cout Пример

Пример 1:
if (x < 0) cout << " X отрицательное "

<< endl;
else
if(x > 0) cout << " X положительное " << endl; else
cout << " X равно нулю " << endl;
Пример 2: вычислить

Более корректной для double x, z; будет следующая запись
if (z < 1) x = z * z;
else
x = z + 1;

Слайд 18

Условная операция «?:» Условная операция – тернарная, т.к. в ней участвуют

Условная операция «?:»
Условная операция – тернарная, т.к. в ней участвуют три

операнда. Ее форма:
Выражение_1 ? Выражение_2 : Выражение_3
если Выражение_1 Истинно, то результат операции Выражение_2, иначе – Выражение_3. Каждый раз вычисляется только одно из Выражений 2 или 3.
Схема работы аналогична схеме полного оператора if :
Слайд 19

Пример 1: найти максимальное между a и b. 1. Используя оператор

Пример 1: найти максимальное между a и b.
1. Используя оператор if

:
if (a > b) max = a;
else max = b;
2. Используя условную операцию:
max = (a > b) ? a : b;
Условную операцию можно использовать также как и любое другое выражение.
Пример 2: найти y = max(a, b) / max(c, d);
y = (a > b ? a : b) / (c > d ? c : d);
Слайд 20

Оператор безусловного перехода goto Метка ; (перейти на …) передает управление

Оператор безусловного перехода
goto Метка ; (перейти на …)
передает управление оператору с

указанной Меткой. Метка – идентификатор, записанный по синтаксису языка Си с символом «двоеточие» после него. Например, пустой оператор «;» с меткой m1
m1 : ;
Область действия Метки – функция (блок), где она определена.
Имена меток не декларируются.
Слайд 21

Операторы (циклы, switch) могут быть вложены вдруг в друга и наиболее

Операторы (циклы, switch) могут быть вложены вдруг в друга и наиболее

оправданный случай использования оператора goto – выход во вложенной структуре.
Например, выход из двух (или более) вложенных операторов при возникновении грубых ошибок:
Оператор 1 (...) {
Оператор 2(...) {
...
if (Ошибка) goto error;
}
...
}
error : - Устранение ошибки
Второй случай: переход из нескольких мест функции в одно, например, когда перед завершением работы функции необходимо сделать одни и те же действия.
Слайд 22

Оператор альтернативного выбора Составной оператор switch (переключатель) предназна-чен для разветвления процесса

Оператор альтернативного выбора
Составной оператор switch (переключатель) предназна-чен для разветвления процесса вычислений

на несколько направлений (три и более).
Общий вид:
switch ( Выражение ) { - Заголовок оператора
case Константа_1: Список_1 Операторов
case Константа_2: Список_2
...
case Константа_N : Список_N
default : Список_N+1 – Необязательная ветвь
}
Типы Выражения и Констант должны совпадать и могут быть только int (целый) или char (символьный).
Слайд 23

Сначала вычисляется Выражение, затем оно сравни-вается с Константами, которые фактически выполняют

Сначала вычисляется Выражение, затем оно сравни-вается с Константами, которые фактически выполняют

роль меток.
Если значение Выражения совпало с одной из Констант, то выполняется соответствующий Список Операторов. Далее, если выход (оператор break) из switch в данной ветви не указан, последовательно выполняются все остальные ветви (до конца, или до первого break).
Константы должны иметь разные значения одного типа. Несколько меток могут следовать подряд, тогда переход в указанную ветвь будет происходить при совпа-дении хотя бы одной из них. Порядок следования ветвей не важен.
Если Выражение не совпало ни с одной из Констант, то выполняется ветвь default, а при ее отсутствии – оператор, следующий за switch.
Слайд 24

Оператор break (разрыв, прерывание) выполняет досрочный выход из оператора switch .

Оператор break (разрыв, прерывание) выполняет досрочный выход из оператора switch .


Если по совпадению с каждой Константой должна быть выполнена только одна ветвь, в конце каждой из них используем break.
Пример switch с использованием оператора break:
Слайд 25

. . . int i = 2; switch ( i )

. . .
int i = 2;
switch ( i ) {

case 1: cout << " Case 1 " << endl; break;
case 2: cout << " Case 2 " << endl; break;
case 3: cout << " Case 3 " << endl; break;
default : cout << " Default " << endl; break;
}
cout << " End switch" << endl;
. . .
Результат:
Case 2
End switch
Слайд 26

Пример switch без break: . . . int i = 2;

Пример switch без break:
. . .
int i = 2;
switch (

i ) {
case 1: cout << " Case 1 " << endl;
case 2: cout << " Case 2 " << endl;
case 3: cout << " Case 3 " << endl;
default : cout << " Default " << endl;
}
cout << " End switch " << endl;
. . .
Результат в данном случае:
Case 2
Case 3
Default
End switch
Слайд 27

Пример выбора и расчета функции f(x): 2x, x2, x/3 : .

Пример выбора и расчета функции f(x): 2x, x2, x/3 :
.

. .
int kod;
double f, x;
cout << " 1 – 2x (Default)\n 2 – x*x \n 3 – x / 3 " << endl;
cin >> kod;
switch ( kod ) {
case 1 : default :
f = 2 * x; cout << " f = 2x ( Default ! ) " << endl;
break;
case 2 :
f = x * x; cout << " f = x*x " << endl;
break;
case 3 :
f = x / 3; cout << " f = x/3 " << endl;
break;
}
. . .
Слайд 28

Можно сделать проще : . . . int code; . .

Можно сделать проще :
. . .
int code;
. . .
cout <<

" 1 – 2x \n 2 – x*x \n ELSE – x / 3 " << endl;
cin >> code;
switch ( code) {
case 1 :
f = 2 * x; cout << " f = 2x " << endl;
break;
case 2 :
f = x * x; cout << " f = x*x " << endl;
break;
default :
f = x / 3; cout << " f = x/3 ( Default ! ) " << endl;
break;
}
. . .