kroll44 Opublikowano 27 Listopada 2005 Zgłoś Opublikowano 27 Listopada 2005 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... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Haquim Opublikowano 28 Listopada 2005 Zgłoś Opublikowano 28 Listopada 2005 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 ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kroll44 Opublikowano 28 Listopada 2005 Zgłoś Opublikowano 28 Listopada 2005 OK, już zaczynam to trybić, dzięki Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 28 Listopada 2005 Zgłoś Opublikowano 28 Listopada 2005 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) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...