{
 **
 **
 **                ANALYSE NUMERIQUE -- LE PETIT AMIGA ILLUSTRE -- 
 **
 **                     MISE EN SOUS-ROUTINE DE KHALETSKI 
 **
 **                            (SOURCE EN PCQ)
 **
 **
}

program Khaletski (input,output);

{*** Variables globales ***}

VAR
   N,N1,I,J,II,L,K : integer;
   M : array[1..20, 1..20] of real;	
   X : array[1..20] of real;	
   Z : array[1..20] of real;	
   somme : Real;


{------------------------ SOUS-ROUTINE KHALETSKI --------------------------}

Procedure  Khaletski(VAR M  : array[1..20, 1..20] of real ;
                     VAR X  : array[1..20] of real ;
                     VAR N  : integer ;
                     VAR N1 : integer);
begin
  for I:=1 to N do begin
   Z[I]:=0;
   X[I]:=0; 
   for J:=1 to N do begin	
     somme:= M[I][J];
     if I < J then 
       L:=I-1
     else    
       L:=J-1;
     for K:=1 to L do begin
       somme:= somme - ( M[I][K] * M[K][J] );
     end;
     if J > I then begin
       if M[I][I] = 0 then begin
         writeln ("erreur division par zero !!");
         exit(0);
       end;
       somme:= somme / M[I][I];
     end;
     M[I][J]:=somme;
   end;
  end;
          
  for I:=1 to N do begin
    if M[I][I] = 0 then begin
      writeln ("erreur division par zero !!");
      exit(0);
    end; 
    somme:= M[I][N1] / M[I][I];
    for J:=1 to I-1 do begin
      somme:=somme - M[I][J] * ( Z [J] / M[I][I] ) ;
    end;
    Z[I]:=somme;
  end;
  
{
 ** TROUVE LES INCONNUES
}

  for I:=N downto 1 do begin
    somme:=z[I];
    II:=I+1;
    for J:=II to N do begin
      somme:=somme - ( M[I][J] * X[J] );
    end;
    X[I]:=somme;
  end;    	
end;


{------------------------ ROUTINE PRINCIPALE -----------------------------}

begin
  writeln ("\f");
  writeln ("               ANALYSE NUMERIQUE : METHODE DE KHALETSKI");
  writeln ("               ========================================");  	
  writeln;

{
 ** LIRE LE NOMBRE D'EQUATIONS
}

  write   ("ENTREZ LE NOMBRE D'EQUATIONS : ");		
  readln  (N);
  N1:=N+1;

{
 ** LIRE M(i,j)
}

  for I:=1 to N do begin
    for J:=1 to N1 do begin
      write  ("M(",I,",",J,") = ");
      readln (M[I][J])
   end;
  end;
{
 ** ECRIRE M(i,j) INITIALE
}

  writeln ("\n","LE SYSTEME INITIAL EST :");
  for I:=1 to N do begin
    for J:=1 to N1 do begin
      write (M[I][J]," ")
   end;
   writeln;   
  end;
 
{
 ** APPEL DE LA SOUS-ROUTINE
}
  
  Khaletski(M,X,N,N1); 
 
{
 ** AFFICHE LES ICONNUES
}

  writeln("\nLES INCONNUES SONT : "); 
  for I:=1 to N  do begin
    writeln("X (",I,") = ",X[I]);
  end;

  writeln;
end.
