Labolatorium 7

Transkrypt

Labolatorium 7
Podstawy Programowania
Laboratorium 6
Do tej pory w sposób statyczny rezerwowaliśmy pamięc np. celem stworzenia tabeli liczb
całkowitych:
int i;
char tab[10];
for (i=0; i<10; i++)
tab[i]=rand()%26+'a';
tab[10]='\0';
printf ("Random string: %s\n",tab);
Istnieje jednak możliwośc wykonania takiego samego kodu za pomocą funkcji dynamicznie
alokującej pamięć komputera.
W języku C / C++ wkorzystujemy do tego funkcję malloc.
Funkcja służy do dynamicznego rezerwowania miejsca w pamięci. Gdy funkcja zostanie
wywołana, w przypadku sukcesu zwróci wskaźnik do nowo zarezerwowanego miejsca w pamięci;
w przypadku błędu zwraca wartość NULL.
Funkcja free zwalnia blok pamięci wskazywany przez wskaźnik wcześniej przydzielony
przez jedną z funkcji malloc, calloc lub realloc. Jeżeli wskaźnik ma wartość NULL funkcja nie
robi nic. Poniżej przykład z dynamicznie alokowaną pamięcią dla tablicy jednowymiarowej
zawierającej losowy łańcuch znaków (język C).
int i,n;
char * ptr;
printf ("How long do you want the string? ");
scanf ("%d", &i);
ptr = (char*) malloc (i+1);
for (n=0; n<i; n++)
ptr[n]=rand()%26+'a';
ptr[i]='\0';
printf ("Random string: %s\n",ptr);
free (ptr);
Dynamiczną dwuwymiarową tablicę stworzyć można poprzez zaimplementowanie tablicy
wskaźników (np. O rozmiarze takim jak ilość wierszy), a następnie dla każdego elementu tej tablicy
(de facto dla każdego wiersza) zaimplementować dynamicznie jednowymiarową tablicę o długości
równej ilości kolumn (przykład poniżej):
int r = 3, c = 4, max = 20, min = 1;
int *arr[r];
for (i=0; i<r; i++){
arr[i] = (int *)malloc(c * sizeof(int));
}
for (int i=0; i<r; i++){
for (int j=0; j<c; j++){
arr[i][j] = min + rand()%(max-min+1);
}
}
Dynamiczne alokowanie pamięci pozwala na dynamiczne zwiększanie rozmiaru tablic zależnie od
potrzeb programisty. Kod poniżej przedstawia jak realokować pamięć za pomocą funkcji realloc().
int main (int argc, char* argv[]) {
int *p;
void *tmp; /* tymczasowy wskaźnik typu void */
p = malloc(10 * sizeof(int)); /* alokacja miejsca pod 10 elementów typu int */
/* ... */
if( (tmp = realloc(p, 20 * sizeof(int))) == NULL ) {
/* odpowiednie działania w przypadku błędu realokacji */
}
else {
p = tmp;
}
/* ... */
free(p); /* zwolnienie obszaru wskazywanego przez p */ }
Tak samo jak w przypadku funkcji malloc, funkcja realloc również zwraca NULL w przypadku
błędu alokacji. Warto sprawdzać w instrukcji warunkowej if czy nie ma błędu (zarówno przy
malloc jak i realloc).
Zadanie 1
Stworzyć dwywymiarową tablicę liczb całkowitych zawierając zawierającą 5 wierszy oraz liczbę
kolumn podaną przez użytkownika. Wypełnić tablicę liczbami losowymi z przedziału 1-20.
Następnie stworzyć dwie tablice jednowymiarowe o długości odpowiadających odpowiednio
liczbom wierszy oraz liczbom kolumn pierwszej tablicy.
W tablicy o długości odpowiadającej liczbie wierszy zsumować wszystkie liczby z danego wiersza
tablicy dwuwymiarowej.
W tablicy o długości odpowiadającej liczbie kolumn zapisać wynik iloczony liczb parzystych z
poszczególnych kolumn.
4
7
2
1
14
13
11
3
4
31
6
6
8
1
21
8
4
9
5
26
9
2
7
9
27
192
48
16
4
Zadanie 2
Jednowymiarową tablicę o rozmiarze podanym przez użytkownika wypełnić liczbami losowymi z
przedziału 1-100. Następnie zliczyć ilość liczb parzystych oraz nieparzystych i skopiować je do
dwóch oddzielnych tablic: jednej dla liczb parzystych, drugą dla nieparzystych. Posortować obie
tablice.