190 likes | 345 Views
Funkcje standardowe (1). Pliki standardowej biblioteki C: assert.h - makra do asercji ctype.h - klasyfikacje znaków typu char (isspace, isalpha itd.) errno.h - deklaracja errno fenv.h - środowisko dla liczb zmiennoprzecinkowych (ISO C 9X)
E N D
Funkcje standardowe (1) Pliki standardowej biblioteki C: assert.h - makra do asercji ctype.h - klasyfikacje znaków typu char (isspace, isalpha itd.) errno.h - deklaracja errno fenv.h - środowisko dla liczb zmiennoprzecinkowych (ISO C 9X) float.h - definicje specjalne dla liczb zmiennoprzecinkowych limits.h - makra określające granice dla typów ścisłych locale.h - definicje lokali math.h - funkcje matematyczne setjmp.h - funkcje setjmp i longjmp signal.h - sygnały stdarg.h - narzędzia dla funkcji o zmiennej liście argumentów stddef.h - standardowe definicje (ptrdiff_t i size_t głównie) stdio.h - operacje wejścia/wyjścia stdlib.h - zespół funkcji użytkowych string.h - funkcje operujące na tablicach znaków time.h - narzędzia do odczytywania, interpretacji i prezentacji czasu wchar.h - obsługa "szerokiego" (wide-char) zestawu znaków wctype.h - wersja `ctype.h' dla szerokich znaków
Funkcje standardowe (2) • Funkcje znakowe: • isalpha(c) - czy c jest znakiem z alfabetu, • isupper(c) - czy C jest duże, • islower(c) - czy C jest małe, • isdigit(c) - czy c jest cyfrą [0..9], • isalnum(c) - czy c jest znakiem alfanumerycznym, • isspace(c) - czy c jest separatorem (spacja, TAB, LF, FF, VT lub CR), • toupper(c) - zwraca c duże, • tolower(c) - zwraca c małe. • Zadanie 1. • Napisz program zmieniający we wskazanym pliku wszystkie małe litery na duże lub odwrotnie. • Zadanie 2. • Napisz program, który oblicza ile jest dużych liter, ile małych liter, ile cyfr, a ile innych znaków we wskazanym pliku.
Funkcje standardowe (3) • Funkcje matematyczne (1): • sin(x) – sinus • cos(x) – cosinus • tan(x) – tangens • asin(x) – arcussinus, • acos(x) – arcuscosinus, • atan(x) – arcustangens, • atan2(y,x) – arcustangens (x / y), • sinh(x) – sinus hiperboliczny, • cosh(x) – cosinus hiperboliczny, • tanh(x) – tangens hiperboliczny, • exp(x) – funkcja wykładnicza,
Funkcje standardowe (4) • Funkcje matematyczne (2): • log(x) – logarytm naturalny, • log10(x) – logarytm dziesiętny, • pow(x,y) – x do potęgi y, • sqrt(x) – pierwiastek kwadratowy z x, • ceil(x) – najmniejsza liczba całkowita nie mniejsza niż x, • floor(x) – największa liczba całkowita nie większa niż x , • fabs(x) – wartość bazwzględna, • fmod(x,y) – reszta z dzielenia x/y. • Zadanie 3. • Napisz program obliczający odległość Euklidesową między punktami o wprowadzonych przez użytkownika współrzędnych
Funkcje standardowe (5) • Funkcje obsługi czasu (1): • clock() - przybliżoną wartość czasu procesora zużytego przez program, • ctime() - przekształca czas w formie podawanej przez funkcję time() na napis zawierający lokalny czas, • difftime() - różnicę między zmienną czas1, a zmienną czas2, • localtime() - przekształca czas kalendarzowy zadany za pomocą wskaźnika do zmiennej zawierającej ilość sekund od 1 stycznia 1970 r. na czas lokalny w postaci wskaźnika do struktury tm, • strftime() - przekształca dane o czasie zawarte w strukturze tm na tekst, • time() - odczytu czasu, który upłynął od dnia 1 stycznia 1970 roku godziny 0:00:00 czasu uniwersalnego, • tm (struktura) - struktura zawierająca elementy reprezentujące liczbę sekund, liczbę minut, godzinę, dzień miesiąca miesiąc liczbę lat od roku 1900, numer dnia tygodnia, numer dnia w rokuZadanie 3. • Napisz program obliczający odległość Euklidesową między punktami o wprowadzonych przez użytkownika współrzędnych
Funkcje standardowe (6) Funkcje obsługi czasu (2): Zadanie 4. Napisz program wypisujący na ekran aktualną datę i godzinę
Funkcje standardowe (7) • Inne funkcje użytkowe: • Interpretacja liczbowa argumentu tekstowego • int atoi( const char * ); • long atol( const char* ); • double atof( const char* ); • Generowanie liczb pseudolosowych • void srand( unsigned int ); - inicjalizacja generatora • int rand( void ); - zwraca liczbę losową z przedziału <0, RANDMAX> • Przerywanie programu • void exit( int ); • void abort( void ); • int atexit( void (*)( void ) ); - rejestracja funkcji wykonywanej przy opuszczeniu programu • Obsługa środowiska • char* getenv( const char *name ); • int setenv( const char *name, const char *value, int replace ); • void unsetenv( const char *name ); • int putenv( const char *string );
Funkcje standardowe (8) Zadanie: Napisz program wypisujący na ekran wartość wybranej zmiennej środowiskowej
Niezdefiniowane zachowania • Odczyt i zapis poza zasięgiem tablicy • Przepełnienie liczby całkowitej ze znakiem • Dotarcie do końca funkcji zwracającej wartość, bez napotkania na wyrażenie return • Odczytanie zmiennej przed zapisaniem do niej wartości • Kolejność wykonywania wyrażeń przekazanych jako argumenty do funkcji
Zarządzanie pamięcią (1) Programy w języku C mają dostęp do dwóch rodzajów pamięci: stosu i sterty. Na stosie przechowywane są zmienne lokalne. Stos jest obsługiwany automatycznie. Sterta jest obszarem pamięci udostępnianym przez system operacyjny wszystkim wykonującym się procesom. Wielkość sterty jest często znacznie większa niż stosu. Procesy działające w systemie współzawodniczą o dostęp do wspólnego obszaru pamięci.
Zarządzanie pamięcią (2) Przydzielanie pamięci Do przydzielania pamięci w języku C służą funkcje malloc() i calloc(). void* malloc(int size) void* calloc(size_t numberOfElements, size_t elementSize) Funkcja malloc() przydziela podaną w argumencie ilość bajtów. Zawartość przydzielonej pamięci jest nieokreślona. Funkcja calloc() przydziela alokuje na stercie numberOfElements elementów o rozmiarze elementSize. Funkcja wypełnia zerami przydzielany obszar pamięci przed dokonaniem alokacji. Funkcja malloc() i calloc() zwracają wskaźnik do przydzielonego miejsca w pamięci. Jeśli alokacja nie powiodła się, to funkcje zwracają NULL.
Zarządzanie pamięcią (3) Zwalnianie pamięci Przydzielony obszar pamięci można zwolnić za pomocą funkcji free(). void free(void * pointer) Funkcja zwraca obszar pamięci wskazany przez argument. Po wywołaniu funkcji pointer ma niepoprawną wartość.
Zarządzanie pamięcią (4) Problemy z wykorzystaniem sterty: 1. Alokacja pamięci jest wolniejsza niż na stosie. 2. Możliwe, że żądanie przydzielenia pamięci w czasie wykonania programu jest niemożliwe. Wymaga to obsłużenia takich sytuacji w kodzie. 3. Jeżeli zajmowana pamięć nie jest zwalniana, gdy nie jest już potrzebna, to procesy mogą przestać funkcjonować, ponieważ w systemie zabraknie pamięci. 4. Częste alokowanie sterty może spowodować fragmentację, czyli rozrzucenie wolnych obszarów pamięci po wielu różnych fragmentach sterty. Powoduje to zwiększenie ryzyka niepowodzenia alokacji i zmniejszenia wydajności
Przykład: #include <stdio.h> #define FALSE 0 #define NULL 0 typedef struct { int dataitem; struct listelement *link; } listelement; void Menu (int *choice); listelement * AddItem (listelement * listpointer, int data); listelement * RemoveItem (listelement * listpointer); void PrintQueue (listelement * listpointer); void ClearQueue (listelement * listpointer); Zarządzanie pamięcią (5)
Przykład: main () { listelement listmember, *listpointer; int data, choice; listpointer = NULL; do { Menu (&choice); switch (choice) { case 1: printf ("Wprowadz liczbe calkowita do kolejki: "); scanf ("%d", &data); listpointer = AddItem (listpointer, data); break; case 2: if (listpointer == NULL) printf ("Kolejka jest pusta.\n"); else listpointer = RemoveItem (listpointer); break; case 3: PrintQueue (listpointer); break; case 4: break; default: printf ("Wskazano niewlasciwa pozycje menu\n"); break; } } while (choice != 4); ClearQueue (listpointer); } Zarządzanie pamięcią (6)
Przykład: void Menu (int *choice) { char local; printf ("\n\t1 - dodaj element,\n\t2 - usun element\n\ \t3 - wyswietl kolejke\n\t4 - zakoncz program\n"); do { local = getchar (); if ((isdigit (local) == FALSE) && (local != '\n')) { printf ("\n\Prosze wprowadzic liczbe\n"); printf ("Nacisnij 1 aby dodac element, 2 aby usunac element, 3 aby wyswietlic kolejke, 4 aby zakonczyc program\n"); } } while (isdigit ((unsigned char) local) == FALSE); *choice = (int) local - '0'; } Zarządzanie pamięcią (7)
Przykład: listelement * AddItem (listelement * listpointer, int data) { listelement * lp = listpointer; if (listpointer != NULL) { while (listpointer -> link != NULL) listpointer = listpointer -> link; listpointer -> link = (struct listelement *) malloc (sizeof (listelement)); listpointer = listpointer -> link; listpointer -> link = NULL; listpointer -> dataitem = data; return lp; } else { listpointer = (struct listelement *) malloc (sizeof (listelement)); listpointer -> link = NULL; listpointer -> dataitem = data; return listpointer; } } Zarządzanie pamięcią (8)
Przykład: listelement * RemoveItem (listelement * listpointer) { listelement * tempp; printf ("Usunieto element %d\n", listpointer -> dataitem); tempp = listpointer -> link; free (listpointer); return tempp; } void PrintQueue (listelement * listpointer) { if (listpointer == NULL) printf ("Kolejka jest pusta\n"); else while (listpointer != NULL) { printf ("%d\t", listpointer -> dataitem); listpointer = listpointer -> link; } printf ("\n"); } void ClearQueue (listelement * listpointer) { while (listpointer != NULL) { listpointer = RemoveItem (listpointer); } } Zarządzanie pamięcią (9)
Zadanie: Zmodyfikuj przedstawiony program tak, by otrzymać listę dwukierunkową Zarządzanie pamięcią (10)