1.19M
Категория: ПрограммированиеПрограммирование

Основы алгоритмизации и программирования

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…if
int 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.

Оператор switch
switch (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.

Пример вопроса на экзамене
Операции && и ||:
• сравнивают два численных значения;
• комбинируют два численных значения;
• сравнивают два булевых значения;
• комбинируют два булевых значения.
English     Русский Правила