PROGRAM tp9exc1;
(* voir l'exercice 3 du TP6 *)

TYPE point = array[1..3] of real;
     triangle = array[1..3] of point;
     liste = array[1..20] of triangle;

VAR LI : liste;
    Tr : triangle;
    M : point;
    taille, i : integer;
    choix : char;

PROCEDURE SAISIRPOINT(Var P : point);
Var i : integer;
Begin
writeln('coordonnées du point :');
for i:=1 to 3 do
    begin
    write('[',i,'] ? ');
    readln(P[i]);
    end;
End;

PROCEDURE SAISIRTRIANGLE(Var T : triangle);
Var i : integer;
Begin
writeln('points du triangle :');
for i:=1 to 3 do
    begin
    writeln('point n°',i,' ? ');
    SAISIRPOINT(T[i]);
    end;
End;

PROCEDURE AFFICHERLISTE(L : liste; n: integer);
Const xyz='XYZ';
Var i, j, k :integer;
Begin
write('n°');
for j:=1 to 3 do
    for k:=1 to 3 do
        write(' ':6,xyz[j],k);
writeln;
for i:=1 to n do
    begin
    write(i:2);
    for j:=1 to 3 do
        for k:=1 to 3 do
            write(L[i][j][k]:8:3);
    writeln;
    end;
End;

FUNCTION AJOUTERTRIANGLE(Var L : liste; Var n : integer; T : triangle):boolean;
Var j, k : integer;
Begin
if n>=20 then AJOUTERTRIANGLE:=false
else begin
     for j:=1 to 3 do
         for k:=1 to 3 do
             L[n+1][j][k]:=T[j][k];
     n:=n+1;
     AJOUTERTRIANGLE:=true;
     end;
End;

FUNCTION SUPPRIMER(Var L : liste; Var n : integer; p : integer):boolean;
Var i, j, k : integer;
Begin
if (p<1) or (p>n) then SUPPRIMER:=false
else begin
     for i:=i to n do
         for j:=1 to 3 do
             for k:=1 to 3 do
                 L[i][j][k]:=L[i+1][j][k];
     n:=n-1;
     SUPPRIMER:=true;
     end;
End;

PROCEDURE TRANSLATER(Var T : triangle; P : point);
Var j,k : integer;
Begin
for j:=1 to 3 do
    for k:=1 to 3 do T[j][k]:=T[j][k]+P[k];
End;

BEGIN
taille:=0;
writeln('Liste de triangle : Le menu');
repeat
  writeln('-1- afficher la liste');
  writeln('-2- ajouter un triangle');
  writeln('-3- supprimer un triangle');
  writeln('-4- modifier un triangle');
  writeln('-0- terminer');
  repeat
    write('choix ? ') ; readln(choix);
    until (choix>='0') and (choix<='4');
  case choix of
       '1' : AFFICHERLISTE(Li,taille);
       '2' : begin
             SAISIRTRIANGLE(Tr);
             if (not AJOUTERTRIANGLE(Li,taille,Tr))
                then writeln('ajout impossible');
             end;
       '3' : begin
             repeat
               write('supprimer le triangle numéro (1 à ',taille,') ? ');
               readln(i);
               until SUPPRIMER(Li,taille,i);
             end;
       '4' : begin
             repeat
               write('translater le triangle numéro (1 à ',taille,') ? ');
               readln(i);
               until (i<=taille) and (i>0);
             writeln('translater avec le point :');
             SAISIRPOINT(M);
             TRANSLATER(Li[i],M);
             end;
       end;
  until (choix='0');
END.