Jakiś czas temu pisałem program mnożący macierze. Znajdziesz go poniżej wraz z dokłdanym zaznaczeniem co i w którym miejscu się dzieje.
Zacznijmy od początku.
Tablice w C++ to zarezerwowane miejsce w pamięci, które nazwijmy to niefahowo jest prostokątnym, poziomym elementem. Aby zrobić tablicę dwuwymiarową z dynamicznym przydziałem pamięci musisz skorzystać ze wskaźników, ponieważ musimy połączyć ze sobą nasze "prostokąty", które dla nas po połączeniu będą tablicą dwuwymiarową. Dodam, że w pamięci dalej pozostają poziomymi prostokątami, które gdzieś tam się znajdują niekonicznie obok siebie.
Poprzez wskaźnik, którego symbolem jest gwiazdka (*) odwołujesz się do adresu w pamięci, w którym przechowywany jest każdy z naszych "prostokątów".
PS. Napisanie tego to prosta sprawa, ale wytłumaczenie...hmm z tym już dużo gorzej. W razie niejasności postaram się odpowiedzieć na Twoje pytania ;)
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int **A, **B, **C;
int k1, w1;
int k2, w2;
int w3, k3;
int i, j, k, s;
// odczytujemy wymiary macierzy
cout << "Wprowadz ilosc wierszy macierzy A:" << endl;
cin >> w1;
cout << "Wprowadz ilosc kolumn macierzy A:" << endl;
cin >> k1;
cout << "Wprowadz ilosc wierszy macierzy B:" << endl;
cin >> w2;
cout << "Wprowadz ilosc kolumn macierzy B:" << endl;
cin >> k2;
if (k1 != w2)
cout << "Mnozenie macierzy niemozliwe";
else {
// tworzymy macierze o odpowiednich rozmiarach
//Macierz A
A = new int *[w1];
for (i = 0; i < k1; i++)
{
A[i] = new int[k1];
}
//Macierz B
B = new int *[w2];
for (i = 0; i < k2; i++)
{
B[i] = new int[k2];
}
//Macierz C
C = new int *[w1];
w3 = w1;
k3 = k2;
for (int i = 0; i < k3; i++)
{
C[i] = new int[k3];
}
cout << "Wprowadz dane macierzy A" << endl;
// odczytujemy dane dla macierzy A
for (i = 0; i < w1; i++)
for (j = 0; j < k1; j++)
cin >> A[i][j];
cout << "Wprowadz dane macierzy B" << endl;
// odczytujemy dane dla macierzy B
for (i = 0; i < w2; i++)
for (j = 0; j < k2; j++)
cin >> B[i][j];
cout << endl;
cout << "Mnozymy:" << endl;
// mnozymy macierz A przez B i wynik umieszczamy w C
for (i = 0; i < w3; i++)
{
for (j = 0; j < k3; j++)
{
s = 0;
for (k = 0; k < w1; k++)
{
s += A[i][k] * B[k][j];
C[i][j] = s;
}
}
}
// wyprowadzamy wynik mnozenia z C
cout << "C = A x B:\n";
for (i = 0; i < w3; i++)
{
for (j = 0; j < k3; j++) cout << setw(6) << C[i][j];
cout << endl;
}
// zwalniamy pamiec zajeta przez macierze
for (i = 0; i < k1; i++)
delete[] A[i];
for (i = 0; i < k2; i++)
delete[] B[i];
for (int i = 0; i < k3; i++)
delete[] C[i];
delete[] A, B, C;
}
getchar();
cin.ignore();
return 0;
}