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

Mnożenie tablic o podanym wymiarze z wpisanego, losowego przedziału liczb

Ostatnio zmodyfikowano 2020-03-10 22:53
Autor Wiadomość
matt21mcr
Temat założony przez niniejszego użytkownika
Mnożenie tablic o podanym wymiarze z wpisanego, losowego przedziału liczb
» 2020-03-10 09:15:09
Witam,

Mam problem. Napisałem program, który prosi o rozmiar macierzy oraz maksymalną liczbę losową, którą będzie wypełniana macierz 1 i druga, natomiast wynik końcowy nie jest taki, jaki być powinien po mnożeniu macierzy.

C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;
int main()
{
   
    srand( time( NULL ) );
    cout << "Podaj wymiary pierwszej tablicy(ilosc wierszy, ilosc kolumn):\n";
    int TWier1, TKol1, za;
    cin >> TWier1 >> TKol1;
    int taba[ TWier1 ][ TKol1 ];
   
    cout << "Podaj maksymalny przedzial dla pierwszej maciezy:\n";
    cin >> za;
   
    //(rand()%((b-a)+1))+a;
    //Random r = new Random();
   
   
    for( int i = 0; i < TWier1; i++ )
    {
        for( int j = 0; j < TKol1; j++ )
        {
            taba[ i ][ j ] = rand() % za;
            //cout << taba[i][j]<<endl;
        }
    }
   
    for( int i = 0; i < TWier1; i++ )
    {
        for( int j = 0; j < TKol1; j++ )
        {
            cout << taba[ i ][ j ] << " ";
        }
        cout << "\n";
    }
   
   
    cout << "Podaj wymiary drugiej tablicy (ilosc wierszy, ilosc kolumn):\n";
    int TWier2, TKol2, zw;
    cin >> TWier2 >> TKol2;
    int tabb[ TWier2 ][ TKol2 ];
   
    for( int i = 0; i < TWier2; i++ )
    {
        for( int j = 0; j < TKol2; j++ )
        {
            taba[ i ][ j ] = rand() % za;
            //cout << taba[i][j]<<endl;
        }
    }
   
    for( int i = 0; i < TWier2; i++ )
    {
        for( int j = 0; j < TKol2; j++ )
        {
            cout << tabb[ i ][ j ] << " ";
        }
        cout << "\n";
    }
   
    int tabc[ TWier1 ][ TKol2 ];
    for( int i = 0; i < TWier1; i++ )
    {
        for( int j = 0; j < TKol2; j++ )
        {
            tabc[ i ][ j ] = 0;
        }
    }
   
    for( int i = 0; i < TWier1; i++ )
    {
        for( int j = 0; j < TKol2; j++ )
        {
            for( int k = 0; k < TWier1; k++ )
            {
               
                tabc[ i ][ j ] += taba[ k ][ j ] * tabb[ i ][ k ];
               
            }
        }
    }
   
    for( int i = 0; i < TWier1; i++ )
    {
        for( int j = 0; j < TKol2; j++ )
        {
            cout << tabc[ i ][ j ] << " ";
        }
        cout << "\n";
    }
   
    system( "pause" );
    return 0;
}

Czy ktokolwiek może wie, gdzie popełniłem błąd?
P-176339
nanoant20
» 2020-03-10 13:24:47
wynik końcowy nie jest taki, jaki być powinien po mnożeniu macierzy
Czynnikiem, który powoduje błędny wynik może być:
1. Jeśli chcesz tworzyć tablice z określonymi przez użytkownika rozmiarami to musisz tworzyć je dynamicznie.
2. Rozmiary tych macierzy nie mogą być dowolne, warunek jest taki, że macierz M1  musi posiadać w wierszu tyle samo elementów, co macierz M2 ma ich w kolumnie.

//EDIT
C/C++
cout << "Podaj wymiary drugiej tablicy (ilosc wierszy, ilosc kolumn):\n";
int TWier2, TKol2, zw;
cin >> TWier2 >> TKol2;
int tabb[ TWier2 ][ TKol2 ];

for( int i = 0; i < TWier2; i++ )
{
    for( int j = 0; j < TKol2; j++ )
    {
        taba[ i ][ j ] = rand() % za; // <--- TU TRZEBA LOSOWAĆ dla TABB
        //cout << taba[i][j]<<endl;
    }
}

3. Zakres losowanych liczb jest od ZERA co jest błędem, chyba że chcesz mnożyć przez ZERO

tabc[ i ][ j ] += taba[ k ][ j ] * tabb[ i ][ k ];

ten zapis jest błędny, powinno być:
tabc[ i ][ j ] += taba[ i ][ k ] * tabb[ k ][ j ];
P-176340
pekfos
» 2020-03-10 22:53:07
tabb jest niezainicjalizowane. Przypisujesz dwa razy do taba.
P-176343
« 1 »
  Strona 1 z 1