PROGRAM tp9exc2;

CONST nmax = 10;

TYPE matrice = array[1..nmax,1..nmax] of real;

VAR A, B, C : matrice;
    m, n, p : integer;
    reponse : string[3];

PROCEDURE CREER_MATRICE(Var n:integer;Var X:matrice);
Var i,j, choix : integer;
    r : real;
Begin
repeat
  write('Taille de la matrice (au plus ',nmax,') ? ');
  readln(n);
  until (n>0) and (n<=nmax);
writeln('forme de la matrice :');
writeln('-1- scalaire');
writeln('-2- première diagonale');
writeln('-3- deuxième diagonale');
writeln('-4- triangulaire supérieure');
writeln('-5- triangulaire inférieure');
writeln('-6- quelconque');
writeln;
write('votre choix ? '); readln(choix);
(* NB : si le choix n'appartienjt pas à la liste
        ci-dessus, la matrice est remplie de 0 *)
randomize;
for i:=1 to n do
    for j:=1 to n do X[i,j]:=0;
case choix of
     1 : begin
         r:=random(19)-9.0;
         for i:=1 to n do X[i,i]:=r;
         end;
     2 : for i:=1 to n do X[i,i]:=random(19)-9.0;
     3 : for i:=1 to n do X[i,n+1-i]:=random(19)-9.0;
     4 : for i:=1 to n do for j:=i to n do X[i,j]:=random(19)-9.0;
     5 : for i:=1 to n do for j:=1 to i do X[i,j]:=random(19)-9.0;
     6 : for i:=1 to n do for j:=1 to n do X[i,j]:=random(19)-9.0;
     end;
End;

PROCEDURE AFFICHER_MATRICE(n:integer;X:matrice);
Var i, j : integer;
Begin
writeln;
writeln('voici la matrice :');
writeln;
for i:=1 to n do
    begin
    for j:=1 to n do write(X[i,j]:7:0);
    writeln;
    end;
End;

PROCEDURE PRODUIT_MATRICE(X,Y:matrice;Var Z:matrice);
          (* calcule Z=X*Y *)
Var i, j, k : integer;
Begin
for i:=1 to n do
    for j:=1 to n do
        begin
        Z[i,j]:=0;
        for k:=1 to n do Z[i,j]:=Z[i,j]+X[i,k]*Y[k,j];
        end;

End;

BEGIN
repeat
  CREER_MATRICE(n,A);
  AFFICHER_MATRICE(n,A);
  write('Exposant ? '); readln(p);
  B:=A; (* B= A puissance 1 *)
  for m:=2 to p do
      begin
      PRODUIT_MATRICE(A,B,C);
      B:=C (* B= A puissance m *)
      end;
  writeln;
  writeln('voici la puissance ',p,' de la matrice ci-dessus :');
  writeln;
  AFFICHER_MATRICE(n,B);
  writeln;
  write('voulez-vous recommencer (oui/non) ? ');
  readln(reponse);
  until reponse='non';
END.