ToxicSpider
Бритуля - Богиня
Здрасте!

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

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

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

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


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


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



Код:




Результат:


















На прошлой лекции мы впервые познакомились с условиями. На самом деле, эта лекция должна была, по моей задумке, стать частью предыдущей, но посмотрев на объем информации, которую я вылил на вас в прошлый раз, я решил разбить это дело на 2 лекции. В этой лекции мы поговорим о блоке switch-case, а так же я расскажу вам про "тройной оператор". Начнем по порядку.



Блок switch-case


Блок if-else, с которым мы познакомились на предыдущей лекции имеет два недостатка:

1. Все условия взаимоисключающие. Допустим, есть 3 разных условия, но 2 из них имеют общую обработку, правда в первом делается еще что-то дополнительно. Это НЕ большой недостаток, так как вложенный if обычно легко исправляет ситуацию.

2. Если опций больше 3-х код становится неудобочитаемым. То есть, нужно напрягать глаза, чтобы найти, где именно обработается тот или иной случай. Думаю, именно этот недостаток и послужил причиной для создания блока switch-case.

Как всегда, "лучше один раз увидеть, чем 100 раз услышать", поэтому, сразу код, а потом объяснения:




Программа просит ввести цифру от 2 до 5 включительно и высвечивает на экран цифры, которые делят ее без остатка (делители).


Разберем:

В начале есть слово switch, а в скобках - переменная которую мы хотим "проверить". Как только переменная заходит в блок - она начинает искать подходящий случай, другими словами - чему из предложенных вариантов она равна.

Допустим, она равна 3. Тогда алгоритм войдет в вариант case 3: и будет строчка за строчкой выполнять код, пока не встретит на своем пути слово break. Как только это слово будет встречено, алгоритм покинет блок.

Обратим внимание, что есть опция default: Она предназначена для случаев, когда алгоритм не нашел ни одного совпадения в "специфических" случаях. Он попадает в default. Эта опция необязательна: блок switch-case прекрасно отработает без default. Просто в данном случае, было очень удобно использовать эту опцию как отлов ошибочного ввода пользователя. Не могу сказать, что default всегда используется в таком качестве.... иногда большая часть работы происходит именно в нем.

Примечание: Эклипс ставит немного не такие отступы в этом блоке, как у меня в примере.... просто я привык так....

Отлично. В общем - что такое блок switch-case вроде разобрались, осталось осветить одну мелочь: что будет, если в конце конкретного case не поставить break? Код просто продолжит в следующий case и выполнит действия, написанные там. В Java или C# это запрещено и код не скомпилируется, потому что как правило, забытый break - это ошибка программиста, НО! В С++ такое допускается и поэтому если вы ошиблись - пеняйте на себя.... хотя иногда программисты используют эту возможность.

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

Поэтому, код можно изменить так:



Обратите внимание, что Эклипс подчеркнул желтым это место, потому что с точки зрения Эклипс - это потенциально опасное место. Он как бы показывает программеру: "Обрати внимание! Этот case не заканчивается break! Это то, что ты хотел?"

Такой прием называется "проваливание". Иногда проваливание используют еще, когда оба case делают одинаковую работу. Так как нельзя написать что-то типа case 2,4:, это не пройдет компиляцию, то пишут один под другим:

case 2:
case 4:
// тут код
break;


Теперь о правилах блока:
Их несколько. Во-первых, в case нельзя писать сравнения, например case 4 > n: , так как блок отвечает на вопрос: "является ли переменная, написанная в скобках switch равной одной из следующих опций?"
Во-вторых - нельзя писать после слова case переменную! Там ТОЛЬКО константа! Это означает, что если написано case n:, то переменная n объявлена так: const тип n = значение, например: const int n = 7;

В любом case можно делать что угодно! Например открывать блок if-else или еще один switch-case... все, что требует задача!



Оператор "по модулю"


Существует математическое действие "по модулю". Я предполагаю, что многие не помнят, что оно значит, поэтому позволю себе напомнить. Я не буду давать тут точное математическое определение, а попробую построить объяснение так, чтобы было понятно.

Допустим вам дали два числа. Действие "первое число по модулю второго числа" возвращает остаток при делении первого числа на второе. Несколько примеров:

Два числа: 5 и 3
Если 5 разделить на 3, то получится, что 5 разделить на 3 будет 1 С ОСТАТКОМ 2, то есть 5 mod 3 = 2

Два числа: 20 и 5
20 делится на 5 БЕЗ ОСТАТКА, то есть 20 mod 5 = 0

Два числа: 67 и 15:
67 делится на 15 так: 4 "целых" раз по 15 (15 * 4 = 60) И ОСТАТОК 7, то есть: 67 mod 15 = 7.

Думаю - понятно.

В программирование есть действие "по модулю" и записывается оно так (по нашим примерам):
1. 5 % 3
2. 20 % 5
3. 67 % 15

Чаще всего это действие используют, когда хотят узнать, является ли число четным? if (num % 2 == 0)
Для чего я это рассказал именно сейчас? Ну, во-первых, это нужно знать, а во-вторых я использую этот оператор, чтобы объяснить следующую тему лекции "Тройной оператор"



Тройной оператор


Представим себе ситуацию, что у нас есть 2 числа. Первое мы получаем с клавиатуры, назовем его input. А ко второму такое требование: если input четный, то во второе мы положим 17, а если нечетный, то -35. Это можно написать так:

if(input % 2 == 0)
num = 17;
else
num = -35;


ИЛИ

if(input % 2) // почему??? если кто не помнит - бегом в предыдущую лекцию!
num = -35;
else
num = 17;


НО! Можно использовать тройной оператор. Тройной оператор работает так:

условие ? вернуть, если условие правда : вернуть, если условие ложь ;

Обратим внимание:

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

то есть, для нашего примера это будет выглядеть так:

num = input % 2 == 0 ? 17 : -35;

можно взять в скобки, чтобы было понятней:

num = (input % 2 == 0 ? 17 : -35);

ИЛИ

num = input % 2 ? -35 : 17;

В скобках:

num = (input % 2 ? -35 : 17);

Требование: тип возвращаемого значения в обоих случаях должен совпадать!

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





Напишу этот код еще один раз, чтобы "приучить" вас видеть в нуле - "false". Это ОЧЕНЬ нужно, так как МНОГИЕ этим пользуются!





Прекрасно! Для этой лекции - достаточно. На ней мы познакомились с блоком switch-case, оператором "по модулю" и тройным оператором. Следующая лекция обещает быть более интересной, так как мы начинаем идти круто в гору)))



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


Перепишите домашнее задание с предыдущей лекции с дополнительным требованием: в вашем коде обязан присутствовать хотя бы один блок switch-case.
Удачи!

@темы: C++