PROGRAM TP8EXC2 ; (* calcul vectoriel *)

TYPE vecteur = array[1..3] of real;
VAR a,b,c,d,e,f,g,h,m1,m2 : vecteur;
 k : real;
    choix : integer;

PROCEDURE saisir(var v:vecteur);
Var i:integer;
Begin
for i:=l to 3 do
    begin
    write(i,'-ième composante');
    readln(v[i]);
    end;
writeln;
End;

PROCEDURE afficher(v:vecteur);
Var i : integer;
Begin
for i:1 to 3 do
    writeln(i,'-ième composante : ',v[i]) ;
writeln;
End;

PROCEDURE externe(k:real ; v:vecteur ; var w:vecteur);
Var i : integer;
begin
for i:=l to 3 do w[i]:=k*v[i];
End;

PROCEDURE somme(u,v:vecteur ; var w:vecteur);
Var i : integer;
Begin
for i:1 to 3 do w[i]:=u[i]+v[i];
End;

PROCEDURE prodvect(u,v:vecteur ; var w:vecteur);
Begin
w[1]:=u[2]*v[3]-v[2]*u[3];
w[2]:=u[3]*v[1]-v[3]*u[1];
w[3]:=u[1]*v[2]-v[1]*u[2];
End;

FUNCTION scalaire(u,v:vecteur):real;
Begin
scalaire:=u[1]*v[1]+u[2]*v[2]+u[3]*v[3];
end;

FUNCTION modulecar(u:vecteur):real;
Begin
modulecar:=scalaire(u,u);
End:

FUNCTION mixte(u,v,w:vecteur):real;
Var x : vecteur;
Begin
prodvect(u,v,x);
mixte:=scalaire(x,w);
End;

BEGIN
repeat
writeln;
writeln('menu :');
writeln;
writeln('-1- vérification de la première formule');
writeln('-2- vérification de la deuxième formule');
writeln('-3- division vectorielle');
writeln('-0- sortie du programme');
writeln;
write(votre choix ? '); readln(choix);
case choix of

    1: begin
       writeln('Vecteur A :'); saisir(a);
       writeln('Vecteur B :'); saisir(b);
       writeln('Vecteur C :'); saisir(c);

       writeln('A^(B^C) : ');
       prodvect(b,c,e);
       prodvect(a,e,m1);
       afficher(m1);

       writeln('(A.C)B-(A.B)C :');
       externe(scalaire(a,c),b,e);
       externe(-scalaire(a,b),c,f);
       somme(e,f,m2);
       afficher(m2);

       write('appuyer sur la touche RETURN pour continuer');
       readln;
       end;

    2: begin
       writeln('Vecteur A :'); saisir(a);
       writeln('Vecteur B :'); saisir(b);
       writeln('Vecteur C :'); saisir(c);
       writeln('Vecteur D :'); saisir(d);

       writeln('(A,B,C)D :');
       externe(mixte(a,b,c),d,m1);
       afficher(m1);

       writeln('(D,B,C)A+(D,C,A)B+(D,A,B)C :');
       externe(mixte(d,b,c),a,e);
       externe(mixte(d,c,a),b,f);
       externe((mixte(d,a,b),c,g);
       somme(e,f,h);
       somme(h,g,m2);
       afficher(m2);

       write('appuyer sur la touche RETURN pour continuer');
       readln;
       end;

    3: begin
       writeln('résolution de A^X=B :');
       writeln('Vecteur A :'); saisir(a);
       writeln('Vecteur B :'); saisir(b);
       writeln('Valeur du scalaire k ? ');
       readln(k);
       if (scalaire(a,b)<>0)
           then writeln('pas de solution')
           else begin
                prodvect(a,b,e);
                externe(-1/modulecar(a),e,f);
                externe(k,a,g);
                somme(f,g,h);
                writeln('solution X associée à ',k,' : ');
                afficher(h);
                writeln('verification : '); writeln;
                writeln('A^X : ');
                prodvect(a,h,m1);
                afficher(m1);
                writeln('B : ');
                afficher(b);
                end;
      write('appuyer sur RETURN pour continuer'); readln;
      end;

    end; (* du case *)

until choix=0;
END.