Skocz do zawartości
kroll44

Macierze I Wskaźniki W C

Rekomendowane odpowiedzi

Witam wszystkich, to mój pierwszy post więc od razu chciałbym przeprosić jeśli złamię jakiś regulamin forum i prosze o wyrozumialość.Dopiero od 2 tygodni zacząłem wogóle programować więc jestem na poziomie BAAARRDZO średnim. A więc mój problem wygląda nasępująco.Napisalem program za pomocą funkcji w dev-c++, który operuje na macierzach , a mianowicie dodaje je i odejmuje, pracuje na 4 funkcjach:

-wypelnij_tablice wpisuje dane

-wydruk wypisuje komórki macierzy na ekran

-dodaje

-odejmuje

 

#include <iostream.h>

#include <stdlib.h>

int wypelnij_tablice(int tab[100][100],unsigned lw,unsigned lk)

{

unsigned i,j;

for(i=0;i<lw;i++)

{

for(j=0;j<lk;j++)

{

cout<<"["<<i<<"]["<<j<<"] = ";

cin>>tab[j];

}

}

return(tab[j]);

}

int wydruk(int tab[100][100],unsigned lw,unsigned lk)

{

unsigned i,j;

for(i=0;i<lw;i++)

{

for(j=0;j<lk;j++)

{

cout<<" "<<tab[j];

}

cout<<"\n";

}

return(tab[j]);

}

int dodaje(int t[100][100],int t2[100][100],int t3[100][100],unsigned lw1,unsigned lw2,unsigned lk1,unsigned lk2)

{

unsigned i,j;

 

if(lw1==lw2 && lk1==lk2)

{

for(i=0;i<lw1;i++)

{

for(j=0;j<lk1;j++)

{

t3[j]=t[j]+t2[j];

}

}

}

else

{

cout<<"Podaj inne dane"<<endl;

}

return(t3[j]);

}

int odejmuje(int t[100][100],int t2[100][100],int t3[100][100],unsigned lw1,unsigned lw2,unsigned lk1,unsigned lk2)

{

unsigned i,j;

 

if(lw1==lw2 && lk1==lk2)

{

for(i=0;i<lw1;i++)

{

for(j=0;j<lk1;j++)

{

t3[j]=t[j]-t2[j];

}

}

}

else

{

cout<<"Podaj inne dane"<<endl;

}

return(t3[j]);

}

int main()

{ int A[100][100],B[100][100],C[100][100];

unsigned i,j,a,b,rozmiar1A,rozmiar2A,rozmiar1B,rozmiar2B;

cout<<" WYPELNIANIE PIERWSZEJ MACIERZY"<<endl;

cout<<"Podaj ilosc wierszy pierwszej macierzy"<<endl;

cin>>rozmiar1A;

cout<<"Podaj ilosc kolumn pierwszej macierzy"<<endl;

cin>>rozmiar2A;

wypelnij_tablice(A,rozmiar1A,rozmiar2A);

wydruk(A,rozmiar1A,rozmiar2A);

cout<<""<<endl;

cout<<" WYPELNIANIE DRUGIEJ MACIERZY"<<endl;

cout<<"Podaj ilosc wierszy drugiej macierzy"<<endl;

cin>>rozmiar1B;

cout<<"Podaj ilosc kolumn drugiej macierzy"<<endl;

cin>>rozmiar2B;

wypelnij_tablice(B,rozmiar1B,rozmiar2B);

wydruk(B,rozmiar1B,rozmiar2B);

 

cout<<" SUMOWANIE"<<endl;

dodaje(A,B,C,rozmiar1A,rozmiar1B,rozmiar2A,rozmiar2B);

wydruk(C,rozmiar1A,rozmiar2B);

 

cout<<" ODEJMOWANIE"<<endl;

odejmuje(A,B,C,rozmiar1A,rozmiar1B,rozmiar2A,rozmiar2B);

wydruk(C,rozmiar1A,rozmiar2B);

system("PAUSE");

return 0;

}

 

 

Czytałem jednak że jest optymalniejsza 'wersja' przekazywania tablic funkcjom, a mianowice za pomocą WSKAŹNIKÓW. Przeszukiwalem różne kursy internetowe w poszukiwaniu wiadomości o wskaźnikach ale jest to zwykle tylko jakaś pusta(jak dla mnie) teoria, dlatego prosiłbym o jakiś konstruktywne wskazówki dotyczące na przykład 'przetłumaczenia' funkcji WYPEŁNIJ_ TABLICE na funkcje wskaźnikową.

Najlepiej jeśli to oczywiście możliwe prosiłbym o napisanie tej funkcji za pomocą wskaźników. Aha, i mam jeszcze jedno pytania:czy ten kod napisany przeze mnie (mimo tego że nie jest na wskaźnikach) będzie się kompilowac na innych kompilatorach?

 

Z góry dziekuje za pomoc i...wyrozumialość.

Pozdrawiam wszystkich

Kuba

PS

Prosze o uwagi dotyczące posta(konstruktywnie krytyczne mile widziane), wiem że jest za długi i mój język też malo tachniczny, ale pracuje nad tym...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jak piszesz w C++ to zamiast wskazników możesz uzyc referencji np. tak jest to równie szybkie jak przekzanie przez wskaźnika na pewno bardziej eleganckie

 

int wypelnij_tablice(int& tab[100][100],unsigned lw,unsigned lk); reszta bez zmian

albo zadeklaruj funkcje tak , ale nie jestem pewien :/

int wypelnij_tablice(int** tab,unsigned lw,unsigned lk);

kazda tablica to w ostatecznosci jakis wskaznik na jej pierwszy element ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie tłumacz mu tak bo chlopak się zakopie.

 

#include <iostream>using namespace std;void wypelnij_tablice(int (*tab)[5],unsigned int lw, unsigned int lk)   //<----------!!!{   for(unsigned int i=0;i<lw;i++)   {	  for(unsigned int j=0;j<lk;j++)	  {		 cout<<"["<<i<<"]["<<j<<"] = ";		 cin >> tab[i][j];	  }   }}int main(){	int tab[5][5];	wypelnij_tablice(tab,5,5);		for(int i = 0; i < 5; i++)	{	   for(int j = 0; j < 5; j++) cout << tab[i][j];	   cout << endl;	   	} 	  	cin.sync();	cin.get();	return 0;}

1. Aby mieć tablice 2 i wiecej n jako wskaźnik trzeba pierwszy ( niepotrzebny ) wymiar przykazać jako wskaźnik , jesli jest tylko 1 to wystarczy int * wsk ale jeśli jest kilka to będzie np (int * wsk)[4][5][6], tablica musi odebrać w funkcji wymiary. Wymiar pierwszy z lewej sie nie liczy dlatego można tam wrzucić wskaźnik a jeśli jest reszta wymiarów to trzeba dodać jeszcze tą reszte oprócz pierwszego za którego jest wskaźnik.

2. Funkcja nie wymaga zwrotu wartości bo pracuje na orginale.

3. Zresztą jakąkolwiek różnice nie zawsze sie odczuje w (większości procedur jakie robimy na codzień w domu)

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ę...