Popis funkcí a maker standardních knihoven

Podobné dokumenty
Knihovní funkce jazyka C

Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

10 Práce s řetězci - pokračování

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Algoritmizace a programování

Vstup a výstup datové proudy v C

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

- jak udělat konstantu long int: L long velka = 78L;

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Základy programování (IZP)

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

vstup a výstupv jazyce C

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Knihovny funkcí. Chyby v CRT. IUJCE Přednáška č. 9

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

vstup a výstupy jazyce C

Základy programování (IZP)

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

PB071 Programování v jazyce C

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Operační systémy. Cvičení 4: Programování v C pod Unixem

Zápis znakù pomocí výjimkových kódù

Stručný přehled základní syntaxe jazyka C

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Funkce, intuitivní chápání složitosti

vstup a výstupy jazyce C

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Reference jazyka C - Tahák

Programování v jazyce C

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

11b Další příklady operací vstupu a výstupu (úvod viz 10)

Formátové specifikace formátovací řetězce

Práce se soubory. Základy programování 2 Tomáš Kühr

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Operační systémy. Cvičení 3: Programování v C pod Unixem

Standardní vstup a výstup

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Stromy, soubory. BI-PA1 Programování a Algoritmizace 1. Ladislav Vagner, Josef Vogel

Jazyk C++, některá rozšíření oproti C

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Algoritmizace a programování

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

PB071 Programování v jazyce C

Úvod do programování. Lekce 5

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

1. test z PJC Jméno studenta: Pocet bodu: Varianta 37: příklad 5 (5 bodů)

Práce s polem a pamětí

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Základy algoritmizace a programování

Základy programování (IZP)

Základy programování (IZP)

- tzv. standardní vstupní a výstupní proud (input / output stream)

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Programování v C++, 2. cvičení

Výtah z Učebnice jazyka C

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Práce s pamětí a předávání parametrů. Úvod do programování 1

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Standardní knihovny C. Rekurze.

Lekce 19 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Př. další použití pointerů

Struktura programu v době běhu

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Část 1 Standardní knihovny, čtení/zápis ze/do souboru

Programování v jazyce C

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Část I. Část 1 Standardní knihovny, čtení/zápis ze souboru. Přehled témat. Standardní knihovny C. Rekurze. Standardní knihovny

Programovanie v jazyku C - funkcie a makra

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Základy programování (IZP)

BI-PA1 Programování a Algoritmizace 1. Miroslav Baĺık, Ladislav Vagner a Josef Vogel. 7., 9. a 10. listopadu 2017

Algoritmizace a programování

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Racionální čísla, operátory, výrazy, knihovní funkce

Programování v C++ 1, 1. cvičení

Algoritmizace a programování

Racionální čísla, operátory, výrazy, knihovní funkce

Opakování programování

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Standardní knihovny C. Rekurze.

IUJCE 07/08 Přednáška č. 1

Transkript:

Popis funkcí a maker standardních knihoven <assert.h> Makro používané při ladění.

<ctype.h> Práce se znaky. isalnum() isalpha() iscntrl() isdigit() isgraph() islower() isprint() ispunct() isspace() isupper() isxdigit() tolower() toupper() číslice nebo malá či velká písmena malá či velká písmena řídící znaky číslice znaky s grafickou podobou malá písmena tisknutelné znaky interpunkční znaky bílé znaky velká písmena hexadecimální číslice konverze velkých pímen na malá konverze malých písmen na velká

<math.h> sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) atan2(x,y) sinh(x) cosh(x) tanh(x) exp(x) log(x) log10(x) pow(x,y) sqrt(x) ceil(x) floor(x) fabs((x) ldexp(x,n) frexp(x, exp) modf(x, n) fmod(x,n) sin(x) cos(x) tan(x) arcsin(x) arccos(x) arctan(x) arkustangents x; y sinh(x) cosh(x) tanh(x) e x ln(x) log(x) q x y (x) y 2 Z; y x, nejmenší y 2 Z; y» x, největší jxj x 2 n x = m 2 e xp x na celou n a desetinou část reálný zbytek po dělení x=y

1. Parametry funkcí a návratové hodnoty jsou typu double. 2. Při chybě je v errno EDOM - vstup mimo definiční obor funkce. ERANGE -Výstup ±HUGE VAL nebo 0.0. int i double g, f; printf("%f n", ceil(3.14)); 4.000000 printf("%f n", floor(3.14)); 3.000000 f = frexp(3.14, &g); printf("%f x 2^%d n", f, i); 0.785000 x 2^2 f = modf(-3.14, &g) printf("%f + %f n", g, f); -3.000000 printf("%f n", fmod(3.14, 2.0)); 1.140000

<locale.h> Přízpůsobení C národnímu prostředí. Problémy ffl znaková sada, např. isupper( ), ffl desetinná tečka versus naše desetinná čárka, ffl zápisu času a data, např. 10.6.1995 nebo 6-10- 1995. setlocale() localeconv() nastavuje vrací <setjmp.h> Umožnění dlouhých skoků. setjmp() longjmp() připraví podmínky a návratový bod provede nelokální skok.

Funkce setjmp() uloží a funkce longjmp() obnoví obsah potřebných registrů procesoru, typ je jmp buf. Princip jednotné reakce na chybu s následným restartem programu. #include <studio.h> #include <setjmp.h> void chyba(void); /* funkcni prototyp */ jmp_buf hlavni_smycka; /* globalni promenna*/ int main(void) int i, j; printf(" Zacatek programu n") ; do printf("zadej dve cisla :"); scanf("%d %d", &i, &j ); if(j!=0)

printf(" %d /%d=%d n",i,j, i/j); else chyba(); } while(i!=0); } void chyba(void); printf("chyba - nulovy delitel n n"); longjmp(hlavni_smycka,1); } void chyba(jmp_buf kam_se_vratit, char *chybova_zpr printf("chyba: %s n", chybova zprava ); longjmp(kam_se_vratit,1); }

<signal.h> Zpracování signálu. signal() raise() zavede novou obsluhu signálu vyšle signál programu #include <studio.h> #include <signal.h> #include <setjmp.h> #define POCET_POKUSU 2 #define vynech 5000 /* znak se vypisuje jednou za vynech*/ jmp_buf navrat; char vypisovany_znak = '#'; void obsluha_signalu(int nevyuzity_parametr) static int pocet_vstupu = 0; pocet_vstupu++; if (pocet_vstupu <= pocet_pokusu) printf(" n%d: A zrovna ne n", pocet_vstupu); vypisovany_znak++; }

longjmp(navrat, pocet_vstupu); } int main(void) long int i = 0; int pid; void (*stara_adr)(int); /* zavedeni nove adresy obsluhy SIGQUIT */ stara_adr = signal(sigquit, obsluha_signalu); /* ziskani identifikacniho cisla procesu */ pid=getpid(); printf(" npid =%d n n", pid); printf("zadej trikrat prikaz: kill -%d %d n", SIGQUIT, pid); if (setjmp(navrat) < 0 pocet_pokusu) while(1) if (++i % vynech == 0) putchar(vypisovany_znak); fflush(stdout); } } } printf(" n Tak tedy ano... n"]; /* obnoveni puvodni adresy obsluhy SIGQUIT */ signal(sigquit, stara_adr); }

<stdarg.h> Práce s proměnným počtem parametrů. va start() va arg() va end() nastaví na začátek dá další položky seznamu ukončí práci se seznamem <stdio.h> Funkce pro vstup a výstup.

fopen() freopen() fflush() fclose() remove() rename() tmpfile() tmpnam() setbuf() setvbuf() fprintf() printf() sprintf() vfprintf() vprintf() vsprintf() fscanf() scanf() sscanf() vfscanf() vsscanf() fgetc() getc() fputs() puts() getchar() otevírá soubor přesměruje otevřený soubor do jiného souboru zapíše obsah bufferu do souboru uzavře soubor vymaže soubor přejmenuje soubor vytvoří dočasný soubor vytvoří dočasné jméno souboru změní buffer změní buffer a způsob práce s ním zapisuje formátovaně do souboru zapisuje formátovaně do stdout zapisuje formátovaně dořetězce zapisuje do souboru proměnný počet parametr zapisuje do stdout proměnný počet parametrů zapisuje do řetězce proměnný počet parametru čte formátovaně ze souboru čte formátovaně ze stdin čte formátovaně zřetězce čte ze souboru proměnný počet parametrů čte ze stdin proměnný počet parametrů čte znak ze souboru - vždy funkce čte znak ze souboru - může být makro zapisuje řetězec do souboru zapisuje řetězec do stdout čte znak ze stdin

fread() fwrite() fseek() ftell() rewind() fgetpos() fsetpos() clearerr() feof() ferror() perror() čte neformátovaně ze souboru zapisuje neformátovaně do souboru přesune se v souboru vrátí pozici aktuálního místa v souboru přesune se na začátek souboru uloží pozici aktuálního místa v souboru vrátí se na uloženou pozici v souboru nuluje indikátor chyby a konce souboru testuje příznak konce souboru testuje příznak chyby práce se souborem tiskne chybu podle obsahu errno

<stdlib.h> Obecně využitelné funkce.

atof() atoi() atol() strtod() strtol() strtoul() rand() srand() calloc() malloc() realloc() free() abort() exit() atexit() system() getnev() bsearch() qsort() abs() labs() div(x, y) ldiv(x, y) konverze řetězce na double konverze řetězce na int konverze řetězce na long int konverze řetězce na double konverze řetězce na long int konverze řetězce na unsigned long int generátor náhodného čísla inicializace generátoru náhodného čísla alokace dynamické paměti pro pole objektů alokace bloku dynamické paměti změna velikosti bloku dynamické paměti uvolnění dynamické paměti nestandardní ukončení programu standardní ukončení programu registrace ukončující funkce volání systémového příkazu poskytnutí informace o systémové proměnné binární vyhledávání třídění logaritmem quick sort absolutní hodnota typu int absolutní hodnota typu long int x=y a x%y současně pro typy int x=y a x%y současně pro typy long int Konverze řetězců na čísla

Poznámka: ANSI C nedefinuje opačné funkce, tj. pro převod čísel na řetězce, např. itoa(). V těchto případech je nutno použít funkci sprintf(). char *s, *chyba; long int 1; s = " 1234567"; l = atol(s); printf("s=%s l = %ld n",s,l); /* s=1234567 l=1234567 */ s="1234567"; l= strtol(s, &chyba, 10); printf("s=%s l = %ld n",s,l); /* s=1234567 l=1234567 */ s="ffff"; l=strtol(s, &chyba,16); printf("s=%s l = %ld n",s,l); /* s=ffff l=65535 */

s= " OxFGFFF" l=strtol(s, &chyba, 16); printf("s=%s l=%ld nchybny znak: %s n", s, l,chyba); /* s = OxFGFFF l = 15 */ s= 1111111111111111; l = 15; /* chybn znak: GFFF */ l= strtol(s, &chyba, 2); printf("s=%s n l = %ld n",s,l); /* s = 11111111111111111 l = 65535 */

Generátor pseudonáhodných čísel Používají se dvě funkce: 1. int rand(void) Rozsah < 0; RAND MAX), při každém spuštění programu je posloupnost stejná. Použití: rand() % rozsah, např. rand() % 20 #define real_rand() ((double)rand()/(rand_max+1.0)) 2. void srand(unsigned int start) Inicializuje generátor rand() počáteční hodnotou start.

#include <studio.h> #include <studio.h> #include <time.h> int main(void) int i; srand(( unsigned) time(null)); printf(" ndeset nahodnych cisel od 0 do 99 n"); for(i=0; i<10; i++) } printf("%2d ", rand() % 100);

Funkce pracující s dynamickou pamětí Funkce typu malloc(). Funkce pro spolupráci s operačním systémem Funkce abort() nestandardně ukončí program, tzn. že nezapisuje buffery, nemaže dočasné soubory, nespouští funkce registrované pomocí atexit(), atd. V UNIXU se snaží zavřít soubory a generuje soubor core. Funkce atexit() zaregistruje funkci stop funkce(). Zaregistrovaná funkce se spustí po ukončení funkce main(). Lze jich zaregistrovat až 32; jsou volány v obráceném pořadí, než byly registrovány.

#include <stdio.h> #include <stdlib.h> void exit_fn1(void) printf("1.exit_funkce n"); } void exit_fn2(void) printf("2.exit_funkce n"); } int main(void) printf("zacatek & registrace exit_fn n"); atexit(exit_fn1); atexit(exit_fn2); printf("konec programu n"); } Program vypíše: Zacatek & registrace exit_fn Konec programu 2. exit_funkce 1. exit_funkce

Funkce exit() Standardně ukončí prováděníprogramu, funguje jako příkaz return v main(), tzn. zapíší se buffery, uzavřou se soubory, volají se všechny funkce registrované pomocí atexit(), mažou se dočasné soubory, atd. if(( fr=fopen("nesmysl.dat","r")) == NULL) printf("soubor neexistuje n "); exit(1); }

Funkce system() vyvolá z programu příkaz operačního systému. #include<studio.h> #include<stdlib.h> int main(void) printf("vyvolani prikazu dir z programu n"); system("dir *.txt"); }

Funkce pro hledání a třídění Používá se funkce: void qsort( void *pole_trid, size_t n_prv, size_t vel_prv, int(*porov_fce)(const void*, const void*)); a porov fce() vrací: < 0 je-li první parametr menší než druhý, 0 jsou-ji parametry shodné, > 0 je-li první parametr větší než druhý. Binární vyhledávání v setříděném poli

void *bsearch(const void *klic, const void *pole_trid, size_t n_prv, size_t vel_prv, int(*porov_fce) (const void*,const void*));

<string.h> strcpy() strncpy() strcat() strncat() strcmp() strncmp() strchr() strrchr() strstr() strlen() strspn() strcspn() strpbrk() strerror() strtok() memcpy() memmove() memcmp() memchr() memset() kopírování řetězce kopírování řetězce s omezením délky spojení řetězců spojení řetězců porovnání řetězců porovnání řetězců hledání znaku v řetězci hledání znaku v řetězci od jeho konce hledání podřetězcevřetězci aktuální délka řetězce hledání prvního rozdílného znaku hledání prvního shodného znaku počet rozdílných znaků poskytnutí chybového hlášení dělení řetězce na části kopírování bloků bajtů jako memcpy(), bloky se mohou překrývat porovnání bloků bajtů hledání znaku v bloku bajtů vyplnění bloku bajtů konstantou

#include <stdio.h> #include <string.h> int main(void) char *s1 = "nazdar ahoj, dobry_den"; char *s2 = "qwx radzan"; char *s3= " qwxr"; char *s4= "od"; int pozice; char *p_c; pozice=strspn(s1,s2); printf("prvnich %d znaku s1 je v s2 n", pozice); pozice=strcspn(s1,s3); printf("prvnich %d znaku s1 neni v s3 n", pozice); p_c=strpbrk(s1,s4); if(p_c! = NULL) printf(" Prvni shodny znak s1 a s4: %c n",*p_c); else printf("zadny shodny znak n"); p_c =strtok(s1,",-"); /*mezera,carka pomlcka */

if(p_c!=null) printf("%s n",p_c); while((p_c = strtok(null, ",-"))!=NULL) } printf("%s n",p_c); Program vypíše: Prvních 8 znakù s1 je obsazeno v s2 prvních 5 znakù s1 není obsazeno v s3 První shodn znak : d nazdar ahoj dobry den #include <stdio.h> #include <string.h> #define delka 1000

int main(void) int a[delka],b[delka]; int i, *p_i; memset((void *)a,0,(size_t)(delka* sizeof(int))); printf("memset: a[%d] = %d n", delka/2, a[delka/2] a[delka/2]=1; p_i =(int *) memchr((void *) a, 1,(size_t)(delka * printf("memchr: i=%u n",p_i - a); memcpy((void*)b,(void*a,(size_t)(delka*sizeof(int)) printf("memcpy: b[%d]=%d n", delka/2,b[delka /2]) for(i=1; i < 9; i++) a[i]=i-1; for(i=0 ; i < 9; i++) printf("a[%d]=%d ",i,a[i]); printf(" nmemmove: n"); memmove((void*) &a[0],(void*) &a[1],

(size_t)(9*sizeof(int))); for(i=0; i < 9;i++) printf("a[%d]=%d", i, a[i]); } memset: a[500] =0 memchr: i=500 memcpy: b[500] =1 a[0]=0 a[1]=0 a[2]=1 a[3]=2 a[4]=3 a[5]=4 a[6]=5 a[7]=6 a[8]=7 remove: a[0]=0 a[1]=1 a[2]=3 a[3]=3 a[4]=4 a[5]=5 a[6]=6 a[7]=7 a[8]=0

<time.h> Práce s datem a časem. clock() tiků procesoru time() sekund od 1.ledna 1970 difftime() rozdíl dvou časů mktime() práce s položkami času asctime() složeky času do řetězce ctime() počet sekund na řetězec gmtime() počet sekund na čas localtime() složky času z počtu sekund strftime() form. složky času do řetězce CLK TCK počet procesorových tiků za sekundu, clock t obvykle long, pro funkci clock(), time t obvykle long, pro ostatní funkce než clock(), tm pro uložení složek času.

Struktura tt tm obsahuje tyto položky: int tm sec sekundy (0; 59) int tm min minuty (0; 59) int tm hour hodiny (0; 23) int tm mday den v měsíci (1; 31) int tm mon měsíc od ledna (0; 11) int tm year roky od 1970 (0; ) int tm wdaz dny do neděle (0; 6) int tm ydaz počet dnů od 1. ledna (0; 365) int tm isdst příznak letního času clock_t zac, konec; zac =clock(); konec = clock(); printf("program trval : %f [sec] n", (konec-zac)/(double) clk_tck); time_t pocet_sec, n_sec;

pocet_sec = time(&n_sec); pocet_sec = time(&pocet_sec); pocet_sec = time(null); struct tm tm_promenna, *p_tm; time_t cas; time(&cas); tm_promenna = *locatlime(&cas); /*prirazeni struktu if(tm_promenna.tm_min == 2) p_tm = localtime(&cas); /*prirazeni ukazatelu*/ if(p_tm->tm_min ==2)... Mon Jun 19 16:00:14 1995

time_t t ; time(&t); printf("%s n", asctime( localtime(&t))); printf("%s n", ctime(&t)); Program vypíše: Mon Jun 19 16:00:14 1995 Mon Jun 19 16:00:14 1995

#include <studio.h> #include <time.h> #define posun 20000 int main(void) struct tm *p_pak; time_t ted; char*dny[]= "Ne","Po","Ut","St","Ct","Pa","So"}; time(&ted); p_pak=localtime( &ted); p_pak->tm_min += posun; mktime(p_pak); printf("za %d bude %s. n",posun, dny[p_pak->tm_wday]);

Příklad: Následující program bude pokračovat ve své činnosti dnes ve 20 hodin plus tolik minut, kolik je nyní, plus ještě 15 minut. struct tm *p_pak; time_t ted, spusteni; time(&ted); p_pak = localtime(&ted); p_pak ->tm_min +=15 ; /*prirustkove*/ p_pak ->tm_hour =20 ; /*absolutni*/ spusteni = mktime(p_pak); while(difftime(time(null), spusteni) < 0) /* prazdny cyklus cekani*/