Ĺ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
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 :)