Как вносить switch case в массив си

от admin

Сделать оператор switch в C с массивом?

Я пытаюсь сделать оператор switch, который принимает слово в массив, а затем выбрасывает каждую букву через оператор switch и выделяет точку каждой букве в зависимости от того, какая это буква, и дает окончательное значение точки для слова, и я не могу понять часть массива правильно. Любая помощь будет оценена по достоинству!

задан 14 сен ’12, 16:09

Кроме того, ваш массив слов может содержать максимум 6 буквы плюс завершающий нуль. Ничто не мешает пользователю ввести 7 или более букв и получить переполнение буфера. — Phil Perry

5 ответы

Вероятно, было бы быстрее иметь массив поиска:

Предупреждение: для этого требуется кодировка, в которой заглавные буквы расположены непрерывно, например, Unicode или ASCII.

Попробуйте использовать это

в операторе переключения. В нынешнем виде вы не тестируете каждый элемент в своем массиве, даже если вы выполняете итерацию по всему диапазону массива. Сказав, что я бы выбрал подход, предложенный Керреком С.Б. в другом ответе. Это гораздо аккуратнее и компактнее.

Переменная word это массив, но вы хотите switch на каждом персонаже. Таким образом, вам нужно:

В C вы не можете использовать массивы в switch (и выражения для case ). Кроме того, тип, переданный switch() и типы, указанные в каждом case должны совпадать. Так что максимум, что вы можете сделать, это включить персонажа. Вы почти все поняли правильно, за исключением того, что вы передаете весь массив в переключатель. Вместо этого используйте индекс для ссылки на символ. Например:

У вас есть слово в виде массива размером 7, вы не можете включить массив, вам нужно переключаться на каждый символ массива, поэтому используйте: switch(word[i])

ответ дан 25 мар ’13, в 11:03

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c arrays switch-statement or задайте свой вопрос.

Конструкция switch case на языке C

Switch-case в языках C и C++ является оператором выбора. Также он называется оператором принятия решений. Её общая форма представляет собой конструкцию, приведённую ниже:

switch<выражение> <
case<константа 1>:
<инструкции для выполнения>
break;

case<константа n>:
<инструкции для выполнения>
break;
default:
<инструкции для выполнения>
>

Блоки, начинающиеся со слов caseили defaultназываются лейблами. На английском языке label значит метка.
Тип лейбла со словом caseсодержит константу. Её значение может принимать выражение после слова switch.
Константа после слова case может быть либо литералом, либо перечислением, либо непосредственно самой константой (т. е. переменной, которая объявлена со словом const). После константы ставится двоеточие и описываются операторы, которые должны при этом выполниться.

Метка со словом default содержит инструкции, которые должны выполниться в том случае, если выражение после switchприняло значение, отличное от тех, что есть в блоках case. Оператор break в этом label’е не нужен.

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

intnum = 3;
switch(num)
<
case 1: // внутри этой метки объявлены сразу 3 оператора
printf(«Result: One \n»);
printf(«Result: Number 1»);
break;
case 2:
printf(«Result: Two \n»);
printf(«Result: Number 2»);
break;
case 3:
printf(«Result: Three\n»);
printf(«Result: Number 3»);
break;
default: // Если число не найдено по предыдущим меткам, то выполняетсялейбл по умолчанию
printf(«Result: Another number»);
>

Вывод:

Отличия switch-case от if-else

Множественный выбор также можно реализовать при помощи нескольких объединённых конструкций if-else. Однако оператор switch для этого в отличие от условного оператора более компактен и прост в использовании. Если искомое выражение может принимать больше двух значений, то в большинстве случаев лучше использовать именно switch-case.

Приведённые ниже коды, использующие конструкции if-else и switch-case эквивалентны в языке C.

If-else

Вывод:

Switch-case

Вывод:

Сравнение switch в C и C++

В обоих языках нельзя инициализировать переменные внутри метки case. Такая запись не будет скомпилирована:

int numb = 3;
switch(numb)
<
case 1:
intt = 1; // объявляем и присваиваем значение переменной одновременно
printf(«Result: One»);
break;
default:
printf(«Other number»);
>

Тем не менее, в языке C++ можно разделить инициализацию переменной на 2 части: её объявление и присваивание. В языке С это не сработает. Такая программа будет корректна для C++:

int d;
boolb_var;
d = 3;
switch (d)
<
case 1:
intt;// разбиваем инициализацию на 2 команды
t = 1;
b_var = false;
break;

default:
b_var = true;
break;
>

Но инициализировать переменную внутри лейбла всё-таки можно. Для того, чтобы сделать это,нужно заключить код в фигурные скобки. Этот код будет рабочим для обоих языков:

intind;
boolbool_var;
ind = 2;
switch (ind)
<
case 1:
<
int t = 1;
bool_var = false;
break;
>
default:
bool_var = true;
break;
>

Другие примеры использования switch-case

Как уже говорилось выше, оператор switchумеет работать с перечисляемым типом. Ниже приведен пример такого кода:

enum Days <
DAY_SUN,
DAY_MON,
DAY_TUES,
DAY_WEDNES,
DAY_THURS,
DAY_FRI,
DAY_SATUR,
>;

int d = 1;
switch(d)
<
caseDAY_MON:
printf(«Day: Monday»);
break;
caseDAY_TUES:
printf(«Day: Tuesday»);
break;
default:
printf(«Otherwise»);
>

Вывод:

Выражение после слова case также может быть константой. Но это применимо только для языка C++. Пример кода:

constintNumbOne = 1;
constintNumbTwo = 2;

int dig = 1;
stringStrDig;
switch(dig)
<
caseNumbOne:
StrDig = «One»;
break;
caseNumbTwo:
StrDig = «Two»;
break;
default:
StrDig = «Other digit»;
>
cout<<StrDig;

Вывод:

В операторе switch недопустимо использование нескольких case c одним и тем же значением. Этот код не скомпилируется:

constintOne = 1;
constint Two = 2;

int digit = 1;
switch(digit)
<
case 1:
printf(«Digit 1»);
break;
caseOne://константа One объявлена со значением 1, поэтому возникает повтор и происходит ошибка компиляции
printf(«Digit: One»);
break;
case Two:
printf(«Digit: Two»);
break;
default:
printf(«Otherdigit»);
>

В этом коде также возникнет ошибка:

enum Days <
SUN,
MON,
TUES,
WEDN,
THUR,
FRI,
SATUR,
>;
intDayNumber = 1;
switch(DayNumber)
<
case 1:
printf(«Day One»);
break;
caseMON:// MON имеет индекс 1 в перечислении, поэтому происходит повтор
printf(«Day: MON»);
break;
default:
printf(«Another day»);
>

Оператор switch может быть вложен в другой switch.

Пример программы:

int n = 1, t = 12;
switch(n)
<
case 1:
printf («Result day: Monday»);
switch (t)
<
case 12:
printf («noon»);
break;
default:
printf («not noon»);
>
break;
case 2:
printf («Result day: Tuesday»);
break;
case 3:
printf («Result day: Wednesday»);
break;
default:
printf («Result: Other day»);
>

Вывод:

Об операции break

Операция break необязательна в операторе выбора.Если её не использовать, то продолжат выполняться операторы, которые находятся в следующих лейблах. Пример подобной программы:

enumDays <
Su,
M,
Tu,
W,
Th,
F,
Sa,
>;

int n = 0;
switch(n)
<
caseM: // объявление нескольких меток caseподряд
caseTu:
case W:
caseTh:
case F:
printf («Working day.»);
case Sa:
case Su:
printf(«Day off»);
>

7.4 – Основы работы с оператором switch

Хотя несколько операторов if — else можно связать вместе, но это будет трудно читать и неэффективно. Рассмотрим следующую программу:

Хотя этот пример не слишком сложен, x вычисляется до трех раз (что неэффективно), и читатель должен быть уверен, что каждый раз вычисляется именно x (а не какая-то другая переменная).

Читать:
Как пересохранить файл 3d max в более раннюю версию

Поскольку проверка переменной или выражения на равенство с набором различных значений является обычным явлением, C++ предоставляет альтернативный условный оператор, называемый оператором switch , который специализируется на этой задаче. Вот та же программа, что и выше, с использованием switch :

Идея оператора switch проста: выражение (иногда называемое условием) вычисляется для получения значения. Если значение выражения равно значению после любой из меток case , выполняются инструкции после соответствующей метки case . Если не удается найти соответствующее значение, и метка default (по умолчанию) существует, выполняются инструкции после метки default .

По сравнению с исходным оператором if преимущество оператора switch заключается в том, что он вычисляет выражение только один раз (что делает его более эффективным), и оператор switch также дает читателю понять, что это одно и то же выражение проверяется на равенство в каждом случае.

Лучшая практика

Если есть выбор, предпочитайте использовать операторы switch вместо цепочек if — else .

Давайте рассмотрим каждую из этих концепций более подробно.

Начало switch

Оператор switch мы начинаем с ключевого слова switch , за которым следует условное выражение в скобках, которое мы хотели бы вычислить. Часто выражение – это всего лишь одна переменная, но это может быть любое допустимое выражение.

Единственное ограничение заключается в том, что условие должно вычисляться как целочисленный тип (если вам нужно напоминание, какие базовые типы считаются целочисленными типами, просмотрите урок «4.1 – Введение в основные типы данных»). Небазовые типы, которые можно преобразовать в int (например, перечисляемые типы и некоторые классы), также допустимы. Выражения, которые вычисляются как типы с плавающей запятой, строки и другие нецелочисленные типы, здесь не могут использоваться.

Для продвинутых читателей

Почему switch допускает только целочисленные типы? Ответ в том, что операторы switch разработаны с учетом высокой степени оптимизации. Исторически сложилось так, что наиболее распространенный способ реализации компиляторами операторов switch – это таблицы переходов, а таблицы переходов работают только с целочисленными значениями.

Для тех из вас, кто уже знаком с массивами, таблица переходов работает во многом как массив, целочисленное значение используется в качестве индекса массива для «перехода» непосредственно к результату. Это может быть намного эффективнее, чем несколько последовательных сравнений.

Конечно, компиляторам не обязательно реализовывать switch с помощью таблиц переходов, и иногда они так и делают. Технически нет причин, по которым C++ не мог ослабить ограничение для switch на использование только целочисленных значений, просто это еще не сделано (по крайней мере, в C++20).

После условного выражения мы объявляем блок. Внутри блока мы используем метки для определения всех значений, которые мы хотим проверить на равенство. Есть два вида меток.

Метки case

Первый вид метки – это метка case , которая объявляется с использованием ключевого слова case , за которым следует константное выражение. Константное выражение должно либо соответствовать типу условного выражения, либо преобразовываться в этот тип.

Если значение условного выражения равно выражению после метки case , выполнение начинается с первой инструкции после этой метки case , а затем продолжается последовательно.

Вот пример условия, соответствующего метке case :

Этот код печатает:

В приведенной выше программе x вычисляется для получения значения 2. Поскольку имеется метка case со значением 2, выполнение переходит к инструкции под этой совпавшей меткой case . Программа выводит Two , а затем выполняется оператор return , который возвращает выполнение в вызывающую функцию.

Практического ограничения на количество меток case , которые вы можете иметь, не существует, но все метки case в switch должны быть уникальными. То есть так делать нельзя:

Метка default

Второй вид меток – это метка default (часто называемая меткой по умолчанию), которая объявляется с использованием ключевого слова default . Если условное выражение не соответствует ни одной метке case , и метка default существует, выполнение начинается с первой инструкции после метки default .

Вот пример условия, соответствующего метке по умолчанию:

Этот код печатает:

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

Лучшая практика

Помещайте метку default в блок switch последней.

Прекращение выполнения

В приведенных выше примерах мы использовали операторы return , чтобы остановить выполнение инструкций после наших меток. Однако это также приводит к выходу из всей функции.

Инструкция break (объявленная с помощью ключевого слова break ) сообщает компилятору, что мы закончили выполнение инструкций внутри switch , и что выполнение должно продолжаться с инструкции после конца блока switch . Это позволяет нам выйти из оператора switch , не выходя из всей функции.

Вот немного измененный пример, переписанный с использованием break вместо return :

Приведенный выше пример напечатает:

Лучшая практика

Каждый набор инструкций под меткой должен заканчиваться инструкцией break или инструкцией return .

Итак, что произойдет, если вы не завершите набор инструкций под меткой с помощью break или return ? Мы рассмотрим эту и другие темы в следующем уроке.

Оператор Switch

Оператор switch принимает в качестве аргумента число, и в зависимости от его значения выполняет те или иные команды.

Если значение переменной не соответствует ни одному case, то выполняется default ветвь. Она может отсутствовать, тогда вообще ничего не выполняется.
В примере выше каждая ветвь оканчивается оператором break. Это важно. Когда компьютер видит оператор break, он выходит из оператора switch. Если бы он отсутствовал, то программа «провалилась» бы дальше, и стала выполнять следующие ветви.

Введите значение, например 3, и вы увидите, что программа выведет
WednesdayThursdayFridaySaturday то есть все ветви, после найденной.
Операторы каждой из ветвей могут быть обрамлены фигурными скобками (и так даже лучше). Тогда каждая из ветвей будет отдельным блоком, в котором можно определять свои переменные. Пример программы, которая запрашивает у пользователя число, оператор и второе число и выполняет действие.

Если ввести
1 + 2
то будет выведен результат операции 1 + 2 = 3
Хочу обратить внимание, что литеры типа ‘+’ и т.п. воспринимаются в качестве чисел, поэтому их можно использовать в операторе switch. В этой программе использовалась функция exit из библиотеки stdlib. Функция останавливает работу программы и возвращает результат её работы. Если возвращается истина (ненулевое значение), то это значит, что программа была выполнена с ошибкой.

Ветвь default может располагаться в любом месте, не обязательно в конце. Этот код также будет нормально работать

default здесь также нуждается в операторе break, как и другие ветви, иначе произойдёт сваливание вниз. Несмотря на то, что так можно писать, это плохой стиль программирования. Ветвь default логически располагается в конце, когда других вариантов больше нет.

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

Всё ещё не понятно? – пиши вопросы на ящик

Похожие статьи