{*************************************************************

               Le CyberZo‹de Qui Fr‚tille

  http://www.multimania.com/cyberzoide/info/turbo/turbo.htm
               cyberzoide@multimania.com

***************************************************************}

program tp5;

uses crt;

const nmax=15;
      epsilon=1E-03;
      nmaxit=50;

type tab1=array[1..nmax] of real;
     tab2=array[1..nmax, 1..nmax] of real;

procedure saisie(var a:tab2; var y:tab1; var n:integer);
var i,j:integer;
    x:real;
    test:boolean;
begin
write('Entrez le nombre total d''‚quations : ');
readln(n);
for i:=1 to n do
    begin
    writeln('- EQUATION Nø',i,' -');
    for j:=1 to n do
        begin
        repeat
        write('Entrez le coefficient du membre nø',j,' : ');
        readln(x);
        test:= (i=j) and (x=0);
        if test then writeln('Erreur! Les coefficients diagonaux doivent ˆtre non nuls.');
        until not test;
        a[i,j]:=x;
        end;
    write('Entrez le second membre : ');
    readln(x);
    y[i]:=x;
    end;
end;

function max(u,v:tab1; n:integer):real;
var i,j:integer;
    x:real;
begin
x:=0;
for i:=1 to n do
    begin
    if (abs(u[i]-v[i])>=x) then x:=abs(u[i]-v[i]);
    end;
max:=x;
end;

var y,u,v:tab1;
    a:tab2;
    n,i,j,k:integer;
    x:real;
    test:boolean;
    reponse:char;

BEGIN
repeat
clrscr;
saisie(a,y,n);
for i:=1 to n do v[i]:=y[i]/a[i,i];
k:=0;
repeat
inc(k);
u:=v;
for i:=1 to n do
    begin
    x:=y[i];
    for j:=1 to (i-1) do x:=x-a[i,j]*v[j];
    for j:=(i+1) to n do x:=x-a[i,j]*v[j];
    v[i]:=x/a[i,i];
    end;
for i:=1 to n do writeln('v[',i,'] = ',v[i]:10:5);
if (k mod 20) =0 then
   begin
   readln;
   clrscr;
   end;
test:=max(u,v,n)<=epsilon;
until (k>=nmaxit) or test;
if not test then writeln('Erreur ! La pr‚cision voulue n''a pas pu ˆtre atteinte.')
             else
             begin
             writeln('Voici les composantes du vecteur solution : ');
             for i:=1 to n do write(u[i],' ');
             writeln;
             end;
writeln;
write('Souhaitez-vous recommencer [O/N] ? ');
readln(reponse);
reponse:=upcase(reponse);
until reponse='N';
END.