![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Gold_Fish |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Помогите, пожалуйста, очень прошу, хотя бы частично:
Перенос слова. Перенос русского слова с одной строки на другую с большей вероятностью выполняется правильно, если пользоваться следующими правилами: 1)две идущие подряд гласные можно разделить, если перед первой из них стоит согласная, а за второй идет хотя бы одна буква (буква й при этом рассматривается вместе с предшествующей ей гласной как единое целое); 2) две идущие подряд согласные можно разделить, если первой из них стоит гласная, а в той части слова, которая идет за второй согласной, имеется хотя бы одна гласная (буквы ь, ъ вместе с предшествующей согласной рассматриваются как единое целое); 3) если не удается применить первые два правила, то слово разбивают так, чтобы первая часть содержала более чем одну букву и оканчивалась на гласную, а вторая содержала хотя бы одну гласную. Дан текст, состоящий из нескольких строк. Преобразовать текст таким образом, чтобы длина строк не превышала заданного значения, используя при этом перенос слов. ![]() Как найти ближайший к концу строки пробел, если при заданном значении слово "как бы разбивается"? Как осуществить на Паскале приведенный выше перенос??? Сообщение отредактировано: Gold_Fish - 6.12.2006 14:51 |
![]() ![]() |
Lapp |
![]()
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Пишу пояснения к реализации Правила №1 (см. пост №20)
Итак, к этому моменту у нас есть следующее: - в переменной s лежит текущая строка (без последнего слова); - в переменной t лежит последнее слово, которое нам как раз и надо разделить на части. Во-первых, внимательно прочитав Пр.1, мы приходим к выводу, что в нем участвуют по крайней мере 4 буквы (две гласные, одна согласная перед ними и одна любая после них). Следовательно, для работы по Пр.1 нам нужны слова, которые содержат как минимум 4 буквы. Поэтому мы можем поставить условный оператор if, который будет фильтровать для нас все слова, давая только те, которые содержат не менее 4 букв: if Length(t)>=4 then ... Все дальнейшее, относящееся к этому правилу, мы заключим в операторные скобки begin-end, чтобы программа пропустила все это, если слово имеет менее 4 букв. (Замечание: в приведенном расуждении есть ошибка. Не старайся ее найти, это не так просто. Я все исправлю и объясню потом. Сейчас не хочу сбивать тебя с толку исправлениями на ходу). Это было как бы подготовительное действие, и оно было простым. Сделаем еще одно подготовительное действие, немного более сложное.. Уделим внимание последнему утверждению из Пр.1, к тому же заключенному в скобки. Оно гласит, что буква "й" в определенных ситуациях считается единым целым с предыдущей буквой. Иными словами, комбинацию типа "ай" можно заменить просто буквой "а", то есть выкинуть "й". Проще говоря, буква "й" в некоторых ситуциях лишняя. Выкидываем ее в цикле, отыскивая означенные комбинации. Но выкидывание буквы "й" повредит самому тексту, который станет после этого содержать ошибки! Значит, сначала делаем копию слова (в переменной w), и уже над ней производим описанную операцию:
Если ты сравнишь приведенные два куска с полным кодом (пост №20), то увидишь, что между ними есть строчка, которой я не уделил внимания. Кроме того, во втором фрагменте есть оператор Delete(Map,i,1) непонятного (пока) назначения... Зачем это? А вот, зачем.. Выидывание буквы "й" не только повредит тексту (о чем я упомянул раньше, и от чего мы типа защитились копированием), но еще и изменит нумерацию в слове! То есть, если в слове "койот" буквы "о" и "т" имеют номера 4 и 5 соответственно, то после выкидывания (в соответствии с Пр.1) буквы "й" мы получим слово "коот", в котором упомянутые буквы имеют номера 3 и 4. Это может сыграть с нами злую шутку, когда мы станем делить слово на части (ведь делить надо оригинальное слово, а не его копию, лишенную "й"), так как мы запутаемся в нумерации букв, копируемых в две разные части. Чтобы это не случилось, мы делаем карту нашего слова, нумеруя все буквы по порядку (именно это и делает пропущенная строка). Когда же мы выбрасываем "й", мы выбрасываем и его номер. Например, изначально карта слова "койот" была 12345, а после выбрасывания "й" она стала 1245. Эту информацию мы используем в дальнейшем при разбиении слова.. Следующий цикл - собственно реализация Пр.1. Мы проходим циклом с конца слова (с предпоследней буквы - почему?) до начала (до второй буквы - почему?), пытаясь выявить комбинации, подпадающие под Пр.1. Рассмотри внимательно условие, и ты узришь в нем то самое правило: если вторая буква (с конца) гласная, и третья гласная, а четвертая согласная, а первая (то есть самая правая) есть буква (а не точка, не запятая и т.п.), то слово можно разделить между двумя гласными, то есть между буквой с номером i и буквой с номером i+1. Заметим, что эта нумерация - нумерация в слове с выкинутыми "й", то есть неправильная нумерация для оригинального слова. Вот тут-то мы и вспоминаем про запасенную карту слова.. В результате к имеющейся строке s дописывается кусок орининального слова t длиной, равной номеру i-го символа в оригинальном слове. И точно такая же часть удаляется из t, которое будет содержать остаток слова, который в свою очередь явится началом новой строки.. Мораль: жизнь бесконечно многообразна, что есть, впрочем, флуд ![]() Рыбка, я тебя очень прошу, уважь плод труда моего ночного бдения, прочти все внимательно (желательно не единожды) и постарайся разобраться. Это в твоих силах.. и интересах ![]() И после этого, на базе, так сказать, приобретенных знаний ![]() Последнее: в дальнейшем никаких исключений - по вопросам Форума я в личке не отвечаю. И даже не читаю. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 9:27 |