Programowanie w języku C/C++ » FAQ

Mnożenie macierzy

Mnożenie macierzy kwadratowych , programik w C++.

/**********************************/
/* dbe_benio                      */
/* Mnożenie macierzy kwadratowych */
/* o rozmiarze N                  */
/**********************************/
//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
//---------------------------------------------------------------------------
#include <iostream>
 
using namespace std;
 
int rozmiar;
long **tabA, **tabB, **tabC;
 
void wprowadz(long **tab);
void wyswietl(long **tab);
void mnozenie();
 
int main(int argc, char* argv[])
{
cout << "Wprowadz rozmiar macierzy kwadratowych ktore chcesz pomnozyc: ";
cin >> rozmiar;
 
tabA = new long* [rozmiar];
for (unsigned i = 0; i < rozmiar; ++i)
tabA[i] = new long [rozmiar];
 
tabB = new long* [rozmiar];
for (unsigned i = 0; i < rozmiar; ++i)
tabB[i] = new long [rozmiar];
 
tabC = new long* [rozmiar];
for (unsigned i = 0; i < rozmiar; ++i)
tabC[i] = new long [rozmiar];
 
cout << "\nWprowdzaj wartosci macierzy A wierszami i potwierdzaj ENTEREM " << endl;
wprowadz(tabA);
cout << "\nWprowdzaj wartosci macierzy B wierszami i potwierdzaj ENTEREM " << endl;
wprowadz(tabB);
cout << "\nMacierz A: " << endl;
wyswietl(tabA);
cout << "\nMacierz B: " << endl;
wyswietl(tabB);
cout << "\nIloczynem macierzy A i B jest macierz C: " << endl;
mnozenie();
wyswietl(tabC);
 
for (unsigned i = 0; i < rozmiar; ++i)
delete[] tabA[i];
delete[] tabA;
 
for (unsigned i = 0; i < rozmiar; ++i)
delete[] tabB[i];
delete[] tabB;
 
for (unsigned i = 0; i < rozmiar; ++i)
delete[] tabC[i];
delete[] tabC;
 
cout << endl;
 
system("pause"); 
return 0;
}
 
//----------------------------------------------
void wprowadz(long **tab)
{
 for(int a=0; a<rozmiar; a++)
 {
 cout << "Wiersz " << a+1 << ": " << endl;
     for(int b=0; b<rozmiar; b++)
     {
        cin >> tab[a][b];
     }
 }
}
//-----------------------------------------------
void wyswietl(long **tab)
{
 for(int n=0; n<rozmiar; n++)
 {
        for(int m=0; m<rozmiar; m++)
        {
        cout << tab[n][m] << "  ";
        }
 cout << "\n\n";
 }
}
//-----------------------------------------------
void mnozenie()
{
 for(int i=0; i<rozmiar; i++)
 {
   for(int j=0; j<rozmiar; j++)
     {
       tabC[i][j]=0;
         for(int k=0; k<rozmiar; k++)
          {
           tabC[i][j] += tabA[i][k] * tabB[k][j];
         }
     }
 }
}
//------------------------------------------------


1 komentarz

Smiglo 2006-04-02 05:22

Skoro już C++, to wypadałoby to obiektowo zrobić, macierze to jest szkoleniowe ćwiczenie na przeciążanie operatorów.
Poza tym mnożymy nie tylko macierze o identycznych rozmiarach - warunek:
ilość kolumn w pierwszej = ilość wierszy w drugiej (mnożenie macierzy nie jest przemienne)