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
http://www.fi.muni.cz/usr/brandejs/unix_old/slajdy/vi/node 2.html
vim
http://www.kit.vslib.cz/~satrapa/docs/vim/
joe
http://www.phil.muni.cz/lvt/navody/joe.html
emacs, xemacs
http://www.karlin.mff.cuni.cz/asc/network/prirucky/obcasni k/ob02/section3_3.html
dtpad
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
výstup z gcc/g++ se uloží do daného souboru místo do a.out spustí se pouze preprocesor
-S
vytvoří se pouze soubor s asemblerem
-c
vytvoří se pouze sestavitelný kód (prog.o)
-g
do spustitelného programu se uloží informace pro ladící program spustitelný program bude optimalizován pro úroveň n
-On
8
Překlad zdrojového kódu (5) -Dmacro -Dmacro hodnota
definujeme dané macro a můžeme mu přiřadit danou hodnotu
-lknihovna
zdrojový program se spojí s danou knihovnou
-Ladresář
knihovny se budou hledat navíc i v tomto adresáři
-Iadresář
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
číslo v pohyblivé řadové čárce
double bigsum
bigsum=-71.25 double bigsum=-71.25
float sum=2.35e-3
• 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
jeden znak
%d %i celé číslo %u celé číslo bez znaménka %f číslo v pohyblivé řadové čárce %s ř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
•
Příklad
variable.element1=value 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