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: typ_výsledku jméno_funkce (seznam argumentů) { příkaz1; … příkazN; return(výsledek); }
• Příklad: 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
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)
vypíše velice stručnou informaci o příkazu
run parametr (r)
spustí program s parametry
break radka/funkce (b)
definuje breakpoint na řádce nebo na vstupu funkce
list N
výpis zdrojových kódů okolo řádky N
info breakpoints (i)
výpis všech definovaných breakpointů
info locals
vypíše všechny lokální proměnné
delete (d)
vymaže všechny breakpointy
delete N (d N)
vymaže ntý breakpoint 14
Ladící program gdb (2) • Příkazy gdb step (s)
trasování se zanořuje do funkcí
next (n)
trasování se nezanořuje do funkcí
finish
dotrasuje až na konec aktuální funkce
continue (c)
pokračuje v běhu programu až do ukončení programu nebo breakpointu
backtrace (bt)
vypíše zásobník a aktuální pozici v programu
print objekt (p)
vypíše obsah proměnné, adresu funkce a podobně
display objekt
vypíše seznam všech sledovaných objeků
display
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