Как написать программу с выбором

Сегодня мы научимся пользоваться этой полезной конструкцией языка c++.

Очень часто в процессе написания программы требуется писать длинные if-else конструкции, например, когда мы получаем какой-либо ключ от пользователя; если вы пишете игру, то придется проверять на какую кнопку нажал игрок (вправо, влево, пробел и т.д.).

В этой статье мы узнаем как удобно оформлять подобные конструкции с помощью switch case, а так же узнаем немного о enum типах, которые хорошо подходят для работы со switch case.

Конструкция switch-case — это удобная замена длинной if-else конструкции, которая сравнивает переменную с несколькими константными значениями, например int или char.

Синтаксис

switch ( ) < case значение1: Выполнить если == значение1 break; case значение2: Выполнить если == значение2 break; . default: выполнить, если ни один вариант не подошел break; >

Переменная в скобках сравнивается со значениями, описанными после ключевого слова case. После двоеточия находится код, который будет выполнен в случае если переменная оказалась равной текущему значению. break необходим для того, чтобы прервать выполнение switch. Рассмотрим пример, где нет break:

If else. Конструкция логического выбора if. Лесенка if — else if. Примеры использования. Урок #12.


int a=1; switch(a) < case 1: a++; case 2: a++; case 3: a++; >cout

Данная программа выведет a = 4.

Значения для сравнения, описанные после case могут быть только константами, поэтому следующий вариант использования switch-case — неверен:

int a = 10; int b = 10; int c = 20; switch ( a ) < case b: // Code break; case c: // Code break; default: // Code break; >

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

test.cpp:9: error: ‘b’ cannot appear in a constant-expression

Блок default — необязателен, но он полезен для обработки исключительных ситуации.

Следующая программа демонстрирует один из возможных вариантов использования switch-case:

#include using namespace std; void playgame() < cout void loadgame() < cout void playmultiplayer() < cout int main() < int input; cout> input; switch ( input ) < case 1: playgame(); break; case 2: loadgame(); break; case 3: playmultiplayer(); break; case 4: coutcin.get(); >

Эта программа показывает простой способ обработки вводимых пользователем данных.

Минус данной программы в том, что она дает только одну попытку, без права на ошибку . Это легко исправить, заключив весь блок switch-case в цикл. Но может возникнуть вопрос: внутри switch-case есть break, не прервет ли он выполнение цикла? Нет, break прервет только выполнение блока switch.

Сравнение switch-case с if-else

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

if ( 1 == input ) < playgame(); >else if ( 2 == input ) < loadgame(); >else if ( 3 == input ) < playmultiplayer(); >else if ( 4 == input ) < cout else

Если мы можем сделать то же самое с помощью if-else, зачем вообще нужен switch? Главное преимущество этой конструкции в том, что нам понятно, как работает программа: единственная переменная контролирует поведение программы. В случае с if-else, придется внимательно читать каждое условие.

Winderton / Написал несколько Языков Программирования, вот что я узнал

Создаем собственные типы с помощью enumeration

Иногда при написании программ могут понадобится переменные, которые могут принимать только строго определенные значения, которые известны вам заранее. Например, вы можете задать ограниченный набор цветов, которые пользователь может выбрать. Очень удобно иметь сразу и набор доступных констант и тип переменной, который связан с этим набором. Более того, подобные переменные хорошо подходят для использования в switch-case, так как вы знаете все возможные значения заранее.

Читайте также:
Какая температура в программе выпечка в мультиварке

Тип enum (сокращение от «enumerated type«, перечисляемые типы) содержит перечисление различных значений, например цветов радуги:

enum RainbowColor < RC_RED, RC_ORANGE, RC_YELLOW, RC_GREEN, RC_BLUE, RC_INDIGO, RC_VIOLET >;

Несколько важных моментов:

  • Для объявление перечисляемого типа используйте ключевое слово enum.
  • Имя нового типа вы задаете сами, например RainbowColor.
  • Все возможные значения для данного типа перечислены в фигурных скобках.
  • После объявления перечисления необходима точка с запятой.

Теперь вы можете объявлять переменные с типом RainbowColor:

RainbowColor chosen_color = RC_RED;

И, как уже говорилось, эти переменные хорошо подходят для использования в switch:

switch (chosen_color) < case RC_RED: /* paint screen red */ case RC_ORANGE: /* paint screen orange */ case RC_YELLOW: /* paint screen yellow */ case RC_GREEN: /* paint screen green */ case RC_BLUE: /* paint screen blue */ case RC_INDIGO: /* paint screen indigo */ case RC_VIOLET: /* paint screen violet */ default: /* обработка исключений */ >

Так как мы используем перечисления, мы можем быть уверенными, что рассмотрели все возможные значения переменной. Значения констант в перечислении — это простой int, по умолчанию каждое следующее значение больше предыдущего на 1. Для первого — 0, для второго — 1 и т.д. В нашем случае: RC_RED = 0 и RC_ORANGE = 1.

Вы также можете задать собственные значения:

enum RainbowColor < RC_RED = 1, RC_ORANGE = 3, RC_YELLOW = 5, RC_GREEN = 7, RC_BLUE = 9, RC_INDIGO = 11, RC_VIOLET = 13 >;

Преимущество использования перечисляемых типов в том, что вы можете задать имя значениям, которые иначе пришлось бы хард-кодить. Например, если вы пишете игру крестики-нолики, вам нужен способ представления крестиков и ноликов на доске. Это может быть 0 для пустой клетки, 1 для нолика и 2 для крестика. Значит, наверняка придется использовать подобный код:

if ( board_position == 1 ) < /* do something */ >

Оператор выбора Case Of в Pascal.

Помимо условного оператора If в языке программирования Pascal существует оператор выбора Case of. Рассмотрим его применение на примере программы, которая выводит на экран то или иное сообщение, в зависимости от введенного числа.

Вывод сообщения на экран с помощью If.

program vetvlenija7; uses crt; var NUM :integer; begin clrscr; writeln(‘Введите число от 1 до 4:’); readln (NUM); if NUM=0 then writeln (‘Нуль’); if NUM=1 then writeln (‘Один’); if NUM=2 then writeln (‘Два’) if NUM=3 then writeln (‘Три’) if NUM=4 then writeln (‘Четыре’); readln end.

Эта программа выводит на экран сообщение (Нуль, Один и т. д.) в зависимости от того какое мы введем число. Однако, ту же задачу можно выполнить более простым способом с помощью оператора Case of.

Использование Case Of.

program vetvlenija7; uses crt; var NUM :integer; begin clrscr; writeln(‘Введите число от 0 до 4:’); readln (NUM); case NUM of 0:writeln (‘Нуль’); 1:writeln (‘Один’); 2:writeln (‘Два’); 3:writeln (‘Три’); 4:writeln (‘Четыре’); end; readln end.

В строке №8 записывается оператор выбора Case Of. Сначала записывается слово Case, затем записывается переменная, затем слово Of. После служебного слова Of идет перечисление всех возможных значений переменной (строка №9 — №13), а через двоеточие указывается действие, которое нужно сделать, если переменная принимает то или иное значение. Таким образом, если мы вводим с клавиатуры 0, то на экран выводится сообщение «Нуль» (строка №9), если вводим 1, то выводится сообщение «Один» (строка №10) и т.д.

Нам не нужно каждый раз писать конструкцию If…Then.
Достаточно указать CASE «переменная» OF, а затем для каждого значения этой переменной через двоеточие прописать вывод на экран. После перечисления всех операторов необходимо поставить служебное слово End.

Читайте также:
Как узнать версию программы 32 или 64

case of

Запустим программу и введем любое число от 0 до 4 (например, 4)

case of.

Напишем программу, которая определяет квартал года по введенному числу месяца.

Использование Case Of Else.

program vetvlenija8; uses crt; var NUM :integer; begin clrscr; write (‘Введите номер месяца’); readln (NUM); case NUM of 1,2,3: writeln (‘Первый квартал’); 4,5,6: writeln (‘Второй квартал’); 7,8,9: writeln (‘Третий квартал’); 10,11,12: writeln (‘Четвертый квартал’) else writeln (‘Вы неправильно указали месяц’) end; readln end.

В строке №8 записываем оператор выбора Case Of. После слова Of (в строках №9 — №12) указываем возможные значения нашей переменной.

Причем несколько значений можно указать в одной строке. Например, в строке №9 мы указываем 3 значения для переменной и действие, которое нужно совершить, если будут введены эти переменные. Т.е. если мы вводим с клавиатуры 1 или 2 или 3, то на экран выводится сообщение «Первый квартал».

В строке №13 записывается служебное слово Else. Если мы вводим с клавиатуры число, которое лежит вне диапазона чисел от 1 до 12, то должно совершиться действие, которое указывается после слова Else (строка №14).

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

case of else

case of else.

Дополнение к материалу.

В данном примере вместо перечисления значений переменной можно использовать диапазон значений переменной. Например, строку №9 можно записать так: 1..3: writeln (‘Первый квартал’); Т.е. сначала указывается первое значение переменной, а затем через 2 точки указывается последнее значение переменной.

Источник: mojainformatika.ru

Оператор множественного выбора switch

Итак мы рассмотрели оператор с одиночным выбором if и оператор с двойным выбором if else , но в С++ еще имеется оператор множественного выбора switch , который мы сейчас детально рассмотрим.

// форма записи оператора множественного выбора switch switch (/*переменная или выражение*/) < case /*константное выражение1/*: < /*группа операторов*/; break; >case /*константное выражение2*/: < /*группа операторов*/; break; >//. . . default: < /*группа операторов*/; >>

На начальном этапе анализируется выражение или переменная. После чего осуществляется переход к той ветви программы, для которой значение переменной или выражения совпадает с указанным константным выражением. Далее выполняется оператор или группа операторов пока не встретится зарезервированное слово break или закрывающая фигурная скобочка. Если значение переменной или выражения не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default . После чего выполняется оператор или группа операторов данной ветви. Сейчас рассмотрим задачу с использованием оператора выбора switch .

Условие задачи: написать программу, которая складывает, вычитает, умножает, делит два числа введенных с клавиатуры. Разработать пользовательский интерфейс.

// switch.cpp: определяет точку входа для консольного приложения. #include «stdafx.h» #include using namespace std; int main(int argc, char* argv[]) < int count; // переменная для выбора в switch double a,b; // переменные для хранения операндов cout > a; cout > b; cout > count; switch (count) // начало оператора switch < case 1: // если count = 1 < cout case 2: // если count = 2 < cout case 3: // если count = 3 < cout case 4: // если count = 4 < cout default: // если count равно любому другому значению cout system(«pause»); return 0; >

В 9-й строке мы объявили переменную count целочисленного типа. Именно значение данной переменной программа будет сравнивать со значением константного выражения. В строке 10 объявлены две переменные вещественного типа данных, для хранения введённых чисел. Почему вещественного, объясню позже. С 17 по 41 строки записан условный оператор множественного выбора switch . На начальном этапе анализируется переменная count . Анализируется таким образом:
если переменная count равна единице, значит, выполняется блок операторов с 20-й по 23-ю строки;
если переменная count равна двойке, значит, выполняется блок операторов с 25-й по 28-ю строки;
если переменная count равна тройке, значит, выполняется блок операторов с 30-й по 33-ю строки;
если переменная count равна четырем, значит, выполняется блок операторов с 35-й по 38-ю строки;

Читайте также:
Написать программу которая по вводимому числу от 1 до 11

Если же значение переменной count не совпадает ни с одним константным выражением, то передается управление ветви программы содержащей зарезервированное слово default . То есть будет выполнена следующая строка

cout

Оператор switch может содержать, а может и не содержать зарезервированное слово default . Если значение переменной не совпадет ни с одним константным выражением и не будет default , то программное управление в этом случае просто перешло бы к первому оператору после switch . В строках 19, 24, 29, 34 записаны константные выражения, с которыми программа сравнивает значение переменной count .
В строках 22, 27, 32, 37, записан оператор break. Возникает вопрос: «Зачем он нужен?» Допустим, пользователь ввел 2, то есть переменная count инициализировалась двойкой. Начинает работать условный оператор множественного выбора switch . То есть выполняется поиск двойки в константных выражениях.

Сначала проверяется строка 19, мы видим, что в строке 19 константное выражение равно единице, а нам нужна двойка. Проверяем дальше. А дальше по порядку строка 24. Мы видим, что в строке 24 константное выражение равно двойке, то, что нужно. Переменная count равна константному выражению, выполняется блок операторов с 25 по 28 строки.

И вот в 27-й строке записан оператор break , который заставляет программу перейти к первому оператору после оператора switch . В данном случае управление передается строке 42. А нужен этот переход только для того, чтобы не выполнялись заведомо ненужные действия. Если убрать оператор break , то программа будет дальше сравнивать значение переменной с константными выражениями, пока они все не закончатся и потом все равно передаст управление строке 42. Результат работы программы показан ниже (см. Рисунок 1).

Оператор множественного выбора switch C++

Рисунок 1 — Оператор множественного выбора в С++

Вернемся к строке 10, там объявляются две переменные типа double . Наверное, возникает вопрос, «Почему вещественного типа, а не целочисленного?». Отвечаю: «Потому, что одно из действий, которые может выполнять программа является деление, а при делении результат имеет вещественный тип данных. Компилятор С++ при делении чисел обращает внимание на их типы данных.

Если мы просто делим числа на калькуляторе, например 4/5=0.8 Компилятор С++ нам выдаст результат при таком делении 0. Так как оба числа являются целочисленными, значит, результат тоже будет целочисленный, то есть целая часть от обычного деления, а в нашем случае целая часть при таком делении – это 0, соответственно часть информации теряется, или как еще говорят, отсекается (восемь десятых, в нашем случае, отсекается). А если делимое и делитель поменять местами, на калькуляторе получим: 5/4=1.25; компилятор С++ покажет несколько иной результат, а именно 5/4=1 (0.25 отсекается). Такое явление в С++ называется неявным приведением типа.» Вещественный тип данных используется для более точного представления чисел, чем целочисленный (то есть отображает дробную часть).

В С++ существуют два вещественных типа данных:

1) double – вещественный тип данных двойной точности, а значит занимает вдвое больше памяти, чем тип float
2) float – вещественный тип данных одинарной точности

Источник: cppstudio.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru