IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Перенос слова, перенести слова, используя 3 правила
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Женский
Реальное имя: Марина

Репутация: -  0  +


Помогите, пожалуйста, очень прошу, хотя бы частично:
Перенос слова. Перенос русского слова с одной строки на другую с большей вероятностью выполняется правильно, если пользоваться следующими правилами:
1)две идущие подряд гласные можно разделить, если перед первой из них стоит согласная, а за второй идет хотя бы одна буква (буква й при этом рассматривается вместе с предшествующей ей гласной как единое целое);
2) две идущие подряд согласные можно разделить, если первой из них стоит гласная, а в той части слова, которая идет за второй согласной, имеется хотя бы одна гласная (буквы ь, ъ вместе с предшествующей согласной рассматриваются как единое целое);
3) если не удается применить первые два правила, то слово разбивают так, чтобы первая часть содержала более чем одну букву и оканчивалась на гласную, а вторая содержала хотя бы одну гласную.
Дан текст, состоящий из нескольких строк. Преобразовать текст таким образом, чтобы длина строк не превышала заданного значения, используя при этом перенос слов. blink.gif

Как найти ближайший к концу строки пробел, если при заданном значении слово "как бы разбивается"? Как осуществить на Паскале приведенный выше перенос???

Сообщение отредактировано: Gold_Fish -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Пишу пояснения к реализации Правила №1 (см. пост №20)
Итак, к этому моменту у нас есть следующее:
- в переменной s лежит текущая строка (без последнего слова);
- в переменной t лежит последнее слово, которое нам как раз и надо разделить на части.

Во-первых, внимательно прочитав Пр.1, мы приходим к выводу, что в нем участвуют по крайней мере 4 буквы (две гласные, одна согласная перед ними и одна любая после них). Следовательно, для работы по Пр.1 нам нужны слова, которые содержат как минимум 4 буквы. Поэтому мы можем поставить условный оператор if, который будет фильтровать для нас все слова, давая только те, которые содержат не менее 4 букв:
if Length(t)>=4 then ...

Все дальнейшее, относящееся к этому правилу, мы заключим в операторные скобки begin-end, чтобы программа пропустила все это, если слово имеет менее 4 букв.
(Замечание: в приведенном расуждении есть ошибка. Не старайся ее найти, это не так просто. Я все исправлю и объясню потом. Сейчас не хочу сбивать тебя с толку исправлениями на ходу).

Это было как бы подготовительное действие, и оно было простым. Сделаем еще одно подготовительное действие, немного более сложное.. Уделим внимание последнему утверждению из Пр.1, к тому же заключенному в скобки. Оно гласит, что буква "й" в определенных ситуациях считается единым целым с предыдущей буквой. Иными словами, комбинацию типа "ай" можно заменить просто буквой "а", то есть выкинуть "й". Проще говоря, буква "й" в некоторых ситуциях лишняя. Выкидываем ее в цикле, отыскивая означенные комбинации. Но выкидывание буквы "й" повредит самому тексту, который станет после этого содержать ошибки! Значит, сначала делаем копию слова (в переменной w), и уже над ней производим описанную операцию:

w:=t;
for i:=Length(t) downto 2 do {убираем Й после гласных в слове}
if (w[i ] in ISh)and(w[i+1] in Vow) then begin {если за гласной идет Й}
Delete(w,i,1); {то убираем ее}
Delete(Map,i,1)
end;

Если ты сравнишь приведенные два куска с полным кодом (пост №20), то увидишь, что между ними есть строчка, которой я не уделил внимания. Кроме того, во втором фрагменте есть оператор Delete(Map,i,1) непонятного (пока) назначения... Зачем это? А вот, зачем..

Выидывание буквы "й" не только повредит тексту (о чем я упомянул раньше, и от чего мы типа защитились копированием), но еще и изменит нумерацию в слове! То есть, если в слове "койот" буквы "о" и "т" имеют номера 4 и 5 соответственно, то после выкидывания (в соответствии с Пр.1) буквы "й" мы получим слово "коот", в котором упомянутые буквы имеют номера 3 и 4. Это может сыграть с нами злую шутку, когда мы станем делить слово на части (ведь делить надо оригинальное слово, а не его копию, лишенную "й"), так как мы запутаемся в нумерации букв, копируемых в две разные части. Чтобы это не случилось, мы делаем карту нашего слова, нумеруя все буквы по порядку (именно это и делает пропущенная строка). Когда же мы выбрасываем "й", мы выбрасываем и его номер. Например, изначально карта слова "койот" была 12345, а после выбрасывания "й" она стала 1245. Эту информацию мы используем в дальнейшем при разбиении слова..

Следующий цикл - собственно реализация Пр.1. Мы проходим циклом с конца слова (с предпоследней буквы - почему?) до начала (до второй буквы - почему?), пытаясь выявить комбинации, подпадающие под Пр.1. Рассмотри внимательно условие, и ты узришь в нем то самое правило: если вторая буква (с конца) гласная, и третья гласная, а четвертая согласная, а первая (то есть самая правая) есть буква (а не точка, не запятая и т.п.), то слово можно разделить между двумя гласными, то есть между буквой с номером i и буквой с номером i+1.

Заметим, что эта нумерация - нумерация в слове с выкинутыми "й", то есть неправильная нумерация для оригинального слова. Вот тут-то мы и вспоминаем про запасенную карту слова.. В результате к имеющейся строке s дописывается кусок орининального слова t длиной, равной номеру i-го символа в оригинальном слове. И точно такая же часть удаляется из t, которое будет содержать остаток слова, который в свою очередь явится началом новой строки..

Мораль: жизнь бесконечно многообразна, что есть, впрочем, флуд smile.gif.
Рыбка, я тебя очень прошу, уважь плод труда моего ночного бдения, прочти все внимательно (желательно не единожды) и постарайся разобраться. Это в твоих силах.. и интересах smile.gif

И после этого, на базе, так сказать, приобретенных знаний smile.gif, попробуй еще раз воплотить Пр.2. Извини, но первый твой подход к этой штанге был неуспешным.. Думаю, ты это и сама поняла - либо растолкуй мне еще раз.

Последнее: в дальнейшем никаких исключений - по вопросам Форума я в личке не отвечаю. И даже не читаю.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Gold_Fish   Перенос слова   6.12.2006 0:54
lapp   Дан текст, состоящий из нескольких строк. Преобра…   6.12.2006 11:13
Gold_Fish   :blink: Ой, неужели кто-то мне помог!!…   6.12.2006 18:48
lapp   Помогите доделать, пожалуйста. :unsure: Помочь -…   6.12.2006 19:12
Gold_Fish   Я знаю, что Lapp, я даже сначала так написала, а п…   6.12.2006 21:07
Lapp   Ну так вот, ввожу я уже свой текст: Хорошо, что…   7.12.2006 11:30
Gold_Fish   Спасибки, Lapp :) Почти все дошло, кроме: почему п…   8.12.2006 1:49
Lapp   Gold_Fish, извини, я неправильно (не в той кодиров…   8.12.2006 8:28
Pola   Спасибки, Lapp :) Почти все дошло, кроме: почему …   8.12.2006 15:16
Gold_Fish   Из браузера я не копирую, а сама перепечатываю в П…   8.12.2006 19:45
Lapp   Из браузера я не копирую, а сама перепечатываю в …   8.12.2006 19:55
Gold_Fish   Я установила новый, т к в старом Windows-1251.reg …   8.12.2006 20:18
Gold_Fish   Страничка freepascal.org не хочет открываться :bl…   8.12.2006 20:34
Lapp   Я установила новый, т к в старом Windows-1251.reg…   9.12.2006 9:18
Gold_Fish   А ты правда готова качать 28 мег?.. Какой у тя к…   9.12.2006 16:22
Gold_Fish   Премногоуважаемый Lapp! :))) Я создала обычный…   9.12.2006 16:52
Lapp   Премногоуважаемый Lapp! :))) Я создала обычны…   9.12.2006 17:20
Gold_Fish   Здраствуйте, друг мой Lapp! :))) (Снова Вас тр…   9.12.2006 17:50
Lapp   Вот вариант, читающий файл и выдающий отдельно стр…   9.12.2006 19:18
Gold_Fish   :) Более или менее все понятно, а вот куда впихнут…   10.12.2006 14:22
Lapp   Вот, есть первый ощутимый результат :). Я реализов…   10.12.2006 21:31
Gold_Fish   Сейчас разберусь в проге и попробую развеять :)))…   10.12.2006 23:41
Gold_Fish   Что-то не очень понимаю вот это место: И почему-т…   11.12.2006 0:50
Lapp   > И почему-то перед ошибка №121 :unsure: TP…   11.12.2006 5:52
Gold_Fish   Барахтаюсь :lol: В FPC я тоже пробовала эту прог…   11.12.2006 12:37
Lapp   > В FPC я тоже пробовала эту прогу, да он пропу…   11.12.2006 15:06
Gold_Fish   В общем-то ничего и не выдает :))) ( может быть я …   11.12.2006 17:49
Lapp   > В общем-то ничего и не выдает :))) > ... …   11.12.2006 18:01
Gold_Fish   Теперь вообще FPC другую штуку пишет (типа ошибки,…   11.12.2006 18:04
Lapp   Ну я вводила d.txt точно :))) Против сверхъестес…   11.12.2006 18:13
Gold_Fish   Против сверхъестественных явлений я пас.. Ошибка…   11.12.2006 18:15
Lapp   Теперь уже TP работает :) , а FPC прежнюю штучку…   11.12.2006 18:26
Gold_Fish   Что ТР работает - это хорошо, но хотелось бы узна…   11.12.2006 18:37
Lapp   > Штучку прежнюю, где > exited with > exi…   11.12.2006 18:55
Gold_Fish   Заметил еще одну квазиошибку в том своем тексте..…   11.12.2006 19:01
Lapp   Что сделать? :unsure: Заключить в фигурные ско…   11.12.2006 19:05
Gold_Fish   Заключить в фигурные скобки :))))))))) Ну не над…   11.12.2006 19:10
Алена   sTRing попробуй набрать, вместо того, что сейчас…   11.12.2006 18:06
Lapp   sTRing попробуй набрать, вместо того, что сейчас …   11.12.2006 18:10
Gold_Fish   УРА!!! Заработало :lol: Там просто в…   11.12.2006 18:10
Lapp   2) две идущие подряд согласные можно разделить, е…   11.12.2006 19:53
Michael_Rybak   Наверное "две идущие подряд согласные можно р…   11.12.2006 19:56
Gold_Fish   Вот это как понимать?.. :blink: Да, не знаю, так…   11.12.2006 19:57
Lapp   Пишу пояснения к реализации Правила №1 (см. пост №…   12.12.2006 20:08
Gold_Fish   Ура!!! Заработало, у меня перенеслось …   12.12.2006 22:04
Gold_Fish   Подскажите пожалуйста, как задать момент, когда вт…   12.12.2006 23:59
Lapp   > Ура!!! Заработало, Правда приятн…   13.12.2006 19:36
Gold_Fish   Спасибки :give_rose: Еще как пыталась :) , я и…   13.12.2006 21:22
Lapp   Вот тут: Rule №3: if ((w[i] in Vow) and ((w[i-1] i…   14.12.2006 8:29
Gold_Fish   А ты все же потрудись разобраться! Я не по…   16.12.2006 2:27
Lapp   Я не понимаю как переделать, подскажите пожалуйст…   16.12.2006 6:52
Gold_Fish   Я разбиралась, а все равно не поняла, а вторник - …   16.12.2006 20:33
Lapp   Gold_Fish, мне искренне жаль, что это оказалось не…   19.12.2006 11:41
Gold_Fish   Да все уже, сдала я :))) Вторую делаю к зачету уже…   19.12.2006 23:50
Lapp   Да все уже, сдала я Gold_Fish, пожалуйста, уважа…   20.12.2006 7:28


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 18:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name