program Lab1_Variant23;

{$APPTYPE CONSOLE}

uses
  SysUtils;

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

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

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

const
  Digits : set of Char = ['0'..'9'];

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 ((S[i] in Digits) 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

      ((S[i] in Digits) and IsUpperCyr(S[i+1]))

      or

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

      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;
  p1,p2 : Integer;
begin

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

  repeat

    flag:=True;

    for i:=1 to len-z do
    begin

      p1:=Pos(S[i],SymbTable);
      p2:=Pos(S[i+1],SymbTable);

      if

      ((p1>33) and (p1<=43) and (p2<=33))

      or

      ((p1>=44) and (p2<=43))

      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;

    end;

    Inc(z);

  until flag or (z=len);

end;

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

begin

  Write('Введите строку: ');
  ReadLn(S);

  S1:=S;
  S2:=S;

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

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

  Nom:=Prov1(S1);

  case Nom of

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

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

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

  end;

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

  Nom:=Prov2(S2);

  case Nom of

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

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

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

  end;

end.