Skocz do zawartości
Zaloguj się, aby obserwować  
michal!

Pomoc w Funkcjach C

Polecane posty

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

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

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

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

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

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

Zaloguj się, aby obserwować  

×