Mnożenie macierzy

0

Problem z mnożeniem macierzy wyglada tak że macierz wynikowa posiada poprawne waktosci tylko wpierwszej kolumnie, reszta to toalne bzdety, wydaje mi sie ze funkcja mnozaca macierze jest wporzadku bede wdzieczny za wskazanie bledu.

 #include <iostream>

using namespace std;

void nowa_tablica(int **&tab_wsk, int tab_wiersze, int tab_kolumny){
     
    tab_wsk = new int*[tab_wiersze];
    
    for(int i=0; i<tab_wiersze; i++)
    {
        tab_wsk[i]= new int[tab_kolumny];
    }
}    

void wypelnij_tablice (int **&tab_wsk, int tab_wiersze, int tab_kolumny){
     
     for(int i=0; i<tab_wiersze; i++)
             {           cout<<endl;
           
                         for(int j=0; j<tab_kolumny; j++)
                           { 
                             //tab_wsk[i][j]=rand()/100;
                             cin>>tab_wsk[i][j];
                             
                             cout<<tab_wsk[i][j]<<" \t";
                            
                               }
                               }
}



void usuwacz (int **&tab_wsk, int tab_kolumny)
{
     for(int i=0; i<tab_kolumny; i++)
    {
        delete [] tab_wsk[i];

    }
       delete [] tab_wsk;
}

void dodaj_macierze (int **tab_wsk,int **&tab_wynik, int tab_wiersze, int tab_kolumny,int **tab_wsk2)
{
                    for(int i=0;i<tab_wiersze;i++){
                            cout<<"\n";
                            for(int j=0;j<tab_kolumny;j++){
                                    
                                    tab_wynik[i][j]=tab_wsk[i][j] + tab_wsk2[i][j];
                                    cout<<tab_wynik[i][j]<<" \t";
                                    }
                            
                            }
     }
void odejmij_macierze (int **tab_wsk,int **&tab_wynik, int tab_wiersze, int tab_kolumny,int **tab_wsk2)
{
                    for(int i=0;i<tab_wiersze;i++){
                            cout<<"\n";
                            for(int j=0;j<tab_kolumny;j++){
                                    
                                    tab_wynik[i][j]=tab_wsk[i][j] - tab_wsk2[i][j];
                                    cout<<tab_wynik[i][j]<<" \t";
                                    }
                            
                            }
     }
     
void macierz_przez_liczbe (int **tab_wsk,int **&tab_wynik, int tab_wiersze, int tab_kolumny,int liczba)
{
                    for(int i=0;i<tab_wiersze;i++){
                            cout<<"\n";
                            for(int j=0;j<tab_kolumny;j++){
                                    
                                    tab_wynik[i][j]=tab_wsk[i][j] * liczba;
                                    cout<<tab_wynik[i][j]<<" \t";
                                    }
                            
                            }
     }

bool porownaj_macierze(int tab_wiersze, int tab_kolumny,int tab_wiersze2, int tab_kolumny2)
{
     if(tab_wiersze==tab_wiersze2 && tab_kolumny== tab_kolumny2)
                                  return true;
     else
                                  return false;
     }
     
bool czy_da_sie_pomnozyc (int tab_wiersze,int tab_kolumny2)
{
     if(tab_wiersze == tab_kolumny2)
     return true;
     else
     return false;
     }
     
void mnozenie_macierzy(int **tab_wsk,int **&tab_wynik, int tab_wiersze, int tab_kolumny,int tab_wiersze2, int **tab_wsk2)
{
      for(int i=0;i<tab_wiersze;i++){
                            cout<<"\n";
                            for(int j=0;j<tab_kolumny;j++){
                                    tab_wynik[i][j]=0;
                                    for(int k=0;k<tab_wiersze2;k++){
                                    tab_wynik[i][j] += tab_wsk[i][k] * tab_wsk2[k][j];
                                    
                                    }
                                    }
                                    }                        
                                }
     
     
  int main()
{
    int tab_wiersze,tab_kolumny,tab_wiersze2,tab_kolumny2;
    int **tab_wsk,**tab_wsk2,**tab_wynik;
    
    cout << "[Macierz 1] Podaj ilosc wierszy: ";
    cin >> tab_wiersze;
    cout << "\n[Macierz 1] Podaj ilosc kolumn: ";
    cin >> tab_kolumny;
    
    
    nowa_tablica(tab_wsk,tab_wiersze,tab_kolumny);
    wypelnij_tablice(tab_wsk,tab_wiersze,tab_kolumny);
    
    
    cout << "\n[Macierz 2] Podaj ilosc wierszy: ";
    cin >> tab_wiersze2;
    cout << "\n[Macierz 2] Podaj ilosc kolumn: ";
    cin >> tab_kolumny2;
    cout <<"\n";
    
    nowa_tablica(tab_wsk2,tab_wiersze2,tab_kolumny2);
    wypelnij_tablice(tab_wsk2,tab_wiersze2,tab_kolumny2);
    
    
       cout <<"\n";
    if (porownaj_macierze(tab_wiersze,tab_kolumny,tab_wiersze2,tab_kolumny2)== true){
                cout<<"Macierz utworzona w wyniku dodania macierzy 1 i macierzy 2 ";
               nowa_tablica(tab_wynik,tab_wiersze,tab_kolumny);                                                                      
               dodaj_macierze(tab_wsk,tab_wynik,tab_wiersze,tab_kolumny,tab_wsk2);
               usuwacz(tab_wynik,tab_kolumny); 
               cout<<"\n";
               }
    else
    cout<<"Macierze różnych rozmairów - nie można wykonać operacji.\n";
    
    if (porownaj_macierze(tab_wiersze,tab_kolumny,tab_wiersze2,tab_kolumny2)== true){
               cout<<"Macierz utworzona w wyniku odejmowania macierzy 2 od macierzy 1 ";
               nowa_tablica(tab_wynik,tab_wiersze,tab_kolumny);                                                                      
               odejmij_macierze(tab_wsk,tab_wynik,tab_wiersze,tab_kolumny,tab_wsk2);
               usuwacz(tab_wynik,tab_kolumny); 
               cout<<"\n";
               }
    else
     cout<<"Macierze różnych rozmairów - nie można wykonać operacji.\n";
    
    cout<<"Podaj liczbe przez ktora mnozymy macierz: ";
    int liczba;
    cin>>liczba;
    
    nowa_tablica(tab_wynik,tab_wiersze,tab_kolumny); 
    cout<<"Macierz utworzona w wyniku mnozenia macierzy 1 przez liczbe: \n";
    macierz_przez_liczbe (tab_wsk,tab_wynik,tab_wiersze,tab_kolumny,liczba);
    usuwacz(tab_wynik,tab_kolumny);
    
    cout<<"\n";
    
    if (czy_da_sie_pomnozyc(tab_wiersze, tab_kolumny2) == true){
    nowa_tablica(tab_wynik,tab_wiersze,tab_kolumny2); 
    cout<<"Macierz utworzona w wyniku mnozenia macierzy 1 przez macierz 2 \n";
    mnozenie_macierzy(tab_wsk,tab_wynik,tab_wiersze,tab_kolumny,tab_wiersze2,tab_wsk2);
    cout<<"\n";cout<<"\n";
    
     for(int i=0;i<tab_wiersze;i++){
                            cout<<"\n";
                            for(int j=0;j<tab_kolumny2;j++){
                                     cout<<tab_wynik[i][j]<<" \t";}
                                     } 
                                    
    usuwacz(tab_wynik,tab_kolumny2);
}
else {
cout<<"Macierze różnych rozmairów - nie można wykonać operacji.\n";
}
    usuwacz(tab_wsk,tab_kolumny); 
    usuwacz(tab_wsk2,tab_kolumny2); 
     
    system("pause");
    return 0;
}
0

Porównaj twoją funkcję mnożenia macierzy do mojej. Może znajdziesz co Ci nie gra w twojej

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define wiersze 3
#define kolumny 2

void mnozenie_macierzy(int tab[][kolumny], int tab2[][wiersze], int wynik[][wiersze]);

 int main(void)
{
    int i, j, tab[wiersze][kolumny], tab2[kolumny][wiersze], wynik[wiersze][wiersze];
    
    srand(time(0));

    for(i = 0; i < wiersze; i++)
        for(j = 0; j < wiersze; j++)
             wynik[i][j] = 0;    
    
    for(i = 0; i < wiersze; i++)
        for(j = 0; j < kolumny; j++)
        {
            tab[i][j] = rand() % 10;
            tab2[j][i] = rand() % 10;
        }

    for(i = 0; i < wiersze; i++)
        for(j = 0; j < kolumny; j++)
            printf("\nTab[%d][%d] = %d", i, j, tab[i][j]);
            
    printf("\n");
    
    for(i = 0; i < kolumny; i++)
         for(j = 0; j < wiersze; j++)
            printf("\nTab[%d][%d] = %d", i, j, tab2[i][j]);

    mnozenie_macierzy(tab, tab2, wynik);
    
    printf("\n--------WYNIK---------\n");
     
    for(i = 0; i < wiersze; i++)
        for(j = 0; j < wiersze; j++)
            printf("\nWynik[%d][%d] = %d", i, j, wynik[i][j]); 

    printf("\n");    
    
    return 0;
 }

void mnozenie_macierzy(int tab[][kolumny], int tab2[][wiersze], int wynik[][wiersze])
{
    int j, k, l = 0;
    
    for(k = 1; l < wiersze; k++)
    {
        for(j = 0; j < kolumny; j++)
                 wynik[l][k - 1] += tab[l][j] * tab2[j][k - 1];
                
        if(!(k % wiersze))
        {
            l++;
            k = 0;
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1