michal! 0 Zgłoś post Napisano Luty 16, 2011 Witam, czy znalazła by się osoba chętna mi pomóc w napisaniu/niekierunkowaniu jak napisać kilka funkcji w C, takich jak np. mnożenie dwóch tablic o różnych wymiarach np. {1,2,3,4,5} * {1,2,3}. Niestety nie mogę sobie poradzić z pewnym zadankiem na uczelni... kontakt poprzez PW. Pozdrawiam. Udostępnij ten post Link to postu Udostępnij na innych stronach
igor_s 30 Zgłoś post Napisano Luty 16, 2011 tak na szybko masz tu szkielet programu z macierzami, jest tylko jedna funkcja dodawania macierzy ale może Ci się przyda #include <stdio.h> #include <stdlib.h> int **alokuj (int,int); void wpisz(int **,int,int); void wypisz(int **,int,int); int **dodawanie(int **,int**,int,int); int main(void) { int i,j,w1,w2,k1,k2; int **tab1,**tab2,**tab_w; printf ("Podaj ilosc wierszy I macierzy: "); scanf ("%d",&w1); printf ("Podaj ilosc kolumn I macierzy: "); scanf ("%d",&k1); printf ("Podaj ilosc wierszy II macierzy: "); scanf ("%d",&w2); printf ("Podaj ilosc kolumn II macierzy: "); scanf ("%d",&k2); tab1 = alokuj(w1,k1); tab2 = alokuj(w2,k2); printf ("wypelnij I macierz: "); wpisz(tab1,w1,k1); printf ("wypelnij II macierz: "); wpisz(tab2,w2,k2); wypisz(tab1,w1,k1); printf("############\n"); wypisz(tab2,w2,k2); if (w1==w2 && k1==k2){ tab_w = dodawanie(tab1,tab2,w1,k1); printf ("wynik dodawania\n"); wypisz (tab_w,w1,k1); } else printf ("rozmiar musi byc taki sam\n"); return 0; } int **alokuj (int wiersze,int kolumny) { int i; int **M; M=malloc (sizeof(int)*2); for (i=0;i<wiersze;i++) M[i]=malloc(sizeof(int)*2); return M; } void wpisz (int **M,int wiersze,int kolumny) { int i,j; for (i=0;i<wiersze;i++) { for (j=0;j<kolumny;j++){ printf("tab[%d][%d] = ",i,j); scanf("%d",&M[i][j]); } } } void wypisz (int **M,int wiersze,int kolumny) { int i,j; for (i=0;i<wiersze;i++) { for (j=0;j<kolumny;j++){ printf ("%d ",M[i][j]); } printf ("\n"); } } int **dodawanie(int **t1,int**t2,int wiersze,int kolumny) { int i,j; int **tabW; tabW=alokuj(wiersze,kolumny); for (i=0;i<wiersze;i++) { for (j=0;j<kolumny;j++){ tabW[i][j]=0; } } for (i=0;i<wiersze;i++) { for (j=0;j<kolumny;j++){ tabW[i][j]=t1[i][j]+t2[i][j]; } } return tabW; } Udostępnij ten post Link to postu Udostępnij na innych stronach
behemoth 230 Zgłoś post Napisano Luty 16, 2011 Pamiętaj o prawidłowych założeniach dla działań matematycznych, które musisz sprawdzić przed działaniem na macierzach. Np. dla mnożenia macierzy dwa sąsiadujące ze sobą wymiary muszą być takie same, czyli jeśli masz dwie macierze o wymiarach NxM i PxR, to by mnożenie było wykonalne, wymiar M musi być równy wymiarowi P. Udostępnij ten post Link to postu Udostępnij na innych stronach
kafi 2425 Zgłoś post Napisano Luty 16, 2011 I przede wszystkim pamiętaj o sprzątaniu pamięci, bo kod igora mallocuje od groma, ale żeby zwolnić to po sobie, to już nie bardzo. Udostępnij ten post Link to postu Udostępnij na innych stronach
igor_s 30 Zgłoś post Napisano Luty 16, 2011 W pełni się z Wami zgadzam. Co do prawidłowych założeń matematycznych to już jest zależne od konkretnych działań na macierzach, chciałem tylko pokazać szkielet. Co do alokacji pamięci to jeśli będziemy chcieli dołożyć mnożenie macierzy o różnych rozmiarach to wygodnie dynamicznie alokować pamięć tak jak napisał behemoth ( macierz A o rozmiarze NxM * macierz o rozmiarze PxR = macierz wynikowa MxP). Faktycznie ze zwalnianiem pamięci to jest duży błąd, wklejam kod z w/w zwalnianiem pamięci: #include <stdio.h> #include <stdlib.h> int **alokuj (int,int); void wpisz(int **,int,int); void wypisz(int **,int,int); int **dodawanie(int **,int**,int,int); void zwolnij(int **,int); int main(void) { int i,j,w1,w2,k1,k2; int **tab1,**tab2,**tab_w; printf ("Podaj ilosc wierszy I macierzy: "); scanf ("%d",&w1); printf ("Podaj ilosc kolumn I macierzy: "); scanf ("%d",&k1); printf ("Podaj ilosc wierszy II macierzy: "); scanf ("%d",&w2); printf ("Podaj ilosc kolumn II macierzy: "); scanf ("%d",&k2); tab1 = alokuj(w1,k1); tab2 = alokuj(w2,k2); printf ("wypelnij I macierz: "); wpisz(tab1,w1,k1); printf ("wypelnij II macierz: "); wpisz(tab2,w2,k2); wypisz(tab1,w1,k1); printf("############\n"); wypisz(tab2,w2,k2); if (w1==w2 && k1==k2){ tab_w = dodawanie(tab1,tab2,w1,k1); printf ("wynik dodawania\n"); wypisz (tab_w,w1,k1); zwolnij (tab_w,w1); } else printf ("rozmiar musi byc taki sam\n"); zwolnij (tab1,w1); zwolnij (tab2,w2); return 0; } int **alokuj (int wiersze,int kolumny) { int i; int **M; M=malloc (sizeof(int)*2); for (i=0;i<wiersze;i++) M[i]=malloc(sizeof(int)*2); return M; } void wpisz (int **M,int wiersze,int kolumny) { int i,j; for (i=0;i<wiersze;i++) { for (j=0;j<kolumny;j++){ printf("tab[%d][%d] = ",i,j); scanf("%d",&M[i][j]); } } } void wypisz (int **M,int wiersze,int kolumny) { int i,j; for (i=0;i<wiersze;i++) { for (j=0;j<kolumny;j++){ printf ("%d ",M[i][j]); } printf ("\n"); } } int **dodawanie(int **t1,int**t2,int wiersze,int kolumny) { int i,j; int **tabW; tabW=alokuj(wiersze,kolumny); for (i=0;i<wiersze;i++) { for (j=0;j<kolumny;j++){ tabW[i][j]=0; } } for (i=0;i<wiersze;i++) { for (j=0;j<kolumny;j++){ tabW[i][j]=t1[i][j]+t2[i][j]; } } return tabW; } void zwolnij(int **M, int wiersze) { int i; for(i=0; i<wiersze; i++) free(M[i]); free(M); } Udostępnij ten post Link to postu Udostępnij na innych stronach