2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 243
|
|
1 | |
Как использовать оператор switch со строками?05.01.2019, 14:39. Показов 4665. Ответов 11
Метки нет (Все метки)
Добрый день!
Подскажите пожалуйста как использовать оператор switch с объектом String? Я понимаю что switch работает только с целочисленными данными, но как быть если нужно распознать много строк.
0
|
05.01.2019, 14:39 | |
Ответы с готовыми решениями:
11
Использовать оператор switch чтобы определить цену за каждое изделие Как использовать оператор switch в структуре Оператор switch со строками Оператор switch не работает со строками |
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
|
|
05.01.2019, 16:03 | 2 |
Вы разделом форума точно не ошиблись? В С нет ни класса String (в Java есть такой), ни его объектов. Есть последовательность символов, заканчивающаяся терминальным нулём. Адрес первого символа по сути указатель на С-строку. В любом случае, самое очевидное решение - хорошая хеш-функция со строкой на входе и беззнаковым целым на выходе. А дальше switch по хеш-кодам проверяемых строк...
0
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 243
|
|
05.01.2019, 16:19 [ТС] | 3 |
Я под String имел в виду строку. Язык си. Конец строки определяется обычным нулем. Можно попросить пример с хэш?
0
|
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
|
|||||||||||||||||||||
06.01.2019, 03:21 | 5 | ||||||||||||||||||||
Попросить можно. Для примера взял простенькую функцию из первого нагугленного ресурса. Но имейте ввиду, что этот подход не особо надёжен - функция может случайно выдать "правильный" код для какой-то произвольной строки.
hashfunc.h
hashfunc.c
makehash.c
main.c
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 |
Тут же не произвольные строки, а заранее известный, конечный набор. Т.е. всегда можно взять что-то вроде gperf и построить perfect hash функцию, которая гарантирует отсутствие коллизий для заданного набора строк.
0
|
Диссидент
27709 / 17325 / 3811
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
06.01.2019, 12:28 | 7 |
easybudda, prik, господа, не слишком ли мы усложняем? Если тупой перебор, предложенный в посте 4, вас так уж не устраивает, можно лексикографически упорядочить варианты, и искать простым бинарным поиском.
И конечно , иначе о каком switch может идти речь? Добавлено через 10 минут Впрочем, согласен. Хэш будет эффективнее. Но эта эффективность будет проявляться начиная с серьезных объемов.
0
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
06.01.2019, 13:00 | 8 |
Байт, ваш код из поста 4 делает ровно тоже самое - вычисляет хэш (k). Только менее эффективно...
Добавлено через 8 минут Речь о том, что произвольная строка "на входе" switch() может привести к коллизиям. Т.е. либо мы гарантируем, что строка "подаваемая" в switch() входит в наш заранее определенный набор и тогда можно построить совершенную хэш ф-цию, либо делаем туже strcmp() в каждом case. На сколько я знаю, языки которые умеют switch(string) из коробки, работают по второму варианту - хэш + strcmp()
0
|
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
|
|
06.01.2019, 14:24 | 9 |
С этим-то всё просто - достаточно убедиться, что для всех заданных слов функция выдала разные значения. Но строка, которая вводится пользователем (читается из файла, откуда там она ещё берётся) - по сути случайный набор символов.
Добавлено через 1 минуту Да, я как-раз про это...
0
|
724 / 224 / 72
Регистрация: 01.03.2011
Сообщений: 629
|
|
06.01.2019, 14:50 | 10 |
Так это и будет одна из совершенных хэш функций для нашего набора.
Каюсь, я не смотрел под спойлеры с вашим кодом.
Спокойно использовать одну (без доп. проверок типа strcmp()) хэш ф-цию возможно только для "чистых" данных, например мы уже успешно разобрали строку на лексемы и ничего "левого" там быть не может.
0
|
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
|
|
06.01.2019, 16:46 | 11 |
Тогда вся прелесть этого подхода теряется. Основной профит от всей этой возни в том, что нет нужды каждое слово на входе проверять на соответствие всем заданным. При условно бесконечном потоке ввода и достаточно большом словаре получить хеш-код очередного слова на входе и при обнаружении такого кода, как одной из ветвей switch/case, проверить, точно ли входное слово является заданным, всё-таки не так накладно...
0
|
Байт
|
06.01.2019, 21:47
Как использовать оператор switch со строками?
#12
|
Не по теме: Есть у Юлия Кима славная песенка про лейб-гусаров. Хотел вот даже ее опубликовать тут, но понял, что она длинновата. Если кому интересно - Гугл помощь
0
|
06.01.2019, 21:47 | |
06.01.2019, 21:47 | |
Помогаю со студенческими работами здесь
12
Вычислить значение функции, использовать оператор выбора switch. По дате d,m,y определить дату следующего дня d1,m1,y1( d-день , m-месяц, y-год). Использовать оператор switch Найти какая из двух заданных точек ближе к третьй, вывести найденное расстояние (использовать оператор switch) Как оператор switch превратить в оператор if Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |