Similar presentations:
Основы алгоритмизации и программирования
1.
Основы алгоритмизации ипрограммирования
Пашук Александр Владимирович
[email protected]
2.
Содержание лекции1. Ветвление
2. Условный оператор if. Оператор
if…else.
3. Операторы switch, break.
4. Сравнение switch и if…else.
5. Логические операции.
6. Примеры.
3.
Ветвление• Программы должны принимать решения.
• Решение или ветвление, сводится к переходу в
другую часть программы в зависимости от
условия или выражения.
• В зависимости от ситуации, C++ предоставляет
несколько типов ветвлений: if…else для выбора
между двумя альтернативами, switch для
выбора одной из множества альтернатив, а
также условная операция.
4.
Условный оператор if• Наиболее простой из операторов ветвлений.
• За ключевым словом if следует условие ветвления,
заключенное в круглые скобки.
int main() {
int x = 0;
cout << "Enter the number: ";
cin >> x;
if (x>100)
cout << "Number is greater than 100\n";
return 0;
}
5.
Синтаксис оператора if// Single statement
if (x == 100)
<statement>;
// Multiple statements
if (y > 0) {
<statement_1>;
<statement_2>;
<statement_3>;
} // Without `;` !
6.
Примерint main() {
int x = 0;
cout << "Enter the number: ";
cin >> x;
if (x > 100) {
cout << "Number " << x;
cout << "is greater than 100\n";
}
return 0;
}
7.
Функция exit()• Библиотечная функция exit() производит
немедленный выход из программы, независимо
от того, в каком месте она находится.
• Не возвращает значения.
• Единственный
аргумент
–
возвращается
вызывающему окружению после того, как
программа завершится. Как правило, 0 –
успешное завершение, ненулевое значение –
ошибка.
8.
Пример#include <math.h>
// ...
int main() {
int x;
cout << "Enter the number to compute square
root(): ";
cin >> x;
if (x < 0) {
cout << "Cannot compute square root\n";
exit(0);
}
cout << "Square root: " << sqrt(x);
return 0;
}
9.
Оператор if…else• Оператор if позволяет совершать действие в том
случае, если условие выполняется. В противном
случае, никакого действия не выполняется.
• В случаях, когда необходимо выполнить
различные действия в зависимости от условия,
необходимо использовать конструкцию if…else.
10.
Оператор if…else// Single statement
if (x == 100)
<statement_1>;
else
<statement_2>;
// Multiple statements
if (y > 0) {
<statement_1>;
<statement_2>;
} else {
<statement_3>;
<statement_4>;
} // Without `;` !
11.
Форматирование// Good
if (y > 0) {
<statement_1>;
<statement_2>;
} else {
<statement_3>;
<statement_4>;
}
// Good
if (y > 0)
{
<statement_1>;
<statement_2>;
}
else
{
<statement_3>;
<statement_4>;
}
12.
Форматирование// Good
// Bad
if (x > 0) {
if (y > 0) {
<statement_1>;
<statement_1>;
} else {
<statement_2>;
<statement_2>;
} else
}
<statement_3>;
// Also good
// Also bad
if (x > 0)
if (y > 0)
<statement_1>;
else
<statement_1>;
else {
<statement_2>;
<statement_2>;
<statement_3>;
}
13.
Вложенные ветвления• Конструкция if…else может быть вложенной.
• Вложенные группы ветвлений называются
деревом ветвлений.
• Во вложенных ветвлениях часто возникает
сложность установления соответствия между
else и if.
• Для того, чтобы связать else с корректным if
необходимо использовать фигурные скобки
14.
Примерint main() {
int a, b, c;
• 1, 2, 3
?
cout << "Enter a, b, c: ";
cin >> a >> b >> c;
if (a == b)
if (b == c)
cout << " a == b == c\n";
else
cout << "a != b\n";
return 0;
}
• 2, 2, 2
?
• 2, 3, 3
?
• 3, 3, 2
?
15.
Вложенные ветвленияОбщее правило: else будет связан с последним из
операторов if, который не имеет своего
собственного блока else.
Если необходимо связать else с тем if, который
расположен
раньше,
нужно
использовать
фигурные скобки.
16.
Пример// ...
// ...
if (a == b)
if (a == b) {
if (b == c)
if (b == c)
cout << " a == b == c\n";
else
cout << " a == b == c\n";
} else {
cout << "a != b\n";
cout << "a != b\n";
}
// ...
// ...
17.
Еще один примерint x, y;
char direction;
if (direction == 'n')
y--;
else
if (direction == 's')
y++;
else
if (direction == 'e')
x++;
else
if (direction == 'w')
x--;
18.
Конструкция else…if• Вложенные ветвления (как в предыдущем
примере) могут представлять трудность для
восприятия, особенно при большой глубине
вложенности.
• Существует альтернативный вариант записи
вложенных ветвлений – с помощью конструкции
else…if.
19.
Конструкция else…ifint x, y;
char direction;
if (direction == 'n')
y--;
else if (direction == 's')
y++;
else if (direction == 'e')
x++;
else if (direction == 'w')
x--;
20.
int main() {int x = 10, y = 10;
Пример
char direction = 'a’;
do {
if (direction == 'n’)
y--;
else if (direction == 's’)
y++;
else if (direction == 'e’)
x++;
else if (direction == 'w’)
x--;
cout << "\n\nCurrent coordinates: " << x << ", " << y;
cout << "\nEnter direction (n, s, e, w) to go: ";
} while ((direction = getche()) != '\r’);
return 0;
}
// <conio.h>
21.
Оператор switch• Альтернативный
оператор ветвления.
• Используется в случаях,
когда в программе
присутствует большое
дерево ветвлений и все
ветвления зависят от
значения
одной
переменной.
switch (var) {
case <c_0>: {
// ...
break;
}
case <c_1>: {
// ...
break;
}
default: {
// ...
}
} // No `;` needed!
22.
Оператор switch• Перед входом в тело
switch переменная var
должна
быть
проинициализирована
каким-либо значением
• Тип констант (c_0, c_1,
etc.), используемых
в
операторах case должен
совпадать
с
типом
переменной var.
• Можно
использовать
переменные типа int или
char.
switch (var) {
case <c_0>: {
// ...
break;
}
case <c_1>: {
// ...
break;
}
default: {
// ...
}
}
23.
Оператор switchswitch (var) {
case <c_0>: {
// ...
break;
}
case <c_1>: {
// ...
break;
}
default: {
// ...
}
}
24.
Оператор break• Завершает выполнение ветвления switch.
• Если сравнение переменной switch c константой
в case дает истинный результат, то операторы
будут исполняться до тех пор, пока не встретится
слово break.
• После оператора break управление передается
первому
оператору,
следующему
за
конструкцией switch.
25.
Примерswitch(direction) {
case 'n':
y--; break;
case 's':
y++; break;
case 'e':
x++; break;
case 'w':
x--; break;
default:
cout << "Wrong symbol!\n";
26.
int main() {int x = 10, y = 10;
char direction = 'a’;
Пример
do {
switch(direction) {
case 'n': y--; break;
case 's': y++; break;
case 'e': x++; break;
case 'w': x--; break;
}
cout << "\nCurrent coordinates: " << x << ", " << y;
cout << "\nEnter direction (n, s, e, w) to go: ";
} while ((direction = getche()) != '\r’);
return 0;
}
27.
Примерint i = 1;
switch (i) {
case 1:
cout << "Branch 1\n";
case 2:
cout << "Branch 2\n";
case 3:
case 4:
cout << "Branches 3-4\n";
default:
cout << "Default Branch\n";
}
28.
Ключевое слово default• Последняя ветвь конструкции switch обычно
начинается со ключевого слова default.
• Предназначено для того, чтобы программа
могла выполнить какие-либо действия в случае,
если ни одно из значений констант не совпало
со значением переменной.
• Указывать ключевое слово break не нужно.
• Рекомендуется не пропускать конструкцию при
разработке программ.
29.
int main() {int x = 10, y = 10;
char direction = 'a’;
do {
switch(direction) {
case 'n': y--; break;
case 's': y++; break;
case 'e': x++; break;
case 'w': x--; break;
case 'a': cout << "\nStay on spot...\n"; break;
default: cout << "\nWrong symbol. Try again!\n";
}
cout << "\n\nCurrent coordinates: " << x << ", " << y;
cout << "\nEnter direction (n, s, e, w) to go: ";
} while ((direction = getche()) != '\r’);
return 0;
Пример
}
30.
switch vs if…else• Проверка
значений • Проверка значений не
одной и той же связанных
друг
с
переменной
другом переменных
• Единственная
• Проверка
доступная проверка – любой
сравнение
с сложности
константой
(равенство)
условий
степени
31.
Условная операцияРаспространенная
проблема:
переменной
необходимо присвоить одно значение в случае
выполнения некоторого условия и другое
значение, если это условие не выполняется.
Пример: нахождение минимального из двух
чисел.
if (a < b)
min = a;
else
min = b;
32.
Условная операцияДля таких случае была специально разработана
условная операция:
min = (a < b) ? a : b;
Знак вопроса (?) и двоеточие (:) обозначают
условную операцию.
Условие (a < b) является условием проверки.
Скобки необязательны, но желательны!
33.
Условная операция34.
Пример использованияmin = a < b ? a : b;
max = a > b ? a : b;
abs_value = (n < 0) ? -n : n;
Рекомендация: следует соблюдать баланс между
компактностью кода и его читаемостью.
// very bad!
int median(int a, int b, int c) {
return (a<b) ? (b<c) ? b : (a<c) ? c : a : (a<c)
? a : (b<c) ? c : b;
}
35.
Логические операции• Кроме арифметических операций (+, -, *, /, %) и
операций отношения (<, >, <=, >=, == и !=) можно
выделить третью группу операций – логические
операции.
• Логические операции позволяют производить
действия над булевыми переменными (истина и
ложь).
36.
Логические операцииВ C++ существуют 3 логические операции:
• && – логическое И
• || – логическое ИЛИ
• ! – логическое НЕ
Операции «исключающее ИЛИ» в языке C++ нет.
37.
Операция логического Иint main() {
// ...
// switch
if (x == 9 && y == 12) {
cout << "\n\n\nYou found
the treasure!\n";
exit(0);
}
// ...
return 0;
}
38.
Операция логического ИЛИint main() {
// ...
// switch
if (x < 0 || x > 20) {
cout << "\n\nWatch out
dragons!\n";
}
// ...
return 0;
}
39.
Операция логического НЕ• Является унарной (имеет один операнд).
• Действие операции ! заключается в том, что она
меняет
значение
своего
операнда
на
противоположное.
• Если операнд имел истинное значение, то после
применения операции ! он становится ложным
и наоборот.
Примеры: x == 7, !(x == 7)
40.
Целые величины в качествебулевых
Выражение x рассматривается как истинное в том
случае, если его значение не равно нулю, и как
ложное, если его значение равно нулю.
int x = 5; // x == true; !x == false;
if (!x) {} // if (x == 0) {}
int x = 0; // x == false; !x == true;
if (x) {} // // if (x != 0) {}
if ( x%7 == 0 && y%7 == 0 ) {}
if ( !(x % 7) && !(y % 7) ) {}
41.
Приоритеты операций C++Тип операции
Операции
!, ++, --, +, Унарные
Арифметические *, /, %
+, <, >, <=, =>
Отношения
==, !=
&&, ||
Логические
?:
Условная
=, +=, -=, *=, /=, %=
Присваивания
Приоритет
Высший
Низший
42.
Приоритеты операцийРекомендации:
• Использовать скобки в сложных выражениях с
несколькими операциями, даже там, где это не
является
обязательным.
Это
уменьшит
вероятность ошибок и упростит код для чтения
другими разработчиками.
• В некоторых случаях лучше разбить сложное
выражение на несколько более простых,
сохраняя результат вычисления во временных
переменных.
43.
Пример вопроса на экзаменеОперации && и ||:
• сравнивают два численных значения;
• комбинируют два численных значения;
• сравнивают два булевых значения;
• комбинируют два булевых значения.