program Lab1_Variant23;

uses SysUtils;

const
  AlphUp =
  'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';

  AlphLow =
  'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';

  SymbTable =
  'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' +
  '0123456789' +
  'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';

function IsDigit(C: Char): Boolean;
begin
  IsDigit := (C >= '0') and (C <= '9');
end;

function IsUpperCyr(C: Char): Boolean;
begin
  IsUpperCyr := Pos(C, AlphUp) > 0;
end;

function IsLowerCyr(C: Char): Boolean;
begin
  IsLowerCyr := Pos(C, AlphLow) > 0;
end;

function Prov1(const S: String): Byte;
var
  i: Integer;
begin

  if Length(S)=0 then
  begin
    Prov1:=1;
    Exit;
  end;

  for i:=1 to Length(S) do
    if not (
       IsDigit(S[i])
       or
       IsUpperCyr(S[i])
       or
       IsLowerCyr(S[i])
    ) then
    begin
      Prov1:=2;
      Exit;
    end;

  Prov1:=0;
end;

function Prov2(const S: String): Byte;
var
  i: Integer;
begin

  if Length(S)=0 then
  begin
    Prov2:=1;
    Exit;
  end;

  for i:=1 to Length(S) do
    if Pos(S[i],SymbTable)=0 then
    begin
      Prov2:=2;
      Exit;
    end;

  Prov2:=0;
end;

procedure Sort1(var S: String);
var
  i,z,len : Integer;
  flag : Boolean;
  ch : Char;
begin

  len:=Length(S);
  z:=1;

  repeat

    flag:=True;

    for i:=1 to len-z do

      if

      (IsDigit(S[i]) and IsUpperCyr(S[i+1]))

      or

      (IsLowerCyr(S[i]) and
      (IsUpperCyr(S[i+1]) or IsDigit(S[i+1])))

      or

      (
      IsUpperCyr(S[i])
      and
      IsUpperCyr(S[i+1])
      and
      (
      Pos(S[i],AlphUp)
      >
      Pos(S[i+1],AlphUp)
      )
      )

      then
      begin

        ch:=S[i];
        S[i]:=S[i+1];
        S[i+1]:=ch;

        flag:=False;

      end;

    Inc(z);

  until flag or (z=len);

end;

procedure Sort2(var S: String);
var
  i,z,len : Integer;
  flag : Boolean;
  ch : Char;
begin

  len:=Length(S);
  z:=1;

  repeat

    flag:=True;

    for i:=1 to len-z do

      if

      (
      Pos(S[i],SymbTable)
      >
      Pos(S[i+1],SymbTable)
      )

      and

      not
      (
      IsDigit(S[i])
      and
      IsDigit(S[i+1])
      )

      and

      not
      (
      IsLowerCyr(S[i])
      and
      IsLowerCyr(S[i+1])
      )

      then
      begin

        ch:=S[i];
        S[i]:=S[i+1];
        S[i+1]:=ch;

        flag:=False;

      end;

    Inc(z);

  until flag or (z=len);

end;

var
  S,S1,S2 : String;
  Nom : Byte;

begin

  Writeln('Введите строку');
  Readln(S);

  S1:=S;
  S2:=S;

  Writeln;
  Writeln('Исходная строка: "',S,'"');

  Writeln;
  Writeln('Метод 1');

  Nom:=Prov1(S1);

  case Nom of

    1:
      Writeln('Пустая строка');

    2:
      Writeln('Некорректные символы');

  else
    begin
      Sort1(S1);
      Writeln('Результат: "',S1,'"');
    end;

  end;

  Writeln;
  Writeln('Метод 2');

  Nom:=Prov2(S2);

  case Nom of

    1:
      Writeln('Пустая строка');

    2:
      Writeln('Некорректные символы');

  else
    begin
      Sort2(S2);
      Writeln('Результат: "',S2,'"');
    end;

  end;

end.