Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302

Использование текстовой/длинной переменной для switch

19.09.2013, 11:22. Показов 3734. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
добрый день!

Такой вот вопрос:

есть цикл switch-case, но нужно, чтобы пользователь вводил команды, например:
hepl и exit.
Как мне сделать, чтобы case проверял именно слова?

*если использовать enum, то как осуществить ввод слова?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//объявить переменную command;
do
    {
        switch (command)
        {
            case('help'): //если сделать сомманд чаром, то считывает только h, а вдруг у меня будет две различных команды с h ?
            {
                cout << "help";
            }
            default:
            {
                break;
            }
        }
    } while (command!=exit);
Добавлено через 56 секунд
опечатку со свитчем исправила, там была другая переменная.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2013, 11:22
Ответы с готовыми решениями:

Использование строк для оператора switch
заставте это работать пожолуйста c++ #include &lt;iostream&gt; using namespace std; int print(char a) { switch (a) { ...

Ошибка «использование локальной переменной которой не присвоено значениe» внутри switch
Помогите, пожалуйста, не могу разобраться с оператором switch. При таком коде выдает ошибки: &quot;Использование локальной переменной...

Switch . Как присвоить переменной значение из Switch в default
Добрый день подскажите как реализуется данный код . Как взять значение switch если выпал default ? public int Parse() { int...

18
 Аватар для es_
217 / 216 / 114
Регистрация: 14.01.2013
Сообщений: 459
19.09.2013, 11:29
Command должен иметь целочисленный тип: http://msdn.microsoft.com/ru-r... 5wee3.aspx
Где-нибудь раньше присваивай Command значение, например если ввёл пользователь help, то присваиваешь 1 command, если exit то 2 и далее в switch описываешь, что нужно делать при command =1 и 2.
0
9 / 8 / 2
Регистрация: 02.05.2012
Сообщений: 92
19.09.2013, 11:29
используй string в качестве переменной command и проверяй как сделал
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.09.2013, 12:08
Цитата Сообщение от Nullik Посмотреть сообщение
Как мне сделать, чтобы case проверял именно слова?
Пример использования char в switch:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(void)
{
char *input_word;
 
cin >> input_word;
 
switch(input_word[0])
{
  case 'e': cout << "Exit!"; break;
  case 'h': cout << "Help!"; break;
  default : cout << "Default";
}
 
cin.ignore(2);
return 0;
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
19.09.2013, 12:29
Цитата Сообщение от Nerock Посмотреть сообщение
используй string в качестве переменной command и проверяй как сделал
Ты сам то пробовал так делать?
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
19.09.2013, 12:35
Nullik, enum и string можно связать через мапу
C++
1
std::map<std::string, enum_name> map_name;
Соответственно, в начале программы мапа заполняется. Затем пользователь вводит очередное слово, и из мапы вытаскивается енум
C++
1
const enum_name command = map_name.at(input_string);
1
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 08:18  [ТС]
I.M., попробую ваш метод сейчас разобрать (нагуглить примеров)

Пример es_ неплохой, но хотелось бы как-то выпендриться что-ли и сделать типа "ключевые слов", т.е., именно слов, а не символов.

Вариант Nerock работает в С11, или как эта версия называется -- на хабре видела, НО у меня вижуалка это точно не делает, пример был там, проверила, нифига. Так что, этот вариант не катит.

А идея SatanaXIII не совсем подходит, потому что в комменте программы я написала (может быть там далеко уехало, но всё же): а если будут ещё с
"слова" с того же символа, как быть тогда? Воооооот, хотелось бы сразу словами.

Поэтому, будем изучать мар.

Добавлено через 28 минут
Подскажите, что я сделал не так, и правильно ли я сделала вообще, потому что код работает, но где-то циклится *сейчас ещё выясню где*

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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <map>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(0,"");
    enum command {help,iterations,sequence,test,exit};
    map<string, enum command> words;
 
    words["help"]=help;
    words["exit"]=exit;
    string aa;
    cin >> aa;
    const enum command dd = words.at(aa);
 
    do
    {
        switch (dd)
        {
            case('help'):
            {
                cout << "help";
            }
            default:
            {
                break;
            }
        }
    } while (dd!=exit);
 
return 0;
}
Добавлено через 3 минуты
ахаха, всё, ошибку нашла! Кавычки лишние поставила. Спасибо за помощь!!!!!!
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
20.09.2013, 11:09
Цитата Сообщение от Nullik Посмотреть сообщение
Вариант Nerock работает в С11, или как эта версия называется -- на хабре видела
Кажется я помню эту статью. В с++11 не добавляли возможность делать свитч по строке. В той статье используется хеш строки, который подставляется вместо нее на этапе компиляции. Самопал, короче говоря)
0
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 12:25  [ТС]
I.M. , если вам не сложно, ещё раз:

мар - это абстрактный контейнер, типа хэш таблицы, "ключ-значение", где ключи уникальны.
enum - перечисляем (???)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum command {help,iterations,sequence,test,exit}; //здесь мы перечислили (???)
    map<string, enum command> words; //указали тип ключа и значение (?)
 
    words["help"]=help; //присвоили ключу значение
    words["exit"]=exit;
    string aa; 
    cin >> aa;//ввели ключ
    const enum command dd = words.at(aa); //вот тут не совсем поняла что делали
 //что есть переменная dd ?
    do
    {
        switch (dd)
        {
            case('help'):
            {
                cout << "help";
            }
            default:
            {
                break;
            }
        }
    } while (dd!=exit);
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
20.09.2013, 12:36
words.at(aa); - тут из мапы по ключу вытаскивается значение

и свитч надо не так писать
C++
1
2
3
4
5
6
7
switch (dd)
{
case command::help:
   cout << "help";
   break:
...
}
1
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 12:43  [ТС]
ааааа

А вот ещё, допустим, если я буду писать так, как Вы говорите, то не будет ли такой ошибки: когда ввели не help, а hlep -- вылетать?

В таком коде, что выше, вылетает, если ввести другое слово.

Добавлено через 4 минуты
*неа, я написала так, как вы сказали, ввела hlep и вылетела "ошибка", а если случайно не ошибиться, то всё работает. Как бы вот это сделать, что если не элемент (ключ) mар, то идём дальше?


итоговый код у меня такой:


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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <map>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(0,"");
    enum command {help,iterations,sequence,test,exit};
    map<string, enum command> words;
    words["help"]=help;
    words["exit"]=exit;
    string aa;
    cin >> aa;
    const enum command dd = words.at(aa);
    do
    {
        switch (dd)
        {
            case command::help:
            {
                cout << "Программа";
                break;
            }
            case command::exit:
            { //будет ещё что-нибудь
                break;
            }
            default:
            {
                cout << "что это за слово?!\n\n";
                break;
            }
        }
        cin >> aa;
        const enum command dd = words.at(aa);
    } while (dd!=exit);
 
    cin.get();
    return 0;
}
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
20.09.2013, 13:57
Думаю, рано рассказывать про exception и try-catch блоки) поэтому другой вариант, самый простой, на мой взгляд
вызывать
words.count(aa);
метод вернет 1, если слово есть в мапе и 0, если слова там нет
про другие методы мапы можно посмотреть, например, тут
http://en.cppreference.com/w/cpp/container/map
1
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 14:37  [ТС]
Цитата Сообщение от I.M. Посмотреть сообщение
Думаю, рано рассказывать про exception и try-catch блоки)
рассказывайте, мне С++ ещё долго изучать

метод вернет 1, если слово есть в мапе и 0, если слова там нет
и если мы сделаем это ДО свитча, то нужно будет сделать там "что это за?!", и предложить ещё раз ввести слово. Получается, можно сделать do-while и while,
т.е.:

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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <map>
#include <string>
 
using namespace std;
 
int main()
{
    setlocale(0,"");
    enum command {help,iterations,sequence,test,exit};
    map<string, enum command> words;
    words["help"]=help;
    words["exit"]=exit;
    string aa;
    cin >> aa;
    const enum command dd = words.at(aa);
    const enum command dd_bool = words.count(aa);
do
{
    
if (dd_bool==false)
{
     cout << "что это за слово?!\n\n";
}
else
{
    do
    {
        switch (dd)
        {
            case command::help:
            {
                cout << "Программа";
                break;
            }
            case command::exit:
            { //будет ещё что-нибудь
                break;
            }
        }
    } while (dd!=exit);
} //else
 
} while (dd!=exit);
 
    cin.get();
    return 0;
}
0
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
20.09.2013, 14:43
не совсем так
C++
1
2
3
4
5
6
7
8
std::string input;
do
{
   std::cin >> input;
} while (!words.count(input));
 
//  и вот только теперь
const command input_command = words.at(input);
1
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
20.09.2013, 19:08  [ТС]
аааа, т.е. не вложенные, а последовательные ду-ду. Ааа! Спасибо!

Добавлено через 4 часа 16 минут
теперь у меня случилась проблема: когда я ввожу хэлп, мне выводится хэлп, а когда ввожу другой кейс - снова хэлп. Что не так?
*т.е., программу нужно прогнать по 4 кейсам, но в различном порядке, например: help, iterations, help, test.

Добавлено через 6 минут
аааа, всё, нашла косяг.

почему dd не обновлял, их было "2 штуки". Один dd убрала, поставила в конец проверку строчки на "выход" и всё нормально, вроде бы.
0
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
28.09.2013, 09:41  [ТС]
Добрый день. Помогите с "хитростью кода".

C++
1
2
3
4
5
6
7
//cout << "% ";
        do
        {
        //cout << "% "; 
            (cin >> strr).get();
        } while (!words.count(strr)); // будем вводит "ключевое слово" до тех пор, пока оно не обнаружиться в map
        enum command dd = words.at(strr); //по ключу из map вытаскиваем значение и добавляем его в dd
Мне нужно, чтобы в начале строки был символ "%", но, предположим, пользователь допустил ошибку и ввёл вместо

sequence
например

secuence
но проблема даже не в том, что второе слово проскочит, а в том, что должен делать sequence/

Дело в том, что мне нужно вводить строчку целиком. Примерно я ввожу:

% sequence 1 2 3 4 5
а, допустим, пользователь ввёл так:

% secuence 1 2 3 4 5
то результат будет или строчка без % или так:

% secuence 1 2 3 4 5 //сout во втором
% % % % % %
как бы исхитриться сделать так, что если ввели строчку с ещё одной строкой, т.е., числа через пробел, то их как-то бы пропустить и снова один % вывести. Условие какое поставить? Числа могут быть любыми, считывает их cin как map элементы или int?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
28.09.2013, 09:52
Думаю примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
map<string, command>::const_iterator it;
while (true) {
   cout << "% ";
   cin >> strr;
 
   if ((it = words.find(strr)) != words.end()) {
      break;
   }
 
   cerr << "bad input" << endl;
   cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
 
command dd = it->second;
1
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
28.09.2013, 10:56
Цитата Сообщение от Nullik Посмотреть сообщение
проверял именно слова?
C++
1
2
3
4
#include <string.h>
if(strcmp(str,"help")==0){...}
else if(strcmp(str,"exit")==0){...};
else if(strcmp(str,"...")==0){...}
Зачем использовать именно switch?
0
 Аватар для Nullik
46 / 15 / 4
Регистрация: 13.03.2013
Сообщений: 302
28.09.2013, 10:59  [ТС]
Коды сейчас не могу проверить, позже.

Return0 - switch из первого сообщения, это условие задачи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.09.2013, 10:59
Помогаю со студенческими работами здесь

Как поменять значение числовой переменной в зависимости от значения текстовой переменной
Доброго вам времени суток! Ломаю голову на следующей задачей, и не знаю, где ошибка: может быть в JS или в html коде. Не могу...

Изменение значения переменной, название которой находится в текстовой переменной
Подскажите как мне сделать: у меня есть цикл _0_gray = 1 for i in range(9): peremen = &quot;_&quot; + str(i) + &quot;_gray&quot;\ ...

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

Использование оператора switch для выполнения последовательности действий как в С++
switch (n){ case 0: a = 0; case 1: b = 2; case 2: c = 10; ... }

Использование конструкции выбора switch для вывода элементов окружности
Столкнулся с таким вот заданием, не знаю как сделать на C# Заранее спасибо :) Задание: Элементы окружности пронумерованы следующим...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru