04:11 

Учимся программировать на С++. Лекция 7. Блоки и условия. if-else

ToxicSpider
Бритуля - Богиня

Условие:
Напишите программу, которая выдает на экран размеры всех, пройденых на предыдущих лекциях переменных, в байтах. Напоминаю, для этой цели вам необходим оператор sizeof





Результат:



Примечание:
Мои результаты могут расходиться с вашими, по той причине, что эти размеры диктует операционная система







На этой лекции мы поднимемся на следующую ступеньку наших возможностей. Сегодня я освещу 2 новые вещи. Начнем по-порядку.



Блоки.


О блоках, как таковых, мало что можно сказать, но не сказать об этом вообще - невозможно. Дело в том, что в коде С++ можно ставить логические блоки. С одним из таких мы уже знакомы, это наш "обязательный шаблон":

int main() {
}


Точно так же, внутри этого блока, можно написать другой блок:

int main() {

// тут код до блока

{
// код в блоке
}

// код после блока

return 0;
}



Мы видим, что блок начинается с открывающей фигурной скобки '{', а заканчивается закрывающейся фигурной скобкой '}'. Сам по себе такой блок несет в себе мало смысла и мало толку, обычно, есть какое-то условие, для попадания алгоритма в блок и тогда такой блок приобретает колоссальный смысл! Сегодня мы рассмотрим самые элементарные из них.




Условия


Для чего нужны условия? Ну, я думаю, что на этот вопрос не требуется ответа. Это понятно само-собой. Правильная программа - это гибкий организм, который способен вести себя корректно, вне зависимости от ситуаций, в которые он попадает. Ваши программы будут пестрить "разветвлениями", из серии "если это так, то тебе - по этой дороге, а если иначе - тогда - сюда". Программа должна уметь обработать все! Часто, разные желания пользователя пускают алгоритм по разным дорогам, но всегда - это дорога, а не тупик.




Блок if - else


Я начну сразу с примера, объясню этот код:




Теперь разберем:

Вначале я расскажу про операторы:

num > 0 // num больше нуля?

num < 0 // num меньше нуля?

num == 0 // num равен нулю? (обратите внимание: ДВА знака "равно"! Один знак "равно", как мы уже знаем - это "положи в num ноль"! Будьте внимательны!)

num != 0 // num НЕ равен нулю?

num >= 0 // num больше ИЛИ равен нулю? (именно в таком порядке! НЕ => !!!)

num <= 0 // num меньше ИЛИ равен нулю?

Примечание: ноль тут только в качестве примера, там может быть любое число!

Примечание: некоторые программисты любят писать наоборот: if(0 == num) и делают это по одной, единственной причине: если они СЛУЧАЙНО напишут if (0 = num) - с одним знаком равно, то программа не скомпилируется, потому что компилятор "думает", что программист пытается "положить" в ноль значение переменной, а это - невозможно. Однако!!! Если написать if (num = 0) - программа скомпилируется! В num будет положен ноль, а это не то, что мы имели ввиду! На лицо - баг, причем - трудноуловимый (пока вы заметите свою оплошность.....)

Лично я не пишу в "обратном" порядке, просто потому что так привык.... стараюсь быть внимательным... надо сказать, что многие программеры не пишут в "обратном" порядке....


Объяснение кода:

Программа получает от пользователя число и:
Если число больше нуля, то она выдает на экран сообщение, что число - положительное
Если число меньше нуля, то она выдает на экран сообщение, что число - отрицательное
В противном случае, она пишет, что число равно нулю

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

То есть: программа зайдет ТОЛЬКО В ОДИН ИЗ НИХ. Если (и это важно понять!) программа найдет совпадение в условии, написанном выше - условия в остальных она даже НЕ БУДЕТ ПРОВЕРЯТЬ!

НО!

Допустимо поменять код следующим образом:

if(num > 0)
{
// обработка
}
if(num < 0)
{
// обработка
}


НО! В данном случае это будет не совсем корректно! Код все равно отработает правильно, но так как число НЕ может быть одновременно больше и меньше нуля - но получится ситуация, когда программа выполнит лишнюю работу: найдя совпадение в первом блоке и пройдя обработку - она полезет проверять условие во втором блоке. Почему? Потому что каждый новый if - новая песня))))

Примечание: обратите внимание!!! я НЕ ставлю точку с запятой после условия if Почему? Потому что условие и блок - одно целое! Если по-ошибке, после if поставить точку с запятой, то компилятор поймет это следующим образом: есть пустой блок if (что допускается в С++), а сразу за ним идет СОВЕРШЕННО не связанный с ним блок - БЕЗ каких-либо условий, то есть - надо зайти в него В ЛЮБОМ случае!

Код с двумя и более if подряд уместен с случае, если условия, которые проверяет программа - НЕ взаимоисключающие. Например, в одном if программа спрашивает больше ли число нуля, а во втором - четное ли оно.

Как мы видим из примера, можно писать сколько угодно if, а как дело обстоит с else if? else if тоже можно писать сколько угодно, НО!!! все они будут отнесены к самому "ближайшему" if И все они будут ВЗАИМОИСКЛЮЧАЮЩИЕ! То есть, попав в один из них - остальные, сколько бы их ни было - программа автоматически пропустит! Есть еще одно ограничение: если вы написали else if - это значит, что выше в коде, есть if! НЕЛЬЗЯ начинать проверки с else if - это не пройдет компиляцию, а так же, нельзя между двумя этими блоками писать код! Закончился один блок - СРАЗУ ЖЕ начался второй блок!

Блок else - может быть ТОЛЬКО ОДИН у каждого if! В него программа попадает только в том случае, если она не выполнила условий выше. И еще: МОЖНО писать блок if без else if ИЛИ без else ИЛИ без обоих! В коде ниже я привожу разные примеры и все они законны:



Окей, давайте разбирать.....
Чтобы не нагружать глаза лишней информацией, я написал только тот код, который соответствует поставленной цели: показать правила и возможности блока if - else, поэтому код внутри блока я не писал, а лишь отметил, что он там есть))) Также, я отделил звездочками блоки, чтобы было понято, где каждый блок начинается, а где заканчивается. В коде так делать не нужно и в будущем я так делать не буду.

Первый блок имеет только if

Второй имеет if, else if (2 раза) и else
Теперь секунду внимания: во втором блоке мы видим проверку "является ли число больше 7?", и ниже, в else if мы спрашиваем "больше ли оно нуля?", так вот, повторю это еще раз, но это будет последний раз: числа 8, 9, .... и так далее в else if НЕ попадут! Хоть они и больше нуля! Это произойдет потому что они "отбработаются" в верхнем if! Если у кого-то еще были до этого вопросы - надеюсь, что сейчас они исчерпаны)))
Естественно, что все уже понимают, что в else при таких условиях - попадут ТОЛЬКО отрицательные числа.... кто этого еще не понял - у меня для вас плохие новости)))) (шучу)
Однако! Например число 17 обработается как в if(num == 17) так и в if(num > 7), в ОБОИХ! Потому что это - два РАЗНЫХ блока if

В третьем блоке я обратил внимание, что можно обойтись и без else if

В четвертом - без else

Отлично... теперь можно немного отвлечься и поговорить о стиле)))

Существуют 2 разных подхода к "внешнему виду" блоков.
Один - вы видите выше. Чтобы понять отличие его от второго, я приведу пример с этим же кодом:



Как мы видим, открывающая скобка блока - сразу после условия И если есть условия else и/или else if - то они ставятся сразу, после закрывающей. Какой из стилей написания вы предпочтете - ваше личное дело, например я отдаю предпочтение последнему и весь последущий мой код будет выглядеть так.

Наконец, я расскажу, что возможна запись:



Как вы видите, if не имеет скобок блока ВООБЩЕ! Это возможно ТОЛЬКО в одном случае: после условия if - ТОЛЬКО одна строка кода, относящаяся к блоку! Если появляется еще хоть одна - скобки ОБЯЗАНЫ БЫТЬ! То есть, так писать можно, но не обязательно.... обычно я не беру одну строку в скобки, это зрительно уменьшает код))) Это правило работает с почти любым блоком! Блок, в котором это не работает мы увидим значительно позже, я отмечу это.

Примечание:На всех примерах сравнения я поставил с одной стороны оператора переменную, а с другой - прописал конкретное число (то есть - константу). НО! Думаю, что понятна следущая вещь: если переменные будут с обеих сторон - это тоже будет работать! Например, в программе нужно сравнить, равна ли переменная num1 переменной num2? При условии, что ОБЕ переменные одинакового типа, например int, можно и нужно написать: if(num1 == num2) и это отработает правильно!

Если я еще не взорвал вам мозг, то позволю себе продолжить))) Мы - на финишной прямой))) Крепитесь!

Теперь я не могу не осветить переменную типа bool. Дело в том, что когда мы пишем, например, if(num == 7) компьютер делает анализ и возвращает bool - правда или ложь. То есть, если у нас есть переменная bool, то можно написать так:

bool a = true;
if(a == true){
}


а можно написать сразу:

if(a){
}


Так как a - правда - то алгоритм попадет в блок.

Что делать, если:

bool b = false;

можно так:

if(b == false){
}


а можно так:

if(!b){
}


то есть поставить перед переменной b оператор "не" (!)

Кто забыл булевые операторы - мигом освежить память! Мы проходили это несколько лекций назад!



Окунемся, немного, в историю... язык С++ был создан в начале 90-х годов. Он совершил революцию в программировании, так как открыл новый взгляд на программирование, НО! До него был славный предшественник - язык С.
Можно сказать, что С - это предшественник многих современных языков! Они, как и С++ - очень похожи на С. И, на самом деле, открою вам маленькую тайну: выучив С++ вы легко поймете код, написанный на Java, C#, PHP.... потому что, за исключением некоторых дополнений все эти языки выглядят одинаково и работают по похожим законам.

Если быть до конца честным, то как такового языка С++ вы еще и не видели, уберите из кода cout и cin - и перед вами - чистейший С. В С просто высвечивали сообщения на экран немного другим способом, который мы обязательно разберем, потому что там есть интересные моменты, но это будет позже.

А пока я расскажу такую вещь:
В языке С отсутствует тип переменной bool. Как же выходят из ситуации программисты С? Очень просто! Если вы объявите переменную любого типа и положите туда ноль - это будет равносильно false, НО если положить ЛЮБОЕ другое число, отличное от нуля (положительное или отрицательное) - это будет true.

Тот же трюк работает и в С++, то есть:

int a = -7;

if(a){
сюда код зайдет
}

if(!a){
сюда НЕ зайдет!
}

float b = 0;

if(b){
сюда код НЕ зайдет!
}

if(!b){
сюда - зайдет!
}





Ну и закончим мы - сложными условиями....

Как мы помним, из лекции о булевых операциях, можно производить несколько сравнений на этом уровне, например нам нужно проверить, является ли число num больше 5-ти, но меньше 10-ти? Пишут так:

if(num > 5 && num < 10) есть такие (и ваш покорный слуга именно такой), которые это берут в скобки: if( (num > 5) && (num < 10) ) - оба эти условия отработают правильно.

Теперь, другой пример: нужно проверить, является ли другое число num меньше 3-х ИЛИ больше 7-ми?:

if(num < 3 || num > 7) ну, или со скобками: if( (num < 3) || (num > 7) )

Можно без конца это дело "усложнять", компьютер разберется со всем!
"Является ли число num больше 3, но меньше 7 ИЛИ больше 15-ти, но меньше 25?"

Вот тут скобки ОЧЕНЬ желательны, чтобы быть уверенными, какое из сравнений будет выполнено первым:

if( (num > 3 && num < 7) || (num > 15 && num < 25) )

Остановитесь на этих примерах, чтобы убедиться, что в них все понятно!

И, наконец, последнее, что хотелось бы добавить - внутри любого блока, можно открыть еще блок и внутри этого - тоже! По идее можно делать бесконечное количество таких "вложений"! Единственное, чем это дело ограничено - правилами хорошего тона. Принято считать, что большое количество вложений (одно в другое) - дурной тон, так как компьютер с этим делом справится, а вот программист, читающий код - вряд ли поймет такое))) Не увлекайтесь!

Итак: на этой лекции мы познакомились с понятием "блок", а так же рассмотрели блок с уловием if-else. Это не было легкой лекцией и может быть некоторые прибывают в легком шоке от количества свалившейся на них информации...НО! Не стоит пугаться или отчаиваться! Это - нормальное чувство! Я помню себя, когда выходил с лекций - всегда прибывал в таком состоянии, однако - сегодня я программист....

Все эти вещи очень скоро улягутся у вас в голове, на свои полочки, и там будет понимание и порядок. Для того, чтобы это произошло - нужно самому писать код, используя эти вещи, и как раз на этом домашнем задании мы напишем первый свой код с условиями!



Домашнее задание


Напишите программу, которая получает от пользователя символ и выполняет следущие действия:

Если символ это буква - программа пишет в консоль "символ является буквой",
а также: если эта буква заглавная, то программа добавляет: "символ является заглавной буквой"

Если символ это цифра - программа пишет: "символ является цифрой",
а также, если это 5 - добавляет: "это 5",
а также, если это 7 - добавляет: "это 7",
а также, если это 9 - добавляет: "это 9"

В любом другом случае программа пишет: "символ не является ни буквой, ни цифрой"


Запустите программу со следущими символами:
a, Z, 2, 7, [ , @ (кому не видно: пятый символ - квадратная скобка, находится на той же клавише, что и русское 'х')


Подсказка: желательно вспомнить, что существует таблица ASCII и внимательно ее изучить!

Удачи!

@темы: C++

URL
   

Godney

главная