Как вывести последовательность слов, но в обратном порядке?
Дана последовательность,содержащая от 1 до 30 слов,в каждом из которых от 1 до 5 строчных латинских букв;между соседними словами -запятая,за последним словом-точка. Вывести эту же последовательность слов, но в обратном порядке.
Как вывести в обрантом порядке
Const m=[' ','.','!','?'];
Var s,s1,s2:string;
A:array[1..30] of string;
i,k:byte;
Function Proverka(s:string;k:byte):boolean;
Var i:byte;
b:boolean;
Begin
b:=true;
For i:=1 to k do
if A[i]=s then b:=false;
Proverka:=b;
End;
Begin
write('Введите предложение: ');readln(s);
k:=0;s:=s+' ';s1:='';s2:='';
For i:=1 to Length(s) do
if not(s[i] in m) then s1:=s1+s[i]
else
Begin
if Proverka(s1,k) then
Begin
s2:=s2+s1+s[i];
inc(k);
A[k]:=s1;
End;
s1:='';
End;
writeln(s2);
readln;
End.
Ответы (3 шт):
Автор решения: MBo
→ Ссылка
Строку сами сложите?
procedure Extract(const s: string; idx: Integer);
var
i: integer;
sub: string;
begin
i := idx;
while (not(s[i] in m)) and (i <= Length(s)) do
inc(i);
if i - idx >= 1 then begin
sub := Copy(s, idx, i - idx);
if i < Length(s) then
Extract(s, i + 1);
Writeln(sub);
end;
end;
begin
Extract('A black cat sat on a mat', 1);
Readln;
Автор решения: Alekcvp
→ Ссылка
const
Delims = [' ',',','.','!','?'];
procedure SkipDelims(const Text: string; var Index: Integer);
begin
while (Index > 0) and (Text[Index] in Delims) do Dec(Index);
end;
procedure WriteReverted(const Text: string);
var
Fst, Lst: Integer; // Fst ищет разделитель, Lst - индекс последней буквы текущего слова
begin
Lst := Length(Text); // конец строки
SkipDelims(Text, Lst); // пропускаем разделители (точку и пробелы, если есть)
Fst := Lst;
while Fst > 0 do // идём в цикле от конца до начала
begin
Dec(Fst); // предыдущий символ
if (Fst > 0) and not (Text[Fst] in Delims) then
Continue; // если не дошли до начала строки и не нашли разделитель, то пропускаем
Write(Copy(Text, Fst + 1, Lst - Fst)); // выводим текущее слово
if Fst = 0 then
Break; // если это первое слово в строке, то закончили
Write(','); // выводим разделитель
SkipDelims(Text, Fst); // снова пропускаем разделители
Lst := Fst; // продолжаем с последней буквы предыдущего слова
end;
end;
...
WriteReverted('The quick,brown,fox jumps , over the lazy dog.');
Автор решения: Ilya Filimonov
→ Ссылка
var
a : char;
str, slovo, res : string;
i , k : integer;
begin
writeln('Последовательность слов должна быть: ');
writeln('1. от 1 до 30 слов');
writeln('2. от 1 до 5 строчных латинских букв');
writeln('3. между соседними словами -запятая,за последним словом-точка');
writeln('Введите последовательность:');
str:=''; i:=0;
while (a<>'.')and(i<>30) do
begin
read(a);
str:=str+a;
i:=i+1;
end;
writeln('Исходная строка');
writeln(str);
res:=''; slovo:='';
for i:=1 to length(str) do
begin
if (str[i]<>',')and(str[i]<>'.')
then
slovo:=slovo+str[i]
else
begin res:=slovo+','+res; slovo:=''; end;
end;
res[length(res)]:='.';
writeln('Результат');
writeln(res);
end.