begin process at 2012 05 27 17:37:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > OPÉRATIONS SUR MATRICES C++

OPÉRATIONS SUR MATRICES C++


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :Opérations, matrices, déterminant, inverse, produit Niveau :Débutant Date de création :31/01/2010 Date de mise à jour :28/04/2010 19:55:29 Vu :4 050

Auteur : Minilogus

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Voici un petit programme en C++ permettant de réaliser différentes opérations sur les matrices.

Produit, déterminant, addition, soustraction, division, inversion (via un algorithme d'élimination de Gauss-Jordan), ...

Exécutables disponibles sur cette page: http://minilog.freehostia.com/telechargements.php

Source

  • //------------------------------------------------------------ Fichier: matrice.h ------------------------------------------------------------
  • #ifndef MATRICE_H_INCLUDED
  • #define MATRICE_H_INCLUDED
  • class matrice
  • {
  • public:
  • // constructeur:
  • matrice();
  • // méthodes:
  • std::string acc(const unsigned int &);
  • int entier();
  • double reel();
  • void couleur();// pour appliquer la couleur utilisée dans l'affichage des matrices.
  • void couleur_fin();
  • int demande(const std::string & , const bool &);// demande d'un entier en fonction des restrictions liées à une fonction.
  • void saisie(const std::string & , std::vector<std::vector<double> > &);// saisie dans un tableau de matrice.
  • void addition(const std::vector<std::vector<double> > & , const std::vector<std::vector<double> > & , std::vector<std::vector<double> > & , const int &);// addition/soustraction de matrices, variable operateur: 1=addition , 2=soustraction.
  • void transpose(const std::vector<std::vector<double> > & , std::vector<std::vector<double> > &);// transposition d'une matrice.
  • void produit_nb(std::vector<std::vector<double> > & , const double &);// multiplication d'une matrice par un nombre.
  • void produit_mat(const std::vector<std::vector<double> > & , const std::vector<std::vector<double> > & , std::vector<std::vector<double> > &);// réalisation du produit matriciel ordinaire.
  • double determinant_carre(const std::vector<std::vector<double> > &);// déterminant d'une matrice carrée via la méthode de Leibniz.
  • double inversion(std::vector<std::vector<double> > &);// inversion d'une matrice (carrée).
  • void affiche(const std::string &, std::vector<std::vector<double> > &);
  • };
  • #endif
  • //----------------------------------------------------------------------------------------------------------------------------------------------
  • //------------------------------------------------------------ Fichier: matrice.cpp ------------------------------------------------------------
  • #include <iostream>
  • #include <vector>
  • #include <sstream>
  • #include <cmath>
  • #ifdef _WIN32// si système windows...
  • #include <windows.h>// pour la coloration.
  • #endif
  • #include "matrice.h"
  • //-- CONSTRUCTEUR --
  • matrice::matrice(){}
  • //--FIN DU CONSTRUCTEUR --
  • //-- METHODES --
  • #ifdef _WIN32// si système windows...
  • void matrice::couleur()
  • {
  • HANDLE hConsole;
  • hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
  • SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
  • }
  • void matrice::couleur_fin()
  • {
  • HANDLE hConsole;
  • hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
  • SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
  • }
  • // ces 2 fonctions ci-dessus nécessite windows.h
  • std::string matrice::acc(const unsigned int & choix)// demande d'accent.
  • {
  • if(choix==1){return "\x85";}// a accent grave.
  • if(choix==2){return "\x82";}// e accent aigu.
  • if(choix==3){return "\x88";}// e accent circonflexe.
  • if(choix==4){return "n""\xA7";}// caractère numéro.
  • }
  • #elif linux// si système linux...
  • void matrice::couleur()
  • {
  • std::cout<<"\033[31m";
  • }
  • void matrice::couleur_fin()
  • {
  • std::cout<<"\033[0m";
  • }
  • std::string matrice::acc(const unsigned int & choix)
  • {
  • if(choix==1){return "à";}// a accent grave.
  • if(choix==2){return "é";}// e accent aigu.
  • if(choix==3){return "ê";}// e accent circonflexe.
  • if(choix==4){return "";}// caractère numéro.
  • }
  • #else// pour les autres...
  • void matrice::couleur(){}
  • void matrice::couleur_fin(){}
  • std::string matrice::acc(const unsigned int & choix)
  • {
  • if(choix==1){return "a";}// a accent grave.
  • if(choix==2 || choix==3){return "e";}// e accent aigu et e accent circonflexe.
  • if(choix==4){return "- ";}// caractère numéro.
  • }
  • #endif
  • int matrice::entier()// demande d'un entier.
  • {
  • std::string saisie;
  • std::string verif;
  • bool good=1;
  • bool trouble=0;
  • int num;
  • do
  • {
  • if(good==0)
  • {
  • std::cout<<std::endl;
  • couleur();
  • std::cout<<"->";
  • couleur_fin();
  • std::cout<<" Saisie incorrecte, ressaisissez: ";
  • }
  • std::cin>>saisie;
  • std::istringstream iss(saisie);// conversion du type string en type double.
  • iss>>num;
  • if(iss.fail())// lorsqu'on insère uniquement des caractère lettre, le passage dans un type numérique ==> 0 , ce qui ne déclenche aucune erreur par la suite, d'où l'instauration du iss.fail().
  • {
  • good=0;
  • trouble=1;
  • }
  • else// le cas où il n'y a pas que des caractères lettre, mais des caractères numériques suivit de lettres puis à nouveau de chiffres.
  • {
  • std::ostringstream oss;
  • oss<<num;
  • verif=oss.str();
  • if(verif.size() < saisie.size())// lors du passage dans la variable num, les caractères autres que numérique sont enlevés (ainsi que ce qu'il y a après), par conséquent la taille des 2 strings en est différente.
  • {
  • good=0;
  • trouble=1;
  • }
  • else{good=1;}
  • }
  • if(good==1 && trouble==1)
  • {
  • std::cout<<"-> OK!"<<std::endl;
  • }
  • }while(good==0);
  • return num;
  • }
  • double matrice::reel()// demande d'un réel (utile pour le facteur multiplicateur...)
  • {
  • std::string saisie;
  • std::string verif;
  • size_t found;
  • bool good=1;
  • bool trouble=0;
  • double num;
  • do
  • {
  • if(good==0)
  • {
  • std::cout<<std::endl;
  • couleur();
  • std::cout<<"->";
  • couleur_fin();
  • std::cout<<" Saisie incorrecte, ressaisissez: ";
  • }
  • std::cin>>saisie;
  • found=saisie.find_first_of(",");
  • while (found!=std::string::npos)
  • {
  • saisie[found]='.';// les virgules françaises seront automatiquement transformées en point.
  • found=saisie.find_first_of(",",found+1);
  • }
  • std::istringstream iss(saisie);// conversion du type string en type double.
  • iss>>num;
  • if(iss.fail())
  • {
  • good=0;
  • trouble=1;
  • }
  • else
  • {
  • std::ostringstream oss;
  • oss<<num;
  • verif=oss.str();
  • if(verif.size() < saisie.size())
  • {
  • good=0;
  • trouble=1;
  • }
  • else{good=1;}
  • }
  • if(good==1 && trouble==1)
  • {
  • std::cout<<"-> OK!"<<std::endl;
  • }
  • }while(good==0);
  • return num;
  • }
  • int matrice::demande(const std::string &indic , const bool &stop)// demande d'un entier en fonction des restrictions liées à une fonction.
  • {
  • int z;
  • bool good=1;
  • std::cout<<indic;
  • do
  • {
  • z=entier();
  • if((stop==0 && z<1) || (stop==1 && z<2))
  • {
  • std::cout<<std::endl;
  • couleur();
  • std::cout<<"->";
  • couleur_fin();
  • std::cout<<" La valeur minimum est "<<stop+1<<" , ressaisissez: ";
  • if(good==1){good=0;}
  • }
  • }while((stop==0 && z<1) || (stop==1 && z<2));
  • if(good==0){std::cout<<std::endl;}
  • return z;
  • }
  • void matrice::saisie(const std::string &nom_mat , std::vector<std::vector<double> > &mat)// saisie dans un tableau de matrice.
  • {
  • std::cout<<std::endl<<"Entrer les valeurs de la matrice "<<nom_mat<<" :";
  • int unites,div=0,rajout;
  • for(unsigned int j=0;j<mat[0].size();j++)// étant donné que je commence par les colonnes, je suis obligé de choisir une ligne manuellement (chaque ligne ayant le même nombre de colonne, cela ne pose aucun problème, on aurait même pu faire cela partout).
  • {
  • if(j+1>=10)// début de présentation (... la force de l'esthétisme ...).
  • {
  • div=0;
  • unites=j+1;
  • do
  • {
  • unites=unites/10;
  • div++;
  • }while(unites>=10);
  • }
  • std::cout<<std::endl<<"_________________________________";
  • if(div>0)
  • {
  • rajout=0;
  • do
  • {
  • std::cout<<"_";
  • rajout++;
  • }while(rajout<div);
  • }
  • std::cout<<std::endl<<"Matrice "<<nom_mat<<" | Colonne "<<acc(4)<<j+1<<std::endl;
  • std::cout<<"-----------|---------------------";
  • if(div>0)
  • {
  • rajout=0;
  • do
  • {
  • std::cout<<"-";
  • rajout++;
  • }while(rajout<div);
  • }
  • std::cout<<std::endl;
  • // fin de présentation, ==> insertion.
  • std::string saisie;
  • std::string verif;
  • size_t found;
  • bool good=1;
  • for(unsigned int i=0;i<mat.size();i++)
  • {
  • std::cout<<" | Ligne "<<acc(4)<<i+1<<": ";
  • do
  • {
  • if(good==0)// en cas d'erreur de saisie...
  • {
  • couleur();// on applique la couleur rouge.
  • std::cout<<">RESSAISIR";
  • couleur_fin();// on arrête d'appliquer la couleur.
  • std::cout<<" | Ligne "<<acc(4)<<i+1<<": ";
  • }
  • std::cin>>saisie;
  • found=saisie.find_first_of(",");
  • while (found!=std::string::npos)
  • {
  • saisie[found]='.';// les virgules françaises seront automatiquement transformées en point.
  • found=saisie.find_first_of(",",found+1);
  • }
  • std::istringstream iss(saisie);// conversion du type string en type double.
  • iss>>mat[i][j];
  • if(iss.fail())// lorsqu'on insère uniquement des caractère lettre, le passage dans un type numérique ==> 0 , ce qui ne déclenche aucune erreur par la suite, d'où l'instauration du iss.fail().
  • {
  • good=0;
  • }
  • else// le cas où il n'y a pas que des caractères lettre, mais des caractères numériques suivit de lettres puis à nouveau de chiffres.
  • {
  • std::ostringstream oss;
  • oss<<mat[i][j];
  • verif=oss.str();
  • if(verif.size() < saisie.size())// lors du passage dans la variable num, les caractères autres que numérique sont enlevés (ainsi que ce qu'il y a après), par conséquent la taille des 2 strings en est différente.
  • {
  • good=0;
  • }
  • else{good=1;}
  • }
  • }while(good==0);
  • }
  • }
  • }
  • void matrice::addition(const std::vector<std::vector<double> > &A , const std::vector<std::vector<double> > &B , std::vector<std::vector<double> > &C , const int &operateur)// addition/soustraction de matrices, variable operateur: 1=addition , 2=soustraction.
  • {
  • for(unsigned int i=0;i<A.size();i++)
  • {
  • for(unsigned int j=0;j<A[i].size();j++)
  • {
  • if(operateur==1)
  • {
  • C[i][j]=A[i][j]+B[i][j];
  • }
  • if(operateur==2)
  • {
  • C[i][j]=A[i][j]-B[i][j];
  • }
  • }
  • }
  • }
  • void matrice::transpose(const std::vector<std::vector<double> > &A , std::vector<std::vector<double> > &B)// transposition d'une matrice.
  • {
  • for(unsigned int i=0;i<A.size();i++)
  • {
  • for(unsigned int j=0;j<A[i].size();j++)
  • {
  • B[j][i]=A[i][j];
  • }
  • }
  • }
  • void matrice::produit_nb(std::vector<std::vector<double> > &A , const double &facteur)// multiplication d'une matrice par un nombre.
  • {
  • for(unsigned int i=0;i<A.size();i++)
  • {
  • for(unsigned int j=0;j<A[i].size();j++)
  • {
  • A[i][j]=facteur*A[i][j];
  • }
  • }
  • }
  • void matrice::produit_mat(const std::vector<std::vector<double> > &A , const std::vector<std::vector<double> > &B , std::vector<std::vector<double> > &C)// réalisation du produit matriciel ordinaire.
  • {
  • unsigned int v;
  • for(unsigned int i=0;i<C.size();i++)
  • {
  • for(unsigned int j=0;j<C[i].size();j++)// si vous êtes tentés de prendre A.size() avec B[i].size() au lieu de C.size() avec C[i].size() , vous courrez à l'erreur de segmentation...
  • {
  • C[i][j]=0;
  • v=0;
  • do
  • {
  • C[i][j]=C[i][j]+A[i][v]*B[v][j];
  • v++;
  • }while(v<B.size());// tant que le nombre de colonne de la matrice A ou le nombre de ligne de la matrice B...(ici le choix a été porté sur le nombre de ligne de la matrice B).
  • }
  • }
  • }
  • double matrice::determinant_carre(const std::vector<std::vector<double> > &mat)// déterminant d'une matrice carrée via la méthode de Leibniz.
  • {
  • if(mat.size()==2){return mat[0][0]*mat[1][1]-mat[1][0]*mat[0][1];}
  • double det=0,v;
  • unsigned int o=0,j;
  • int i;
  • do
  • {
  • i=o,j=0,v=1;
  • do
  • {
  • v=v*mat[i][j];
  • i++;
  • j++;
  • if(i>=mat.size()){i=0;}// on remonte après être arrivé en bas de la matrice.
  • }while(j<mat[i].size());
  • det=det+v;
  • o++;
  • }while(o<mat.size());
  • o=0;
  • do
  • {
  • i=o,j=0,v=1;
  • do
  • {
  • v=v*mat[i][j];
  • i--;
  • j++;
  • if(i<0){i=mat.size()-1;}// on redescend après être arrivé en haut de la matrice.
  • }while(j<mat[i].size());
  • det=det-v;
  • o++;
  • }while(o<mat.size());
  • return det;
  • }
  • void permutation(std::vector<std::vector<double> > &mat , const unsigned int &ligne1 , const unsigned int &ligne2)// cette fonction est définie afin de permutter les lignes dans le calcul d'inverse via la méthode d'élimination de Gauss-Jordan.
  • {
  • std::vector<double> permut(mat[ligne1].size() , 0);// plus ou moins la même façon de penser que lorsqu'on était dans la fonction de saisie, on choisit n'importe quelle ligne de la matrice (il y a le même nombre de colonne à toute les lignes).
  • for(unsigned int j=0;j<mat[ligne1].size();j++)
  • {
  • permut[j]=mat[ligne1][j];
  • mat[ligne1][j]=mat[ligne2][j];
  • mat[ligne2][j]=permut[j];
  • }
  • }
  • double matrice::inversion(std::vector<std::vector<double> > &mat)// inversion d'une matrice (carrée).
  • {
  • double det;
  • det=determinant_carre(mat);
  • if(det==0)
  • {
  • return det;// si le déterminant est égal à 0 ==> pas d'inversion possible, on s'arrête là.
  • }
  • else
  • {
  • std::vector<std::vector<double> > matmat;
  • matmat.resize(mat.size() , std::vector<double>(2*mat[0].size(),0));
  • for(unsigned int i=0;i<mat.size();i++)
  • {
  • for(unsigned int j=0;j<mat[i].size();j++)
  • {
  • matmat[i][j]=mat[i][j];
  • }
  • }
  • for(unsigned int i=0;i<matmat.size();i++)
  • {
  • for(unsigned int j=mat[i].size();j<matmat[i].size();j++)
  • {
  • if(j-i==mat[i].size())
  • {
  • matmat[i][j]=1;
  • }
  • else{matmat[i][j]=0;}
  • }
  • }// jusqu'ici on a crée une matrice comportant le double de colonne de la matrice initiale, et on a implémenté des 1 en diagonale dans la deuxième moitié.
  • unsigned int ii=0;
  • unsigned int iii;
  • unsigned int iiii;
  • double numb3rs;
  • do// début de l'application de l'élimination de Gauss-Jordan.
  • {
  • if(matmat[ii][ii]==0)
  • {
  • iii=ii;
  • do
  • {
  • iii++;
  • }while(matmat[iii][ii]==0);
  • permutation(matmat,ii,iii);// le terme de la diagonale de la première moitié est égal à zéro, comme on aura besoin de diviser par 0, on permute.
  • }
  • numb3rs=matmat[ii][ii];
  • for(unsigned int j=0;j<matmat[ii].size();j++)
  • {
  • matmat[ii][j]=matmat[ii][j]/numb3rs;
  • }
  • iiii=1;
  • iii=ii;
  • do
  • {
  • iii++;
  • if(iii==matmat.size()){iii=0;}
  • iiii++;
  • numb3rs=matmat[iii][ii];
  • for(unsigned int j=0;j<matmat[iii].size();j++)
  • {
  • matmat[iii][j]=matmat[iii][j]-(numb3rs*matmat[ii][j]);
  • }
  • }while(iiii<matmat.size());
  • ii++;
  • }while(ii<matmat.size());// fin de l'application de l'élimination de Gauss-Jordan.
  • for(unsigned int i=0;i<matmat.size();i++)// on place la deuxième moitié de la matrice matmat (qui après élimination G-J n'est plus une suite de 1 et de 0) dans la matrice initiale...
  • {
  • for(unsigned int j=mat[i].size();j<matmat[i].size();j++)
  • {
  • mat[i][j-mat[i].size()]=matmat[i][j];
  • }
  • }
  • }
  • return det;
  • }
  • void matrice::affiche(const std::string &nom_mat, std::vector<std::vector<double> > &mat)
  • {
  • int significatif=0;
  • std::vector<bool> signe(mat[0].size(),0);//signe du plus long chiffre (par colonne).
  • std::vector<double> chiffre(mat[0].size(),0);//plus long chiffre (par colonne).
  • bool reel=0;
  • for(unsigned int i=0;i<mat.size();i++)
  • {
  • for(unsigned int j=0;j<mat[i].size();j++)
  • {
  • if(mat[i][j]==-0){mat[i][j]=0;}// on commence par éliminer ce qui est nuisible à une bonne présentation.
  • if(mat[i][j]>=0 && chiffre[j]<mat[i][j])// on répertorie les plus longs chiffres par colonne ainsi que la présence ou non d'un signe associé.
  • {
  • chiffre[j]=mat[i][j];
  • signe[j]=0;
  • }
  • if(mat[i][j]<0 && chiffre[j]<-1*mat[i][j])
  • {
  • chiffre[j]=-1*mat[i][j];
  • signe[j]=1;
  • }
  • if(reel==0 && mat[i][j]-floor(mat[i][j])>0.0000000000001)// on détecte si tout les chiffres sont des entier, si ce n'est pas le cas on indiquera le nombre de chiffre significatif.
  • {
  • reel=1;
  • }
  • }
  • }
  • if(reel==1)
  • {
  • std::cout<<std::endl<<std::endl<<"--> Il existera au moins un nombre qui ne sera pas un entier, choisissez un nombre de chiffre significatif (entre 0 et 10): ";
  • do
  • {
  • significatif=entier();// on indique le nombre de chiffre significatif.
  • if(significatif<0 || significatif>10)
  • {
  • std::cout<<std::endl;
  • couleur();
  • std::cout<<"->";
  • couleur_fin();
  • std::cout<<" Choisissez un nombre de chiffre significatif entre 0 et 10: ";
  • }
  • }while(significatif<0 || significatif>10);
  • }
  • std::cout<<std::endl<<std::endl<<"===> Matrice "<<nom_mat<<" ("<<mat.size()<<"x"<<mat[0].size()<<"):"<<std::endl<<std::endl;
  • couleur();
  • for(unsigned int i=0;i<mat.size();i++)
  • {
  • for(unsigned int j=0;j<mat[i].size();j++)
  • {
  • if(mat[i][j]>=0)
  • {
  • std::cout<<" ";
  • }
  • std::cout.precision(significatif);// le nombre de chiffre significatif va être prit en compte ici.
  • std::cout<<std::fixed<<mat[i][j];
  • if(j+1<mat[i].size())
  • {
  • if(chiffre[j]>=10)
  • {
  • int div_1=0,div_2=0,rajout=0;
  • double unites;
  • if(mat[i][j]>=10 || mat[i][j]<=-10)
  • {
  • unites=mat[i][j];
  • do
  • {
  • unites=unites/10;
  • div_1++;
  • }while(unites>=10 || unites<=-10);
  • }
  • unites=chiffre[j];
  • do
  • {
  • unites=unites/10;
  • div_2++;
  • }while(unites>=10);
  • rajout=div_2-div_1;
  • int rajoute=0;
  • if(rajout>0)
  • {
  • do
  • {
  • std::cout<<" ";
  • rajoute++;
  • }while(rajoute<rajout);
  • }
  • }
  • std::cout<<" | ";
  • }
  • else
  • {
  • std::cout<<std::endl;
  • }
  • }
  • }
  • couleur_fin();
  • }
  • //--FIN DES METHODES--
  • //-------------------------------------------------------------------------------------------------------------------------------------------
  • //------------------------------------------------------------ Fichier: main.cpp ------------------------------------------------------------
  • #include <iostream>
  • #include <vector>// rappel même si inutile car déjà dans matrice.cpp
  • #include "matrice.h"
  • int main()
  • {
  • std::cout<<">----------------------- OPERATIONS SUR MATRICES -----------------------<"<<std::endl<<std::endl;
  • int quitter=0;//pour le "quitter" de fin.
  • int choix;
  • int Aligne , Acolonne , Bligne , Bcolonne;
  • double facteur;
  • double det;
  • matrice mat;
  • do//pour le "quitter" de fin.
  • {
  • std::cout<<"-------------------- MENU --------------------"<<std::endl<<std::endl;
  • std::cout<<" 1. Addition de 2 matrices"<<std::endl;
  • std::cout<<" 2. Soustraction de 2 matrices (A-B)"<<std::endl;
  • std::cout<<" 3. Produit de 2 matrices"<<std::endl;
  • std::cout<<" 4. Produit d'une matrice par un nombre"<<std::endl;
  • std::cout<<" 5. Transpos"<<mat.acc(2)<<"e d'une matrice"<<std::endl;
  • std::cout<<" 6. D"<<mat.acc(2)<<"terminant d'une matrice carr"<<mat.acc(2)<<"e"<<std::endl;
  • std::cout<<" 7. Inversion d'une matrice"<<std::endl;
  • std::cout<<" 8. Division de 2 matrices (A/B)"<<std::endl<<std::endl;
  • std::cout<<" 0. ) Quitter ("<<std::endl;
  • std::cout<<std::endl<<"-> Choix "<<mat.acc(4);
  • do
  • {
  • choix=mat.entier();
  • if(choix<0 || choix>8)
  • {
  • std::cout<<std::endl;
  • mat.couleur();
  • std::cout<<"->";
  • mat.couleur_fin();
  • std::cout<<" Le choix "<<mat.acc(4)<<choix<<" n'existe pas, ressaisissez: ";
  • }
  • }while(choix<0 || choix>8);
  • if(choix==0)
  • {
  • std::cout<<std::endl<<">------------------------------------------------------------<"<<std::endl<<std::endl;
  • return 0;
  • }
  • std::cout<<std::endl;
  • std::vector<std::vector<double> > mat_A;
  • std::vector<std::vector<double> > mat_B;
  • std::vector<std::vector<double> > mat_C;
  • do
  • {
  • if(choix>=6)
  • {
  • Aligne=mat.demande("Indiquer le nombre de ligne (>=2) de votre matrice A: ",1);
  • std::cout<<std::endl;
  • Acolonne=mat.demande("Indiquer le nombre de colonne (>=2) de votre matrice A: ",1);
  • }
  • else
  • {
  • Aligne=mat.demande("Indiquer le nombre de ligne (>=1) de votre matrice A: ",0);
  • std::cout<<std::endl;
  • Acolonne=mat.demande("Indiquer le nombre de colonne (>=1) de votre matrice A: ",0);
  • }
  • if(choix<=3)
  • {
  • std::cout<<std::endl;
  • Bligne=mat.demande("Indiquer le nombre de ligne (>=1) de votre matrice B: ",0);
  • std::cout<<std::endl;
  • Bcolonne=mat.demande("Indiquer le nombre de colonne (>=1) de votre matrice B: ",0);
  • }
  • if(choix==8)
  • {
  • std::cout<<std::endl;
  • Bligne=mat.demande("Indiquer le nombre de ligne (>=2) de votre matrice B: ",1);
  • std::cout<<std::endl;
  • Bcolonne=mat.demande("Indiquer le nombre de colonne (>=2) de votre matrice B: ",1);
  • }
  • if(choix==4)
  • {
  • std::cout<<std::endl;
  • std::cout<<"Indiquer le facteur multiplicateur: ";
  • facteur=mat.reel();
  • }
  • if((choix<=2 && (Aligne!=Bligne || Acolonne!=Bcolonne)) || ((choix==3 || choix==8) && Acolonne!=Bligne) || ((choix>=6 && Aligne!=Acolonne) || (choix==8 && Bligne!=Bcolonne)))
  • {
  • std::cout<<std::endl;
  • mat.couleur();
  • std::cout<<"->";
  • mat.couleur_fin();
  • if(choix<=2 && (Aligne!=Bligne || Acolonne!=Bcolonne))
  • {
  • std::cout<<" Le nombre de ligne et de colonne de la matrice A doit "<<mat.acc(3)<<"tre "<<mat.acc(2)<<"gal au nombre de ligne et de colonne de la matrice B. Ressaisissez:"<<std::endl<<std::endl;
  • }
  • if((choix==3 || choix==8) && Acolonne!=Bligne)
  • {
  • std::cout<<" Le nombre de colonne de la matrice A doit "<<mat.acc(3)<<"tre "<<mat.acc(2)<<"gal au nombre de ligne de la matrice B. Ressaisissez:"<<std::endl<<std::endl;
  • }
  • if((choix>=6 && Aligne!=Acolonne) || (choix==8 && Bligne!=Bcolonne))
  • {
  • if(choix!=8)
  • {
  • std::cout<<" La matrice doit "<<mat.acc(3)<<"tre carr"<<mat.acc(2)<<"e. Ressaisissez:"<<std::endl<<std::endl;
  • }
  • else
  • {
  • std::cout<<" Les matrices doivent "<<mat.acc(3)<<"tre carr"<<mat.acc(2)<<"es. Ressaisissez:"<<std::endl<<std::endl;
  • }
  • }
  • }
  • }while(((choix==3 || choix==8) && Acolonne!=Bligne) || (choix<=2 && (Aligne!=Bligne || Acolonne!=Bcolonne)) || ((choix>=6 && Aligne!=Acolonne) || (choix==8 && Bligne!=Bcolonne)));
  • mat_A.resize(Aligne , std::vector<double>(Acolonne,0));
  • mat.saisie("A",mat_A);
  • if(choix<=3 || choix==8)
  • {
  • mat_B.resize(Bligne , std::vector<double>(Bcolonne,0));
  • mat.saisie("B",mat_B);
  • }
  • if(choix<=2)
  • {
  • mat_C.resize(Aligne , std::vector<double>(Acolonne,0));
  • std::string nom="C";
  • if(choix==2)
  • {
  • nom=nom+" (A-B)";
  • }
  • mat.addition(mat_A,mat_B,mat_C,choix);
  • mat.affiche(nom,mat_C);
  • }
  • if(choix==3)
  • {
  • mat_C.resize(Aligne , std::vector<double>(Bcolonne,0));
  • mat.produit_mat(mat_A,mat_B,mat_C);
  • mat.affiche("C",mat_C);
  • }
  • if(choix==4)
  • {
  • mat.produit_nb(mat_A,facteur);
  • mat.affiche("B",mat_A);
  • }
  • if(choix==5)
  • {
  • mat_B.resize(Acolonne , std::vector<double>(Aligne,0));
  • mat.transpose(mat_A,mat_B);
  • mat.affiche("transposition A",mat_B);
  • }
  • if(choix==6)
  • {
  • std::cout<<std::endl<<std::endl<<"Le d"<<mat.acc(2)<<"terminant de la matrice est "<<mat.determinant_carre(mat_A);
  • }
  • if(choix==7)
  • {
  • det=mat.inversion(mat_A);
  • if(det!=0){mat.affiche("inverse A",mat_A);}
  • else
  • {
  • std::cout<<std::endl<<std::endl<<"Le d"<<mat.acc(2)<<"terminant de la matrice est "<<mat.acc(2)<<"gal "<<mat.acc(1)<<" 0, il est donc impossible de l'inverser."<<std::endl;
  • }
  • }
  • if(choix==8)
  • {
  • det=mat.inversion(mat_B);
  • if(det!=0)
  • {
  • mat_C.resize(Aligne , std::vector<double>(Bcolonne,0));
  • mat.produit_mat(mat_A,mat_B,mat_C);
  • mat.affiche("C",mat_C);
  • }
  • else
  • {
  • std::cout<<std::endl<<std::endl<<"Le d"<<mat.acc(2)<<"terminant de la matrice B est "<<mat.acc(2)<<"gal "<<mat.acc(1)<<" 0, il est donc impossible de diviser."<<std::endl;
  • }
  • }
  • std::cout<<std::endl<<std::endl<<">------------------------------------------------------------<"<<std::endl;
  • std::cout<<std::endl<<"--> Faire un autre calcul de matrice? (1=oui/0=non): ";
  • quitter=mat.entier();
  • std::cout<<std::endl<<">------------------------------------------------------------<"<<std::endl<<std::endl;
  • }while(quitter>0);
  • // pas de PAUSE car inutile ici.
  • return 0;
  • }
  • //-------------------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------ Fichier: matrice.h ------------------------------------------------------------

#ifndef MATRICE_H_INCLUDED
#define MATRICE_H_INCLUDED


class matrice
{
    public:

        // constructeur:
        matrice();

        // méthodes:
        std::string acc(const unsigned int &);
        int entier();
        double reel();
        void couleur();// pour appliquer la couleur utilisée dans l'affichage des matrices.
        void couleur_fin();
        int demande(const std::string & , const bool &);// demande d'un entier en fonction des restrictions liées à une fonction.
        void saisie(const std::string & , std::vector<std::vector<double> > &);// saisie dans un tableau de matrice.
        void addition(const std::vector<std::vector<double> > & , const std::vector<std::vector<double> > & , std::vector<std::vector<double> > & , const int &);// addition/soustraction de matrices, variable operateur: 1=addition , 2=soustraction.
        void transpose(const std::vector<std::vector<double> > & , std::vector<std::vector<double> > &);// transposition d'une matrice.
        void produit_nb(std::vector<std::vector<double> > & , const double &);// multiplication d'une matrice par un nombre.
        void produit_mat(const std::vector<std::vector<double> > & , const std::vector<std::vector<double> > & , std::vector<std::vector<double> > &);// réalisation du produit matriciel ordinaire.
        double determinant_carre(const std::vector<std::vector<double> > &);// déterminant d'une matrice carrée via la méthode de Leibniz.
        double inversion(std::vector<std::vector<double> > &);// inversion d'une matrice (carrée).
        void affiche(const std::string &, std::vector<std::vector<double> > &);

};

#endif

//----------------------------------------------------------------------------------------------------------------------------------------------

//------------------------------------------------------------ Fichier: matrice.cpp ------------------------------------------------------------

#include <iostream>
#include <vector>
#include <sstream>
#include <cmath>

#ifdef _WIN32// si système windows...
#include <windows.h>// pour la coloration.
#endif

#include "matrice.h"


//-- CONSTRUCTEUR --

matrice::matrice(){}

//--FIN DU CONSTRUCTEUR --

//-- METHODES --


#ifdef _WIN32// si système windows...
void matrice::couleur()
{
    HANDLE hConsole;
    hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
}

void matrice::couleur_fin()
{
    HANDLE hConsole;
    hConsole=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}

// ces 2 fonctions ci-dessus nécessite windows.h

std::string matrice::acc(const unsigned int & choix)// demande d'accent.
{
    if(choix==1){return "\x85";}// a accent grave.
    if(choix==2){return "\x82";}// e accent aigu.
    if(choix==3){return "\x88";}// e accent circonflexe.
    if(choix==4){return "n""\xA7";}// caractère numéro.
}

#elif linux// si système linux...
void matrice::couleur()
{
    std::cout<<"\033[31m";
}

void matrice::couleur_fin()
{
    std::cout<<"\033[0m";
}

std::string matrice::acc(const unsigned int & choix)
{
    if(choix==1){return "à";}// a accent grave.
    if(choix==2){return "é";}// e accent aigu.
    if(choix==3){return "ê";}// e accent circonflexe.
    if(choix==4){return "n°";}// caractère numéro.
}

#else// pour les autres...
void matrice::couleur(){}
void matrice::couleur_fin(){}

std::string matrice::acc(const unsigned int & choix)
{
    if(choix==1){return "a";}// a accent grave.
    if(choix==2 || choix==3){return "e";}// e accent aigu et e accent circonflexe.
    if(choix==4){return "- ";}// caractère numéro.
}

#endif




int matrice::entier()// demande d'un entier.
{
    std::string saisie;
    std::string verif;

    bool good=1;
    bool trouble=0;
    int num;

    do
    {
        if(good==0)
        {
            std::cout<<std::endl;
            couleur();
            std::cout<<"->";
            couleur_fin();
            std::cout<<" Saisie incorrecte, ressaisissez: ";
        }

        std::cin>>saisie;

        std::istringstream iss(saisie);// conversion du type string en type double.
        iss>>num;
        if(iss.fail())// lorsqu'on insère uniquement des caractère lettre, le passage dans un type numérique ==> 0 , ce qui ne déclenche aucune erreur par la suite, d'où l'instauration du iss.fail().
        {
            good=0;
            trouble=1;
        }
        else// le cas où il n'y a pas que des caractères lettre, mais des caractères numériques suivit de lettres puis à nouveau de chiffres.
        {
            std::ostringstream oss;
            oss<<num;
            verif=oss.str();

            if(verif.size() < saisie.size())// lors du passage dans la variable num, les caractères autres que numérique sont enlevés (ainsi que ce qu'il y a après), par conséquent la taille des 2 strings en est différente.
            {
                good=0;
                trouble=1;
            }
            else{good=1;}
        }

        if(good==1 && trouble==1)
        {
            std::cout<<"-> OK!"<<std::endl;
        }

    }while(good==0);

    return num;
}




double matrice::reel()// demande d'un réel (utile pour le facteur multiplicateur...)
{
    std::string saisie;
    std::string verif;

    size_t found;
    bool good=1;
    bool trouble=0;
    double num;

    do
    {
        if(good==0)
        {
            std::cout<<std::endl;
            couleur();
            std::cout<<"->";
            couleur_fin();
            std::cout<<" Saisie incorrecte, ressaisissez: ";
        }

        std::cin>>saisie;

        found=saisie.find_first_of(",");
        while (found!=std::string::npos)
        {
            saisie[found]='.';// les virgules françaises seront automatiquement transformées en point.
            found=saisie.find_first_of(",",found+1);
        }

        std::istringstream iss(saisie);// conversion du type string en type double.
        iss>>num;
        if(iss.fail())
        {
            good=0;
            trouble=1;
        }
        else
        {
            std::ostringstream oss;
            oss<<num;
            verif=oss.str();

            if(verif.size() < saisie.size())
            {
                good=0;
                trouble=1;
            }
            else{good=1;}
        }

        if(good==1 && trouble==1)
        {
            std::cout<<"-> OK!"<<std::endl;
        }

    }while(good==0);

    return num;
}




int matrice::demande(const std::string &indic , const bool &stop)// demande d'un entier en fonction des restrictions liées à une fonction.
{
    int z;
    bool good=1;
    std::cout<<indic;
    do
    {
        z=entier();
        if((stop==0 && z<1) || (stop==1 && z<2))
        {
            std::cout<<std::endl;
            couleur();
            std::cout<<"->";
            couleur_fin();
            std::cout<<" La valeur minimum est "<<stop+1<<" , ressaisissez: ";
            if(good==1){good=0;}
        }
    }while((stop==0 && z<1) || (stop==1 && z<2));

    if(good==0){std::cout<<std::endl;}

    return z;
}




void matrice::saisie(const std::string &nom_mat , std::vector<std::vector<double> > &mat)// saisie dans un tableau de matrice.
{
    std::cout<<std::endl<<"Entrer les valeurs de la matrice "<<nom_mat<<" :";
    int unites,div=0,rajout;
    for(unsigned int j=0;j<mat[0].size();j++)// étant donné que je commence par les colonnes, je suis obligé de choisir une ligne manuellement (chaque ligne ayant le même nombre de colonne, cela ne pose aucun problème, on aurait même pu faire cela partout).
    {
        if(j+1>=10)// début de présentation (... la force de l'esthétisme ...).
        {
            div=0;
            unites=j+1;
            do
            {
                unites=unites/10;
                div++;
            }while(unites>=10);
        }

        std::cout<<std::endl<<"_________________________________";

        if(div>0)
        {
            rajout=0;
            do
            {
                std::cout<<"_";
                rajout++;
            }while(rajout<div);
        }

        std::cout<<std::endl<<"Matrice "<<nom_mat<<"  |          Colonne "<<acc(4)<<j+1<<std::endl;

        std::cout<<"-----------|---------------------";

        if(div>0)
        {
            rajout=0;
            do
            {
                std::cout<<"-";
                rajout++;
            }while(rajout<div);
        }
        std::cout<<std::endl;

        // fin de présentation, ==> insertion.

        std::string saisie;
        std::string verif;

        size_t found;
        bool good=1;

        for(unsigned int i=0;i<mat.size();i++)
        {
            std::cout<<"           | Ligne "<<acc(4)<<i+1<<":   ";
            do
            {
                if(good==0)// en cas d'erreur de saisie...
                {
                    couleur();// on applique la couleur rouge.
                    std::cout<<">RESSAISIR";
                    couleur_fin();// on arrête d'appliquer la couleur.
                    std::cout<<" | Ligne "<<acc(4)<<i+1<<":   ";
                }

                std::cin>>saisie;

                found=saisie.find_first_of(",");
                while (found!=std::string::npos)
                {
                    saisie[found]='.';// les virgules françaises seront automatiquement transformées en point.
                    found=saisie.find_first_of(",",found+1);
                }

                std::istringstream iss(saisie);// conversion du type string en type double.
                iss>>mat[i][j];
                if(iss.fail())// lorsqu'on insère uniquement des caractère lettre, le passage dans un type numérique ==> 0 , ce qui ne déclenche aucune erreur par la suite, d'où l'instauration du iss.fail().
                {
                    good=0;
                }
                else// le cas où il n'y a pas que des caractères lettre, mais des caractères numériques suivit de lettres puis à nouveau de chiffres.
                {
                    std::ostringstream oss;
                    oss<<mat[i][j];
                    verif=oss.str();

                    if(verif.size() < saisie.size())// lors du passage dans la variable num, les caractères autres que numérique sont enlevés (ainsi que ce qu'il y a après), par conséquent la taille des 2 strings en est différente.
                    {
                        good=0;
                    }
                    else{good=1;}
                }

            }while(good==0);
        }
    }
}




void matrice::addition(const std::vector<std::vector<double> > &A , const std::vector<std::vector<double> > &B , std::vector<std::vector<double> > &C , const int &operateur)// addition/soustraction de matrices, variable operateur: 1=addition , 2=soustraction.
{
    for(unsigned int i=0;i<A.size();i++)
    {
        for(unsigned int j=0;j<A[i].size();j++)
        {
            if(operateur==1)
            {
                C[i][j]=A[i][j]+B[i][j];
            }

            if(operateur==2)
            {
                C[i][j]=A[i][j]-B[i][j];
            }
        }
    }
}




void matrice::transpose(const std::vector<std::vector<double> > &A , std::vector<std::vector<double> > &B)// transposition d'une matrice.
{
    for(unsigned int i=0;i<A.size();i++)
    {
        for(unsigned int j=0;j<A[i].size();j++)
        {
            B[j][i]=A[i][j];
        }
    }
}




void matrice::produit_nb(std::vector<std::vector<double> > &A , const double &facteur)// multiplication d'une matrice par un nombre.
{
    for(unsigned int i=0;i<A.size();i++)
    {
        for(unsigned int j=0;j<A[i].size();j++)
        {
            A[i][j]=facteur*A[i][j];
        }
    }
}




void matrice::produit_mat(const std::vector<std::vector<double> > &A , const std::vector<std::vector<double> > &B , std::vector<std::vector<double> > &C)// réalisation du produit matriciel ordinaire.
{
    unsigned int v;
    for(unsigned int i=0;i<C.size();i++)
    {
        for(unsigned int j=0;j<C[i].size();j++)// si vous êtes tentés de prendre A.size() avec B[i].size() au lieu de C.size() avec C[i].size() , vous courrez à l'erreur de segmentation...
        {
            C[i][j]=0;
            v=0;
            do
            {
                C[i][j]=C[i][j]+A[i][v]*B[v][j];
                v++;
            }while(v<B.size());// tant que le nombre de colonne de la matrice A ou le nombre de ligne de la matrice B...(ici le choix a été porté sur le nombre de ligne de la matrice B).
        }
    }
}




double matrice::determinant_carre(const std::vector<std::vector<double> > &mat)// déterminant d'une matrice carrée via la méthode de Leibniz.
{
    if(mat.size()==2){return mat[0][0]*mat[1][1]-mat[1][0]*mat[0][1];}

    double det=0,v;
    unsigned int o=0,j;
    int i;

    do
    {
        i=o,j=0,v=1;

        do
        {
            v=v*mat[i][j];
            i++;
            j++;
            if(i>=mat.size()){i=0;}// on remonte après être arrivé en bas de la matrice.
        }while(j<mat[i].size());

        det=det+v;
        o++;
    }while(o<mat.size());

    o=0;
    do
    {
	i=o,j=0,v=1;

    	do
        {
            v=v*mat[i][j];
            i--;
            j++;
            if(i<0){i=mat.size()-1;}// on redescend après être arrivé en haut de la matrice.
        }while(j<mat[i].size());

        det=det-v;
        o++;
    }while(o<mat.size());

    return det;
}




void permutation(std::vector<std::vector<double> > &mat , const unsigned int &ligne1 , const unsigned int &ligne2)// cette fonction est définie afin de permutter les lignes dans le calcul d'inverse via la méthode d'élimination de Gauss-Jordan.
{
    std::vector<double> permut(mat[ligne1].size() , 0);// plus ou moins la même façon de penser que lorsqu'on était dans la fonction de saisie, on choisit n'importe quelle ligne de la matrice (il y a le même nombre de colonne à toute les lignes).

	for(unsigned int j=0;j<mat[ligne1].size();j++)
	{
	    permut[j]=mat[ligne1][j];
	    mat[ligne1][j]=mat[ligne2][j];
	    mat[ligne2][j]=permut[j];
	}
}




double matrice::inversion(std::vector<std::vector<double> > &mat)// inversion d'une matrice (carrée).
{
	double det;
	det=determinant_carre(mat);
	if(det==0)
	{
	    return det;// si le déterminant est égal à 0 ==> pas d'inversion possible, on s'arrête là.
	}
	else
	{
        std::vector<std::vector<double> > matmat;
        matmat.resize(mat.size() , std::vector<double>(2*mat[0].size(),0));

        for(unsigned int i=0;i<mat.size();i++)
        {
            for(unsigned int j=0;j<mat[i].size();j++)
            {
                matmat[i][j]=mat[i][j];
            }
        }

        for(unsigned int i=0;i<matmat.size();i++)
        {
            for(unsigned int j=mat[i].size();j<matmat[i].size();j++)
            {
                if(j-i==mat[i].size())
                {
                    matmat[i][j]=1;
                }
                else{matmat[i][j]=0;}
            }
        }// jusqu'ici on a crée une matrice comportant le double de colonne de la matrice initiale, et on a implémenté des 1 en diagonale dans la deuxième moitié.

        unsigned int ii=0;
        unsigned int iii;
        unsigned int iiii;
        double numb3rs;
        do// début de l'application de l'élimination de Gauss-Jordan.
        {
            if(matmat[ii][ii]==0)
            {
                iii=ii;
                do
                {
                    iii++;
                }while(matmat[iii][ii]==0);

                permutation(matmat,ii,iii);// le terme de la diagonale de la première moitié est égal à zéro, comme on aura besoin de diviser par 0, on permute.
            }

            numb3rs=matmat[ii][ii];

            for(unsigned int j=0;j<matmat[ii].size();j++)
            {
                matmat[ii][j]=matmat[ii][j]/numb3rs;
            }

            iiii=1;
            iii=ii;
            do
            {
                iii++;
                if(iii==matmat.size()){iii=0;}
                iiii++;
                numb3rs=matmat[iii][ii];
                for(unsigned int j=0;j<matmat[iii].size();j++)
                {
                    matmat[iii][j]=matmat[iii][j]-(numb3rs*matmat[ii][j]);
                }
            }while(iiii<matmat.size());

            ii++;

        }while(ii<matmat.size());// fin de l'application de l'élimination de Gauss-Jordan.

	    for(unsigned int i=0;i<matmat.size();i++)// on place la deuxième moitié de la matrice matmat (qui après élimination G-J n'est plus une suite de 1 et de 0) dans la matrice initiale...
        {
	        for(unsigned int j=mat[i].size();j<matmat[i].size();j++)
	        {
        	    mat[i][j-mat[i].size()]=matmat[i][j];
	        }
        }
	}
	return det;
}




void matrice::affiche(const std::string &nom_mat, std::vector<std::vector<double> > &mat)
{
    int significatif=0;
    std::vector<bool> signe(mat[0].size(),0);//signe du plus long chiffre (par colonne).
    std::vector<double> chiffre(mat[0].size(),0);//plus long chiffre (par colonne).
    bool reel=0;

    for(unsigned int i=0;i<mat.size();i++)
    {
        for(unsigned int j=0;j<mat[i].size();j++)
        {
            if(mat[i][j]==-0){mat[i][j]=0;}// on commence par éliminer ce qui est nuisible à une bonne présentation.

            if(mat[i][j]>=0 && chiffre[j]<mat[i][j])// on répertorie les plus longs chiffres par colonne ainsi que la présence ou non d'un signe associé.
            {
                chiffre[j]=mat[i][j];
                signe[j]=0;
            }

            if(mat[i][j]<0 && chiffre[j]<-1*mat[i][j])
            {
                chiffre[j]=-1*mat[i][j];
                signe[j]=1;
            }

            if(reel==0 && mat[i][j]-floor(mat[i][j])>0.0000000000001)// on détecte si tout les chiffres sont des entier, si ce n'est pas le cas on indiquera le nombre de chiffre significatif.
            {
                reel=1;
            }
        }
    }

    if(reel==1)
    {
        std::cout<<std::endl<<std::endl<<"--> Il existera au moins un nombre qui ne sera pas un entier, choisissez un nombre de chiffre significatif (entre 0 et 10): ";

        do
        {
            significatif=entier();// on indique le nombre de chiffre significatif.
            if(significatif<0 || significatif>10)
            {
                std::cout<<std::endl;
                couleur();
                std::cout<<"->";
                couleur_fin();
                std::cout<<" Choisissez un nombre de chiffre significatif entre 0 et 10: ";
            }
        }while(significatif<0 || significatif>10);
    }

    std::cout<<std::endl<<std::endl<<"===> Matrice "<<nom_mat<<" ("<<mat.size()<<"x"<<mat[0].size()<<"):"<<std::endl<<std::endl;

    couleur();

    for(unsigned int i=0;i<mat.size();i++)
    {
        for(unsigned int j=0;j<mat[i].size();j++)
        {

            if(mat[i][j]>=0)
            {
                std::cout<<" ";
            }

            std::cout.precision(significatif);// le nombre de chiffre significatif va être prit en compte ici.
            std::cout<<std::fixed<<mat[i][j];

            if(j+1<mat[i].size())
            {
                if(chiffre[j]>=10)
                {
                    int div_1=0,div_2=0,rajout=0;
                    double unites;

                    if(mat[i][j]>=10 || mat[i][j]<=-10)
                    {
                        unites=mat[i][j];
                        do
                        {
                            unites=unites/10;
                            div_1++;
                        }while(unites>=10 || unites<=-10);
                    }

                    unites=chiffre[j];
                    do
                    {
                        unites=unites/10;
                        div_2++;
                    }while(unites>=10);

                    rajout=div_2-div_1;

                    int rajoute=0;
                    if(rajout>0)
                    {
                        do
                        {
                            std::cout<<" ";
                            rajoute++;
                        }while(rajoute<rajout);
                    }
                }

                std::cout<<"   |  ";

            }
            else
            {
                std::cout<<std::endl;
            }
        }
    }

    couleur_fin();
}

//--FIN DES METHODES--

//-------------------------------------------------------------------------------------------------------------------------------------------

//------------------------------------------------------------ Fichier: main.cpp ------------------------------------------------------------

#include <iostream>
#include <vector>// rappel même si inutile car déjà dans matrice.cpp
#include "matrice.h"


int main()
{
    std::cout<<">----------------------- OPERATIONS SUR MATRICES -----------------------<"<<std::endl<<std::endl;

    int quitter=0;//pour le "quitter" de fin.
    int choix;
    int Aligne , Acolonne , Bligne , Bcolonne;
    double facteur;
    double det;

    matrice mat;

    do//pour le "quitter" de fin.
    {
        std::cout<<"--------------------  MENU  --------------------"<<std::endl<<std::endl;

        std::cout<<"     1. Addition de 2 matrices"<<std::endl;
        std::cout<<"     2. Soustraction de 2 matrices (A-B)"<<std::endl;
        std::cout<<"     3. Produit de 2 matrices"<<std::endl;
        std::cout<<"     4. Produit d'une matrice par un nombre"<<std::endl;
        std::cout<<"     5. Transpos"<<mat.acc(2)<<"e d'une matrice"<<std::endl;
        std::cout<<"     6. D"<<mat.acc(2)<<"terminant d'une matrice carr"<<mat.acc(2)<<"e"<<std::endl;
        std::cout<<"     7. Inversion d'une matrice"<<std::endl;
        std::cout<<"     8. Division de 2 matrices (A/B)"<<std::endl<<std::endl;
        std::cout<<"     0. ) Quitter ("<<std::endl;

        std::cout<<std::endl<<"-> Choix "<<mat.acc(4);

        do
        {
            choix=mat.entier();
            if(choix<0 || choix>8)
            {
                std::cout<<std::endl;
                mat.couleur();
                std::cout<<"->";
                mat.couleur_fin();
                std::cout<<" Le choix "<<mat.acc(4)<<choix<<" n'existe pas, ressaisissez: ";
            }
        }while(choix<0 || choix>8);

        if(choix==0)
        {
            std::cout<<std::endl<<">------------------------------------------------------------<"<<std::endl<<std::endl;
            return 0;
        }

        std::cout<<std::endl;

        std::vector<std::vector<double> > mat_A;
        std::vector<std::vector<double> > mat_B;
        std::vector<std::vector<double> > mat_C;

        do
        {
            if(choix>=6)
            {
                Aligne=mat.demande("Indiquer le nombre de ligne (>=2) de votre matrice A:   ",1);
                std::cout<<std::endl;
                Acolonne=mat.demande("Indiquer le nombre de colonne (>=2) de votre matrice A: ",1);
            }
            else
            {
                Aligne=mat.demande("Indiquer le nombre de ligne (>=1) de votre matrice A:   ",0);
                std::cout<<std::endl;
                Acolonne=mat.demande("Indiquer le nombre de colonne (>=1) de votre matrice A: ",0);
            }


            if(choix<=3)
            {
                std::cout<<std::endl;
                Bligne=mat.demande("Indiquer le nombre de ligne (>=1) de votre matrice B:   ",0);
                std::cout<<std::endl;
                Bcolonne=mat.demande("Indiquer le nombre de colonne (>=1) de votre matrice B: ",0);

            }

            if(choix==8)
            {
                std::cout<<std::endl;
                Bligne=mat.demande("Indiquer le nombre de ligne (>=2) de votre matrice B:   ",1);
                std::cout<<std::endl;
                Bcolonne=mat.demande("Indiquer le nombre de colonne (>=2) de votre matrice B: ",1);

            }

            if(choix==4)
            {
                std::cout<<std::endl;
                std::cout<<"Indiquer le facteur multiplicateur:                     ";
                facteur=mat.reel();
            }

            if((choix<=2 && (Aligne!=Bligne || Acolonne!=Bcolonne)) || ((choix==3 || choix==8) && Acolonne!=Bligne) || ((choix>=6 && Aligne!=Acolonne) || (choix==8 && Bligne!=Bcolonne)))
            {
                std::cout<<std::endl;
                mat.couleur();
                std::cout<<"->";
                mat.couleur_fin();

                if(choix<=2 && (Aligne!=Bligne || Acolonne!=Bcolonne))
                {
                    std::cout<<" Le nombre de ligne et de colonne de la matrice A doit "<<mat.acc(3)<<"tre "<<mat.acc(2)<<"gal au nombre de ligne et de colonne de la matrice B. Ressaisissez:"<<std::endl<<std::endl;
                }

                if((choix==3 || choix==8) && Acolonne!=Bligne)
                {
                    std::cout<<" Le nombre de colonne de la matrice A doit "<<mat.acc(3)<<"tre "<<mat.acc(2)<<"gal au nombre de ligne de la matrice B. Ressaisissez:"<<std::endl<<std::endl;
                }

                if((choix>=6 && Aligne!=Acolonne) || (choix==8 && Bligne!=Bcolonne))
                {
                    if(choix!=8)
                    {
                        std::cout<<" La matrice doit "<<mat.acc(3)<<"tre carr"<<mat.acc(2)<<"e. Ressaisissez:"<<std::endl<<std::endl;
                    }
                    else
                    {
                        std::cout<<" Les matrices doivent "<<mat.acc(3)<<"tre carr"<<mat.acc(2)<<"es. Ressaisissez:"<<std::endl<<std::endl;
                    }
                }
            }

        }while(((choix==3 || choix==8) && Acolonne!=Bligne) || (choix<=2 && (Aligne!=Bligne || Acolonne!=Bcolonne)) || ((choix>=6 && Aligne!=Acolonne) || (choix==8 && Bligne!=Bcolonne)));


        mat_A.resize(Aligne , std::vector<double>(Acolonne,0));
        mat.saisie("A",mat_A);



        if(choix<=3 || choix==8)
        {

            mat_B.resize(Bligne , std::vector<double>(Bcolonne,0));
            mat.saisie("B",mat_B);
        }


        if(choix<=2)
        {
            mat_C.resize(Aligne , std::vector<double>(Acolonne,0));

            std::string nom="C";
            if(choix==2)
            {
                nom=nom+" (A-B)";
            }

            mat.addition(mat_A,mat_B,mat_C,choix);
            mat.affiche(nom,mat_C);
        }

        if(choix==3)
        {
            mat_C.resize(Aligne , std::vector<double>(Bcolonne,0));


            mat.produit_mat(mat_A,mat_B,mat_C);
            mat.affiche("C",mat_C);
        }

        if(choix==4)
        {
            mat.produit_nb(mat_A,facteur);
            mat.affiche("B",mat_A);
        }

        if(choix==5)
        {
            mat_B.resize(Acolonne , std::vector<double>(Aligne,0));

            mat.transpose(mat_A,mat_B);
            mat.affiche("transposition A",mat_B);
        }

        if(choix==6)
        {
            std::cout<<std::endl<<std::endl<<"Le d"<<mat.acc(2)<<"terminant de la matrice est "<<mat.determinant_carre(mat_A);
        }

        if(choix==7)
        {
            det=mat.inversion(mat_A);
            if(det!=0){mat.affiche("inverse A",mat_A);}
            else
            {
                std::cout<<std::endl<<std::endl<<"Le d"<<mat.acc(2)<<"terminant de la matrice est "<<mat.acc(2)<<"gal "<<mat.acc(1)<<" 0, il est donc impossible de l'inverser."<<std::endl;
            }
        }

        if(choix==8)
        {
            det=mat.inversion(mat_B);

            if(det!=0)
            {
                mat_C.resize(Aligne , std::vector<double>(Bcolonne,0));
                mat.produit_mat(mat_A,mat_B,mat_C);
                mat.affiche("C",mat_C);
            }
            else
            {
                std::cout<<std::endl<<std::endl<<"Le d"<<mat.acc(2)<<"terminant de la matrice B est "<<mat.acc(2)<<"gal "<<mat.acc(1)<<" 0, il est donc impossible de diviser."<<std::endl;
            }
        }

        std::cout<<std::endl<<std::endl<<">------------------------------------------------------------<"<<std::endl;
        std::cout<<std::endl<<"--> Faire un autre calcul de matrice? (1=oui/0=non): ";
        quitter=mat.entier();
        std::cout<<std::endl<<">------------------------------------------------------------<"<<std::endl<<std::endl;

    }while(quitter>0);
    // pas de PAUSE car inutile ici.
    return 0;
}

//-------------------------------------------------------------------------------------------------------------------------------------------



 Historique

31 janvier 2010 19:47:42 :
Rajout d'une capture d'écran.
31 janvier 2010 20:23:39 :
Modification de la description...
09 février 2010 01:41:43 :
-Utilisation de la STL -Gestion des erreurs -Enlèvement du using namespace -Ajout d'une solution de portabilité -...etc
09 février 2010 02:46:36 :
Modification d'une petite erreur.
09 février 2010 12:32:21 :
Rajout du .zip
09 février 2010 13:25:21 :
Rajout du HANDLE dans la fonction couleur_fin.
09 février 2010 14:34:04 :
Changement du screenshot
09 février 2010 14:39:39 :
Changement de screenshot
09 février 2010 20:25:07 :
Rajout d'un lien en conclusion pour les exécutables.
10 février 2010 00:18:52 :
modification du contenu de 2 strings
10 février 2010 00:53:17 :
Rectification d'une erreur texte.
12 février 2010 18:18:18 :
Rajout d'un traitement d'erreurs dans la fonction de saisie (oubli) et modification des demandes dans le main.
12 février 2010 18:27:25 :
Remplacement du screenshot
17 février 2010 14:35:49 :
Modification du contenu de 2 strings.
20 février 2010 15:03:08 :
Modification sur la façon de traiter les erreurs de saisie. Rajout d'une "note" dans le main qui ne s'affiche qu'une seule fois. Mise à jour du screenshot.
27 février 2010 17:27:45 :
Modification de la fonction couleur_fin pour système windows.
11 mars 2010 18:20:31 :
Refonte des fonctions de traitement d'erreur de saisie + réorganisation de déclaration de certaines variables.
28 avril 2010 19:55:29 :
Modification d'un bug sévissant dans les choix 1 et 2 lors de la saisie d'un nombre de ligne différent de celui des colonnes.

 Sources du même auteur

Source avec une capture CALCUL DE VARIANCE
Source avec une capture CALCUL D'INCERTITUDE

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CLASS MATRICE C++ par elkasimi2007
Source avec Zip Source avec une capture BOITE A OUTILS MATHÉMATIQUES POUR L'ALGÈBRE LINÉAIRE ET L'... par BOLLOTD
LES OPÉRATIONS DE LA LISTE CHAINÉE par smaili
Source avec Zip OPERATION SUR LES MATRICES CARREES AVEC CLASSE GENERIQUE par chouhad
Source avec Zip PROJET PRODUIT par totama

Commentaires et avis

Commentaire de CptPingu le 31/01/2010 20:49:33 administrateur CS

Ce n'est pas un code que je recommenderais.
- Non séparation du code en plusieurs fichiers (aisément réalisable)
- Non utilisation de classe ou de redéfinition d'opérateurs, qui sont adaptés pour ce cas.
- Utilisation d'un using namespace std. Beurk ! Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Utilisation d'un type avec **, au lieu d'utiliser la STL
- Non gestion des erreurs de flux d'entrée (si je tape n'importe quoi au lien d'entrée un nombre, ton programme va pas apprécier). On le gère via std::cin.fail(), std::cin.clear et std::cin.ignore.
- include <string> inutile, car déjà inclu dans iostream.
- Non à rallonge.

Pourquoi utiliser du C++, si tu n'exploites aucun des avantages de ce langage ? Autant le faire en C.

Il n'y a aucun raison, pour ce code ci, que la source sous Linux et Windows diffère. Les quelques détails d'affichage, peu utile à cette source devraient être retirés. Si tu perds la portabilité à cause d'une fonctionnalité, demande toi toujours avant, si celle-ci vaut la peine d'être introduite.

Commentaire de Minilogus le 31/01/2010 23:19:36

Bonjour, merci pour le commentaire.
"Ce n'est pas un code que je recommenderais." Je pense qu'ont en a rien à faire de cette phrase un peu provocatrice....

Pour tout le reste je te remercie des conseils et vais tenter modifier le code en conséquence (ton portfolio est très instructif ^^ pour le std).

En revanche pour le STL, c'est pas que je le boude, mais si j'utilise std::vector, il faudra que je fournisse une des 2 valeurs (ligne ou colonne) à la compilation... (du moins c'est ce qu'il me semble). N'est-ce pas un peu contraignant?

Commentaire de CptPingu le 31/01/2010 23:41:16 administrateur CS

> mais si j'utilise std::vector, il faudra que je fournisse une des 2 valeurs (ligne ou colonne) à la compilation
Absolument pas. Tu peux faire un std::vector< std::vector<int> >, tout est dynamique
En revanche, un vector de vector c'est moyen pour les perfs (même si ce n'est pas dramatique), raison pour laquelle, il existe le boost::multi_array (petite contrainte sur le fait qu'il te faut inclure boost).
La meilleur solution, si tu sais que les dimensions de tes matrices ne vont pas changer, est de créer une classe StaticMultiArray templatée qui encapsule un tableau à double dimension (la classe se chargeant de la vérification des bornes, des allocations mémoires, etc...), ou alors un std::vector d'une classe templatée encapsulant un tableaux fixe.

> Je pense qu'ont en a rien à faire de cette phrase un peu provocatrice....
Ce n'était pas une phrase provocatrice. Le code doit être encore retravaillé, et sous plusieurs aspects:
- Pédagogique: Absence totale de commentaire ou d'explication technique
- Utilisation du C++ comme du C (Quand on sait que l'on peut créer une classe "Matrix" et redéfinir tous les opérateurs pour l'utiliser comme ceci: "Matrix a, b, c; c = a * b; std::cout << c << std::endl;", c'est vraiment dommage de ne pas l'exploiter).
- Améliorer la modularisation du code. En moyenne, une fonction ne devrait pas dépasser 30 lignes. Si c'est le cas, alors la fonction devrait être découpée elle même en plusieurs sous fonctions. Avec l'inlining, il n'y a pas de différence de performance, mais la lisibilité et la maintenabilité s'en trouvent accrue.

La raison pour laquelle j'ai dit cela, c'est qu'en l'état (pour l'instant), ce n'est pas un exemple à donner aux débutant.

Commentaire de Minilogus le 31/01/2010 23:51:15

Merci pour toutes ces précisions très utiles, par contre le C en lui même je n'y connais pas grand chose (raison pour laquelle je le fait en C++ ^^).

Commentaire de CptPingu le 01/02/2010 01:20:03 administrateur CS

Voici deux exemples que j'ai trouvé sur ce site. Ils ne sont pas extra-ordinaire (quoi que le deuxième est juste peu propre conceptuellement, mais reste pas trop mal). Ca te donnera une petite idée des avantages réel du C++:
http://www.cppfrance.com/codes/MATRICE-AVEC-TEMPLATE_45871.aspx
http://www.cppfrance.com/codes/CLASS-MATRICE-AVEC-TEMPLATE_45950.aspx

Commentaire de Minilogus le 09/02/2010 02:18:36

Voilà, j'ai fait des modifications.

Commentaire de tagtog le 08/03/2010 16:36:06

Merci,
mais le choix 9 n'est pas prise en charge ^^.

Commentaire de Minilogus le 08/03/2010 16:42:32

Bonjour,

Je te remercie de ton intervention TAGTOG, mais je ne voit pas de quel choix tu fait mention. En effet mon programme propose 8 choix qui, pour autant que j'ai pu le constater, fonctionnent.

Ou alors c'était de l'humour... ^^.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

matrices de complexes [ par piruli ] bonjournous avons un projet a rendre pour l'université celui ci étant de créer des matrices de nombres complexes et d'effectuer des opérations dessus. matrice inverse [ par vladisback ] bonjour, j'utilise pour mes transformation des matrices 4x3: Xx Yx Zx Tx Xy Yy Zy Ty Xz Yz Zz Tz (Identique au matrice directX excepté une quatrieme produit de deux matrices [ par zouba123 ] bonjour ;je veux faire un programme qui fait la multiplication entre deux matrice. la première matrice fixe et la deuxième matrice entré par l'utilis Calcul parallèle de l'inverse d'une matrice en utilisant le langage C et PVM [ par kaisbhh ] Salut à tous! je voudrais réaliser un bout de code en langage C qui inclut la bibliothèque pvm3.h et qui permet de calculer l'inverse d'une matrice pe matrices et c++ [ par anne-lise ] Bonjour, je debute en c++ et j'ai quelques problemes avec les tableaux... D'abord, y a t'il un moyen d'avoir pour resultat d'une fonction un tableau ? Probleme Exception win32 non gérée [ par sylvainsmias ] Salut &#224; tous, j'ai probl&#232;me qui date de 2 ans je crois, voil&#224; je vous en donne le diag: Le code tout d'abord: &nbsp;&nbsp;&nbsp; &nbsp Fonction inverse string [ par deck_bsd ] Bonjour, Juste une petite question, j'avai vu je ne sais plus ou qu'il existait une fonction en c qui inversait les caract&#232;res d'un texte. Oui c produit d'int quand depassement du 2^32. [ par kaervas ] Bonjour a tous,Mon code, a un moment donne, fait le produit de deux int, j'aimerais faire une gestion d'erreur (soit un simple exit(0)) lorque le resu Librairie matrices [ par caribou2001 ] Bonjour &#224; tous, Je dois d&#233;velopper un programme traitant des images, pour cela il est &#233;videmment facile d'utiliser les propri&#233;t&# transformer Cstring en int ou l'inverse [ par lunatic34 ] salut je voudrais savoir s'il vous plais mettre dans une variable CString une variable int.ex: CString mots;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int va


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,468 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales