Урок 5. Условия и циклы
Привет! На этом уроке мы продолжим выполнение ДЗ. Напомню, что нам осталось реализовать две операции: деление и возведение в степень.
Деление В работе программиста очень важно задумываться не только над случаями, в которых код работает штатно, как от него ожидалось, но и над случаями, когда написанный код будет работать неправильно, с ошибками, которые могут привести к аварийному завершению работы приложения. Рассмотрим такой случай на примере операции деления.
c = a / b
a, b, c - целые числа.
Как ты помнишь со школьной скамьи делить на ноль нельзя, значит переменная b не может принимать значение 0. Но что же произойдет, если мы напишем, соберем и запустим такой код?
int a;
a = 1;
int b;
b = 0;
int c;
c = a / b;
Единственный достоверный источник информации о С++ - это стандарт языка. Говоря простым языком, стандарт языка - это набор правил, который описывает, как язык должен работать. На этом этапе тебе пока достаточно знать, что такой документ существует и где его можно найти.
О деление на ноль стандарт говорит следующее:
If the second operand of / is zero, the behavior is undefined. https://eel.is/c++draft/expr.mul#4
В этом предложении мы сталкиваемся с одной из болей C++ (да и любого другого языка) - undefined behavior https://eel.is/c++draft/defns.undefined (неопределенное поведение, кратко UB) - поведение, которое не описывается в стандарте. Т.е. поведение программы, в которой есть UB, полностью зависит от компилятора, которым собирается программа. В случае деления на 0 программа может аварийно завершиться (“упасть”), а этого допускать нельзя. В этом нам поможет…
Условный оператор if
Для начала запишем псевдокод
если b не равно 0 c = a / b иначе выведи в консоль ошибку
А теперь перепишем псевдокод на C++
if (b != 0)
{
c = a / b;
}
else
{
std::cout << "Error! Division by zero is not allowed";
}
Разберем построчно этот фрагмент кода
if (b != 0)
if - условный оператор, после него в круглых скобках необходимо написать условие, т.е. выражение, которое вернет истину или ложь. Если выражение в круглых скобках истинно, то выполнится операция в фигурных скобках, которые следуют за if.
b != 0 - выражение, которое возвращает истину в случае, если b не равно 0, и ложь - в противоположном случае. != - это логический оператор, который читается как “не равно”. Еще один полезный логический оператор - оператор сравнения ==
else - ключевое слово, с помощью которого можно задать операцию, которая будет выполнена в случае, если if вернет ложь. else существует в коде только вместе с if, отдельно else писать нельзя
Возведение в степень Вспомним, что такое возведение в степень. Возведением в степень называется арифметическая операция, когда число умножают само на себя в количестве раз, указанном в степени.
Если мы хотим возвести 2 в степень в 3, то мы должны умножить 2 само на себя 3 раза: 2^3 = 2_2_2 = 8 Т.е. на каждом шаге возведения в степень мы выполняем одно и тоже действие - это циклическая операция.
Напишем псевдокод для возведения a в степень b
a = 2 b = 0
c = 1
a = 2 b = 1
c = 1 c = c * a = 1 * 2 = 2
a = 2 b = 2
result = 1 result = result * a = 1 * 2 = 2 result = result * a = 2 * 2 = 4
Как вы уже догадались, переменная result - результат возведения a в степень b.
Либо в общем виде с использованием цикла
a = 2 b = 2
result = 1 i = 0
цикл пока i меньше b, выполнять result = result * a i = i + 1
В С++ существует несколько способов создания цикла, в этом уроке мы познакомимся с циклом for.
Общий вид цикла for
for (действие, которое выполняется до начала цикла; проверка условия продолжения цикла; действие которое выполняется после каждой итерации цикла)
{
действие
}
for работает следующим образом
- Выполняется действие до начала цикла. Например, можно объявить и инициализировать переменную цикла i
- Выполняется условие выхода из цикла. Да, условие выхода из цикла проверяется до выполнения первой итерации цикла. Если условие выполняется (возвращает истину), выполняется первая итерация цикла. Если условие цикла не выполняется, выполнение цикла завершается - программа переходит к выполнению первой строчки кода, которая следует за циклом.
- Выполнение тела цикла - кода, который находится в фигурных скобках
- Выполняется действие после завершение итерации цикла.
- Пункты 2, 3 и 4 выполняются последовательно, пока не завершится выполнение цикла.
Фух. Перепишем псевдокод на код С++
int a = 2;
int b = 2;
int c = 1;
for (int i = 0; i < b; ++i)
{
c = c * a;
}
Как это работает
- Объявляется переменная i и инициализируется нулем
- i сравнивается с b: 0 < 2 возвращает истину
- Вычисляется result = 1 *2 =2
- i увеличивается на 1, i = 1
- i сравнивается с b: 1 < 2 возвращает истину
- Вычисляется result = 2 *2 =4
- i увеличивается на 1, i = 2
- i сравнивается с b: 2 < 2 возвращает ложь. Выполнение цикла завершается.
Я думаю, ты заметил несколько нововведений.
Первое
int a = 2;
Настало время познакомиться с новой возможностью С++ - переменной можно присвоить значение при её создании. На профессиональном языке это называется “инициализировать переменную”. Отмечу, что использование неинициализированных переменных может приводить к ошибкам. При создании переменные не инициализируются, а потому могут хранить в себе абсолютно любое значение, чаще всего “мусорное”. Использование переменных до инициализации может привести к ошибкам при выполнении программы.
Второе
++i;
Это выражение называется инкремент переменной i, а точнее прединкремент. Инкремент увеличивает значение переменной на 1, т.е. является кратким аналогом операции i = i + 1 Есть еще постинкремент
i++;
Пока тебе достаточно запомнить, что прединкремент работает быстрее постинкремента. Почему это так, я наглядно объясню тебе во второй части курса, которая будет посвящена ООП.
Задание для самостоятельного выполнения Внеси правки в файл main.cpp на основе знаний, которые ты получил в этом модуле. В итоге у тебя должен получиться минималистичный калькулятор, который выполняет все операции из требований к ДЗ.
На этом на сегодня всё. До встречи на следующем уроке!