Operační systémy Cvičení 3: Programování v C pod Unixem 1
Obsah cvičení Editace zdrojového kódu Překlad zdrojového kódu Základní datové typy, struktura, ukazatel, pole Načtení vstupních dat Poznámka: uvedené příklady jsou dostupné na www nebo na počítačích v K327 v adresáři: ~trdlicka/os/c 2
Editace zdrojového kódu Pomocí libovolného textového editoru. Některé textové editory v Unixu: vi vim joe emacs, xemacs dtpad http://www.fi.muni.cz/usr/brandejs/unix_old/slajdy/vi/node 2.html http://www.kit.vslib.cz/~satrapa/docs/vim/ http://www.phil.muni.cz/lvt/navody/joe.html http://www.karlin.mff.cuni.cz/asc/network/prirucky/obcasni k/ob02/section3_3.html man dtpad Kromě editoru dtpad, ostatní editory fungují, jak ve znakovém, tak grafickém prostředí. 3
Úkol Přihlaste se na počítač v K327. Ve svém domovském adresáři vytvořte podadresář osy. Vyzkoušejte si jednotlivé editory. Vyberte si jeden z nich a pomocí něho vytvořte soubor $HOME/osy/hello.c. #include <stdio.h> int main() { printf( \nhello World!\n\n ); return(0); } 4
Překlad zdrojového kódu Překladač jazyka C gcc [-přepínače] zdrojový_soubor Překladač jazyka C++ g++ [-přepínače] zdrojový_soubor Překladač g++ lze použít i pro překlad programu v jazyce C, navíc toleruje některé další syntaktické konstrukce (např. vhodné při přenosu programu z MS Windows na Unix). Dokumentace k překladači info gcc nebo man gcc 5
Překlad zdrojového kódu (2) Překlad zdrojového kódu probíhá ve 4 fázích: preprocesor (cpp) zpracovává zdrojový program odstraní komentáře interpretuje speciální direktivy začínající znakem # (např. #define, #include,...) překladač (ccom) přeloží předzpracovaný zdrojový soubor do asembleru asembler (as) vygeneruje sestavitelný kód sestavovací program (ld) sestaví sestavitelný kód s knihovnami a vytvoří spustitelný soubor 6
Překlad zdrojového kódu (3) 7
Překlad zdrojového kódu (4) Užitečné volby překladače -o soubor -E -S -c výstup z gcc/g++ se uloží do daného souboru místo do a.out spustí se pouze preprocesor vytvoří se pouze soubor s asemblerem vytvoří se pouze sestavitelný kód (prog.o) -g -On do spustitelného programu se uloží informace pro ladící program spustitelný program bude optimalizován pro úroveň n 8
Překlad zdrojového kódu (5) -Dmacro -Dmacro hodnota -lknihovna definujeme dané macro a můžeme mu přiřadit danou hodnotu zdrojový program se spojí s danou knihovnou -Ladresář -Iadresář knihovny se budou hledat navíc i v tomto adresáři vkládané (hlavičkové) soubory se budou hledat navíc i v tomto adresáři 9
Úkol Vygenerujte asembler z programu hello.c a uložte ho do hello.s. Přeložte váš program hello.c a spustitelný program uložte do souboru hello. Spusťte váš přeložený program hello. 10
Základní datové typy Typ Deklarace Inicializace Deklarace+inicializace znak char letter letter= a char letter= a celé číslo int num num=-23 int num=-23 nezáporné celé číslo unsigned int num num=23 unsigned int num=23 číslo v pohyblivé řadové čárce float sum sum=2.35e-3 float sum=2.35e-3 číslo v pohyblivé řadové čárce double bigsum bigsum=-71.25 double bigsum=-71.25 Kolik místa zabírá datový typ v paměti zjistíme pomocí funkce sizeof() 11
Formátovaný výstup knihovna: #include <stdio.h> funkce: printf( format, arg1, arg2, ); format: %[příznaky][šířka][.přesnost][modifikátor]konverze konverze: %c %d %i %u %f %s jeden znak celé číslo celé číslo bez znaménka číslo v pohyblivé řadové čárce řetězec 12
Příklad: variable.c #include <stdio.h> int main() { char letter='a'; /* znak */ int a=-5, b=7; /* cela cisla */ unsigned int c=5; /* nezaporne cele cislo */ float sum=23.5e-2; /* cislo v pohyblive radove carce */ double bigsum=-7.5e2; /* cislo v pohyblive radove carce */ char name[20]="smith"; /* retezec */ 13
Příklad: variable.c (2) printf("\nukazky formatovaneho vystupu\n"); printf("\nznak: letter=%c", letter); printf("\ncele cisla: a=%d b=%d", a, b); printf("\nnezaporna cela cisla: c=%u", c); printf("\ncisla v pohyblive radove carce: sum=%f sum=%5.2f", sum, sum); printf("\ncisla v pohyblive radove carce: bigsum=%f bigsum=%5.2f\n", bigsum, bigsum); printf("\nretezec: name=%s", name); printf("\n\n"); return(0); } 14
Úkol Přeložte a spusťte příklad variable.c. Napište program, který vypíše informaci o tom, kolik bytů v paměti na daném počítači zabírají datové typy: char int unsigned int float double 15
Základní binární operátory = + - * / % && přiřazení sčítání odčítání násobení dělení modulo (zbytek po celočíselném dělení logický součin logický součet 16
Datový typ struktura Může obsahovat prvky různých typů, které jsou adresovány klíčem. Deklarace struktury struct name { type1 element1; type2 element2; } variable; Inicializace variable.element1=value Příklad struct member { char name[10]; int phone; } member1, member2; member1.name=smith; member1.phone=23452145; 17
Datový typ ukazatel 18
Příklad: pointer.c #include <stdio.h> int main() { int a=-5, b=7; /* cela cisla */ int *pa, *pb; /* ukazatele na int */ pa=&a; pb=&b; /* pa=adresa cisla a, pb=adresa cisla b */ printf("\na=%-3d b=%-3d pa=%-12u pb=%-12u\n", a, b, pa, pb); b=*pa; /* cislo z adresy ulozene v pa se zkopiruje do b */ printf("\na=%-3d b=%-3d pa=%-12u pb=%-12u\n", a, b, pa, pb); a=pa; /* adresa ulozena v pa se zkopiruje do a */ printf("\na=%u b=%d pa=%u pb=%u\n", a, b, pa, pb); *pa=200; /* 200 se zapise na adresu ulozenou v pa */ printf("\na=%u b=%d pa=%u pb=%u\n", a, b, pa, pb); return (0); } 19
Pole Obsahuje prvky stejného typu, které se adresují indexem (od 0 do size-1). Deklarace: type name [size]; Inicializace: name[index]=value; Příklad: int a[100]; a[0]=12; a[99]=7+2; int b [ ] = {3, 4, 5}; a[1] =b[0] + b[1]; 20
Načtení vstupních dat Interaktivně pomocí funkce scanf() #include <stdio.h> scanf( format, arg1, arg2,...); Z příkazové řádky int main(int argc, char *argv[ ]) { argc argv[0] argv[argc-1] } 21
Příklad: girth.c Program interaktivně načte poloměr kruhu a na standardní výstup vypíše obvod kruhu. #include <stdio.h> /* preprocesor sem vlozi obsah souboru stdio.h */ #define PI 3.14256 /* definice symbolicke konstanty */ int 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\n\n", 2*PI*r); return (0); /* navratovy kod programu */ } 22
Příklad: sqrt.c Program vypočte druhou odmocninu z čísla zadaného na příkazové řádce. #include <stdio.h> #include <math.h> int main(int argc, char *argv[]) { int a; double o; a=atoi( argv[1] ); /* prevod retezce na int */ o=sqrt(a); /* funkce pro vypocet odmocniny */ printf("\nodmocnina z %d je %10.2f\n\n", a, o); return (0); } 23
Úkol Napište program, který přečte ze vstupní řádky 5 celých čísel a vypíše jejich součet. 24