Operační systémy Cvičení 4: Programování v C pod Unixem 1
Obsah cvičení Řídící struktury Funkce Dynamická alokace paměti Ladění programu Kde najít další informace Poznámka: uvedené příklady jsou dostupné na www nebo na počítačích v K327 v adresáři: ~trdlicka/os/c 2
Řídící struktury Větvení výpočtu if ( výraz ) { příkaz1; příkazn; else { příkaz1; příkazm; ; switch ( výraz ) { case hodnota1: příkaz1; break; case hodnotan: příkazn; break; default: příkaz; 3
Relační operátory < > <= >= ==!= menší než větší než menší než nebo rovno větší než nebo rovno rovnost nerovnost 4
Úkol Napište program, který interaktivně načte celé číslo a vypíše informaci, zda je sudé nebo liché. 5
Cykly Cyklus for() for (výraz1; výraz2 ; výraz3) { příkaz1; příkazn; Cyklus while() while (výraz) { příkaz1; příkazn; do { příkaz1; příkazn; while (výraz); 6
Příklad: sum.c Program sečte čísla na příkazové řádce. #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i, p, sum; printf("\npocet cisel na radce: %d\n", argc-1); printf("vlozena cisla: "); sum=0; for (i=1; i< argc; i++){ p=atoi(argv[i]); /* prevod retezce na int */ printf("%d, ", p); sum=sum+p; ; printf("\nsoucet cisel je: %d\n\n", sum); return (0); 7
Funkce Deklarace: Příklad: typ_výsledku jméno_funkce (seznam argumentů) { příkaz1; příkazn; return(výsledek); int sum (int a; int b) { return ( a + b ); 8
Příklad: content.c Program interaktivně načte poloměr kruhu a na standardní výstup vypíše obvod a plochu kruhu. #include <stdio.h> /* preprocesor sem vlozi obsah souboru stdio.h */ #define PI 3.14256 /* definice symbolicke konstanty */ float obvod (float a) /* funkce pro vypocet obvodu */ { return (2*PI*a); float obsah (float a) /* funkce pro vypocet plochy */ { return (PI*a*a); main() { float r; /* deklarace cisla typu float */ printf("\nzadej polomer:"); /* vypis na st. vystup */ scanf("%f", &r); /* cteni ze st. vstupu */ printf("\nobvod kruhu je %f", obvod(r)); printf("\nplocha kruhu je %f\n\n", obsah(r)); return (0); /* navratovy kod programu */ 9
Příklad: maximum.c Program najde nejvyšší číslo v poli. #include <stdio.h> #define MAX 10 int maximum (int *b) /* funkce vrati nejvyssi cislo v poli */ { int i,m; m=b[0]; for (i=1; i<max; i++) { if ( m < b[i] ) { m=b[i];; return (m); main() { int a[max]={ 9, 2, 7, 11, 33, 5, 88, -5, 17, 10 ; /* pole celych cisel */ printf("\nmaximum je %d.\n\n", maximum(a)); return (0); 10
Úkol Napište program, který z příkazové řádky přečte zadaná celá čísla a vypíše je na výstup v opačném pořadí. program 1 2 3 4 5 6 7 8 Výstup: 8 7 6 5 4 3 2 1 11
Dynamická alokace paměti funkce pro alokaci paměti void *malloc(size_t size); funkce pro dealokaci paměti void free(void *ptr); 12
Příklad: array.c Program ukazuje jak dynamicky alokovat pole. #include <stdio.h> main() { int i, n, *pa; printf("\nzadej pocet cisel:"); scanf("%d", &n); pa = (int *) malloc( n*sizeof(int) ); /* dynamicka alokace pole */ printf("pole cisel zacina na adrese %u\n", pa); for (i=0; i< n; i++) { printf("vloz cislo %d:", i); scanf("%d", &pa[i]); ; for (i=0; i<n; i++) { printf("na adrese %u je prvek pa[%d]=%d\n", &pa[i], i, pa[i]); ; free (pa); /* dealokovani pameti */ return (0); 13
Ladící program gdb Zdrojový program musíme kompilovat s přepínačem g. Spuštění programu: gdb program Příkazy gdb help prikaz (h) run parametr (r) break radka/funkce (b) list N info breakpoints (i) info locals delete (d) delete N (d N) vypíše velice stručnou informaci o příkazu spustí program s parametry definuje breakpoint na řádce nebo na vstupu funkce výpis zdrojových kódů okolo řádky N výpis všech definovaných breakpointů vypíše všechny lokální proměnné vymaže všechny breakpointy vymaže ntý breakpoint 14
Ladící program gdb (2) Příkazy gdb step (s) next (n) finish trasování se zanořuje do funkcí trasování se nezanořuje do funkcí dotrasuje až na konec aktuální funkce continue (c) backtrace (bt) print objekt (p) display objekt display pokračuje v běhu programu až do ukončení programu nebo breakpointu vypíše zásobník a aktuální pozici v programu vypíše obsah proměnné, adresu funkce a podobně vypíše seznam všech sledovaných objeků vypíše seznam všech sledovaných objeků 15
Ladící program ddd grafická nadstavba gdb. 16
Úkol Zkuste přeložit a krokovat příklad maximum.c. 17
Kde najít další informace Programování v C/C++ http://programovani.einstein.cz/clanek/programovani-v-c-1 Programming in C http://www.cs.cf.ac.uk/dave/c/ce.html 18