
- •Тип данных строка
- •Var s:shortstring;
- •Var s,s1,s2:string[10];
- •Var s,St:ShortString;
- •If not Pr and not (s[I] in Prep) then
- •IfSimmetr(St)then//проверка очередного слова на симмет-
- •Var s,St:ShortString;
- •If Slovo(St) then //проверка слова на удовлетворение требо-
- •Var s,St:String;
- •Var I,j,Imin:integer;
- •If not (s[I] in Prep) then
- •If WseGlasn(St) then
- •Var s,St:String;
program strokapr1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type Mas=array[1..128] of ShortString;
Mn=set of Char;
const Prep=[' ', '.', ',', '?', '!', ':', ';', '-'];//множество
//символов-разделителей
Var s,St:ShortString;
A:Mas;
Pr:Boolean;
I,N1,N2,K:Integer;
function Rus(S:String):String;
var I:Byte;
begin
Result:='';
for I:=1 to Length(S) do
case S[I] of
'А'..'п': Result:=Result+Chr(Ord(S[I])-64);
'р'..'я': Result:=Result+Chr(Ord(S[I])-16);
'Ё': Result:=Result+Chr(240);
'ё': Result:=Result+Chr(241);
else
Result:=Result+S[I];
end;
end;
//функция перекодировки строки при вводе
function RusIn(S:String):String;
var I:Integer;
begin
Result:='';
for I:=1 to Length(S) do
case Ord(S[I]) of
128..175: Result:=Result+Chr(Ord(S[I])+64);
224..239: Result:=Result+Chr(Ord(S[I])+16);
240: Result:=Result+Chr(168);
241: Result:=Result+Chr(184);
else
Result:=Result+S[I];
end;
end;
//функция проверки слова на симметричность
function Simmetr(S:ShortString):Boolean;
var I,N,M:integer;
begin
M:=Length(S);
N:=Mdiv2; //количество пар сравниваемых символов
I:=1;
Result:=true;//слово симметрично
while(I<=N)andResultdo//пока не просмотрены все пары
//и пока сохраняется симметричность слова
if S[I]<>S[M-I+1] then Result:=false
else I:=I+1;
end;
//процедура сортировки массива строк по алфавиту методом пузырь-
//ка
procedure Sort(Var A:Mas;N:Integer);
var I,L:integer;
Pr:boolean;
B:ShortString;
begin
l:=0;
repeat
L:=L+1;
Pr:=true;
for I:=1 to N-L do
if A[I]>A[I+1] then
begin
B:=A[I];
A[I]:=A[I+1];
A[I+1]:=B;
Pr:=false;
end;
until Pr;
end;
begin
Writeln(Rus('Введите строку символов'));
Readln(S);
S:=RusIn(s);
Writeln(Rus(S));
K:=0;
Pr:=false;
for I:=1 to Length(S) do
begin
//слово еще не началось, очередной символ не является раздели-
// телем – найдено начало очередного слова
If not Pr and not (s[I] in Prep) then
begin
N1:=I; //начало слова
Pr:=true; //слово началось
end
else
//слово началось, но очередной символ является разделителем
//или последним в строке – найден конец слова
if Pr and ((S[I] in Prep)or(I=Length(S))) then
begin
ifS[I]inPrepthenN2:=I-1 //очередной символ является
//разделителем – слово оканчивается в предыдущей позиции
else if I=Length(S) then//символ – последний в строке,
N2:=I; //слово оканчивается в текущей позиции
Pr:=false;
St:=Copy(S,N1,N2-N1+1);//копирование очередного слова в
//служебную строку
Writeln(Rus(St)); //вывод найденного слова
IfSimmetr(St)then//проверка очередного слова на симмет-
//ричность
begin
Writeln(Rus(St)); //вывод симметричного слова
K:=K+1; //запоминание очередного симметричного
A[K]:=St; //слова в массиве
end;
end;
end;
if k=0 then Writeln(Rus('Симметричных слов в строке нет'))
else
begin
Sort(A,K);
writeln(Rus('Симметричные слова'));
for I:=1 to K do
Writeln(Rus(A[I]));
end;
Readln;
end.
При реализации второго подхода для определения позиций, в которых начинается и оканчивается очередное слово, предлагается использовать стандартные подпрограммы работы со строками.
Пример 2 обработки символьной строки.Найти в строке все слова, которые начинаются согласной буквой и количество согласных в слове превышает количество гласных. Найденные слова отсортировать в алфавитном порядке методом нахождения минимального. Строчные и заглавные символы не различать. Латинские и русские буквы также не различать.
Во-первых, следует удалить все конечные символы-разделители. Если после их удаления строка окажется не пустой, то в цикле реализуется выделения всех слов строки.
Во-вторых, для определения позиции начала слова удаляются все начальные разделители. В результате первое слово будет начинаться в первой позиции строки.
В-третьих, для определения позиции окончания первого слова следует найти первое вхождение символов-разделителей в строку с помощью функции Posи определить минимальное значение из них. Если минимальное значение окажется отличным от нуля, то первое слово оканчивается в позиции, номер которой на единицу меньше найденного минимума. Если вычисленное значение минимума равно нулю (нет в строке разделителей), то слово является последним в строке, и оно оканчивается в последней позиции строки.
Далее найденное слово для удобства последующей обработки следует скопировать во временную строку и удалить его из исходной строки. (Если исходную строку требуется сохранить, то ее необходимо скопировать в другую переменную).
Таким образом, в результате проводимых операций очередное слово всегда будет начинаться в первой позиций строки и требуется определить только позицию, в которой оно оканчивается.