1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Перенос слова, перенести слова, используя 3 правила
Помогите, пожалуйста, очень прошу, хотя бы частично: Перенос слова. Перенос русского слова с одной строки на другую с большей вероятностью выполняется правильно, если пользоваться следующими правилами: 1)две идущие подряд гласные можно разделить, если перед первой из них стоит согласная, а за второй идет хотя бы одна буква (буква й при этом рассматривается вместе с предшествующей ей гласной как единое целое); 2) две идущие подряд согласные можно разделить, если первой из них стоит гласная, а в той части слова, которая идет за второй согласной, имеется хотя бы одна гласная (буквы ь, ъ вместе с предшествующей согласной рассматриваются как единое целое); 3) если не удается применить первые два правила, то слово разбивают так, чтобы первая часть содержала более чем одну букву и оканчивалась на гласную, а вторая содержала хотя бы одну гласную. Дан текст, состоящий из нескольких строк. Преобразовать текст таким образом, чтобы длина строк не превышала заданного значения, используя при этом перенос слов.
Как найти ближайший к концу строки пробел, если при заданном значении слово "как бы разбивается"? Как осуществить на Паскале приведенный выше перенос???
Более или менее все понятно, а вот куда впихнуть буквы "й, ь, ъ" для них просто массив создать в начале, да? P. S. Дальше не могу продвинуться, никак не составлю условие для переноса Програмка прикольно работает, так интересно переносит твои, как ты выразился
Вот, есть первый ощутимый результат . Я реализовал первое правило. Получается не так просто, чтобы объяснить в двух словах. Давай, лучше ты посмотришь и станешь задавать вопросы - по сделанному, а не "как дальше".. Я немного подозреваю, что ты смотришь на сделанное, как на пройденный этап, к которому нет смысла возвроащаться.. А это неправильно, так как именно в этом и состоит твой прогресс. Если можешь, развей мои подозрения .
В принципе, реализация остальных правил может быть проведена по образу и подобию первого. Так что если ты действительно разберешься, ты сможешь это сделать. Извини за отстутствие комментариев, могу добавить позже..
> Более или менее все понятно, а вот куда впихнуть буквы "й, ь, ъ" > для них просто массив создать в начале, да? Я вообще несколько переделал организацию ввода алфавита. Ну, увидишь, как. Это для простоты, компактности и лучшей читаемости (да и писаемости тоже ) кода, особенно когда несколько кодировок.
> P. S. Дальше не могу продвинуться, никак не составлю условие для переноса Вот, я его составил . Enjoy!
Последние замечания: - вывод пока идет только на экран; - длина строки задается Lx, поварьируй ее.. Ну пока и все.
{ Hyphenation Version 0.4 - rule #1 - getting the last w in a line - reading the file for Gold_Fish by Lapp }
var fIn:file of char; fOu:text; fName,s,t,w,Map:string; c,d:char; i:integer; Vow,Con,ISh,SHz,Let:set of char; Gap,Start:boolean;
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:=''; repeat 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} if Length(t)>=4 then begin for i:=1 to Length(t) do Map[i]:=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; 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 s:=s+Copy(t,1,Ord(Map[i]))+'-'; Delete(t,1,Ord(Map[i])) end; end; WriteLn(s); s:=t; if c=' ' then s:=s+' ';
{WriteLn(fOu,s)} until EoF(fIn); Close(fIn); { Close(fOu); } ;ReadLn end.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой