#include <iostream>
#pragma hdrstop
#pragma argsused using namespace std;
//--- VARIABLES GLOBALES --- float Tab[30][30]; //tableau du système d'équations
int p; //nombre d'équations int n; //nombre d'inconnues
int LigPiv; //n° de la ligne où le futur pivot est cherché int ColPiv; //n° de colonne où le futur pivot est cherché int NbPivots; //nombre de pivots trouvés
int NumLigne; //n° de la ligne où on a trouvé le pivot en colonne ColPiv //---fin VARIABLES --- //---FONCTIONS --- void SaisieSysteme();
//affiche le message de début du prog
//et permet la saisie des équations par l'utilisateur void Operations();
// effectue les opérations sur les lignes
// pour le pivot situé en ligne LigPiv et en colonne ColPiv // que l'on a remis à sa place par un échange de lignes
// si on l'a trouvé en-dessous de la ligne LigPiv dans la colonne ColPiv void Echange(int x int y);
//pour échanger les lignes x et y void AfficherTableauOperations();
//affiche le tableau du système et
//les opérations à faire sur chaque ligne pour le pivot trouvé void Gauss_Jordan();
//effectue la recherche des pivots successifs
void AfficherTableau();//affiche le tableau "nu" du système sans //opérations à faire
void AfficherSolutions();
//donne les solutions s'il y en a
//---fin FONCTIONS --- //***** DÉBUT DU MAIN (PGM PRINCIPAL) *************************************
int main(int argc, char* argv[]) {
SaisieSysteme Gauss_Jordan();
AfficherTableau();
AfficherSolutions();
cin.sync();
cin.get();
return 0;
}//***** FIN MAIN *********************************************************
//----Détail des FONCTIONS --- //
NOTE : dans les "for" ou les "while" les variables locales i et j désigneront
//
respectivement :
// pour i, un n° de ligne et pour j, un n° de colonne dans le tableau Tab
//--- Début SaisieSysteme --- void SaisieSysteme()
{
cout<<"Ce programme resout des systèmes linéaires"<<endl;
cout<<" de p équations à n inconnues"<<endl;
cout<<" par la methode du pivot de GAUSS-JORDAN"<<endl;
cout<<" Nombre d'equations ? ";
cin>>p; //n nombre d'équations cout<<endl;
cout<<" Nombre d'inconnues ? ";
cin>>n; //p nombre d'inconnues cout<<endl;
for (int i=1;i<=p;i++) //remplissage du tableau {
cout<<"Equation n° "<<i<<" : "<<endl;
for (int j=1;j<=n;j++) {
cout <<" Coefficient de X"<<j<<" : ";
cin>>Tab[i][j];
}
cout<<" Second membre : ";
cin>>Tab[i][n+1];
cout<<endl;
}
}//--- Fin SaisieSysteme --- //--- Début Operations --- void Operations()
{ // division de la ligne LigPiv du pivot
//(qui est en colonne ColPiv) par le pivot Tab[LigPiv][ColPiv]
for (int j=n+1;j>=ColPiv;j--) {
Tab[LigPiv][j] /= Tab[LigPiv][ColPiv];
}
// pour les autres lignes for (int i=1;i<=p;i++)
{
if (i!=LigPiv) {
for (int j=n+1;j>=ColPiv;j--)
Tab[i][j] -= Tab[i][ColPiv]*Tab[LigPiv][j];
} }
NbPivots++; //on compte le nombre de pivots
Tab[LigPiv][0]=ColPiv; // on mémorise que le pivot de la ligne LigPiv // est en comonne ColPiv
}//--- Fin Operations --- //---Début d'échange des lignes x et y --- void Echange(int x int y);
//échange des lignes x et y à partir de la colonne ColPiv //l'échange n'étant pas nécessaire avant la colonne ColPiv //car on n'échangerait que des 0
{ float Temp;
for (int j=ColPiv;j<=n+1;j++) {
Temp = Tab[x][j];
Tab[x][j] = Tab[y][j];
Tab[y][j] = Temp;
}//--- Fin d'échange des lignes x et y --- //-début d'affichage du tableau et des opérations effectuer sur les lignes- void AfficherTableauOperations()
{
for (int i=1;i<=p;i++) {
for (int j=1;j<=n;j++) {
cout<<setw(10)<<setprecision(4)<<fixed<<Tab[i][j];
}
cout<<setw(10)<<setprecision(4)<<fixed<<"| "<<Tab[i][n+1];
if (i==NumLigne) {
cout<<"L"<<i<<"/";
cout<<setw(10<<setprecision(4)<<fixed<<Tab[NumLigne][ColPiv];
if (NumLigne != LigPiv) {
cout<<" <--> L"<<LigPiv;
//affichage de l'échange des lignes NumLigne et LigPiv //lorsque le pivot (colonne ColPiv) a été trouve
//dans la ligne NumLigne
>
LigPiv }} else {
cout<<" L"<<i<<" - (";
cout<<setw(10)<<setprecision(4)<<fixed<<Tab[i][ColPiv];
cout<<")/("setprecision(4)<<fixed<<Tab[NumLigne][ColPiv];
cout<<")*L"<<NumLigne;
}
cout<<endl;
}
cout<<endl;
}//---Fin d'affichage du tableau et des opérations effectuer sur les lignes //---Recherche des pivots successifs (fonction Gauss_Jordan)--- void Gauss_Jordan()
{
NbPivots = 0;//initialisation du nombre de pivots trouvés à O //LigPiv et ColPiv sont le n° de ligne et de colonne où on espère //touver le pivot non nul
LigPiv=1;
ColPiv=1; //la recherche des pivots commence ligne 1, colonne 1 while (LigPiv<=p && ColPiv<=n)
{
if (Tab[LigPiv][ColPiv] != 0) //on a trouvé un pivot non nul { NumLigne = LigPiv;
AfficherSystemeOperations(); //sans échange de lignes Operations();
LigPiv++; //on passe à la ligne suivante ColPiv++; //on passe à la colonne suivante //pour chercher le pivot suivant }
else //si le "Pivot" Tab[LigPiv][ColPiv] est nul {
bool Trouve=false; //indicateur de pivot trouvé ou non
//tant qu'on ne trouve pas de pivot non nul sous Tab[LigPiv][ColPiv]
//(qui est nul) et qu'on a pas parcouru tous les éléments situés sous
//Tab[LigPiv][ColPiv] on cherche un remplaçant de ce mauvais "pivot nul"
int j=i+1;
while (j<=p && !Trouve) {
if (Tab[j][ColPiv] !=0) //si terme non nul {
NumLigne = j;
Trouve = true; //on a un pivot à la ligne j>LigPiv }
j++; //on passe à la ligne suivante }
if (!Trouve) {
ColPiv++;
//on a pas trouvé de pivot en colonne ColPiv, //on passe à la colonne suivante
//(toujours en ligne LigPiv) }
else
{ //avant l'échange des lignes : NumLigne et LigPiv
AfficherSystemeOperations();//on affiche les opérations à faire Echange(NumLigne,LigPiv);
//on remet la ligne du pivot à sa place (ligne LigPiv) //avant de faire les opérations pour le pivot qui sera //à nouveau Tab[LigPiv][ColPiv] :
NumLig=LigPiv;
Operations();
LigPiv++; //on passe à la ligne suivante ColPiv++; //on passe à la colonne suivante
//pour la recherche du pivot suivant }
} }
}//---Fin Recherche des pivots successifs (fonction Gauss_Jordan) --- //---Début de l'affichage du tableau "nu"(sans opérations à faire)-- void AfficherTableau()
{
for (int i=1;i<=p;i++) {
for (int j=1;j<=n;j++) {
cout<<setw(10)<<setprecision(4)<<fixed<<Tab[i][j];
}
cout<<setw(10)<<setprecision(4)<<fixed<<"| "<<Tab[i][n+1]<<endl;
}
cout<<endl;
}//---Fin d'affichage du tableau "nu" ---
//---Début d'affichage des solutions du système--- void AfficherSolutions()
{ cout<<"Nombre de pivot(s) trouve(s) : "<<NbPivots<<endl;
//si nombre de pivots < nombre d'équations
//Système avec solution(s) seulement si les seconds membres //correspondant aux premiers membres nuls (donc après la ligne BbPivots) sont tous nuls :
bool Possible = true;
while((i <= p)&& (Possible)) //si le nombre de pivots est p ce "while" ne fait rien { if (Tab[i][n+1] != 0)
{
Possible = false; //si un des seconds membres correspondants } // n'est pas nul le système est impossible i++;
} }
if (!Possible) {
cout<<"Systeme impossible à résoudre"<<endl;
} else
{ if (NbPivots == p) //et non pas n !!!
{
cout<<"Solution unique : "<<endl;
} else {
cout<<"Systeme indetermine, solutions :" <<endl;
}
//Affichage des solution(s) du système bool TrouvePivot;
for (int i=1;i<=NbPivots;i++)
{ // le pivot de la ligne i est en colonne n° Tab[i][0]
// on tire l'inconnue correspondant au pivot en fonction des // autres s'il y en a
cout<<"X"<<setw(10)<<setprecision(4)<<fixed<<Tab[i][0]<<" = ";
// on affiche le second membre
cout<<setw(10)<<setprecision(4)<<fixed<< Tab[i][n+1];
// on explore la ligne après le pivot
// s'il y a des coefficients non nuls les variables // correspondantes padssent dans le second membre j=Tab[i][0]+1;
while(j<=n)
{ if (Tab[i][j]> 0) {
cout<<" -(";
cout<<setw(10)<<setprecision(4)<<fixed<< Tab[i][j];
cout<<")*X"<<j;
} else
{ if (Tab[i][j]< 0) {
cout<<" +(";
cout<<setw(10)<<setprecision(4)<<fixed<<-Tab[i][j];
cout<<")*X"<<j;
} } }
}
}
}//---Fin d' affichage les solutions du système--- //========== FIN DE FICHIER SOURCE ========================================