Multiplication matrices

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 750 fois - Téléchargée 33 fois

Contenu du snippet

multiplication de 2 matrices

Source / Exemple :


#pragma hdrstop

#include <conio.h>
#include <iomanip.h>
#include <iostream.h>
#include <stdlib.h>

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

int **multiplieMatrice(int **matriceA, int colonnesA, int lignesA, int **matriceB, int colonnesB, int lignesB);

#pragma argsused
int main(int argc, char* argv[])
    {
    int lignes1;
    int colonnes1 ;
    int lignes2 ;
    int colonnes2 ;
    int **m1 ;
    int **m2 ;
    int **m3 ;
    int i, j ;

    do
        {
        cout << "1ere matrice : " << endl ;
        cout << "combien de lignes ? " ;
        cin >> lignes1 ;

        cout << endl << "combien de colonnes ? " ;
        cin >> colonnes1 ;

        cout << endl << "2eme matrice : " << endl ;
        cout << "combien de lignes ? " ;
        cin >> lignes2 ;

        cout << endl << "combien de colonnes ? " ;
        cin >> colonnes2 ;

        if (colonnes1!= lignes2)
                cout << "erreur, les matrices ne peuvent pas etre multipliees!!! " << endl ;

        }
    while (colonnes1 != lignes2) ;

    // si les matrices sont ok : colonnes1 == lignes2

    m1 = (int**)malloc(lignes1 * sizeof(int*)) ;
    m2 = (int**)malloc(lignes2 * sizeof(int*)) ;

    if (!m1)
        {
        free(m1) ;
        cout << endl << "erreur d'alloc 1ere matrice!!! " ;
        return NULL ;
        }

    for (i=0 ; i<lignes1 ; i++)
        {
        m1[i] = (int*)malloc(colonnes1 * sizeof(int)) ;

        if (!m1[i])
            {
            free(m1) ;
            cout << endl << "erreur d'alloc lignes!!! " ;
            return NULL ;
            }
        }

     if (!m2)
        {
        free(m2) ;
        cout << endl << "erreur d'alloc 1ere matrice!!! " ;
        return NULL ;
        }

     for (i=0 ; i<lignes2 ; i++)
        {
        m2[i] = (int*)malloc(colonnes2 * sizeof(int)) ;

        if (!m2[i])
                {
                free(m2) ;
                cout << endl << "erreur d'alloc lignes!!! " ;
                return NULL ;
                }
        }

    cout << endl << "1ere matrice : " << endl ;

    for (i=0 ; i<lignes1 ; i++)
        {
        for (j=0 ; j<colonnes1 ; j++)
                {
                cout << endl << "nombre en place " << i << " ; " << j << " ? " ;
                cin >> m1[i][j] ;
                }
        }

    cout << endl ;

    // affichage 1ere matrice
    for (i=0 ; i<lignes1 ; i++)
         {
         for (j=0 ; j<colonnes1 ; j++)
                {
                cout << setw(3) << m1[i][j] ;
                }
         cout << endl ;
         }

    cout << endl << "2eme matrice : " << endl ;

    for (i=0 ; i<lignes2 ; i++)
        {
        for (j=0 ; j<colonnes2 ; j++)
                {
                cout << "nombre en place " << i << " ; " << j << " ? " ;
                cin >> m2[i][j] ;
                }
        }

    cout << endl ;

    // affichage 2eme matrice
    for (i=0 ; i<lignes2 ; i++)
         {
         for (j=0 ; j<colonnes2 ; j++)
                cout << setw(3) << m2[i][j] ;
         cout << endl ;
         }

    // multiplication des matrices

    m3 = multiplieMatrice(m1, colonnes1, lignes1, m2, colonnes2, lignes2) ;
    
    cout << endl << "Multiplication des matrices......" << endl ;
    cout << endl << "Matrice Resultat : " << endl ;

    for (i=0 ; i<lignes1 ; i++)
        {
        for (j=0 ; j<colonnes2 ; j++)
            cout << setw(3) << m3[i][j] ;
        cout << endl ;
        }

    free(m1) ;
    free(m2) ;
    free(m3) ;

    cout << endl << endl << "appuyer sur une touche pour quitter..." ;
    getch () ;
    return 0 ;

    }
//---------------------------------------------------------------------------

// fonction multiplication des 2 matrices

int **multiplieMatrice(int **matriceA, int colonnesA, int lignesA, int **matriceB, int colonnesB, int lignesB)
    {
    int **matriceR ;
    int i, j, k ;

    matriceR = (int**)malloc(lignesA * sizeof(int*)) ;

    if (!matriceR)
        {
        free(matriceR) ;
        cout << endl << "erreur d'alloc matrice reponse !!! " ;
        return NULL ;
        }

    for (i=0 ; i<lignesA ; i++)
        {
        matriceR[i] = (int*)malloc(colonnesB * sizeof(int)) ;

        if (!matriceR[i])
            {
            free(matriceR) ;
            cout << endl << "erreur d'alloc lignes!!! " ;
            return NULL ;
            }
        }

    for (i=0 ; i<lignesA; i++)
        for (j=0 ; j<colonnesB; j++)
            {
            matriceR[i][j] = 0 ;

            for (k=0 ; k<colonnesA ; k++)
                matriceR[i][j] += matriceA[i][k] * matriceB[k][j] ;
            }
    return matriceR ;
    }

A voir également

Ajouter un commentaire

Commentaires

Galett
Messages postés
115
Date d'inscription
jeudi 7 février 2002
Statut
Membre
Dernière intervention
21 mai 2005
-
tiens un compteur de désallocation, c'est pas bête, voilà une info qui pourrait me servir :o)
cs_GoldenEye
Messages postés
527
Date d'inscription
vendredi 14 septembre 2001
Statut
Membre
Dernière intervention
6 octobre 2008
2 -
C'est pas récursif clap clap clap :-))
Fais attention au mélange C/C++, bcp de puristes te le reprocheront et ça diminue la lisibilité du code voire même la portabibilité. Comme le dis Kaid révise bien les allocations mémoires. Tout ce qui est alloué à un moment doit être désalloué. Pour t'aider tu peux tout simplement utiliser un compteur d'allocation et un compteur de désallocation qui te permettront de savoir où tu en est.
loraine9999
Messages postés
6
Date d'inscription
dimanche 12 janvier 2003
Statut
Membre
Dernière intervention
23 janvier 2003
-
ouoauauouaaaaaaaaaaah merci pour tous ces bons conseils ;-)

mon compilateur c'est borland builder C++ version6
on mélange du C et du C++...
cs_nEUrOne
Messages postés
41
Date d'inscription
dimanche 17 novembre 2002
Statut
Membre
Dernière intervention
14 avril 2004
-
en tou cas, c'est bien indenté (emacs il me semble)
cs_Kaid
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006
-
Pour finir (oui ca fait beaucoup), tu as des fuites mémoire:

1- m1 = (int**)malloc(lignes1 * sizeof(int*)) ;
2- m1[INDEX] = (int*)malloc(colonnes1 * sizeof(int)) ;
3- L'étape qu'il te manque -> libérer les tableaux allouer par 2
4- free(m1);

for(int i=0;i<colonnes1;i++)
free(m1[i]);

free(m1);

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.