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  +


> Ура!!! Заработало,
Правда приятно, когда сам что-нить сделаешь и.. работает!! smile.gif Ни с чем несравнимое чувство..

> у меня перенеслось слово «выб-роси»
Да, видел. Congratulations! good.gif
Но, к сожалению, из этой фразы я делаю вывод, что ты не пыталась менять значение константы Lx. Меняя ее, ты можешь регулировать длину строки и прогонять снова, получая много маленьких радостей.. smile.gif Или огорчений, если обнаружатся ошибки.. Ошибки есть всегда, увы - это закон. Вот, например:

> только там мягких и твердых знаков нету … smile.gif))
> (Но, я когда там мягкий знак приписывала все получалось)
- это странно. В обработке карты Map у меня была ошибка (сейчас исправлено), в результате нее мягкий знак переносился на следующую строчку, что, ессно, неправильно.

Но все же, ты молодец. В целом ты произвела правильные действия, хотя и не все..
Во-первых, нужно было взять больший кусок, включая копирование t в w (как же иначе? мы же испортили w, когда обработали его первым правилом).
Во-вторых, нужно было организовать выбор из результатов, полученных по Пр.1 и Пр.2. Не применять их сразу очертя голову, а выяснить, какой из двух предлагаемых переносов лучше (если слово допускает оба переноса, и 1, и 2 типа). Я ввел соответствующий механизм, основанный на массиве Cuts размера 3 (по числу правил), который содержит длины первой части слова (оставляемой на старой строке). Короче, ошибки были, но я доволен тем, что ты сделала smile.gif. Респект!

Тепрь дальше по делу.
В первую очередь - мой должок. Я говорил о том, что в алгоритме Пр.1 есть ошибка. Исправляю ее.
Дело в том, что проверка на минимальную длину слова должна стоять после выбрасывания Й (или мягких и твердых знаков в Пр.2). Иначе после выбрасывания длина слова может сократиться до 3 букв, что приведет к ошибкам. Сейчас это исправлено (посмотри, сравни новый и старый коды).

Кроме этого, я нашел и исправил еще пару ошибок (не пугайся, у себя smile.gif). О первой я уже сказал в самом начале (посмотри и найди отличия в операторе IF после проверки правила, обоих из них). А вторая ошибка состояла в том, что я не прекращал разбор слова после того, как разрез, подходящий по длине, был уже найден. Это приводило к тому, что при нахождении еще одного разреза перенос получался более короткий. Я исправил это вставлением оператора Break, который прекращает выполнение цикла (найди оба места места, где стоит Break и разбери подробно).

Еще одно исправление. Хотя это не ошибка, но все же было некрасиво. Карта Map у меня была раньше строкой, хотя я использовал ее для хранения чисел. Сейчас я сделал ее обычным массивом. Это привело, например, к невозможности использования процедуры Delete с ней, но это особо и не нужно (заменил циклом, посмотри).

> Подскажите пожалуйста, как задать момент, когда
> вторая часть слова содержит хотя бы одну гласную???
Замечательный вопрос, он показывает, что уровень твоего понимания достаточно высокий smile.gif. Нет, в самом деле - прогресс налицо! smile.gif
Подсказываю. Я завел некий флаг (булева переменная Flag, найди ее в определении переменных), которой снячала присваиваю значений false (ложь), то есть флаг сброшен. В цикле перебора букв слова я присваиваю ей саму себя ИЛИ результат проверки буквы на гласность. То есть она будет оставаться false до тех пор, пока все буквы согласные (оба параметра ложные), но при первой гласной ей присвоится значение true (правда), и оно уже не сбросится, потому что первый операнд (то есть она сама) операции OR всегда будет с этих пор true. То есть флажок как бы встает при встрече гласной и больше не падает. После этого я использую Flag в логическом выражении для Пр.2. Разбери все это внимательно и убедись, что поняла - или задавай вопросы..

Давай - изучай, разбирайся - и продвигайся дальше! Правило 3 на очереди.. smile.gif
Успеха!

PS
Мне кажется, удобно было бы устроить запрос длины строки (Lx) от пользователя. Сможешь сделать?
{ Hyphenation
Version 0.5
- choosing the right cut
- rule #2
- rule #1
- getting the last word in a line
- reading the file
for Gold_Fish by Lapp }

Program May;
const
Lx=78;
VowDOS:string='АаЕеЁёИиОоУуЫыЭэЮюЯя';
ConDOS:string='БбВвГгДдЖжЗзКкЛлМмНнПпРрСсТтФфХхЦцЧч';
IShDOS:string='Йй';
SHzDOS:string='ЪъЬь';

var
fIn:file of char;
fOu:text;
fName,s,t,w,Map:string;
c,d:char;
i,Cut:integer;
Vow,Con,ISh,SHz,Let:set of char;
Gap,Start,Flag:boolean;
Cuts:array[1..3]of integer;

begin
Write('Введите имя файла для форматирования: ');
ReadLn(fName);
{fName:='d.txt';}
Assign(fIn,fName);
ReSet(fIn);
Assign(fOu,'tst-ou-w.txt');
ReWrite(fOu);
Vow:=[];
Con:=[];
Ish:=[];
for i:=1 to Length(VowDOS) do Include(Vow,VowDOS[i]);
for i:=1 to Length(ConDOS) do Include(Con,ConDOS[i]);
for i:=1 to Length(IShDOS) do Include(ISh,IShDOS[i]);
for i:=1 to Length(SHzDOS) do Include(SHz,SHzDOS[i]);
Let:=Vow+Con+ISh+SHz;
s:='';

for i:=1 to Lx do Write('-');
WriteLn;

repeat
for i:=1 to 3 do Cuts[i]:=0;
d:=#0;
while (Length(s)<Lx)and((d<>#$D)or(c<>#$A))and not EoF(fIn) do begin
if s=' ' then s:='';
d:=c;
Read(fIn,c);
if not (c in [#$D,#$A]) then s:=s+c;
end;
t:='';
if Length(s)=Lx then repeat
d:=c;
Read(fIn,c);
if not (c in [' ',#$D,#$A]) then t:=t+c;
until (c=' ')or((d=#$D)and(c=#$A))or(EoF(fIn));
if t<>'' then while not (s[Length(s)]=' ')or(Length(s)=0) do begin
Insert(s[Length(s)],t,1);
Delete(s,Length(s),1)
end;

{Rule #1}
Map:='';
for i:=1 to Length(t) do Map:=Map+Chr(i);
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;
if Length(w)>=4 then
for i:=Length(w)-2 downto 2 do
if (w[i+1] in Vow)and(w[i] in Vow)and(w[i+2] in Let)and(w[i-1] in Con) then
if Length(s)+Ord(Map[i])<Lx then begin
Cuts[1]:=Ord(Map[i+1])-1;
Break
end;

{Rule #2}
Map:='';
for i:=1 to Length(t) do Map:=Map+Chr(i);
w:=t;
for i:=Length(t) downto 2 do {убираем Ъ и Ь после согласных в слове}
if (w[i] in SHz) and (w[i+1] in Con) then begin
Delete(w,i,1);
Delete(Map,i,1)
end;
if Length(w)>=4 then begin
Flag:=false;
for i:=Length(w)-2 downto 2 do begin
Flag:=Flag or(w[i+2] in Vow);
if (w[i+1] in Con)and(w[i] in Con)and(w[i-1] in Vow)and Flag then
if Length(s)+Ord(Map[i])<Lx then begin
Cuts[2]:=Ord(Map[i+1])-1;
Break
end
end
end;

{Выбор из всех разрезов самого длинного}
Cut:=0;
for i:=1 to 3 do if Cuts[i]>Cut then Cut:=Cuts[i];
{Собственно разрез строки}
if Cut>0 then begin
s:=s+Copy(t,1,Cut)+'-';
Delete(t,1,Cut)
end;
{Вывод текста}
WriteLn(s);
s:=t;
if c=' ' then s:=s+' ';

{WriteLn(fOu,s)}
until EoF(fIn);
Close(fIn);
{ Close(fOu); }
;ReadLn
end.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  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


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

 





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