Skocz do zawartości
Leogict

[c++] Dodawanie Macierzy Na 2 Sposoby

Rekomendowane odpowiedzi

Witam, napisałem dodawanie macierzy na 2 sposoby. Będę wdzięczny za wszelkie uwagi, komentarze i spostrzeżenia.

 

1. Macierze reprezentowane jako tablice dwuwymiarowe:

#include <iostream>using namespace std;void wprowadz_macierz(int macierz[][10],int wiersze, int kolumny);void dodaj_macierze(int macierzA[][10], int macierzB[][10], int macierzC[][10],int wiersze, int kolumny);void wyswietl_wynik(int macierzC[][10],int wiersze,int kolumny);int main(){	int macA[10][10], macB[10][10], macC[10][10]={0},wmac,kmac;	cout << "Podaj rozmiar obu macierzy:\nWierszy: ";	cin >> wmac;	cout << "Kolumn: ";	cin >> kmac;	if((kmac) && (wmac) && (wmac<11) && (kmac<11)) // sprawdzenie poprawnosci rozmiarow macierzy	{		cout << "\nMacierz A: \n";		wprowadz_macierz(macA,wmac,kmac); // wprowadzamy macierz A		cout << "\nMacierz B\n";		wprowadz_macierz(macB,wmac,kmac); // i macierz B			dodaj_macierze(macA,macB,macC,wmac,kmac); // dodajemy je		wyswietl_wynik(macC,wmac,kmac);  // i wyswietlamy macierz wynikowa	}	else cout << "Zly rozmiar macierzy!\n";	return 0;} //**************************************************************************void wprowadz_macierz(int macierz[][10], int wiersze, int kolumny){	for(int i=0; i<wiersze; i++)	   // po wierszach	{		for(int j=0; j<kolumny; j++)  // po kolumnach		{			cout << "Podaj element (" << i+1 << "," << j+1 << "): ";			cin >> macierz[i][j];		}	}}//********************************************************************************void dodaj_macierze(int macierzA[][10], int macierzB[][10], int macierzC[][10],int wiersze,int kolumny){	for(int i=0; i<wiersze; i++)	{		for(int j=0; j<kolumny; j++)		{			macierzC[i][j]=macierzA[i][j]+macierzB[i][j];  // wlasciwe dodawanie		}	}}//***********************************************************void wyswietl_wynik(int macierzC[][10],int wiersze,int kolumny){	cout << "\nWynik:\n";	for(int i=0; i<wiersze; i++)	{		for(int j=0; j<kolumny; j++)		{			cout << macierzC[i][j];			if(j<kolumny-1) cout << ", ";		}		cout << "\n";	}	cout << "\n";}

2. Macierze reprezentowane jako tablice jednowymiarowe:

#include <iostream>using namespace std;void wprowadz_macierz(int macierz[],int wiersze, int kolumny);void dodaj_macierze(int macierzA[], int macierzB[], int macierzC[],int wiersze, int kolumny);void wyswietl_wynik(int macierzC[],int wiersze,int kolumny);int main(){	int macA[100], macB[100], macC[100]={0},wmac,kmac; // wmac - ilosc wierszy, kmac - ilosc kolumn, dodajemy macierze wmac x kmac	cout << "Podaj rozmiar obu macierzy:\nWierszy: ";	cin >> wmac;	cout << "Kolumn: ";	cin >> kmac;	if((kmac) && (wmac) && (wmac<11) && (kmac<11)) // sprawdzenie poprawnosci rozmiarow macierzy	{		cout << "\nMacierz A: \n";		wprowadz_macierz(macA,wmac,kmac); // wprowadzamy pierwsza macierz		cout << "\nMacierz B\n";		wprowadz_macierz(macB,wmac,kmac);	// i druga		dodaj_macierze(macA,macB,macC,wmac,kmac);  // i je dodajemy		wyswietl_wynik(macC,wmac,kmac);  // wyswietlamy wynikowa macierz	}	else cout << "Zly rozmiar macierzy!\n";	return 0;}//*********************************************************************void wprowadz_macierz(int macierz[], int wiersze, int kolumny) // funkcja do wprowadzania macierzy{	for(int i=0; i<wiersze; i=i++)	   // po wierszach	{		for(int j=0; j<kolumny; j++)  // po kolumnach		{			cout << "Podaj element (" << i+1 << "," << j+1 << "): ";			cin >> macierz[(i*kolumny)+j]; // mnozymy i razy liczbe kolumn, zeby wartosci w tablicy jednowymiarowej nie nadpisywaly sie		}	}}//************************************************************************************************void dodaj_macierze(int macierzA[], int macierzB[], int macierzC[],int wiersze,int kolumny) // funkcja dodajaca macierze{	for(int i=0; i<wiersze*kolumny; i++)	{		macierzC[i]=macierzA[i]+macierzB[i];	}}//*********************************************************************************void wyswietl_wynik(int macierzC[],int wiersze,int kolumny) // wyswietlanie macierzy wynikowej{	cout << "\nWynik:\n";	for(int i=0; i<wiersze; i++)	{		for(int j=0; j<kolumny; j++)		{			cout << macierzC[(i*kolumny)+j]; // (i*kolumny)+j, a nie (i+j) zeby np macierzC(1,0) nie nadpisalo macierzC(0,1)			cout << "\t";		}		cout << "\n";	}	cout << "\n";}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Na 90% oba sposoby (w tym konkretny przypadku) po skompilowaniu będą wyglądały w ten sam sposób (mam na myśli wynikowy kod maszynowy) - a to z prostego względu, tablice w sposobie 1 będą zajmowały ciągły obszar pamięci (stos) - tak samo jak w sposobie 2.

 

Napisałeś że to program w c++, a jedyne z czego skorzystałes to strumienie i deklaracja zmiennych w środku funkcji.

 

Osobiści wole "garbate" nazwy funkcji i zmiennych (podkreślniki używam w innych przypadkach np. w nazwach stałych),

czyli napisałbym np. void WprowadzMacierz(int**, int, int);

i z tego co obserwuje to jest to bardziej popularna praktyka - ale każdy pisze tak jak lubi (no chyba że pracuje w zespole :) ) - chciałem pokazać tylko inny sposób nazewnictwa

 

Macierze mają stały rozmiar, przez co ograniczasz użytkownika do macierzy maksymalnie 10 x 10, użyłbym alokacji dynamicznej (new [] i delete [])

 

(kmac) && (wmac) - miałeś chyba na myśli (kmac > 0) && (wmac > 0) - (kmac) zwróci true dla każdej wartości różnej od 0 (dla ujemnych również)

 

Parametr int macierz[][10] zamieniłbym na int** macierz

 

macC jest niepotrzebnie zerowana

 

Jeżeli nie zależy Ci na zwróconej wartości podczas inkrementacji/dekrementacji "++"/"--", a jedynie dbasz o zmiane wartości zmiennej to zalecałbym stosowanie symbolu przed nazwa zmiennej (++zmienna), będzie szybcie (tutaj nie będzie widać różnicy, ale przy dużych obiektach i wielu operacjach da się to odczuć) - ! pamiętaj że zwrócone wartości się różnią i nie wszędzie da się to zastosować

 

Działanie na macierzach napisałbym w formie klasy - jest to dużo czytelniejsza i wygodniejsza(pod każdym względem) forma

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...