Standardní knihovní funkce: matematika a datum a čas Verze 2009.01 Standardní knihovní funkce: matematika a datum a čas 14 A1PRG - Programování – Seminář Ing. Michal Heczko heczko@fai.utb.cz
Agenda Matematické funkce Datum a čas Generátor náhodných čísel
Matematické funkce Hlavičkový soubor math.h Parametry funkci typu double
Goniometrické funkce Nutno použít velikost úhlu v radiánech ! sin(x) Popis sin(x) Sinus x cos(x) Kosinus x tan(x) Tangens x asin(x) Arkussinus x acos(x) Arkuskosinus x atan(x) Arkustangens x atan2(x,y) Arkustangens x/y sinh(x) Hyperbolický sinus x cosh(x) Hyperbolický kosinus x tanh(x) Hyperbolický tangens x
Zaokrouhlování ceil(x) floor(x) Funkce Popis Zaokrouhlení na celé číslo nahoru floor(x) Zaokrouhlení na celé číslo dolů
Zaokrouhlování Omezení: Nutnost zaokrouhlení pouze na jednotky Př.: Zaokrouhlení na 3 desetinná místa x = floor(y*1000)/1000; Zaokrouhlení pouze nahoru nebo pouze dolů => nemožnost zaokrouhlit podle matematických pravidel Př.: Zaokrouhlení dle matematických pravidel x = floor(y+0.5);
Exponenciální funkce, logaritmus, mocniny Pozn.: Třetí a vyšší odmocnina: např. pow(x,1.0/3.0); Funkce Popis exp(x) ex log(x) ln x log10(x) log x pow(x,y) xy sqrt(x) Druhá odmocnina z x
Další matematické funkce Popis fabs(x) Absolutní hodnota ldexp(x,n) x*2n frexp(x,exp) Rozdělí číslo na mantisu a mocninu 2 Pozn. exp … adresa proměnné, do které má být uložen exponent mocniny modf(x,n) Rozdělí číslo na celou a desetinnou část Pozn. N … adresa proměnné, do které má být uložena celá část fmod(x,y) Reálný zbytek po dělení x/y
Další matematické funkce Příklad použití funkce modf(): double g, f; f = modf(-3.14, &g); printf(″%f | %f″, f, g); // vypíše: -3.000000 | -0.140000
Generování náhodných čísel Knihovna stdlib.h Možno generovat celá náhodná čísla s rovnoměrným rozdělením Pseudonáhodný generátor – bez inicializace generuje stejnou posloupnost po každém spuštění Funkce: void srand(unsigned int seed) - inicializace int rand() - generování
Generování náhodných čísel Příklad: int cislo; srand((unsigned int) time(NULL)); cislo = (rand() % MAX); printf("Nahodne cislo:\t%d", cislo);
Datum a čas Hlavičkový soubor time.h Důležité datové typy a konstanty (1. část): CLK_TCK … konstanta … počet procesorových tiků za sekundu, v dnešní době se již nepoužívá clock_t … čtyřbytové celé znaménkové číslo (long) sloužící pro funkci clock()
Datum a čas Hlavičkový soubor time.h Důležité datové typy a konstanty (2. část): time_t … čtyřbytové celé znaménkové číslo (long) sloužící pro ostatní funkce z time.h tm … struktura pro uložení jednotlivých složek času
Datum a čas Položky struktury tm: int tm_sec … sekundy po minutě (0 – 59) int tm_min … minuty po hodině int tm_hour … hodiny od půlnoci (0 – 23) int tm_isdst … příznak letního času (0 – normální čas, >0 – letní čas, <0 – nelze určit)
Datum a čas Položky struktury tm: int tm_mday … den v měsíci (1 – 31) int tm_mon … měsíc od ledna (0 – 11) int tm_year … rok od 1900 (1900 – 2038) int tm_wday … den od neděle (0 - 6) int tm_yday … počet dnů od 1. ledna (0 - 366)
Datum a čas Funkce clock() clock_t clock ( void ); Návratová hodnota: počet tiků procesoru Syntaxe: clock_t clock ( void ); Využití: Zjištění doby trvání programu – dnes se však nepoužívá kvůli nepřesnosti
Datum a čas Příklad použití funkce clock(): #include <stdio.h> #include <time.h> void wait ( int seconds ) { clock_t endwait; endwait = clock () + seconds * CLOCKS_PER_SEC ; while (clock() < endwait) {} } int main () { int n; printf ("Starting countdown...\n"); for (n=10; n>0; n--) { printf ("%d\n",n); wait (1); return 0;
Datum a čas Funkce time() time_t time ( time_t * timer ); Návratová hodnota: počet sekund od 1. 1. 1970 Syntaxe: time_t time ( time_t * timer ); Parametr: Ukazatel na objekt typu time_t, do kterého je uložena hodnota času. Možno použít NULL a hodnota času bude pouze v návratové hodnotě
Datum a čas #include <stdio.h> #include <time.h> int main () { time_t seconds; seconds = time (NULL); printf ("%ld hodin od 1. 1. 1970", seconds/3600); return 0; }
Datum a čas Funkce difftime() Návratová hodnota: Rozdíl dvou časových údajů v sekundách Syntaxe: double difftime ( time_t time2, time_t time1 ); Parametry 2 časové údaje datového typu time_t Využití: Přibližné měření času
Datum a čas Funkce localtime() Na základě hodnoty typu time_m vytvoří strukturu tm pro místní časovou zónu Návratová hodnota: Ukazatel na strukturu tm Syntaxe: struct tm * localtime ( const time_t * timer );
Datum a čas Funkce gmtime() Na základě hodnoty typu time_m vytvoří strukturu tm pro časovou zónu UTC Návratová hodnota: Ukazatel na strukturu tm Syntaxe: struct tm * gmtime( const time_t * timer );
Datum a čas Funkce asctime() Na základě hodnoty typu tm vytvoří řetězec ve formátu Sat May 20 15:21:51 2000 Návratová hodnota: Ukazatel na řetězec Syntaxe: char * asctime ( const struct tm * timeptr );
Datum a čas Funkce ctime() char * ctime ( const time_t * timer ); Na základě hodnoty typu time_m vytvoří řetězec ve formátu Sat May 20 15:21:51 2000 Návratová hodnota: Ukazatel na řetězec Syntaxe: char * ctime ( const time_t * timer );
Datum a čas Funkce mktime() time_t mktime ( struct tm * timeptr ); Funkce provede konverzi ze struktury tm na datový typ time_t Syntaxe: time_t mktime ( struct tm * timeptr ); Vstupní hodnota: Ukazatel na strukturu tm Návratová hodnota: Hodnota typu time_t
Datum a čas Funkce strftime() Převod data ze struktury tm na formátovaný řetězec Syntaxe: size_t strftime ( char * ptr, size_t maxsize, const char * format, const struct tm * timeptr );
Datum a čas Funkce strftime() Vstupní hodnoty: Návratová hodnota: char * ptr … ukazatel na cílový řetězec size_t maxsize … maximální délka řetězce const char * format … formát generovaného řetězce struct tm * timeptr ... Zdrojová struktura tm Návratová hodnota: Počet zapsaných znaků do cílového řetězce. Pokud došlo k chybě, tak NULL
Datum a čas Funkce strftime() Formátovací řetězec – řídící znaky %a %A Popis Příklad %a Zkratka dne v týdnu Thu %A Plný název dne v týdnu Thursday %b Zkratka měsíce Aug %B Plný název měsíce August %c Standardní formát data a času Thu Aug 23 14:55:02 2001 %d Den v měsíci (01 – 31) 23 %H Hodiny ve 24-hodinovém formátu (00 – 23) 14 %I Hodiny ve 12-hodinovém formátu (00 – 12) 02
Datum a čas Funkce strftime() Formátovací řetězec – řídící znaky %j %m Popis Příklad %j Den v roce (0 – 366) 235 %m Pořadové číslo měsíce (00 – 12) 08 %M Minuty (00 – 59) 55 %p AM / PM PM %S Sekundy (00 – 59) 02 %U Číslo týdne (00 – 53) – týden začíná nedělí 33 %w Číslo dne v týdnu (0 – 0) – týden začíná nedělí, neděle == 0 4 %W Číslo týdne (00 – 53) – týden začíná pondělím 34
Datum a čas Funkce strftime() Formátovací řetězec – řídící znaky %x %X Popis Příklad %x Datum 08/23/01 %X Čas 14:55:02 %y Rok (dvouciferný) 01 %Y Rok (čtyřciferný) 2001 %Z Časová zóna CDT %% Znak „%“ %
Datum a čas #include <stdio.h> #include <time.h> int main () { time_t rawtime; struct tm * timeinfo; char buffer [80]; time ( &rawtime ); timeinfo = localtime ( &rawtime ); strftime (buffer,80, "Práve je %I:%M%p.",timeinfo); puts (buffer); // Prave je 03:21PM. return 0; }
Závěrem Šest zákonů o programování: V každém programu je alespoň jedna chyba Každý program lze zkrátit alespoň o jeden řádek Nejjednodušší chyby se nejhůře hledají Každou opravou se do programu zanese nová chyba Když už se zdá, že je program v pořádku, určitě jsme něco přehlédli Programátor dělá, co umí. Počítač si dělá, co chce.
A1PRG-s 14. Datum a čas, … Děkuji za pozornost Ing. Michal Heczko heczko@fai.utb.cz 218/U3 Prezentace k dispozici na http://vyuka.fai.utb.cz