/*
 *      Analyse Numérique -- "Le petit Amiga illustré" --
 *
 *               Méthode de Khalestki
 *
 *                     Source en C
 *
 *
 ***************************************************************************/


#include <stdio.h>

/* Variables globales */
long   n,n1,i,ii,j,k,l;
double m[21][21],x[21],z[21],somme;
/***************************************************************************/
/* Prototypes */
void khaletski(void);
void main(void);

/***************************************************************************/
/* sous-routine proprement dite */
void khaletski(void)
{
 for(i=1;i<n+1;i++) {
   z[i]=0;
   x[i]=0;
   for(j=1;j<n+1;j++) {
     somme=m[i][j];
     if (i<j)
       l=i-1;
     else
       l=j-1;
     for(k=1;k<l+1;k++) { 
       somme-=(m[i][k]*m[k][j]);
     }
     if (j>i) {
       if (m[i][i]==0) {
         printf("ERREUR : DIVISION PAR ZERO !!\n"),exit(0);
       }
       somme/=m[i][i];
     }
     m[i][j]=somme;
   }
 }
 for (i=1;i<n+1;i++) {
   if (m[i][i]==0)
     printf("ERREUR : DIVISION PAR ZERO !!\n"),exit(0);
   somme=m[i][n1]/m[i][i];
   for (j=1;j<i;j++) {
     somme-=m[i][j] * (z[j] / m[i][i]);
   }
   z[i]=somme;
 }
/* Trouve les inconnues */
 for(i=n;i>0;i--) {
   somme=z[i];
   ii=i+1;
   for(j=ii;j<n+1;j++) {
     somme-=(m[i][j] * x[j]);
   }
   x[i]=somme;
 }
}

/***************************************************************************/
/* Routine principale */
void main(void)
{
 printf("\f");
 printf("\t\t\t Analyse Numérique : méthode de Khaletski\n");
 printf("\t\t\t ========================================\n");
 printf("\n");

/* Lire le nombre d'équations */
 printf("Entrez le nombre d'équations : "),scanf("%d",&n);
 n1=n+1;
 
/* Lire M[i][j] */
 for(i=1;i<n+1;i++) {
   for(j=1;j<n1+1;j++) {
     printf("M(%d,%d) = ",i,j),scanf("%lf",&m[i][j]);
   }
 }

/* Ecrire M(i,j) Initiale */
 printf("\nLe système initial est :\n");
 for(i=1;i<n+1;i++) {
   for(j=1;j<n1+1;j++) {
     printf("%lf ",m[i][j]);
   }
   printf("\n");
 }  
   
/* Appel de la sous-routine */
 khaletski();

/* Affiche les inconnues */
 printf("\nLes inconnues sont :\n");
 for(i=1;i<n+1;i++) {
   printf("X(%d) = %lf\n",i,x[i]);
 }
 printf("\n");
}
