![]() |
|
Модераторы: bsa |
![]()
|
|
| startpoint |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 4.7.2007 Репутация: нет Всего: нет |
Нужно написать программу, которая бы подсчитывала количество символов в тексте побуквенно. Каждый символ будет представлен структурой:
Добавлено через 5 минут и 21 секунду P.S. Пишу на C |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
есть три подхода:
1) взять с запасом 2) сначала посчитать количество, потом выделить пространство под массив 3) использовать динамический список недавно обсуждали подобную тему.. http://forum.vingrad.ru/forum/topic-332571/0.html -------------------- undefined |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
startpoint, рекомендую сделать проще - сделать массив из 256 интов. После этого каждый символ интерпретировать как индекс массива. При нахождении символа просто инкрементировать соответствующий элемента массива.
А так, как ты делать хочешь - очень медленно будет работать. Это сообщение отредактировал(а) bsa - 27.6.2011, 11:14 |
|||
|
||||
| newbieone |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 14.3.2010 Репутация: 1 Всего: 1 |
Когда еще учился на первом курсе в ВУЗе, обходил подобную проблему со строками (длина которых заранее неизвестна) так: считывал посимвольно элементы строки и при каждом следующем считывании, если оно проходило успешно, создавал массив размером на 1 чар больше, переносил всё содержимое старого массива в новый, и старый удалял. в конце концов всегда имел [] char нужной длины
Если вариант bsa не подходит по условию задачи (обязательно использовать приведенную структуру), можно посмотреть в сторону контейнеров STL в C++ (если, опять же, условие использования чистого С не строгое). |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Очень неоптимально. В том же std::vector это делается через увеличение объема массива в 2 раза, а не на 1 символ. Более того, можно использовать realloc для изменений объема массива. |
|||
|
||||
| newbieone |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 14.3.2010 Репутация: 1 Всего: 1 |
согласен. в своем посте я указал, что так делать не надо было. впрочем, ничто не мешает применить этот способ к данной задаче с учетом замечания о количестве выделяемой памяти при превышении. получится этакий велосипед наподобие std::vector средствами С. Это сообщение отредактировал(а) newbieone - 27.6.2011, 13:05 |
|||
|
||||
| Сыроежка |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Для таких целей служит контейнер std::map. . |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
вобщето он пишет на Си.. -------------------- undefined |
|||
|
||||
| Сыроежка |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
На С тоже есть реализация map. Но проще конечно в таком случае использовать список и каждый раз проверять, имеется ли в списке уже подсчитанный символ. Если нет, то доавлять в список. Списко конечно желательно иметь отсортированным по коду символа, чтобы использовать двоичный метод поиска. |
|||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 11 Всего: 88 |
Да вы чего, ребятки? Вам что, делать нефиг? bsa ещё два дня назад написал, что и как нужно делать. Читайте внимательно, что вам пишут:
Если есть трудности в реализации этого простейшего метода, то могу предложить чего-нибудь такое:
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| Сыроежка |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
Не обесудьте, но ваш код не корректный! Точнее сказать, зависящий от реализации компилятора. Дело в том, что тип char может вести себя и как signed char, и как unsigned char. Если он ведет себя как знаковое целое число, то тогда выражение arr[*p]++; будет некорректным, так как получится, что вы будете вычитать из arr отрицательное число *p. Чтобы код был правильным надо предварительно делать кастинг то unsigned char. Это сообщение отредактировал(а) Сыроежка - 28.6.2011, 20:42 |
|||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 11 Всего: 88 |
А у нас что, дефицит напильников? -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
поищите мой пост, там давно уже есть такой пример, задолго до bsa.. http://forum.vingrad.ru/forum/topic-332571/0.html -------------------- undefined |
|||
|
||||
| Сыроежка |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 24.6.2011 Репутация: 1 Всего: 1 |
||||
|
||||
| universeroot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 29.6.2011 Репутация: нет Всего: нет |
А как вам моя реализация?
Это сообщение отредактировал(а) universeroot - 29.6.2011, 18:15 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |