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.