Евгений Сыроегин
S:00:00:00 00.00
R:00:00:00 00.00
program project23;
procedure sort(var item, positions: array of integer; Count: integer);
var
i, j, x: integer;
begin
for i := 1 to Count do
begin
for j := Count downto i do
if item[j - 1] > item[j] then
begin
x := item[j - 1];
item[j - 1] := item[j];
item[j] := x;
x := positions[j - 1];
positions[j - 1] := positions[j];
positions[j] := x;
end;
end;
end;
var
s: string;
numsPositions, wordsPositions, wordslens: array [0..100] of integer;
numsLen, wordsLen, len: integer;
isWord, isNumsWord: boolean;
i, c: integer;
const
DIVIDERS: array of char = (* *, #9, #13, #10);
// не работает. Если в коде просто написать *<char> in [* *,#9,#13,#10]*, как я и сделал - всё ок
begin
writeln(*Input string:*);
readln(s);
len := length(s);
numsLen := 0;
wordsLen := 0;
isWord := False;
isNumsWord := True;
for i := 1 to len do
begin
if not (s[i] in [* *, #9, #13, #10]) then
begin
if isWord = False then
begin // запоминаем позицию начала слова
wordsPositions[wordsLen] := i;
wordsLen += 1;
isWord := True;
// говорим, что теперь мы внутри слова (предыдущий обработанный символ - не разделитель)
isNumsWord := True;
end;
if not (s[i] in [*0*..*9*]) then
// если нашли в слове не цифру,
isNumsWord := False;
// то говорим, что текущее слово не состоит из цифр
end
else
begin
if isWord = True then
begin // если дошли до конца слова
if isNumsWord then
begin // если слово состоит целиком из цифр
numsPositions[numsLen] := wordsPositions[wordsLen - 1];
// перекидываем слово из одного списка в другой
wordsLen -= 1;
numsLen += 1;
end
else
begin
wordsLens[wordsLen - 1] := i - wordsPositions[wordsLen - 1];
// если слово не из цифр, запоминаем его длину
end;
isWord := False;
end;
end;
end;
// дошли до конца строки = дошли до конца слова. Надо повторить те же действия
if isNumsWord then
begin // если слово состоит целиком из цифр
numsPositions[numsLen] := wordsPositions[wordsLen - 1];
// перекидываем слово из одного списка в другой
wordsLen -= 1;
numsLen += 1;
end
else
begin
wordsLens[wordsLen - 1] := i - wordsPositions[wordsLen - 1];
// если слово не из цифр, запоминаем его длину
end;
wordsLen -= 1;
numsLen -= 1;
// теперь сортируем запомненные позиции начал слов в соответствии с их длиной
sort(wordsLens, wordsPositions, wordsLen);
writeln(*Only numbers:*);
// выводим сначала слова только из цифр
for i := 0 to numsLen do
begin
c := numsPositions[i];
while (not (s[c] in [* *, #9, #13, #10])) and (c <= len) do
begin
// мы не запоминали сами слова, так что выводим их прямо из изначальной строки. От позиции начала и до первого пробела
Write(s[c]);
c += 1;
end;
writeln();
end;
writeln(*Sorted not only numbers:*);
// теперь остальные слова, отсортированные по длине
for i := 0 to wordsLen do
begin
c := wordsPositions[i];
while (not (s[c] in [* *, #9, #13, #10])) and (c <= len) do
begin
// мы не запоминали сами слова, так что выводим их прямо из изначальной строки. От позиции начала и до первого пробела
Write(s[c]);
c += 1;
end;
writeln();
end;
readln();
end.