Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
stutИдем по символах строки до пробела/конца. Если находим маркируем как n и меняем предыдущие символы в обратном порядке. Потом маркируем начало след. Слова m=n+1, и находим следующий пробел (n=i) и меням местами буквы Алгоритм правильный. ОК. Смотрим код: stut Код: plaintext 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. ---уже даже так переделал и ничего не помагает там d-переменная была лишняя и надо было другую итерационную- j Какой физический смысл у значения (n-m-1)/2 ? Половина длины слова (примерно, см. ниже). А m и n - начало и конец слова относительно начала всей строки. Т.е. у вас j содержит смещение от начала всей строки, а условие окончания цикла сравнивает его с длиной слова j<(n-m-1)/2. Сравнивать нужно также со смещением от начала строки, что-то вроде этого: Код: plaintext 1. Теперь по поводу половины длины слова. Т.к. m - начало слова, m - последний символ слова, то длина слова = n - m + 1. Соответственно половина = (n - m + 1)/2, а не (n - m - 1)/2 Т.е. цикл будет такой: Код: plaintext 1. Как поправите эти ошибки - возвращайтесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 14:13 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Для для слов с нечётным числом букв средня буква остаётся на месте. Всё просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 14:16 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
stut Код: plaintext 1. 2. 3. 4. 1. j увеличивается на 2 за один проход. Вот как у тебя происходит Код: plaintext 1. 2. 3. 4. 5. 6. 2. Это не обмен букв Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 14:32 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
maytonДля для слов с нечётным числом букв средня буква остаётся на месте. Всё просто. При условии что вы эту среднюю букву правильно находите ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 14:42 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Школьная задачка с информатики. 8-й класс первая четверть. И что мы здесь вообще делаем, господа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 15:26 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
maytonШкольная задачка с информатики. 8-й класс первая четверть. И что мы здесь вообще делаем, господа. Двоечников спасаем. Уже третья четверть, а он еще не решил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 15:45 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
mayton,m-начало слова; n-1-конец (слово ворд в строке 6;10). Тогда середина (m+n-1)/2 (тогда середина ворда-8-которая не меняется. А если бы слово было на букву короче тогда-7,5=7 как целое тогда меняется лиш первая буква выходит за середину надо брать (m+n)/2 ). Можно j и не брать ибо я беру относительно начала строки. И когда я ввел j-ничего не поменялось. Ошибка может быть что как раз за пределы слов все эти изменение происходят ибо програма при запуске виснет. А почему j увеличивается на двое не понятно что применение инкремента в индексе невозможно? пк под рукою нет потому проверить не могу?// у меня вообще инф. не было в таком класе, тем более С, и это мне нужно как раз не для школы и не только не для школы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 15:48 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
stutне для школы и не только не для школы Это утверждение эквивалентно утверждению "не для школы и для школы" stut,m-начало слова; n-1-конец (слово ворд в строке 6;10). Тогда середина (m+n-1)/2 (тогда середина ворда-8-которая не меняется. Что ж вы все время эту -1 пихаете? Предлагагаю вам рассмотреть случай, когда m=6, n=7, т.е. длина 2. Тогда середина будет 6 по вашей формуле. А теперь цикл Код: plaintext 1. Сколько итераций будет выполнено? Надеюсь вам не нужен ПК и компилятор чтобы ответить на этот вопрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 16:02 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Ага, все, заработался я. n это не последний символ, а последний + 1. Тогда формула верная. Простите меня :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 16:06 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyТогда формула верная Рано покаялся. :) Все равно (m+n-1)/2 не верная формула. Если m=6, n=8, то середина будет все равно 6 по этой формуле, а должна быть 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 16:09 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
stut А почему j увеличивается на двое не понятно что применение инкремента в индексе невозможно? Знаки препинания ставить надо, а то поток сознания какой-то. Почему два раза: я тебе красным выделил почему. stutприменение инкремента в индексе невозможно? Возможно. То что невозможно - не скомпилируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 16:21 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
stutmayton,m-начало слова; n-1-конец (слово ворд в строке 6;10). Тогда середина (m+n-1)/2 (тогда середина ворда-8-которая не меняется. А если бы слово было на букву короче тогда-7,5=7 как целое тогда меняется лиш первая буква выходит за середину надо брать (m+n)/2 ). Можно j и не брать ибо я беру относительно начала строки. И когда я ввел j-ничего не поменялось. Ошибка может быть что как раз за пределы слов все эти изменение происходят ибо програма при запуске виснет. А почему j увеличивается на двое не понятно что применение инкремента в индексе невозможно? пк под рукою нет потому проверить не могу?// у меня вообще инф. не было в таком класе, тем более С, и это мне нужно как раз не для школы и не только не для школы. Когда работаешь со строками - придерживайся принципов: 1) Символы нумеруются с нуля. Работаем не с байтами а с сущностями char, wchar, TCHAR.... e.t.c. Такой-же берём API. 2) Берём стандартные функции. Они оттестированы и дают хотя-бы адекватный error_state в случае ошибок. В них также по меньший риск получить vulnerability чем в твоих самодельных функциях. 3) Строки заканчиваются всегда '\0'. Если где-то не заканчиваются - то это не строки. 4) При ВСЕХ строковых операциях с диапазонами - берут полуоткрытый интервал вида [m;n). Тоесть yourstring.substring(m,n) означает что нужно взять под-строку с m- позиции включительно по n- позицию не включая хвост. Альтернативный вариант n- задаёт длину подстроки. 5) Большая часть функций (99.9%) которые хотят модифицируют строку - должны работать с аргументом как immutable/const. Для упрощения return используй шаблон std::string. Тоесть аргумент - не изменять. Возвращай изменённую строку как новую сущность. Возможные споры о performance имеют место, но их надо обсуждать отдельно. Это как раз (0.1%) тех самых редких случаев. В некоторых случаях например можно вообще строку не изменять а возвращать особый итератор который делает fetch символов в реверсном порядке и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 16:24 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 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. ---даже так- не работает - то есть дело не в замене букв. Выходит что код после первого ФО не работает вообще Ибо был сместил m=n+1; на скобку ниже и возвратило первоначальную строку. Хотя теперь даже это не идет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 17:30 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
stut, сделай reverse только для 1 слова. И оттестируй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 17:39 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Там есть и другие ошибки. Но основная здесь (об этом еще master_ziv в самом начале намекал): Код: plaintext 1. Функция пытается модифицировать строковый литерал, который скорее всего readonly - и крашится. вместо этого должно быть так: Код: plaintext 1. 2. 3. Т.е. копируем строку во временную переменную, там выполняем реверс, а потому удаляем временную переменную. Остальные ошибки (из очевидных): 1) Условие line[i]=='\0' никогда не выполнится т.к. условие цикла i<l. Должно быть i<=l, иначе последнее слово не найдется. 2) m=n+1 присваивает мусор, т.к. n содержит верное значение только внутри if Перенести внутрь if. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 18:01 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Так бы сразу что рид-онли. Но думаю эту темпоральную переменную как раз в функции надо и использовать. Ей присваивать измененные значение лайна а потом возвращать в конце функции. Если добавить ваш кусок то работает. Даже без free(temp). Ибо для этого надо еще какую то библиотеку подключать. Хотя мой вариант разворота слова работает лиш до середине слова? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 19:01 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
stutДаже без free(temp). Ибо для этого надо еще какую то библиотеку подключать. предвижу, что вскоре здесь на форуме появится пилотная реализацию и функции free от stut-a. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 19:07 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Анатолий Широковпредвижу, что вскоре здесь на форуме появится пилотная реализацию и функции free от stut-a. Зачем? Без нее же "работает" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 19:09 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
stut, Используйте класс std::string из C++ для работы со строками, тогда не надо будет выделять и освобождать временный буфер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 19:13 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковstutДаже без free(temp). Ибо для этого надо еще какую то библиотеку подключать. предвижу, что вскоре здесь на форуме появится пилотная реализацию и функции free от stut-a. И malloc с "хвостиками"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 19:23 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Может лучше так Код: plaintext 1. 2. Зачем грузить студента лишними подробностями если он основное не понимает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 19:42 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Я бы даже так упростил Код: plaintext 1. 2. 3. 4. [/quot] Кому-то изначальная запись фигня, а кому-то по неопытности может мозг взорвать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 19:46 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Dima TМожет лучше так Код: plaintext 1. 2. Зачем грузить студента лишними подробностями если он основное не понимает ? Я с этим согласен. strdup был использован, т.к. инициализировать массив можно только литералом, а если строка например передана в качестве аргумента char* то с массивом такое уже не проканает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 19:53 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
Может проще было создать после int m, n; int l=strlen(line); также char *temp--и выделить память tеmp=nеw chаr [l] потом -- иф лайн[i]==пробел то и темп[i] и т.д. ..темп[j]=лайн[d--]. Чуобы доходило до конечного знака в строке лутше написать i<l+1;// strdup- функция все же нестандартная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 22:06 |
|
||
|
Ошибки в функции реверса каждого слова строки
|
|||
|---|---|---|---|
|
#18+
stutstrdup- функция все же нестандартная здрасте, стандартнее некуда Но мысль выделять память в функции и возвращать ее имеет право на жизнь (хотя я бы так не делал). Главное при вызове помнить что после всего надо освободить память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2014, 23:00 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38564597&tid=2019647]: |
0ms |
get settings: |
10ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
68ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 280ms |
| total: | 441ms |

| 0 / 0 |
