ďťż

Ładny brzuch

Mam zaalloc'owaną tablicę dynamiczną n x m.
Jak napisać funkcje:
1)zwalniająca pamięć
2)drukująca tablicę
3)wypełniająca tablicę szachownicą
1010101010101....
0101010101010....
.
.
.

pomoże ktoś?



Niestety nie napiszę pełnego rozwiązania ale udzielę kilku podpowiedzi:
ad. 1. przydział pamięci odbywa się np. funkcją malloc, a jej zwalnianie funkcją free - jedna linijka programu.
ad. 2. wystarczy użyć pętli od 0 do n-1, w niej pętli od 0 do m-1, a do wypisywania zastosować np. funkcje printf. 2 do 7 linii programu
ad. 3. możliwości jest bardzo dużo. Np. w podobnej do powyższej pętli używając dodatkowej zmiennej pamiętającej pierwszy wyraz poprzedniego wiersza (dajmy na to 0) wypełniać bieżący od drugiej wartości (czyli od 1 gdy poprzednio było 0). 2 do 7 linii programu.

Ogółem program powinien zamknąć się w maksymalnie 20 liniach z "ozdobnikami".

Pozdrawiam
Jarek

To ma być chyba dynamiczna tablica dynamicznych tablic liczb. Czyli otrzymamy wskaźnik na tablicę wskaźników do liczb. Przy alokowaniu trzeba najpierw zaalokować tablicę wskaźników

tab = (int**)malloc(n*sizeof(int*);

a później tablicę liczb:

for(i=0; i<n; i++)
tab[i]=(int*)malloc(m*sizeof(int));

Analogicznie, przy zwalnianiu najpierw trzeba zwolnić poszczególne elementy tablicy a później tablicę:

for(i=0; i<n; i++)
free(tab[i]);
free(tab);

ad 2: Drukowanie jest proste jeśli móżesz indeksować tablicę i używać np. tab[i][j], oraz przekazywać zmienne m i n do funkcji drukującej.

ad 3: Rozwiązanie krolikj jest bardzo dobre :>

Postaram się dzisiaj lub jutro sprawdzić czy to co napisałem ma jakiś sens w praktyce...

EDIT: sprawdziłem i wszystko działa
EDIT2: swoją drogą chętnie bym to zobaczył w 20 liniach kodu, bo mój program ma ich aż 63 (chociaż może mógłbym zaoszczędzić troszkę na klamrach, odstępach i deklaracjach zmiennych).
Użytkownik Catz edytował ten post 15 grudzień 2005, 01:21
Ad2
Wyświetlenie tablicy na ekran:
 int i,j;  for (i = 0; i < n; i++)  {    for (j = 0; j < m; j++)    {      printf("%i",tab[i][j]);    }    printf("\n");  }
Ad3
Wypełnienie szachownicą z zer i jedynek:
 int i,j;  for (i = 0; i < n; i++)    for (j = 0; j < m; j++)      tab[i][j] = (1+i+j)%2;
Użytkownik rzymo edytował ten post 15 grudzień 2005, 14:58



EDIT2: swoją drogą chętnie bym to zobaczył w 20 liniach kodu, bo mój program ma ich aż 63 Pewnie dlatego ze piszesz nieoptymalnie.


Pewnie dlatego ze piszesz nieoptymalnie.
Ale za to czytelnie.


Pewnie dlatego ze piszesz nieoptymalnie.


EDIT2: swoją drogą chętnie bym to zobaczył w 20 liniach kodu, bo mój program ma ich aż 63 (chociaż może mógłbym zaoszczędzić troszkę na klamrach, odstępach i deklaracjach zmiennych).

No nieźle. :) Na takie alokowanie pamięci nie wpadłem, ale jak widać działa. :>


(...)
Pewnie że zawsze da się krócej - możesz to równie dobrze napisać w 3 linijkach - też będzie dobrze, ale przejrzystość i czytelność kodu bliska zeru...


Pewnie że zawsze da się krócej - możesz to równie dobrze napisać w 3 linijkach - też będzie dobrze, ale przejrzystość i czytelność kodu bliska zeru...


Tak samo jak alokowanie setki malych bloczkow pamieci i skladanie na sile "tablicy" ...
Zauważ - nie piszę o efektywności, ale o przejrzystości - wiadomo że rozwiązanie z jednym blokiem będzie szybsze - tu nie ma z czym dyskutować, bo tak będzie (o ile - to by trzeba było zmierzyć i na pewno porcja danych musiałaby być większa) :)

Zresztą jak piszesz - mamy demokrację i język c/c++ sam w sobie pozwala na b. dużo :)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •