Dodawanie macierzy

0

Czesc,
mam problem z dodawaniem macierzy. Zdefiniowalem strukture reprezentujaca macierz, ale przy probie napisania funkcji ktora by je dodawala wyswietlaja mi sie dane z kosmosu :(
#include "stdafx.h"
#include "math.h"
#include "stdio.h"
#include "stdlib.h"

typedef struct macierz{

int wiersze;
int kolumny;
float **dane;

};
macierz m1, m2, m3;

macierz stworz(int wiersze, int kolumny){
int i, j;
macierz m1;
m1.wiersze = wiersze;
m1.kolumny = kolumny;
m1.dane = (float**)malloc(sizeof(float*)* wiersze);
for (i = 0; i < wiersze; i++){
m1.dane[i] = (float*)malloc(sizeof(float)*kolumny);
for (j = 0; j < kolumny; j++){
m1.dane[i][j];
}
}

return m1;

}

macierz wczytaj(macierz m1){

for (int i = 0; i < m1.wiersze; i++){
	for (int j = 0; j < m1.kolumny; j++){
		scanf("%f", &m1.dane[i][j]);
	}
}
return m1;

}

void pokaz(macierz m1){

for (int i = 0; i < m1.wiersze; i++){

	for (int j = 0; j < m1.kolumny; j++)
		printf("%f\t", m1.dane[i][j]);
	printf("\n");

}
printf("\n");

}
void usun(macierz m1){
free(m1.dane);
}

macierz dodaj(macierz m1, macierz m2){

int i, j;

for (i = 0; i < m1.wiersze; i++){
	for (j = 0; j < m3.kolumny; j++)
		m3.dane[i][j] = m1.dane[i][j] + m2.dane[i][j];
}
return m3;

}

int main(void)
{
int wiersze, kolumny;
printf("Podaj ilosc wierszy\n");
scanf("%d", &wiersze);
printf("Podaj ilosc kolumn\n");
scanf("%d", &kolumny);

 m1 = stworz(wiersze, kolumny);
 m2 = stworz(wiersze, kolumny);
 m3 = stworz(wiersze, kolumny);
 m3 = dodaj(m1, m2);
wczytaj(m1);
wczytaj(m2);

pokaz(m1);
pokaz(m2);
pokaz(m3);

system("pause");

return 0;
}

2

A rozumiesz co napisałeś?

  1. sformatuj kod używając odpowiednich tagów
  2. wywołujesz:
 m3 = stworz(wiersze, kolumny);
     m3 = dodaj(m1, m2);

używasz w dodaj zmiennych globalnych, a to co zwracasz, tylko przypadkiem nie powoduje zgubienia wskaźnika
3) wywołujesz dodawanie, zanim wczytasz dane do m1 i m2....
4) masz błąd w funkcji usuń, musisz najpierw usunąć elementy tablicy, a dopiero pozniej samą tablicę
5) nie czyścisz pamięci...

0

void usun(macierz m1){
int i, j;
for (j = 0; j < m1.wiersze; j++)
free(m1.dane[i]);

free(m1.dane);

}
Czy tak bedzie wygladala poprawnie funkcja usun ?

1

Prawie:

  1. http://4programmers.net/Forum/1101404
  2. po kiego ci ta i?
0

void usun(macierz m1){
int j;
for (j = 0; j < m1.wiersze; ++j)
free(m1.dane[j]);

free(m1.dane);

}
To i mialoby sens, jakbym uzyl je w petli, faktycznie bez sensu, czyli tak ?

1

tak.

0

Dzieki wszystkim za pomoc :)

0

Pamiętaj że nie musisz mieć dwuwymiarową macierz w samej implementacji: http://4programmers.net/Forum/C_i_C++/262823-struktura_definiujaca_macierz?p=1204394#id1204394

  • czyli implementacja macierzy poprzez tablicę jednowymiarową.
0

Na ostatnie zadanie mam napisac funkcje, ktora bedzie dodawala nieokreslona liczbe macierzy, ale nie mam za bardzo pomyslu jak to zrobic.
Macierz ma być zadeklarowana tak jak tutaj, czyli poprzez strukture. Trzeba zarezerwowac odpowiednia ilosc pamieci, wiec pomyslalem ze moze wykorzystac petle, ktora by powielala, pamiec przydzielona do pierwszej macierzy, bo w koncu jesli dodawanie to musza byc takich samych wymiarow. Ale pojawil sie kolejny problem z nazwami tych macierzy... wiec pomyslalem, ze zrobie tablice, do ktorej beda wczytywane litery z klawiatury a pozniej bylyby wykorzystywane jako nazwy macierzy... to taki pierwszy pomysl.
Teraz tak sobie mysle, ze moze zrobic tak, zeby to rezerwowanie pamieci w petli, zeby byla jej odpowiednia ilosc, czyli potraktowac to jako jedna, duza macierz, a pozniej ja odpowiednio podzielic i dodac? no nie mam pomyslu za bardzo :(

0

Wymyslilem cos takiego. Gdy robilem tak dla tablic statycznych to dzialalo, ale z dynamicznymi nie za bardzo, co robie zle ?

struct macierz{
int wiersze, kolumny;
float **dane;
}m1, m2, m3;

macierz stworz(int wiersze, int kolumny){

m1.wiersze = wiersze;
m1.kolumny = kolumny;

m1.dane = (float**)malloc(sizeof(float*)*wiersze);
for (int i = 0; i < wiersze; i++)
	m1.dane[i] = (float*)malloc(sizeof(float)*kolumny);
return m1;

}

int dodaj1(macierz m1, macierz m2){

printf("Podaj liczby dla pierwszej\n");
for (int i = 0; i <m1.wiersze; i++){
	for (int j = 0; j < m1.kolumny; j++)
		scanf("%f", &m1.dane[i][j]);
}
printf("Podaj liczby dla Drugiej\n");
for (int i = 0; i < m2.wiersze; i++){
	for (int j = 0; j < m2.kolumny; j++)
		scanf("%f", &m2.dane[i][j]);
}

for (int i = 0; i < m3.wiersze; i++){
	for (int j = 0; j < m3.kolumny; j++)
		m3.dane[i][j] = m1.dane[i][j] + m2.dane[i][j];
}
printf("Wynik\n");

for (int i = 0; i < m3.wiersze; i++){
	for (int j = 0; j < m3.kolumny; j++)
		printf("%f\t", m3.dane[i][j]);
	printf("\n");
}
return 0;

}

int doda2(macierz m1,macierz m2,macierz m3){

int a;

x:
printf("1-Jesli chcesz dodac kolejna macierz\n");
printf("2-Jesli chcesz zakonczyc\n");
scanf("%d", &a);

switch (a){

case 1:



	printf("Podaj liczby dla nastepnej\n");

	for (int i = 0; i < m1.wiersze; i++){
		for (int j = 0; j < m1.kolumny; j++)
			scanf("%f", &m1.dane[i][j]);
	}
	

	for (int i = 0; i < m2.wiersze; i++){
		for (int j = 0; j < m2.kolumny; j++)
			m2.dane[i][j] = m3.dane[i][j];
	}
	
	for (int i = 0; i < m3.wiersze; i++){
		for (int j = 0; j < m3.kolumny; j++)
			m3.dane[i][j] = m1.dane[i][j] + m2.dane[i][j];
	}

	for (int i = 0; i < m3.wiersze; i++){
		for (int j = 0; j < m3.kolumny; j++)
			printf("%f\t", m3.dane[i][j]);
		printf("\n");
	}
	
	break;
	
case 2:

	return 0;
	break;

}
goto x;
}

int _tmain(int argc, _TCHAR* argv[])
{
int wiersze, kolumny;

printf("Podaj ilosc wierszy\n");
scanf("%d", &wiersze);
printf("Podaj ilosc kolumn\n");
scanf("%d", &kolumny);

m1 = stworz(wiersze, kolumny);
m2 = stworz(wiersze, kolumny);
m3 = stworz(wiersze, kolumny);

dodaj1(m1, m2);

dodaj2(m1,m2,m3);

system("pause");
return 0;
}

1
  1. Nie rozumiesz inkrementacji: http://4programmers.net/Forum/1101404
  2. Odradzam nazewnictwo inne niż angielskie inaczej ot tak to wygląda: http://4programmers.net/Forum/1208091
  3. Trzy razy powtórzyłeś wyświetlanie, ile razy musisz użyć metody Kopiego Pejsta aby wymyślić że potrzebujesz funkcji void show(macierz m) ?
  4. To samo dotyczy wprowadzenia - potrzebujesz funkcji void imput(macierz m)
  5. Może zastanów się nad: http://4programmers.net/Forum/C_i_C++/262823-struktura_definiujaca_macierz?p=1204394#id1204394
  6. Wymiary macierzy typu int - czyżby spodziewałeś się ujemnych wymiarów? Używaj size_t do indeksacji tablic.
  7. Jeżeli potrzebujesz tego: system("pause"); to zmień środowisko na jakieś z tego tysiąclecia.
  8. m2 = stworz(wiersze, kolumny); - już psuje się m1 - zemsta zmiennych globalnych.
macierz stworz(size_t wiersze,size_t kolumny)
  {
   macierz m;
   m.wiersze=wiersze;
   m.kolumny=kolumny;
   m.dane=(float**)malloc(sizeof(float*)*wiersze);
   for(size_t y=0;y<wiersze;++y) m.dane[y]=(float*)malloc(sizeof(float)*kolumny);
   return m;
  }

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