Я реализовал первое правило. Получается не так просто, чтобы объяснить в двух словах. Давай, лучше ты посмотришь и станешь задавать вопросы - по сделанному, а не "как дальше".. Я немного подозреваю, что ты смотришь на сделанное, как на пройденный этап, к которому нет смысла возвроащаться.. А это неправильно, так как именно в этом и состоит твой прогресс. Если можешь, развей мои подозрения .
В принципе, реализация остальных правил может быть проведена по образу и подобию первого. Так что если ты действительно разберешься, ты сможешь это сделать. Извини за отстутствие комментариев, могу добавить позже..
> Более или менее все понятно, а вот куда впихнуть буквы "й, ь, ъ"
> для них просто массив создать в начале, да?
Я вообще несколько переделал организацию ввода алфавита. Ну, увидишь, как. Это для простоты, компактности и лучшей читаемости (да и писаемости тоже ) кода, особенно когда несколько кодировок.
> 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 }
const
Lx=37;
VowDOS='АаЕеЁёИиОоУуЫыЭэЮюЯя';
ConDOS='БбВвГгДдЖжЗзКкЛлМмНнПпРрСсТтФфХхЦцЧч';
IShDOS='Йй';
SHzDOS='ЪъЬь';
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.