[C] Mnożenie macierzy

Nesquik
Użytkownik
Użytkownik
Posty: 410
Rejestracja: 23 lut 2012, o 13:54
Płeć: Kobieta
Lokalizacja: Bielsko-Biała
Podziękował: 25 razy

[C] Mnożenie macierzy

Post autor: Nesquik »

Witam,mam napisac program,który bedzie mnozył macierze.są to tablice dynamiczne.Cos napisałam,ale nie działa jak trzeba i juz nie mam pomysłu jak ten algorytm napisac.
z góry dziekuje za pomoc;)

Kod: Zaznacz cały

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


main()
{
int n,m,k,l;
int**array;
int i;
int j;
printf("Podaj n
");
scanf("%d",&n);
printf("podaj m
");
scanf("%d",&m);
printf("podaj k
");
scanf("%d",&k);
array=(int**)malloc(n*sizeof(int*));        //przydzielenie pamieci macierzy nxm
        for(i=0;i<n;i++)
        array[i]=(int*)malloc(m*sizeof(int));

array=(int**)malloc(m*sizeof(int*));          //przydzielenie pamieci macierzy mxk
        for(j=0;j<m;j++)
        array[j]=(int*)malloc(k*sizeof(int));

array=(int**)malloc(n*sizeof(int*));        //przydzielenie pamieci macierzy nxk
        for(i=0;i<n;i++)
        array[i]=(int*)malloc(k*sizeof(int));

  printf("Podaje macierz nxm
");
  for(i=0; i<n; i++)                    //wpisanie wartosci do macierzy nxm
  for(j=0; j<m; j++)
    {
    printf("Podaj [%d][%d] element
",i,j);
     scanf("%d",&array[i][j]);
    }

  printf("Podaj macierz mxk
");

  for(j=0; j<n; j++)             //wpisanie wartosci do macierzy mxk
  for(l=0; l<k; l++)
    {
    printf("Podaj [%d][%d] element
",j,l);
     scanf("%d",&array[j][l]);
    }

for(i=0;i<n;i++)
 for(j=0;j<m;j++)
  {
  array[i][l]=0;
    for(l=0;l<k;l++)
    array[i][l]=array[i][l]+array[i][j]*array[j][l];
  }

  printf("Iloczyn macierzy nxm * mxk
");
  for(i=0; i<n; i++)                     //wyswietlenie macierzy nxk
    {
    for(l=0; l<k; l++)
       printf("%d ",array[i][l]);  //w kazdym wierszu spacja
    printf("
");
    }

for(i=0;i<n;i++)
free(array[i]);

free(array);

getch();
return;
}
Ostatnio zmieniony 31 maja 2012, o 10:28 przez Afish, łącznie zmieniany 2 razy.
Powód: Poprawa wiadomości. Pamiętaj o tagach code.
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

[C] Mnożenie macierzy

Post autor: Szemek »

Wskazówka: popraw swój kod, aby korzystał z 3 różnych tablic, a nie tylko "array".
Pomyśl czemu w obecnej formie to nie działa.
Nesquik
Użytkownik
Użytkownik
Posty: 410
Rejestracja: 23 lut 2012, o 13:54
Płeć: Kobieta
Lokalizacja: Bielsko-Biała
Podziękował: 25 razy

[C] Mnożenie macierzy

Post autor: Nesquik »

tzn chodzi oto żeby zamiast array[i][j] było np A[i][j]?
ale czemu to teraz nie działa to nie wiem,od razu mówie ze nie jestem za dobra w te klocki,dopiero zaczynam sie uczyc programowac;/

-- 30 maja 2012, o 21:43 --

Chyba nie oto Ci chodziło;/

Kod: Zaznacz cały

 #include <stdio.h>
#include <conio.h>
#include <stdlib.h>


main()
{
int n,m,k,l;
int**A,**B,**C;
int i;
int j;
printf("Podaj n
");
scanf("%d",&n);
printf("podaj m
");
scanf("%d",&m);
printf("podaj k
");
scanf("%d",&k);
A=(int**)malloc(n*sizeof(int*));        //przydzielenie pamieci macierzy nxm
        for(i=0;i<n;i++)
        A[i]=(int*)malloc(m*sizeof(int));

B=(int**)malloc(m*sizeof(int*));          //przydzielenie pamieci macierzy mxk
        for(j=0;j<m;j++)
        B[j]=(int*)malloc(k*sizeof(int));

C=(int**)malloc(n*sizeof(int*));        //przydzielenie pamieci macierzy nxk
        for(i=0;i<n;i++)
        C[i]=(int*)malloc(k*sizeof(int));

  printf("Podaje macierz nxm
");
  for(i=0; i<n; i++)                    //wpisanie wartosci do macierzy nxm
  for(j=0; j<m; j++)
    {
    printf("Podaj [%d][%d] element
",i,j);
     scanf("%d",&A[i][j]);
    }

  printf("Podaj macierz mxk
");

  for(j=0; j<n; j++)             //wpisanie wartosci do macierzy mxk
  for(l=0; l<k; l++)
    {
    printf("Podaj [%d][%d] element
",j,l);
     scanf("%d",&B[j][l]);
    }

for(i=0;i<n;i++)
 for(j=0;j<m;j++)
  {
  C[i][l]=0;
    for(l=0;l<k;l++)
    C[i][l]=C[i][l]+A[i][j]*B[j][l];
  }

  printf("Iloczyn macierzy nxm * mxk
");
  for(i=0; i<n; i++)                     //wyswietlenie macierzy nxk
    {
    for(l=0; l<k; l++)
       printf("%d ",C[i][l]);  //w kazdym wierszu spacja
    printf("
");
    }

for(i=0;i<n;i++)
free(C[i]);

free(C);

getch();
return;
}
Ostatnio zmieniony 31 maja 2012, o 10:28 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

[C] Mnożenie macierzy

Post autor: Szemek »

jest prawie ok, ale nie zapomnij zwolnić także pamięć zajmowaną przez macierze A i B
Nesquik
Użytkownik
Użytkownik
Posty: 410
Rejestracja: 23 lut 2012, o 13:54
Płeć: Kobieta
Lokalizacja: Bielsko-Biała
Podziękował: 25 razy

[C] Mnożenie macierzy

Post autor: Nesquik »

Okej;) ale jak poprawiłam jeszcze z tym zwracaniem to wynik mnozenia troszke odbiega od poprawnego;/
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

[C] Mnożenie macierzy

Post autor: Szemek »

40 for(j=0; j<n; j++) //wpisanie wartosci do macierzy mxk

W linijce 40 zamiast \(\displaystyle{ n}\) powinno być \(\displaystyle{ m}\).
Nesquik
Użytkownik
Użytkownik
Posty: 410
Rejestracja: 23 lut 2012, o 13:54
Płeć: Kobieta
Lokalizacja: Bielsko-Biała
Podziękował: 25 razy

[C] Mnożenie macierzy

Post autor: Nesquik »

Już znalazłam błąd oprócz tego co napisałes do od 47linijki ma wygladac tak

Kod: Zaznacz cały

for(i=0;i<n;i++)       //kopiowanie
  {
    for(l=0;l<m;l++)
    {
       C[i][l]=0;
      for(j=0;j<k;j++)
      {
    C[i][l]=C[i][l]+A[i][j]*B[j][l];
      }
  }
 }
ODPOWIEDZ