Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Monożenie macierzy

Ostatnio zmodyfikowano 2019-10-28 20:00
Autor Wiadomość
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:
C/C++
#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;
}
P-175453
pekfos
» 2019-10-28 17:39:58
Wszystkie użycia zmiennej o są błędne.
P-175456
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 .
P-175458
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
C/C++
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.
C/C++
for( int j = 0; j < o; j++ ) // `j` widoczne tylko w tej pętli
{
    C[ i ][ j ] = 0;
}
for( k = 0; k < m; k++ ) // Czemu nie `int k`?
     C[ i ][ j ] = C[ i ][ j ] + A[ i ][ k ] * B[ k ][ j ]; // A te `j` skąd?

P-175460
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
P-175462
« 1 »
  Strona 1 z 1