Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/75: Рейтинг темы: голосов - 75, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 12.11.2014
Сообщений: 3

Как в операторе switch вместо числового значения case поставить, например, слово?

12.11.2014, 23:26. Показов 14710. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как в операторе switch вместо числового значения case поставить, например слово, желательно на русском, и возможно ли это вообще?
Возможно глупо сформулировал вопрос, но думать суть ясна.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2014, 23:26
Ответы с готовыми решениями:

Как записать в операторе switch case последовательность
Допустим с 1 до 10 выводится определенное значение, с 11 до 20 другое значение. Как это записать в одну строку??

Как объединить несколько функций в операторе Switch case или if
Доброго времени суток! Добавлено через 7 минут Доброго времени суток! Помогите у меня есть несколько функции H=0:0.5:15; ...

Группировка case в операторе switch
Подскажите,пожалуйста, где ошибка(Unexpected token { ), вроде бы все скобки на месте: function sequentialSizes(val) { var answer =...

14
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.11.2014, 23:32
Цитата Сообщение от Toby72 Посмотреть сообщение
возможно ли это вообще
Нет. под switch может стоять только целое число. Или то, что к нему приводится.
Это делается так. Заводишь массив этих слов, сравниваешь в цикле поступившее слово с этим массивом, и по найденому индексу входишь в case
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
12.11.2014, 23:32
Цитата Сообщение от Toby72 Посмотреть сообщение
возможно ли это вообще
Нет. switсh работает только с целочисленными типами или с enum типами.

Поэтому если вам нужно организовать ветвление по "слову" через switch, то придется сначала разработать и выполнить какое-то однозначное отображение вашего "слова" в целые числа, а затем уже делать switch по числу.
0
12.11.2014, 23:35

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Нет.
Ну вот. Значит решено абсолютным большинством голосов:)

0
0 / 0 / 0
Регистрация: 12.11.2014
Сообщений: 3
13.11.2014, 00:24  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Поэтому если вам нужно организовать ветвление по "слову" через switch, то придется сначала разработать и выполнить какое-то однозначное отображение вашего "слова" в целые числа, а затем уже делать switch по числу.
Если всё это сделать, то в окно программы я буду вводить "слова" или те целые числа, к которым присвоены эти слова?
И можно какую то наводку, как выполнить подобное отображение?
0
11 / 11 / 10
Регистрация: 16.12.2013
Сообщений: 66
13.11.2014, 00:32
Вот два примера

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    char *ar[]= { "a", "b"};
     
    int a;
    cin >>a;
 
    switch (a)
    {
    case 0:
        cout << ar[0];
        break;
    case 1:
        cout << ar[1];
        break;
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
char a;
    cin >>a;
 
    switch (a)
    {
    case 'a':
        cout << "a";
        break;
    case 'f':
        cout << "f";
        break;
    }
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
13.11.2014, 00:42
Цитата Сообщение от Toby72 Посмотреть сообщение
в окно программы я буду вводить "слова"
Да, СЛОВА будешь вводить, черт возьми! И уж в своей проге переводи их в числа, или там в енумы, которые будет понимать switch.
Если это так сложно понять, может быть ты рановато взялся за оператор switch-case? Может, сначала основы языка еще раз перечитать внимательно? В данном случае простого Си.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
13.11.2014, 00:49
прям таки сходу нельзя, но можно держать что-то типа enum и переводить его в строку.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
13.11.2014, 00:50
Это только концепт, может кто до ума доведет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>           // std::cout
#include <vector>
#include <utility>
#include <locale>
#include <string>
constexpr int make_cs(const char* const str) noexcept {
    return 0;
}
constexpr int operator "" _cs(const char* str, size_t cnt) noexcept {
    return make_cs(str);
}
int main () {
    std::string str;
    std::cin >> str;
    switch (make_cs(str.c_str())) {
    case "test"_cs:
 
        break;
    default:
        break;
    }
    return 0;
}
0
13.11.2014, 00:54

Не по теме:

Цитата Сообщение от Cra3y Посмотреть сообщение
Это только концепт,
Окама бы вас не похвалил

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
13.11.2014, 07:43
Цитата Сообщение от Toby72 Посмотреть сообщение
И можно какую то наводку, как выполнить подобное отображение?
Ну, например, так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::map<string, unsigned> m;
m["Вася"] = 0;
m["Петя"] = 1;
m["Полиграф"] = 2;
m["Новуходоносор"] = 3;
 
std::string s;
cin >> s;
 
auto it = m.find(s);
switch (it != m.end() ? *it : -1)
{
  case 0: ; // "Вася"
  case 1: ; // "Петя"
  case 2: ; // "Полиграф"
  case 3: ; // "Новуходоносор"
  default: ; // Конь в пальто
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
13.11.2014, 12:17
Если есть auto, тогда уж unordered_map.
А вместо чисел я бы использовал enum т.к. 0, 1, 2 ни о чём не говорит.

Добавлено через 1 минуту
Здесь лучше учитывать контекст задачи.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
13.11.2014, 12:37
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include <iostream>
#include <locale>
#include <string>
#include <cstdint>
#include <limits>
 
static_assert(sizeof(char) == sizeof(uint8_t), "char != 8 bit");
 
constexpr uint64_t make_cs(const char str[], std::size_t cnt, std::size_t n) noexcept {
    return (
        (n < cnt) ?
            static_cast<uint64_t>(str[n]) << n*8
        : uint64_t(0)
    );
    using test_type = decltype(static_cast<uint64_t>(str[n]) << n*8);
    using result_type = decltype((n < cnt ? static_cast<uint64_t>(str[n]) << n*8 : uint64_t(0)));
    static_assert(std::is_unsigned<
                  test_type
                  >::value, "(str[n]) << n*8 != uint");
    static_assert(std::is_same<
                  test_type,
                  uint64_t
                  >::value, "(str[n]) << n*8 != uint64");
    static_assert(std::is_unsigned<
                  result_type
                  >::value, "result_type != uint");
    static_assert(std::is_same<
                  result_type,
                  uint64_t
                  >::value, "result_type != uint64");
}
constexpr uint64_t make_cs(const char str[], std::size_t cnt) noexcept {
    return (
                (str == nullptr) ? // if () {
                    uint64_t( 0 )
                :( // } else { pack string to uint64_t
                    make_cs(str, cnt, 0) |
                    make_cs(str, cnt, 1) |
                    make_cs(str, cnt, 2) |
                    make_cs(str, cnt, 3) |
                    make_cs(str, cnt, 4) |
                    make_cs(str, cnt, 5) |
                    make_cs(str, cnt, 6) |
                    make_cs(str, cnt, 7)
                )
            );
    using result_type = decltype(
        (str == nullptr) ? uint64_t( 0 ):(make_cs(str, cnt, 0) | make_cs(str, cnt, 1))
    );
    static_assert(std::is_unsigned<
                  result_type
                  >::value, "result_type != uint");
    static_assert(std::is_same<
                  result_type,
                  uint64_t
                  >::value, "result_type != uint64");
}
 
uint64_t make_cs(const std::string& str) noexcept {
    return make_cs(str.c_str(), str.length());
}
constexpr uint64_t operator "" _cs(const char* str, std::size_t cnt) noexcept {
    return make_cs(str, cnt);
}
int main () {
    std::string cmd;
    bool run = true;
    while (run and (std::cin >> cmd)) {
        switch (make_cs(cmd)) {
        case "quit"_cs:
        case "exit"_cs:
            run = false;
            std::cerr << "bye" << std::endl;
            break;
        case "begin"_cs:
            std::cout << "{" << std::endl;
            break;
        case "end"_cs:
            std::cout << "}" << std::endl;
            break;
        case "<>"_cs:
            std::cout << " != ";
            break;
        case ":="_cs:
            std::cout << " = ";
            break;
        case "="_cs:
            std::cout << " == ";
            break;
        case "coolname"_cs: // в case учитывается только 8 первых символов
            std::cerr << "is cool" << std::endl; break;
        //case "coolname_is_same"_cs: // err: дубль
        //    std::cout << "// empty line" << std::endl; break;
        case ""_cs:
            std::cout << "// empty line" << std::endl;
            break;
        default:
            std::cerr << "echo: " << cmd << std::endl;
            break;
        }
    }
    return 0;
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
13.11.2014, 18:04
Cra3y, я как-то предлагал такую затычку.

PS. Сразу скажу для педантов, что никогда не позиционировал это решение как общее и даже в общем-то всерьез не рекомендовал его. Однако и ему может найтись своя область применения.

Добавлено через 6 минут
PS2. в том примере реализация хэш-функции взята из одной из версий boost::hash для строк.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.11.2014, 20:59
Ну, как я понимаю, в каждой ветви свича предполагаются какие-то действия, зависящие от слова. Логичнее эти действия обернуть в функцию-обработчик, и составить мэп из пар слово - указатель на функцию-обработчик, и затем по ключу-слову вызывать соответствующую функцию-обработчик.
Так-то оператор switch сишный, а следовательно примитивный и глупый, так что не стоит его в плюсовой код пихать, где он смотрится довольно диковато.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2014, 20:59
Помогаю со студенческими работами здесь

C++, ошибка в операторе switch (case)
Доброго времени суток! Ребят, такая тема: в C++ начала изучать операторы switch, case. И вот у меня заступорилась программа: на case '10'...

Можно ли в операторе switch в case записать не конкретное значение, а диапазон?
Можно ли в операторе switch в case записать не конкретное значение, а диапазон? Например: switch(a){ case диапазон1: действие; break; ...

Подскажите, пожалуйста, почему в операторе switch-case подчёркивается красным razdelHCode...
Здравствуйте. Подскажите, пожалуйста, почему в операторе switch-case подчёркивается красным razdelHCode (константа, имеющая тип int). ...

Switch, как в case прописать слово?
Всем привет) Подскажите пожалуйста, как в case прописать слово? Гугл не помог. Вот например: switch(a){ case 'ru':...

Может ли значение метки case в операторе switch быть числовым отрезком, или только константой?
Например, в Pascal возможна запись: ... Case a of 0..15: Write( a+7 ); ... Возможно ли аналогичная запись в c++? или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru