Standardne biblioteke (C)
#fax #cs/prog/c [deo jezika C]
Zaglavlje <stdlib.h>
// dinamička alokacija:
void *malloc(size_t n);
void *calloc(size_t n, size_t size);
void *realloc(void *memblock, size_t size);
void free(void* p);
int system(char* command);
// pseudo-slučajni brojevi:
int rand(void);
void srand(unsigned);
// zaustavljane programa:
void exit(int);
// konverzije:
double atof(const char *str); //str to double
int atoi(const char *str); //str to int
long atol(const char *str); //str to long
// konverzije:
// ako endptr nije NULL, stavlja *endptr na karakter posle pročitanog broja
double strtod(const char *str, char **endptr);
long strtol(const char *str, char **endptr, int base);
unsigned long strtoul(const char *str, char **endptr, int base);
// binarna pretraga:
void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *));
// sortiranje niza:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
// absolutna vrednost:
int abs(int x);
long labs(long x)
Funkcija int rand(void);
generiše pseudo-slučajne cele brojeve u intervalu od 0
do RAND_MAX
(definisana u zaglavlju)
Pseudo-slučajni brojevi u pokretnom zarezu iz intervala [0, 1):
((double)rand() / (RAND_MAX+1.0))
Pseudo-slučajni brojevi u intervalu
n + (m-n+1)*((double)rand() / (RAND_MAX + 1.0))
Funkcija rand
niz pseudo-slučajnih brojeva generiše uvek počev od iste podrazumevane vrednosti (koja je jednaka 1). To znači da će se u svakom pokretanju programa dobiti isti niz pseudo-slučajnih brojeva. Funkcija void srand(unsigned);
menja tu vrednost.
Za bilo koju vrednost funkcije srand
, niz brojeva koji vraća funkcija rand je uvek isti.
Često se kao argument u pozivu funkcije srand
navodi trenutno
vreme: srand(time(NULL))
, gde se koristi funkcija time
iz zaglavlja <time.h>
, da bi se postiglo da se pri svakom pokretanju programa dobije različt niz vrednosti.
Zaglavlje <assert.h>
void assert(int x);
Ako je x
nula zaustavi program sa greškom:
Assertion failed: expression, file filename, line nnn
Zaglavlje <string.h>
— rad sa niskama
// dužina:
size_t strlen (const char* str);
// kopiranje:
char* strcpy (char* destination, const char* source);
char* strncpy (char* destination, const char* source,
size_t num);
// nadovezivanje:
char* strcat (char* destination, const char* source);
char* strncat (char* destination, const char* source,
size_t num);
// poredak:
// -1 ako str1 leksikografski manje od str2
// 0 ako su iste
// 1 ako str1 leksikografski veće od str2
int strcmp (const char* str1, const char* str2);
int strncmp (const char* str1, const char* str2,
size_t num);
// vraća pokazivač na prvo pojavljivane karaktera c u niski, NULL ako c nije u niski:
char* strchr (const char* str, int c);
// vraća pokazivač na poslednje pojavljivane karaktera c u niski, NULL ako c nije u niski:
char* strrchr (const char* str, int c);
// vraća pokazivač na na prvo pojavljivane nekog od karaktera niske str2 i niski str1, NULL ako nijedan karakter nije u niski:
char* strpbrk (char* str1, char* str2);
// vraća pokazivač na podnisku jednaku sa str2 u niski str1, NULL ako nije podniska:
char* strstr (const char* str1, const char* str2);
// dužina početnog dela str1 koji sadrži samo karaktere iz str2:
size_t strspn (const char* str1, const char* str2);
// dužina početnog dela str1 koji ne sadrži nijedan od karaktera iz str2:
size_t strcspn (const char* str1, const char* str2);
// deljenje niske str karakterima iz delimiters, korišćenje dole:
char* strtok (char* str, const char* delimiters);
strtok
:
char str[] ="- Ovo, je jedna niska.", delims[] = " ,.-";
char *s = strtok (str, delims);
while (s != NULL) {
printf ("%s\n", s);
s = strtok (NULL, delims);
}
ispis:
Ovo
je
jedna
niska
Zaglavlje <ctype.h>
— rad sa karakterima
int isalpha(int c); // vraća ne-nulu ako je c slovo
int isdigit(int c); // cifra
int isalnum(int c); // cifra ili broj
int isspace(int c); // belina (razmak, tab, ...)
int isupper(int c); // veliko slovo
int islower(int c); // malo slovo
int toupper(int c); // vraća c, ako je c bio malo slovo, vraća veliko
int tolower(int c); // vraća c, ako je c bio veliko slovo, vraća malo
Zaglavlje <math.h>
— matematika
double sin(double); double asin(double);
double cos(double); double acos(double);
double tan(double); double atan(double);
double atan2(double, double);
double log(double);
double log10(double);
double log2(double);
double exp(double);
double pow(double, double);
double sqrt(double);
double fabs(double);
double floor(double);
double ceil(double);
double trunc(double);
double round(double).
Zaglavlje <time.h>
— merenje vremena
time_t
— tip podataka za predstavljanje vremena u sekundama.
clock_t
— tip podataka za predstavljanje vremena u tikovima.
CLOCKS_PER_SEC
— broj tikova u sekundi (def. u zaglavlju).
time_t time(time_t *time);
// ako je argument NULL vraća vreme od 1970
// inače vraća vreme, koje je upisano na adresi time
double difftime(time_t end, time_t start);
// razlika između dva vremena u sekundama
clock_t clock(void);
// trenutno vreme u tikovima
U tikovima ima smisla samo oduzeti vreme početka od vremena kraja i podeliti sa CLOCKS_PER_SEC
. Time ćemo dobiti vreme potrošeno samo na izvršavanje ovog programa (ne i drugih koji izvršavaju u isto vreme).
Primer
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define BROJ_POZIVA 1000
#define NS_U_S 1000000000 // nanosekundi u sekundi
// funkcija za testiranje:
int f(void) {
int i;
for (i = 0; i < 10000; i++);
}
int main() {
int i;
double ukupno_ns, f_ns;
clock_t t_pocetak = clock();
for(i = 0; i < BROJ_POZIVA; i++)
f();
clock_t t_kraj = clock();
ukupno_ns = (double)(t_kraj-t_pocetak) /
CLOCKS_PER_SEC * NS_U_S;
f_ns = ukupno_ns / BROJ_POZIVA;
printf("%.2lf ns\n", f_ns);
return 0;
}