1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Перенос слова, перенести слова, используя 3 правила
Помогите, пожалуйста, очень прошу, хотя бы частично: Перенос слова. Перенос русского слова с одной строки на другую с большей вероятностью выполняется правильно, если пользоваться следующими правилами: 1)две идущие подряд гласные можно разделить, если перед первой из них стоит согласная, а за второй идет хотя бы одна буква (буква й при этом рассматривается вместе с предшествующей ей гласной как единое целое); 2) две идущие подряд согласные можно разделить, если первой из них стоит гласная, а в той части слова, которая идет за второй согласной, имеется хотя бы одна гласная (буквы ь, ъ вместе с предшествующей согласной рассматриваются как единое целое); 3) если не удается применить первые два правила, то слово разбивают так, чтобы первая часть содержала более чем одну букву и оканчивалась на гласную, а вторая содержала хотя бы одну гласную. Дан текст, состоящий из нескольких строк. Преобразовать текст таким образом, чтобы длина строк не превышала заданного значения, используя при этом перенос слов.
Как найти ближайший к концу строки пробел, если при заданном значении слово "как бы разбивается"? Как осуществить на Паскале приведенный выше перенос???
Ура!!! Заработало, у меня перенеслось слово «выб-роси» из тех заумных мыслей мессаджа №17 с помощью второго правила, только там мягких и твердых знаков нету … )) (Но, я когда там мягкий знак приписывала все получалось) Вот программа, только, наверное, в ней надо что-то поменять, а то повторяется несколько строчек в конце:
{for Lapp by Gold_Fish : ) )) } Program May; const Lx=37; 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: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; if (w[i] in SHz) and (w[i+1] in Con) then begin Delete(w,i,1); Delete(Map,i,1) end; for i:=Length(w)-2 downto 2 do if (w[i+1] in Con) and (w[i] in Con) and (w[i+2] in Let) and (w[i-1] in Vow) 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;
WriteLn(s); s:=t; if c=' ' then s:=s+' ';
{WriteLn(fOu,s)} until EoF(fIn); Close(fIn); { Close(fOu); } ;ReadLn end.