Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/120: Рейтинг темы: голосов - 120, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 02.04.2017
Сообщений: 56

Оператор switch со строками

28.04.2017, 00:33. Показов 24069. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте,как написать оператор выбора для string?
команда
C++
1
2
3
4
std::string t; 
switch(t)
{
}
не работает
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2017, 00:33
Ответы с готовыми решениями:

Switch со строками и переопределение вектора
У меня несколько вопросов по вот такому коду: 1. arr — глобальная переменная vector<int>. 1.1. Почему нельзя переобъявить как...

Cи++. Оператор switch.
У меня такой вопрос. Есть задача: с 1 января 1990 года по некоторый день прошло n месяцев, определить название месяца текущего. Ну как...

Оператор switch
Помогите переправить задачу на оператор switch, пож-та. Я написал с предусловием, но как быть со switch'ом не знаю. Вот код с...

38
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
28.04.2017, 10:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Renji Посмотреть сообщение
Можно в принципе и без map - считаем от строчки хэш-функцию и делаем switch по ней.
Только вот хеш функция для строки потребует линейного прохода по всей строке. Кстати, пример реализации такого подхода.

Я обычно когда нужно делать поиск по строке значения строю статическую (static) мапу.
Кстати, именно std::map, а не std::unordered_map, т.к. последний контейнер также для сравнения требует линейного прохода по всей строке, в то время, как std::map может найти сравнение за логарифм. Тут, конечно, ещё и от данных всё сильно зависит.

Добавлено через 2 минуты
Кстати, для небольших строк можно использовать трюк с multi-character constant. И тогда можно использовать тот же switch с O(1) в лучшем случае.

Добавлено через 8 минут
Но это как ходить по лезвию ножа. Тем не менее, думаю знать про такой трюк полезно.
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
#include <iostream>
 
void Foo(const size_t c)
{
    switch(c)
    {
    case 'WASA':
        std::cout << "Yeap, WASA!\n";
        break;
    case 'PETR':
        std::cout << "Yeap, PETR!\n";
        break;
    case 'DIMA':
        std::cout << "Yeap, DIMA!\n";
        break;
    default:
        std::cout << "Nope!\n";
        break;
    }
}
 
int main()
{
    Foo('WASA');
    Foo('PETR');
    Foo('DIMA');
}
2
1 / 1 / 0
Регистрация: 18.04.2017
Сообщений: 10
28.04.2017, 11:05
Позвольте полюбопытствовать, а что это у Вас за задача такая?) У Вас что абстрактная фабрика 35 классов создаёт?)
Может всё-таки изначально можно сократить число используемых вариантов, спроектировав систему несколько по иному?
0
0 / 0 / 0
Регистрация: 02.04.2017
Сообщений: 56
29.04.2017, 11:12  [ТС]
мне нужно создать класс картотека книг.может я действительно,придумала плохой алгоритм
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.04.2017, 11:17
Цитата Сообщение от asya88 Посмотреть сообщение
мне нужно создать класс картотека книг.может я действительно,придумала плохой алгоритм
Обычно как Primary key для книг берут ISBN. В любом случае вам вряд ли нужен switch по большому количеству строк. Хотя нужно знать весь алгоритм.
0
0 / 0 / 0
Регистрация: 02.04.2017
Сообщений: 56
29.04.2017, 11:25  [ТС]
хотела работать с файлами,но файлов получается очень много.т.к.авторов,разделы,издания я создаю отдельно в файлах.

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

Добавлено через 4 минуты
мне надо на с++ и через классы
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
29.04.2017, 12:13
Цитата Сообщение от asya88 Посмотреть сообщение
чтобы по запросу книги вся информация о ней появлялась
Поиск по каким критериям? Если ISBN, то используйте std::unordered_map<size_t, Book>, если по названию, то
std::map<std::string, Book>
Если несколько критериев, то std::vector<Book>/std::list(зависит от того как часто будут удалять инфу не с конца) и std::find + нужный компаратор.
0
0 / 0 / 0
Регистрация: 02.04.2017
Сообщений: 56
29.04.2017, 12:32  [ТС]
да у меня несколько критериев,а как работать с векторами?я правильно понимаю,что это как цепочный массив?
0
1 / 1 / 0
Регистрация: 18.04.2017
Сообщений: 10
29.04.2017, 12:35
И что, над этими книгами надо совершать 35 разных вариантов действий?
0
0 / 0 / 0
Регистрация: 02.04.2017
Сообщений: 56
29.04.2017, 12:44  [ТС]
нет не 35,у мы было просто 35 файлов stringовых,которые я хотела с помощью switch открывать и читать

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

Добавлено через 1 минуту
сейчас скину свой код по файлам

Добавлено через 3 минуты
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
cout << "Введите раздел библиотеки(1 - artistic (художественная),2 - detective (детективы),3 - scientific (научная),4 - foreign (зарубежная)";
    getline(std::cin, section);
    std::cout << '\n';
    std::ifstream file("section.txt");
    using input_it = std::istream_iterator<std::string>;
    int v = find(input_it(file), input_it(), section) != input_it();
    std::cout << v;
    if (v==1)
    {
        std::cout << "книги этого раздела есть";
    }
    else
    {
        std::cout << "книги такого раздела нет";
        std::cout << '\n';
        system("pause");
        exit(0);
    }
    std::cout << '\n';
 
    std::cout << "Автор(инициалы через точки,например:pushkin.a.c.):";
    getline(std::cin, author);
    if (section == "artistic")
    {
        std::ifstream file("artistic.txt");
        using input_it = std::istream_iterator<std::string>;
        int a = find(input_it(file), input_it(file), section) != input_it(file);
        if (a=1)
        {
            std::cout << "книги этого автора есть";
        }
        else
        {
            std::cout << "книг этого автора нет";
            std::cout << '\n';
            system("pause");
            exit(0);
        }
    }
 
    if (section == "detective")
    {
        std::ifstream file("detective.txt");
        using input_it = std::istream_iterator<std::string>;
        int c = find(input_it(file), input_it(file), section) != input_it(file);
        if (c = 1)
        {
            std::cout << "книги этого автора есть";
        }
        else
        {
            std::cout << "книг этого автора нет";
            std::cout << '\n';
            system("pause");
            exit(0);
        }
 
    }
 
    if (section == "scientific")
    {
        std::ifstream file("scientific.txt");
        using input_it = std::istream_iterator<std::string>;
        int d = find(input_it(file), input_it(file), section) != input_it(file);
        if (d = 1)
        {
            std::cout << "книги этого автора есть";
        }
        else
        {
            std::cout << "книг этого автора нет";
            std::cout << '\n';
            system("pause");
            exit(0);
        }
 
    }
 
    if (section == "foreign")
    {
        std::ifstream file("разделы\foreign.txt");
        using input_it = std::istream_iterator<std::string>;
        int a = find(input_it(file), input_it(file), section) != input_it(file);
        if (a = 1)
        {
            std::cout << "книги этого автора есть";
        }
        else
        {
            std::cout << "книг этого автора нет";
            std::cout << '\n';
            system("pause");
            exit(0);
        }
    }
то что я делаю с разделами,дальше я собиралась делать с книгами
0
1 / 1 / 0
Регистрация: 18.04.2017
Сообщений: 10
29.04.2017, 13:36
Ну свитч тут вообще не нужен) у Вас тела всех ифов одинаковые - выносите их в отдельную функцию, а аргументом - имя файла
0
0 / 0 / 0
Регистрация: 02.04.2017
Сообщений: 56
29.04.2017, 13:40  [ТС]
это рациональная реализация этой задачи?

дальше же я буду делать тоже самое только с названиями книг,издательством
Добавлено через 1 минуту
у меня же стооолько файлов будет
0
1 / 1 / 0
Регистрация: 18.04.2017
Сообщений: 10
29.04.2017, 14:05
Очень не рациональная) Файл, как хранилище - это для Вас принципиально? Субд использовать не хотите?
0
0 / 0 / 0
Регистрация: 02.04.2017
Сообщений: 56
29.04.2017, 20:26  [ТС]
Не принципиально,учитель дал заданиея вот пытаюсь выполнить,.а что это?
0
1 / 1 / 0
Регистрация: 18.04.2017
Сообщений: 10
30.04.2017, 13:41
Напишите, как именно звучит задание. И лучше не "своими словами", а в дословной редакции учителя)
0
0 / 0 / 0
Регистрация: 02.04.2017
Сообщений: 56
01.05.2017, 16:00  [ТС]
Картотека домашней билиотеки:выходные данные книги.картотека должна позволять
1.вывод книг по произвольному запросу (по автору,разделу,наличии)
2.поиск в уже выбранном подмножестве (с предыдущего запроса)
3.добавление удаление книги
4.редактирование(изменение параметра)
0
6 / 3 / 0
Регистрация: 19.03.2019
Сообщений: 157
19.03.2019, 13:30
Вообще в C++ switch(){} работает только с целыми числами, но...
Ведь всегда можно сломать систему!
Ведь строка состоит из символов, а у каждого символа - свой код (например, 27 - Esc)
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
19.03.2019, 13:37
Цитата Сообщение от Turbo_Pgmer_132 Посмотреть сообщение
только с целыми числами
Не только.
Цитата Сообщение от http://eel.is/c++draft/stmt.switch#2
The condition shall be of integral type, enumeration type, or class type ...
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
19.03.2019, 17:07
Цитата Сообщение от asya88 Посмотреть сообщение
здравствуйте,как написать оператор выбора для string?
std::string t;
switch(t)
{
}
не работает
switch-case на стероидах

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
#include <iostream>
 
template<class Val>
struct swither
{
    swither( const Val & v )
        :val(v)
    {}
 
    void operator()()const noexcept {}
 
    template <class E, class F, class ... Args>
    void operator()(E&& e, F&& f, Args&& ... args)const 
    {
        if(e == val)
            f(); 
        else
            (*this)(std::forward<Args>(args)...);
    }
private:
    Val val;
};
 
template<class Val> auto Swith(const Val& v)
   { return swither<Val>(v); }
 
#define CASE(n) n,[]()
 
int main()
{
    auto x = "trololo";
    
    Swith(x) (
        
        CASE("ololo")   { std::cout <<"ololo\n";   },
        CASE("trololo") { std::cout <<"trololo\n"; } 
    );
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.03.2019, 17:25
Добавлено через 4 минуты
Цитата Сообщение от asya88 Посмотреть сообщение
Картотека домашней билиотеки:выходные данные книги.картотека должна позволять
1.вывод книг по произвольному запросу (по автору,разделу,наличии)
2.поиск в уже выбранном подмножестве (с предыдущего запроса)
3.добавление удаление книги
4.редактирование(изменение параметра)
пункт 2 требует доработки. Автора не достаточно. Нужно сначала составить класс - учетная карточка книги и оно само вам покажет и раcскажет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.03.2019, 17:25

оператор switch
С++ начала учить недавно, и многое не понимаю... задачи решаю только по-аналогии.. Задача Составить структурную схему алгоритма и...

С++.Оператор switch.
Не могу избавиться от ошибки в программном коде. #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; using namespace...

Оператор switch
Возникла проблема. Не хочет высчитываться &quot;v&quot;. Что не так? #include &lt;iostream.h&gt; #include &lt;math.h&gt; main () { int k; ...

Оператор switch
целое число в диапазоне 0 – 9. Вывести строку — название соответствующей цифры на английском языке (0 — &quot;zero&quot;, 1 —...

Оператор Switch
Нужно помощь с этим оператором может быть где-то направильно написал ??? со всеми функциями ответ выходет не верно, &quot;res&quot; - не...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №4)
Maks 15.11.2026
Что-то я перемудрил с предыдущими версиями, в этот раз сделал всё проще, обратившись к функции "СтрокаЛатиницей" из типового общего модуля "СтроковыеФункцииКлиент". В данной функции нет апострофов,. . .
BitTorrent (версия 4.3.9) и Меню Настройки
russiannick 15.11.2026
В меню Настройки можно отключить автоматическое обновление программы. Карта этого меню приложена ниже. Нужный пункт выделен красным. Сервис Настройки Поведение
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru