Monożenie macierzy
Ostatnio zmodyfikowano 2019-10-28 20:00
Mikelolo Temat założony przez niniejszego użytkownika |
Monożenie macierzy » 2019-10-28 10:04:08 Witam, robie sobie program gdzie mnożę dwie losowe macierze (A[n][m],B[m][1] ) i ma mi to dac macierz C[n][1]. Macierze mi ładnie się pokazują jednak niestety nie mnoży mi poprawnie w ostatnim punkcie. Nie wiem co mam zrobić. Poniżej mój kod: #include <iostream> #include <time.h> #include <math.h> #include <stdlib.h> #include <iomanip>
using namespace std;
int main() { cout << "Program mnozy 2 macieze przez ciebie - liczby pseldolosowe" << '\n'; short int m, n, o, i, j, s, k; cout << "Macierz 1" << '\n'; cout << "Podaj liczbe wierszy dla 1 maciezy" << '\n'; cin >> n; cin.ignore(); cout << "Podaj liczbe kolumn dla 1 maciezy" << '\n'; cin >> m; cin.ignore(); cout << '\n'; int ** A = new int *[ n ]; for( int i = 0; i < n; i++ ) { A[ i ] = new int[ m ]; for( int j = 0; j < m; j++ ) { A[ i ][ j ] = rand() % 5; cout << A[ i ][ j ] << " "; } cout << "" << '\n'; } cout << "Macierz 2" << '\n'; int ** B = new int *[ m ]; for( int i = 0; i < m; i++ ) { B[ i ] = new int[ o ]; o = 0; for( int j = 0; j <= o; j++ ) { B[ i ][ j ] = rand() % 5; cout << B[ i ][ j ] << " "; } cout << "" << '\n'; } cout << "Mnozenie maciezy " << '\n'; int ** C = new int *[ n ]; for( int i = 0; i < n; i++ ) { C[ i ] = new int[ o ]; for( int j = 0; j < o; j++ ) { C[ i ][ j ] = 0; } for( k = 0; k < m; k++ ) C[ i ][ j ] = C[ i ][ j ] + A[ i ][ k ] * B[ k ][ j ]; { cout << C[ i ][ j ] << " "; } cout << "" << '\n'; } return 0; } |
|
pekfos |
» 2019-10-28 17:39:58 Wszystkie użycia zmiennej o są błędne. |
|
Mikelolo Temat założony przez niniejszego użytkownika |
» 2019-10-28 18:53:47 Jakby umiał Pan/Pani dokładniej wytłumaczyć na czym polega błąd bo nie rozumiem . |
|
pekfos |
» 2019-10-28 19:30:32 Pierwsze użycie o jest błędne, bo zmienna jest niezainicjalizowana. Potem przypisujesz jej 0, co nie ma żadnego sensu, a to zrównoważasz błędnym warunkiem w następnej pętli używającej o. Zerowa wartość jest określona jako błędna w sposób demokratyczny - przypisanie zera i pętla z warunkiem j <= o to 2 głosy że zero jest poprawne, dwie alokacje tablicy zerowej długości i pętla j < o to 3 głosy że zero jest błędne. To pomijając najbardziej oczywisty argument, że m, n i o opisują rozmiary macierzy, więc powinny to robić spójnie. Kolejne błędy maskuje zły dobór zakresu widoczności zmiennych short int m, n, o, i, j, s, k;
Nie ma powodu, by tworzyć wszystkie zmienne na początku, skoro i tak zamierzasz je redefiniować w mniejszych zakresach. for( int j = 0; j < o; j++ ) { C[ i ][ j ] = 0; } for( k = 0; k < m; k++ ) C[ i ][ j ] = C[ i ][ j ] + A[ i ][ k ] * B[ k ][ j ];
|
|
Mikelolo Temat założony przez niniejszego użytkownika |
» 2019-10-28 20:00:36 Poprawiłem i udało się, działa. Bardzo dziekuje Panu/Pani. Pozdrawiam :D |
|
« 1 » |