(********************)
PROGRAM TP7exc2 ;

USES crt ;
TYPE mot = string[255] ;
VAR message, cible : mot ;
    choix : integer ;

FUNCTION CIRC(x:char):char ;
Var res : char ;
Begin
if x=' ' then res:=x
   else if x='Z' then res:='A'
   else if x='z' then res:='a'
   else res:=succ(x) ;
CIRC:=res ;
End ;

FUNCTION CIRCINV(x:char):char ;
Var res : char ;
Begin
if x=' ' then res:=x
   else if x='A' then res:='Z'
   else if x='a' then res:='z'
   else res:=pred(x) ;
   CIRCINV:=res ;
End ;

PROCEDURE TRADUIT(m1:mot ; var m2:mot ; test:boolean) ;
Var c : char ;
    i, j : integer ;
Begin
m2:='' ;
for i:=1 to length(m1) do
    begin
    c:=m1[i] ;
    for j:=1 to i do
        if test
           then c:=CIRC(c)
           else c:=CIRCINV(c) ;
    m2:=m2+c ;
    end ;
End ;

PROCEDURE CODE(m1:mot ; var m2:mot) ;
Begin
TRADUIT(m1,m2,true) ;
End ;

PROCEDURE DECODE(m1:mot ; var m2:mot) ;
Begin
TRADUIT(m1,m2,false) ;
End ;

BEGIN
clrscr ;
repeat
  (* saisie du message *)
  write('Message ? ') ; readln(message) ;
  (* menu *)
  repeat
    writeln('-1- laisser ce message inchange') ;
    writeln('-2- coder ce message') ;
    writeln('-3- decoder ce message') ;
    writeln('-4- changer de message') ;
    writeln('-0- terminer') ;
    readln(choix) ;
    case choix of
         1 : begin cible:=message ; writeln(cible) ; end ;
         2 : begin CODE(message,cible) ; writeln(cible) ; end ;
         3 : begin DECODE(message,cible) ; writeln(cible) ; end ;
         end ;
   until (choix=0) or (choix=4) ;
 until choix=0 ;
END.

(********************)