| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > Найти самое длинное слово (си) |
| Автор: Bony 16.12.2005, 13:58 |
| Задача: Найти самое длинное общее слово двух заданных предложений. Язык Си, просто Си. |
| Автор: En_t_end 16.12.2005, 15:35 | ||
Что типа этого, писал быстро поэтому 1. Коряво сделал добывание слова из предложения в функции readword - возможен выход за границы массива. 2. Не сделал пару проверок. Но алгоритм вроде верный. ЗЫ + не проверял. Добавлено @ 15:40 Короче скорее всего код выше бред, но алгоритм таков. Выбирай одно слово из первого предложения, далее перебирай все выбранные слова из второго предложения, пока не найдешь такое же или не подойдешь к концу второго предложения, если найдешь похожее слово, то получай его длину, сравнивай с имеющимся рекордом и если оно выше рекорда записывай слово в буффер, который затем в конце работы будешь показывать. Далее выбирай следующее слово из первого предложения, опять прокатывайся по второму и так далее пока не достигнешь конца первого. |
| Автор: Bony 16.12.2005, 16:04 |
| Спасибо. С алгорится я все понял! Если не затруднит можно код, ну если нет так нет Еще раз спасибо |
| Автор: En_t_end 16.12.2005, 17:18 |
| Bony В моем коде нужно только исправить функцию readword, я точно не помню, но по-моему есть такая стандартная функция - умеет выдирать совокупность символов от и до определенного символа в нашем случае - это 32 символ, также нужно срезать запятые и точки + знаки восклицания и всевозможные символы, для этого достаточно просто воспользоваться функцией(станд.) для узнавания является ли данный символ буквой. |
| Автор: Bony 17.12.2005, 18:45 |
| А для простого Си этот код потянет!!! |
| Автор: Bony 18.12.2005, 11:06 |
| Есть несколько вопросов: 1. что делает и эта библиотечная функция strlen(Str)) 2. buffer[i++] - это как? |
| Автор: En_t_end 18.12.2005, 19:12 |
| buffer[i++] - возвращает элемент с индексом i и после этого увеличивает i на единицу. strlen возвращает длину строки оканчивающуюся нуль-терминатором, причем не включая его в возвращаемое значение. |
| Автор: Bony 20.12.2005, 15:45 |
| En_t_end чет не пашет, ошибок много!!! |
| Автор: Dov 21.12.2005, 01:24 | ||
Для простоты считаем, что:
2.Регистр символов не учитываем, хотя можем сделать и это. 3.Количество слов в предложении - не больше 20, хотя можем увеличить.
|
| Автор: Bony 21.12.2005, 18:22 |
| Dov Спасибо огромное!!! Как мне благодорить тебя??? Может конечно я покажесь наглым, но не могу сделать чтоб самому предложения вводить, ошибки появляются (наверно потому что не сам код писал)! И можно ли как нибудь на подпрограммы разбить??? Но как бы там ни было еще раз спасибо, спас мою шкуры!!! |
| Автор: noBony 21.12.2005, 22:31 | ||
Встречный вопрос : 1. Что такое ЯЗЫК ПРОГРАММИРОВАИЯ ??? 2. А С/С++ ??? После ответа на эти вопросы (только честно) оба твоих отпадают сразу . |
| Автор: Dov 21.12.2005, 22:35 | ||||||||
Вот исправленная версия:
Что, конкретно, тебя интересует? |
| Автор: noBony 21.12.2005, 22:44 | ||
for Dov
а почему инкремент ( вначале проги ? ) к чему лишние напряги (читай - лишние такты). Почему не указать индекс явно ??? |
| Автор: Dov 21.12.2005, 23:04 | ||
noBony, если есть что-нибудь умное сказать - скажи, а оффтопить мы и сами умеем. Вот человеку подпрограммы нужны, например. Помоги. |
| Автор: noBony 21.12.2005, 23:35 | ||
Я не понял суть задачи :
если слово общее - значит это одно и тоже слово. Как они могут иметь разную длинну ??? |
| Автор: Dov 21.12.2005, 23:50 | ||
Общих слов может быть несколько. Нужно найти самое длинное из них. |
| Автор: noBony 22.12.2005, 00:10 |
| Общее слово - ХАЛЯВА. strlen("Халява") == strlen("Халява") == 6; В чём прикол ??? |
| Автор: Dov 22.12.2005, 00:18 |
2.пейте пиво с раками. самое длинное - пейте. |
| Автор: noBony 22.12.2005, 00:22 |
| насёт пива - в точку (на злобу дня). А насчёт слов - общие по смыслу чтоли ??? |
| Автор: Dov 22.12.2005, 00:27 |
| noBony, вот ты гусь лапчатый. Зараз як скажу хранцюзьке слово на иврите, одразу кобылою станэш. |
| Автор: noBony 22.12.2005, 00:32 |
| осёл!!! Родину продал!!! По-русски писать не можешь !!! Давай мыло - сразимся на С\С++. |
| Автор: Dov 22.12.2005, 00:35 |
| А шампуня тебе не дать |
| Автор: Bony 22.12.2005, 13:13 | ||||||
Ну ты чувак даешь????? Я чуть со смеху не опписался!!! Dov
Просто помимо программирования нужно еще и по трем математикам упевать чето понимать! Но ни че потехоньку да по-маленьку, как нибудь на 2-ой семестр переберусь!!!
Прихоть нашего препода, использовать подпрограммы, в данном случае подпрограммы ввода, сравнения и т.д. Я понимаю глупо делать подпр. ввода, но можно сделать попр. сравнения!! |
| Автор: Dov 23.12.2005, 00:30 | ||
Bony, вот с подпрограммами, которые в С / С++ называются функциями.
|
| Автор: Bony 23.12.2005, 15:38 |
| Благодорность моя не знает границ И для ясности: функции: 1. InputString - ввод предложений 2. FillArray - ввыдерка слова. 3. CompareWord - сравнение слов 4. OutputWord - ввывод слова И последний наверно вопрос: вот *, тобишь указатель на чето там, на Х, а что значит **? |
| Автор: Bony 25.12.2005, 11:52 |
| Чем в данном коде являются: char **ar char **ar1 char **ar2 |
| Автор: En_t_end 25.12.2005, 12:52 |
| Bony Массивы указателей. |
| Автор: Bony 25.12.2005, 18:47 |
| О как!! Массивы указателей! А цель их какая? |
| Автор: En_t_end 25.12.2005, 18:51 |
| Bony В данном случае они хранят слова. Если тебе известно char - символ, а char[] - несколько символов, поэтому чтобы хранить слова нужно иметь несколько char[]. Чтобы иметь несколько char[] можно сделать так: char[][]. |
| Автор: Bony 25.12.2005, 18:57 | ||
А можно ** так что ли? |
| Автор: En_t_end 27.12.2005, 07:19 |
| Bony char** some; - это всего лишь указатель на двумерный массив. Выделение памяти идет в стеке или в куче. В функциях же этот указатель используется для получения адресса на нужный нам массив, чтобы работать с ним, не копируя его содержимое в другую область памяти. char someS[20][13] - обьявление двумерного массива, с практически мгновенным выделением памяти в стеке. char** some; - обьявление указателя на двумерный массив, без выделения памяти. Может применятся для хранения адресса двумерного массива, того же someS. Или же ты можешь сам выделить память, используя менеджер кучи: some = new char*[20]; for(unsigned i = 0; i<20;i++) some[i] = new char[13]; Отчистка области кучи, занятой под some: for(unsigned i = 0; i<20;i++) delete[] some[i]; delete[] some; Обращаясь к двумерному массиву, мы работаем по тому же принципу, что и с обычным массивом символов.То есть используя оператор [] - разыменования для доступа к членам массива по определенному индексу. Не забывая, что массив имеет ещё одну вложенность. |