Уважаемые знатоки! Внимание, нужно написать программу, которая вводит строку символов и выводит на экран сначала предложення, которые начинаются с однобуквенных слов, а потом все остальные. Заранее спасибо! Очень на вас надеюсь.
program Project2;
{$APPTYPE CONSOLE}
const MLA=['A'..'Z','a'..'z'];
MRZ=['.','!'];
var l,i,k,zzr,ps:integer; s:string;
begin
readln(s);
l:=length(s);
i:=1;
k:=0;
while i<=l do begin
zzr:=0;
while (i<=l) and not (s[i] in MLA) do begin
if s[i] in MRZ then inc(zzr);
inc(i);
end;
if i<=l then begin
k:=k+1;
ps:=i;
while (i<=l) and (s[i] in MLA) do i:=i+1;
if ((k=1) or (zzr>0)) and (i-ps=1) then writeln(copy(s,ps,1));
if
end;
end;
write(k);
readln;
readln;
end.
А комментарии к этому можно?
S- строка
MLA- множество лат. алфавита
MRZ- множество знаков препинания
k- кол-во слов в тексте
ps- первое слово
В итоге у меня выводится только первое однобуквенное слово предложения и кол-во слов в тексте. Надо изменить исходник так, чтобы сначала шли предложения, которые начинаются с однобуквенных слов, а потом остальные предложения текста. Пример такого предложения: В лесу родилась елочка. За критерий окончания предложения взято . ! , Помогите мне пожалуйста!
Вот , вроде то, что надо...
const
WordSeparators=[' ',',',';'];
SentenceSeparators=['?','.','!'];
Function FindFirstWord(s:string):string;
var i:byte;
buf:string;
begin
buf:='';
for i:=1 to length(s) do
begin
if (s[i] in WordSeparators) and (buf<>'') then
break;
if not(s[i] in WordSeparators) then
buf:=buf+s[i];
end;
FindFirstWord:=buf;
end;
Function FindFirstSentence(s:string):string;
var buf:string;
i:byte;
begin
i:=0;
buf:='';
repeat
inc(i);
buf:=buf+s[i];
until (s[i] in SentenceSeparators) or (i=length(s));
FindFirstSentence:=buf;
end;
procedure MoveToEnd(from,num:byte; var s:string);
var buf:string;
begin
buf:=copy(s,from,num);
delete(s,from,num);
s:=s+buf;
end;
function Result(s:string):string;
var sentence:string;
from,size,last:byte;
begin
from:=1;
last:=length(s);
repeat
sentence:=FindFirstSentence(copy(s,from,last));
size:=length(sentence);
if length(FindFirstWord(sentence))=1 then
inc(from,size)
else
begin
MoveToEnd(from,size,s);
dec(last,size);
end;
until from>=last;
Result:=s;
end;
var s:string;
begin
s:=', , Hello. I am so cool . I am so big. Yes! Pascal. I am so clever ';
writeln(s);
writeln(Result(s));
readln;
end.
const
WordSeparators=[' ',',',';'];
SentenceSeparators=['?','.','!'];
Function FindFirstWord(s:string):string;
var i:byte;
buf:string;
begin
buf:='';
for i:=1 to length(s) do
begin
if (s[i] in WordSeparators) and (buf<>'') then
break;
if not(s[i] in WordSeparators) then
buf:=buf+s[i];
end;
FindFirstWord:=buf;
end;
Function FindFirstSentence(s:string):string;
var buf:string;
i:byte;
begin
i:=0;
buf:='';
repeat
inc(i);
buf:=buf+s[i];
until (s[i] in SentenceSeparators) or (i=length(s));
FindFirstSentence:=buf;
end;
procedure MoveToEnd(from,num:byte; var s:string);
var buf:string;
begin
buf:=copy(s,from,num);
delete(s,from,num);
s:=s+buf;
end;
function Result(s:string):string;
var sentence:string;
from,size,last:byte;
begin
from:=1;
last:=length(s);
repeat
sentence:=FindFirstSentence(copy(s,from,last));
size:=length(sentence);
if length(FindFirstWord(sentence))=1 then
inc(from,size)
else
begin
MoveToEnd(from,size,s);
dec(last,size);
end;
until from>=last;
Result:=s;
end;
var s:string;
begin
s:=', , Hello. I am so cool . I am so big. Yes! Pascal. I am so clever ';
writeln(s);
writeln(Result(s));
readln;
end.