Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 243
1

Как использовать оператор switch со строками?

05.01.2019, 14:39. Показов 4665. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Подскажите пожалуйста как использовать оператор switch с объектом String?
Я понимаю что switch работает только с целочисленными данными, но как быть если нужно распознать много строк.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2019, 14:39
Ответы с готовыми решениями:

Использовать оператор switch чтобы определить цену за каждое изделие
Задание: фирма, занимающаяся заказами по почте, продает 5 различных видов изделий, цены ниже: 1 -...

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

Оператор switch со строками
здравствуйте,как написать оператор выбора для string? команда std::string t; switch(t) { }...

Оператор switch не работает со строками
switch(DBGrid1->DataSource->DataSet->FieldByName("Äèàãíîç")->AsString){ case...

11
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
05.01.2019, 16:03 2
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
с объектом String
Вы разделом форума точно не ошиблись? В С нет ни класса String (в Java есть такой), ни его объектов. Есть последовательность символов, заканчивающаяся терминальным нулём. Адрес первого символа по сути указатель на С-строку. В любом случае, самое очевидное решение - хорошая хеш-функция со строкой на входе и беззнаковым целым на выходе. А дальше switch по хеш-кодам проверяемых строк...
0
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 243
05.01.2019, 16:19  [ТС] 3
Я под String имел в виду строку. Язык си. Конец строки определяется обычным нулем. Можно попросить пример с хэш?
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
05.01.2019, 17:21 4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int k;
char *s;
if (strcmp(s, "1111")==0) k=0;
else if (strcmp(s, "aaaa")==0) k=1;
....
switch(k)
{
   case 0:
...
   case 1:
...
   default:
...
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
06.01.2019, 03:21 5
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Можно попросить пример с хэш?
Попросить можно. Для примера взял простенькую функцию из первого нагугленного ресурса. Но имейте ввиду, что этот подход не особо надёжен - функция может случайно выдать "правильный" код для какой-то произвольной строки.
hashfunc.h
C
1
2
3
4
5
6
#ifndef HASHFUNC_H
#define HASHFUNC_H 1
 
extern unsigned jenkins_hash(const char *);
 
#endif /* HASHFUNC_H */

hashfunc.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "hashfunc.h"
 
/*  jenkins_one_at_a_time_hash*/
unsigned jenkins_hash(const char *key) {
    unsigned hash, i;
 
    for(hash = i = 0; key[i]; ++i) {
        hash += key[i];
        hash += (hash << 10);
        hash ^= (hash >> 6);
    }
 
    hash += (hash << 3);
    hash ^= (hash >> 11);
    hash += (hash << 15);
 
    return hash;
}

makehash.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include "hashfunc.h"
 
int main(int argc, char ** argv) {
    if ( argc < 2 ) {
        printf("USAGE: %s <some_string>\n", argv[0]);
        return 1;
    }
 
    printf("%#8x\n", jenkins_hash(argv[1]));
 
    return 0;
}

main.c
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
#include <stdio.h>
#include "hashfunc.h"
 
#define str__start 0x84dc271fU
#define str__pause 0x9d8cddc8U
#define str__continue 0x304d4eddU
#define str__finish 0xcb6420e3U
 
typedef char str_t[256];
#define read_string(s) ( scanf("%255[^\n]%*c", (s)) == 1 )
 
int main(void) {
    str_t cmd;
    int done = 0;
 
    while ( ! done && printf("Command: ") && read_string(cmd) ) {
        switch(jenkins_hash(cmd)) {
            case str__start :
                printf("Кидаем то, что делали (если делали)\nИ радостно берёмся за новую работу!\n");
                break;
            case str__pause :
                printf("Перекур 10 минут!\n");
                break;
            case str__continue :
                printf("Бросаем курить, идём работать!\n");
                break;
            case str__finish :
                printf("Шабаш! Расходимся...\n");
                done = 1;
                break;
            default :
                printf("Я тупой бот! Я не понял\n%s\nПопробуйте ещё раз.\n", cmd);
                break;
        }
    }
 
    return 0;
 
}

out
Код
[andrew@easybook hash_funcs]$ gcc -Wall -c -o hashfunc.o hashfunc.c
[andrew@easybook hash_funcs]$ gcc -Wall -o makehash makehash.c hashfunc.o
[andrew@easybook hash_funcs]$ ./makehash start
0x84dc271f
[andrew@easybook hash_funcs]$ ./makehash pause
0x9d8cddc8
[andrew@easybook hash_funcs]$ ./makehash continue
0x304d4edd
[andrew@easybook hash_funcs]$ ./makehash finish
0xcb6420e3
[andrew@easybook hash_funcs]$ gcc -Wall -o main main.c hashfunc.o
[andrew@easybook hash_funcs]$ ./main 
Command: start
Кидаем то, что делали (если делали)
И радостно берёмся за новую работу!
Command: pause
Перекур 10 минут!
Command: unknown
Я тупой бот! Я не понял
unknown
Попробуйте ещё раз.
Command: finish
Шабаш! Расходимся...
[andrew@easybook hash_funcs]$
0
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
06.01.2019, 10:07 6
Цитата Сообщение от easybudda Посмотреть сообщение
Но имейте ввиду, что этот подход не особо надёжен - функция может случайно выдать "правильный" код для какой-то произвольной строки.
Тут же не произвольные строки, а заранее известный, конечный набор. Т.е. всегда можно взять что-то вроде gperf и построить perfect hash функцию, которая гарантирует отсутствие коллизий для заданного набора строк.
0
Диссидент
Эксперт C
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
06.01.2019, 12:28 7
easybudda, prik, господа, не слишком ли мы усложняем? Если тупой перебор, предложенный в посте 4, вас так уж не устраивает, можно лексикографически упорядочить варианты, и искать простым бинарным поиском.
И конечно
Цитата Сообщение от prik Посмотреть сообщение
Тут же не произвольные строки, а заранее известный, конечный набор.
, иначе о каком switch может идти речь?

Добавлено через 10 минут
Впрочем, согласен. Хэш будет эффективнее. Но эта эффективность будет проявляться начиная с серьезных объемов.
0
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
06.01.2019, 13:00 8
Байт, ваш код из поста 4 делает ровно тоже самое - вычисляет хэш (k). Только менее эффективно...

Добавлено через 8 минут
Цитата Сообщение от Байт Посмотреть сообщение
иначе о каком switch может идти речь?
Речь о том, что произвольная строка "на входе" switch() может привести к коллизиям. Т.е. либо мы гарантируем, что строка "подаваемая" в switch() входит в наш заранее определенный набор и тогда можно построить совершенную хэш ф-цию, либо делаем туже strcmp() в каждом case.
На сколько я знаю, языки которые умеют switch(string) из коробки, работают по второму варианту - хэш + strcmp()
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
06.01.2019, 14:24 9
Цитата Сообщение от prik Посмотреть сообщение
Тут же не произвольные строки, а заранее известный, конечный набор.
С этим-то всё просто - достаточно убедиться, что для всех заданных слов функция выдала разные значения. Но строка, которая вводится пользователем (читается из файла, откуда там она ещё берётся) - по сути случайный набор символов.

Добавлено через 1 минуту
Цитата Сообщение от prik Посмотреть сообщение
либо делаем туже strcmp() в каждом case.
Да, я как-раз про это...
0
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
06.01.2019, 14:50 10
Цитата Сообщение от easybudda Посмотреть сообщение
С этим-то всё просто - достаточно убедиться, что для всех заданных слов функция выдала разные значения.
Так это и будет одна из совершенных хэш функций для нашего набора.
Цитата Сообщение от easybudda Посмотреть сообщение
Но строка, которая вводится пользователем
Каюсь, я не смотрел под спойлеры с вашим кодом.
Спокойно использовать одну (без доп. проверок типа strcmp()) хэш ф-цию возможно только для "чистых" данных, например мы уже успешно разобрали строку на лексемы и ничего "левого" там быть не может.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
06.01.2019, 16:46 11
Цитата Сообщение от prik Посмотреть сообщение
Спокойно использовать одну (без доп. проверок типа strcmp()) хэш ф-цию возможно только для "чистых" данных, например мы уже успешно разобрали строку на лексемы и ничего "левого" там быть не может.
Тогда вся прелесть этого подхода теряется. Основной профит от всей этой возни в том, что нет нужды каждое слово на входе проверять на соответствие всем заданным. При условно бесконечном потоке ввода и достаточно большом словаре получить хеш-код очередного слова на входе и при обнаружении такого кода, как одной из ветвей switch/case, проверить, точно ли входное слово является заданным, всё-таки не так накладно...
0
Байт
06.01.2019, 21:47     Как использовать оператор switch со строками?
  #12

Не по теме:

Есть у Юлия Кима славная песенка про лейб-гусаров. Хотел вот даже ее опубликовать тут, но понял, что она длинновата. Если кому интересно - Гугл помощь
Вообще-то, если правильно ее интерпретировать, то она является неплохим дополнением к правилу 4.7...
Вот блин, я получился каким-то звезданутым на этом правиле. И веником уже меня стегали, и с дерьмецом мешали. Имхо, надо или отменить правило, или отменить меня.

0
06.01.2019, 21:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.01.2019, 21:47
Помогаю со студенческими работами здесь

Вычислить значение функции, использовать оператор выбора switch.
Вычислить значение функции из заданного набора: Номер функции вводит пользователь. Все ...

По дате d,m,y определить дату следующего дня d1,m1,y1( d-день , m-месяц, y-год). Использовать оператор switch
По дате d,m,y определить дату следующего дня d1,m1,y1( d-день , m-месяц, y-год). Использовать...

Найти какая из двух заданных точек ближе к третьй, вывести найденное расстояние (использовать оператор switch)
Помогите написать программу на С++. Не пойму как реализовать в этой задаче switch. На числовой оси...

Как оператор switch превратить в оператор if
Здравствуйте! Есть вот такая задачка: Для целого числа K (от 1 до 99 включительно) напечатать...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru