Uvod u programski jezik C Uvodne injenice C

  • Slides: 99
Download presentation
Uvod u programski jezik C

Uvod u programski jezik C

Uvodne činjenice • C je programski jezik opšte namjene • Prvi uspješan pokušaj uvođenja

Uvodne činjenice • C je programski jezik opšte namjene • Prvi uspješan pokušaj uvođenja strukturiranog programiranja • Korišćen je za razvoj operativnog sistema UNIX • Koristi se za pisanje modernih OS • C je portabilan jezik (program mogu da rade na različitim računarima) • C predstavlja osnovu za dalje proučavanje programskih jezika kao što su C++ i Java

Reference • Knjiga: Kernigan and Ritchie – “C Programming Language” • Laslo Kraus: Programski

Reference • Knjiga: Kernigan and Ritchie – “C Programming Language” • Laslo Kraus: Programski jezik C sa rešenim zadacima, Akademska misao, Beograd, 2012. • Razvojno okruženje: Code Blocks

Faze razvoja programa u C-u • Faze razvoja C programa: 1. Edit 2. Preprocess

Faze razvoja programa u C-u • Faze razvoja C programa: 1. Edit 2. Preprocess 3. Compile 4. Link 5. Load 6. Execute Editor Preprocessor Disk Compiler Disk Linker Disk Primary Memory Loader Disk Preprocessor obrađuje kod. Kompajler kreira objektni kod koji čuva na disku. Linker povezuje objektni kod sa bibliotekama. Loader smješta program u memoriju. . . . Primary Memory CPU . . . CPU uzima instrukciju, izvršava je, i moguće smješta nove vrijednosti na disk.

Format C programa • C program sadrži jednu ili više funkcija, a tačno jedna

Format C programa • C program sadrži jednu ili više funkcija, a tačno jedna od njih mora biti main • Tijela svih funkcija moraju biti unutar { i }. • int znači da main “vraća" cio broj • Posljednja naredba u main-u je return 0, što je oznaka sistemu da je program uspješno završio rad • Sve naredbe moraju završiti tačka-zarezom (; ) • Sintaksne greške – prijavljuje ih kompajler • Logičke greške – Program radi ali daje pogrešan izlaz – Program neočekivano završava sa radom

Prvi program u C-u • #include <stdio. h> – Preprocesorska direktiva • Kompjuter treba

Prvi program u C-u • #include <stdio. h> – Preprocesorska direktiva • Kompjuter treba da učita sadržaj određene datoteke – <stdio. h> dopušta standardne input/output operacije • Specijalne grupe karaktera (escape sekvence) kod funkcije printf: – – – n – štampa novi red r – neće se štampati ništa ispred ovog karaktera t – štampa horizontalni tab \ - štampa jedan backslash “ – štampa navodnike a – alert (sistemsko zvonce)

Promjenljive u C-u • Promjenljiva je memorijska lokacija koja može čuvati vrijednost • Imena

Promjenljive u C-u • Promjenljiva je memorijska lokacija koja može čuvati vrijednost • Imena promjenljivih se nazivaju indetifikatori • Identifikatori: niz slova, cifara (ne može biti na početku) i underscores( _ ) – Case sensitive (važna su mala i velika slova) • Promjenljive se moraju deklarisati prije upotrebe – Ako naredba referencira nedeklarisanu promjenljivu, dolazi do sintaksne greške (compiler error)

Aritmetički operatori u C-u Operator Značenje + Sabiranje - Oduzimanje * Množenje / Dijeljenje

Aritmetički operatori u C-u Operator Značenje + Sabiranje - Oduzimanje * Množenje / Dijeljenje % Ostatak pri dijeljenju ++ Inkrementiranje (ima najveći prioritet) -- Dekrementiranje =, +=, -=, *=, /=, %= Operatori dodjeljivanja

Operatori poređenja Operator Značenje == Provjerava da li su vrijednosti operanada jednake (Ne miješati

Operatori poređenja Operator Značenje == Provjerava da li su vrijednosti operanada jednake (Ne miješati ga sa operatorom „=“) != Provjerava da li su vrijednosti operanada različite > Provjerava da li je vrijednost prvog operanda veća od vrijednosti drugog < Provjerava da li je vrijednost prvog operanda manja od vrijednosti drugog >= Provjerava da li je vrijednost prvog operanda veća ili jednaka vrijednosti drugog <= Provjerava da li je vrijednost prvog operanda manja ili jednaka vrijednosti drugog

Logički operatori Operator Značenje && Logičko i || Logičko ili ! Negacija

Logički operatori Operator Značenje && Logičko i || Logičko ili ! Negacija

Lvalue i rvalue • Lvalue je izraz koji se može naći sa lijeve strane

Lvalue i rvalue • Lvalue je izraz koji se može naći sa lijeve strane znaka jednakosti u programskom jeziku. • Rvalue je izraz koji se može naći samo sa desne strane znaka jednakosti u programskom jeziku. • Lvalue je moguće upotrijebiti kao rvalue, obratno nije moguće. • Primjeri: – a = 3; /*a je lvalue, a 3 je rvalue. 3=a; nije moguće*/ – b = ( a=5 ); /*b je lvalue, a=5 je rvalue*/

IF kontrolna naredba • Ako se u programu određeni dio koda može izvršiti samo

IF kontrolna naredba • Ako se u programu određeni dio koda može izvršiti samo ako je određeni uslov ispunjen, tada se koristi if naredba – if(uslov){ naredbe; }

Petlje • Petlje – Grupa instrukcija koja se ponavlja dok je neki uslov tačan

Petlje • Petlje – Grupa instrukcija koja se ponavlja dok je neki uslov tačan • Petlja kontrolisana brojačem – Konačna petlja: poznat broj ponavljanja – Kontrolna promjenljiva broji ponavljanja • Petlja kontrolisan sentinelom – Nedefinisan broj ponavljajnja – Sentinel označava kraj unosa podataka • Petlja kontrolisana uslovom – Slična prethodnoj, sa razlikom da uslov ne zavisi od unosa podataka od strane korisnika

Petlje • Petlje kontrolisane brojačem zahtijevaju – Ime kontrolne promjenljive (brojač) – Početnu vrijednost

Petlje • Petlje kontrolisane brojačem zahtijevaju – Ime kontrolne promjenljive (brojač) – Početnu vrijednost brojača – Inkrement (ili dekrement) koji mijenja kontrolnu promjeniljivu u svakoj iteraciji – Uslov koji testira vrijednost brojača

While naredba • Ako se u programu određeni dio koda treba izvršavati sve dok

While naredba • Ako se u programu određeni dio koda treba izvršavati sve dok važi određeni uslov, koristi se while naredba • Postoji i do. . . while naredba

For petlja • for ( init; condition; increment ) { statement(s); } • init

For petlja • for ( init; condition; increment ) { statement(s); } • init se izvršava na početku i jedino tada • Zatim se provjerava tačnost uslova. Ako je uslov tačan, izvršava se tijelo petlje. Ako uslon nije tačan ide se na izvršavanje naredbe koja je iza for petlje. • Nakon što se izvrši tijelo petlje izvršava se increment dio koda petlje u kojem se ažurira vrijednost promjenjljive kojom se kontroliše petlja. • init i increment dio nijesu obavezni

Switch naredba • Koristi se kada se promjenljiva ili izraz testira na sve vrijednosti

Switch naredba • Koristi se kada se promjenljiva ili izraz testira na sve vrijednosti koje može imati i za svaku vrijednost se preduzima različita akcija.

Primjeri 1. 10 studenata rade test. Bodovi (između 0 i 100) su dati. Naći

Primjeri 1. 10 studenata rade test. Bodovi (između 0 i 100) su dati. Naći prosječan broj bodova na testu. 2. Napisati program za izračunavanje srednje ocjene koji će obraditi proizvoljan broj studenata. – Koristiti sentinel • Takođe poznata kao signal vrijednost, dummy vrijednost ili flag vrijednost • Označava kraj ulaznih podataka (“end of data entry. ”) • Petlja završava kada korisnik unese sentinel • Sentinel se bira tako da ne može biti pomiješan sa regularnim ulazom (kao -1 u našem slučaju)

Primjer • Simulator igre kockicama • Pravila: – Bacamo 2 kockice • 7 ili

Primjer • Simulator igre kockicama • Pravila: – Bacamo 2 kockice • 7 ili 11 u prvom bacanju, igrač pobjeđuje • 2, 3 ili 12 u prvom bacanju, igrač gubi • 4, 5, 6, 8, 9, 10 – to su trenutni bodovi igrača, igra se nastavlja – Ako ima drugog (i ostalih) bacanja, igrač mora da osvoji isti broj bodova kao i u prvom bacanju, i tada pobjeđuje; ako dobije 7, tada igrač gubi. Inače, igra se nastavlja.

Funkcije u C-u

Funkcije u C-u

Uvod • Podijeli pa vladaj. Lakše je obrađivati djelove koda nego kompletan program. •

Uvod • Podijeli pa vladaj. Lakše je obrađivati djelove koda nego kompletan program. • C standardne biblioteke imaju veliki broj funkcija • Matematička biblioteka – Standardna matematička izračunavanja – #include <math. h> – Sve matematičke funkcije vraćaju tip double • Format poziva funkcija – Function. Name( argument ); • Ako ima više argumenata, razdvajamo ih zarezima

Prednosti korišćenja funkcija • Prednosti korišćenja funkcija: – Lakši razvoj programa (podijeli pa vladaj)

Prednosti korišćenja funkcija • Prednosti korišćenja funkcija: – Lakši razvoj programa (podijeli pa vladaj) – Ponovno korišćenje softvera (software reusability)

Definisanje funkcija • Format za definisanje funkcija return-value-type function-name( parameter-list ) { declarations and

Definisanje funkcija • Format za definisanje funkcija return-value-type function-name( parameter-list ) { declarations and statements } • Funkcije ne mogu biti definisane unutar drugih funkcija • Return-value-type: tip rezultata (default int) • Parameter-list: lista parametara razdvojenih zarezima, deklariše parametre – default-type: int

Header datoteke • Prototip funkcije: – return-value-type function-name( parameter-list ); – Imena argumenata su

Header datoteke • Prototip funkcije: – return-value-type function-name( parameter-list ); – Imena argumenata su opcionalna u prototipu • Header datoteke – Sadrže prototipove funkcija za bibliotečke funkcije – <stdlib. h> , <math. h> , itd. – Učitavamo ih sa: #include <filename>, #include <math. h> • Korisničke header datoteke – – Kreiramo datoteku sa funkcijom Sačuvamo je kao filename. h Uključujemo je u druge datoteke sa #include "filename. h" Ponovna upotreba funkcija

Predavanje argumenata • Po vrijednosti – Kopija argumenta predaje se funkciji – Promjena argumenta

Predavanje argumenata • Po vrijednosti – Kopija argumenta predaje se funkciji – Promjena argumenta u funkciji ne utiče na original – Koristiti kada funkcija ne treba da modifikuje argument • Po referenci – Predaje se originalni argument – Promjena u funkciji utiče na original

Memorijske klase • U zavisnosti od toga kojoj od memorijskih klasa objekat pripada imamo

Memorijske klase • U zavisnosti od toga kojoj od memorijskih klasa objekat pripada imamo različito: – Vrijeme memorisanja – koliko dugo objekat postoji u memoriji – Opseg važenja (scope) – gdje objekat može biti referenciran u programu

Memorijske klase • Automatske promjenljive – Objekat je kreiran i uništen unutar svog bloka

Memorijske klase • Automatske promjenljive – Objekat je kreiran i uništen unutar svog bloka – auto: default za lokalne promjenljive local variables auto double x, y; • Registarske promjenljive – register: pokušava da smjesti promjenljive u registre – register int counter = 1; • Statičke promjenljive – – Promjenljive postoje u toku čitavog vremena izvršavanja programa Default vrijednost je nula Čuvaju vrijednost po završetku funkcije Mogu se koristiti samo u funkciji u kojoj su definisane • Globalne promjenljive – Mogu se koristiti u svim funkcijama

Rekurzija • Funkcije koje pozivaju same sebe • Dva su osnovna gradivna bloka rekurzije

Rekurzija • Funkcije koje pozivaju same sebe • Dva su osnovna gradivna bloka rekurzije — Bazni slučaj — Rekurzivni korak • Podijelimo problem na – Šta možemo uraditi – Šta ne možemo uraditi • Ako ovaj dio podsjeća na originalni problem • Funkcija startuje novu kopiju same sebe (rekurzivni korak - recursion step) da bi riješila problem

Nizovi

Nizovi

Uvod • Niz je statička, homogena struktura podataka • Definisanje niza array. Type array.

Uvod • Niz je statička, homogena struktura podataka • Definisanje niza array. Type array. Name[ number. Of. Elements ]; • Pristup elementu niza: arrayname[ position number ] – Prvi element ima indeks 0

Nizovi karaktera • • char string 1[] = "first"; Null karakter '�' označava kraj

Nizovi karaktera • • char string 1[] = "first"; Null karakter '' označava kraj stringa string 1 u stvari ima 6 elemenata char string 1[] = { 'f', 'i', 'r', 's', 't', '' };

Niz kao argument funkcije • Niz se predaje kao argument funkcije tako što se

Niz kao argument funkcije • Niz se predaje kao argument funkcije tako što se preda ime niza bez “uglastih” zagrada • Veličina niza se obično predaje kao drugi argument • • Nizovi se predaju po referenci Ime niza je adresa prvog elementa Funkcija zna gdje je niz smješten u memoriji Elementi niza kao argumenti – Predaju se po vrijednosti – Predaje se kao obična promjenljiva (na primjer, my. Array[ 3 ])

Višedimenzionalni nizovi • U C-u je moguće definisati višedimenzionalne nizove • 2 D nizovi

Višedimenzionalni nizovi • U C-u je moguće definisati višedimenzionalne nizove • 2 D nizovi se nazivaju matrice i njihovi elementi su raspoređeni u redovima i kolonama Row 0 Row 1 Row 2 Column 1 Column 2 Column 3 0 0 a[ 0 ][ 1 ] a[ 0 ][ 2 ] a[ 0 ][ 3 ] a[ 1 ][ 0 ] a[ 1 ][ 2 ] a[ 1 ][ 3 ] a[ 2 ][ 0 ] a[ 2 ][ 1 ] a[ 2 ][ 3 ] Indeks kolone Ime niza Indeks reda

Primjer • Potrebno je raskrčiti šumu koja ima X stabala. Drvosječa Filip može posjeći

Primjer • Potrebno je raskrčiti šumu koja ima X stabala. Drvosječa Filip može posjeći A stabala dnevno ali odmara svakog K-tog dana (K-tog. 2 K-tog, 3 K-tog. . . ). Drvosječa Marko može posjeći B stabala dnevno ali odmara svakog M-tog dana. Drvosječe rade paralelno, pa ako istog dana rade onda posijeku ukupno A+B stabala. Napišite program koji za date brojeve A, K, B, M i X odrediti za koliko dana će dana Filip i Marko iskrčiti cijelu šumu. Ulaz: U jednom redu pet cijelih broja A, K, B, M i X razdvojena sa po jednim blankom, (1 ≤A, B ≤ 109, 2≤K, M≤ 109, 1 ≤x ≤ 1018). Izlaz: Štampati traženi broj dana. • Ulaz: 2 4 3 3 25 • Izlaz : 7

Pokazivači

Pokazivači

Uvod • Pokazivači (pointers) – Moćna mogućnost, ali složena – Simuliraju u C-u prenos

Uvod • Pokazivači (pointers) – Moćna mogućnost, ali složena – Simuliraju u C-u prenos po referenci (call-byreference) – Tijesno su povezani sa nizovima i stringovima

Uvod • Pokazivačke promjenljive – Sadrže memorijsku adresu kao svoju vrijednost – Obične promjenljive

Uvod • Pokazivačke promjenljive – Sadrže memorijsku adresu kao svoju vrijednost – Obične promjenljive sadrže određenu vrijednost (direct reference) count 7 – Pokazivači sadrže adresu promjenljive koja ima određenu vrijednost (indirect reference) count. Ptr count 7

Deklaracija i inicijalizacija pokazivača • Definicija pokazivača: – Koristimo simbol * pointer. Type *my.

Deklaracija i inicijalizacija pokazivača • Definicija pokazivača: – Koristimo simbol * pointer. Type *my. Ptr; – Više pokazivača u liniji - svaki mora da ima svoju * int *my. Ptr 1, *my. Ptr 2; – Možemo definisati pokazivač na bilo koji tip podatka – Pokazivač inicijalizujemo na 0, NULL ili nekom adresom • 0 ili NULL – “points to nothing” (bolje je koristiti NULL )

Prenos argumenata po referenci • Prenos argumenata po referenci primjenom pokazivača – Predaje se

Prenos argumenata po referenci • Prenos argumenata po referenci primjenom pokazivača – Predaje se adresa operanda (& operator) – Dozvoljava nam izmjenu vrijednosti u stvarnoj memorijskoj lokaciji – Nizovi se ne predaju sa & jer je ime niza već pokazivač – Koristi alias/nadimak za promjenljive unutar funkcije void double( int *number ) { *number = 2 * ( *number ); } – *number je alias za predatu promjenljivu

Upotreba const sa pokazivačima • const kvalifikator – Promjenljiva se ne može mijenjati –

Upotreba const sa pokazivačima • const kvalifikator – Promjenljiva se ne može mijenjati – Koristite const ako funkcija ne treba da mijenja promjenljivu – Pokušaj promjene const promjenljive proizvodi grešku

Aritmetika pokazivača Increment/decrement pokazivača (++ ili --) Dodavanje broja pokazivaču ( + ili +=

Aritmetika pokazivača Increment/decrement pokazivača (++ ili --) Dodavanje broja pokazivaču ( + ili += , - ili -=) Možemo oduzimati 2 pokazivača Operacije najčešće nemaju smisla, osim ako se izvode nad nizovima • Poređenje pokazivača ( <, == , > ) • • – Upoređuje koji pokazivač pokazuje na veći indeks u nizu – Takođe, provjera da li pokazivač pokazuje na NULL

Veza pokazivača i nizova • Nizovi i pokazivači su tijesno povezani – Ime niza

Veza pokazivača i nizova • Nizovi i pokazivači su tijesno povezani – Ime niza je kao konstantni pokazivač – Pokazivači mogu da zamijene indeksiranje niza – Element b[ 3 ] • Možemo mu pristupiti sa *( b. Ptr + 3 ) – Ovo se zove pointer/offset notacija • Možemo mu pristupiti sa bptr[ 3 ] – Ovo se zove pointer/subscript notacija • Možemo mu pristupiti sa *( b + 3 ) – Pokazivačka aritmetika nad nizom

Pokazivači na funkcije • Pokazivač na funkciju – Sadrži adresu funkcije – Slično kao

Pokazivači na funkcije • Pokazivač na funkciju – Sadrži adresu funkcije – Slično kao što je ime niza adresa prvog elementa, ime funkcije je početna adresa koda koji definiše funkciju • Pokazivače na funkcije možemo – Predati kao argument funkcijama – Čuvati u elementima niza – Dodjeljivati drugim pokazivačima na funkcije

Stringovi

Stringovi

Osnovni pojmovi • Stringovi su nizovi karaktera • String literali (string konstante) – napisani

Osnovni pojmovi • Stringovi su nizovi karaktera • String literali (string konstante) – napisani sa dvostrukim navodnicima • Mogu sadržati slova, cifre i specijalne karaktere • Vrijednost stringa je adresa prvog karaktera

Definicija stringa • Definišemo ih kao nizove karaktera ili promjenljive tipa char * –

Definicija stringa • Definišemo ih kao nizove karaktera ili promjenljive tipa char * – char color[] = "blue"; – char *color. Ptr = "blue"; • Zapamtite da stringovi predstavljaju nizove karaktera koji završavaju sa '' – color ima 5 elemenata • Ne zaboravite prostor u nizu za ''

Biblioteka za obradu karaktera • Biblioteka <ctype. h> – Sadrži funkcije koje testiraju i

Biblioteka za obradu karaktera • Biblioteka <ctype. h> – Sadrži funkcije koje testiraju i manipulišu sa karakterima

Biblioteka za obradu karaktera

Biblioteka za obradu karaktera

Funkcije za konverziju stringova • U biblioteci <stdlib. h>

Funkcije za konverziju stringova • U biblioteci <stdlib. h>

Ulazno-izlazne funkcije • Funkcije u <stdio. h>

Ulazno-izlazne funkcije • Funkcije u <stdio. h>

Biblioteka <string. h>

Biblioteka <string. h>

Biblioteka <string. h>

Biblioteka <string. h>

Ulazno-izlazne operacije

Ulazno-izlazne operacije

Uvod • Tokovi (streams) su nizovi karaktera organizovani u linije – Svaka linija se

Uvod • Tokovi (streams) su nizovi karaktera organizovani u linije – Svaka linija se sastoji od 0 ili više karaktera i završava karakterom newline – ANSI C mora podržavati linije sa najmanje 254 karaktera – Često mogu biti preusmjereni • Standardni ulaz – tastatura • Standardni izlaz – ekran • Standardna greška – ekran – Funkcije (gets, puts, getchat, putchar, scanf, printf, sscanf, sprintf, fscanf, fprintf)

Formatiranje izlaza • Za precizno formatiranje izlaza koristimo funkciju printf • Svaki poziv printf

Formatiranje izlaza • Za precizno formatiranje izlaza koristimo funkciju printf • Svaki poziv printf vraća vrijednost – Broj prikazanih karaktera – Negativan broj u slučaju greške • Navode se specifikacije konverzije: – flagovi, širina polja, preciznost, itd. • Može se izvoditi zaokruživanje, poravnavanje kolona i lijevo i desno grupisanje, umetanje karaktera, eksponencijalni format, heksadecimalni format i fiksna širina i preciznost • Format funkcije printf: – printf( format kontrolni string, ostali argumenti ); – Format kontrolni string: opisuje izlazni format – Ostali argumenti: odgovaraju svakoj specifikaciji konverzije u format kontrolnom stringu • Svaka specifikacija počinje znakom %, završava sa specifikatorom konverzije

Štampanje cijelih brojeva

Štampanje cijelih brojeva

Štampanje realnih brojeva • Realni brojevi u C-u mogu imati dvije notacije: – Standardnu

Štampanje realnih brojeva • Realni brojevi u C-u mogu imati dvije notacije: – Standardnu notaciju (150. 3) – Eksponencijalnu notaciju 150. 3 je 1. 503 E+02 u eksponencijalnoj notaciji

Štampanje realnih brojeva

Štampanje realnih brojeva

Štampanje stringova i karaktera

Štampanje stringova i karaktera

Ostali specifikatori konverzije

Ostali specifikatori konverzije

Štampanje sa širinom polja i preciznošću • Značenje preciznosti varira u zavisnosti od tipa

Štampanje sa širinom polja i preciznošću • Značenje preciznosti varira u zavisnosti od tipa podatka – Cijeli brojevi • Minimalan broj cifara za prikaz (Ako je podatak premali dodaju se nule kao prefiksi) – Realni brojevi • Broj cifara iza decimalne tačke (za e i f) • Maksimalan broj značajnih cifara (za g) – Stringovi • Maksimalan broj karaktera iz stringa

Štampanje sa širinom polja i preciznošću • Format specifikacije – %width. precision – Negativna

Štampanje sa širinom polja i preciznošću • Format specifikacije – %width. precision – Negativna širina polja – lijevo poravnavanje (left justified) – Pozitivna širina polja – desno poravnavanje (right justified) – Preciznost mora biti pozitivna – Može se koristiti cjelobrojni izraz za određivanje širine polja i preciznosti • Stavite (*) na mjesto za širinu polja ili preciznost – Poklapaju se sa int argumentima u listi argumenata

Korišćenje flagova u prinf

Korišćenje flagova u prinf

Escape sekvence

Escape sekvence

Formatiranje ulaza sa scanf

Formatiranje ulaza sa scanf

Formatiranje ulaza sa scanf

Formatiranje ulaza sa scanf

Strukture, unije i enumeracije

Strukture, unije i enumeracije

Strukture • Strukture su kolekcije povezanih promjenjljivih • Mogu sadržati promjenljive različitih tipova •

Strukture • Strukture su kolekcije povezanih promjenjljivih • Mogu sadržati promjenljive različitih tipova • U kombinaciji sa pokazivačima, koriste se za kreiranje povezanih listi, stekova, redova i stabala

Definisanje strukture • Definicija strukture ne rezerviše memorijski prostor. Umjesto toga, kreira novi tip

Definisanje strukture • Definicija strukture ne rezerviše memorijski prostor. Umjesto toga, kreira novi tip za definisanje strukturnih promjenljivih. • Operacije nad strukturama: • • Dodjeljivanje strukturi istog tipa Uzimanje adrese (&) strukture Pristupanje poljima (članovima) strukture Korišćenje sizeof operatora da bi se odredila veličina strukture (broj bajtova rezervisanih za strukturu)

Strukture kao argumenti funkcije • Predavanje cijele strukture ili predavanje individualnih članova • U

Strukture kao argumenti funkcije • Predavanje cijele strukture ili predavanje individualnih članova • U oba slučaja, predaju se po vrijednosti • Za predavanje strukture po referenci predaje se adresa strukture

typedef • Typedef kreira sinonime (aliase) za već definisane tipove podataka • Važno: typedef

typedef • Typedef kreira sinonime (aliase) za već definisane tipove podataka • Važno: typedef ne kreira novi tip podataka, već samo kreira alias

Unije • Unija je memorija koja sadrži različite objekte u različitim vremenima • Sadrži

Unije • Unija je memorija koja sadrži različite objekte u različitim vremenima • Sadrži samo jedan član u jednom trenutku • Članovi unije dijele prostor • Samo posljednji definisani član je dostupan

Unije • Operacije nad unijama: – Dodjeljivanje uniji istog tipa – Uzimanje adrese (&)

Unije • Operacije nad unijama: – Dodjeljivanje uniji istog tipa – Uzimanje adrese (&) unije – Pristupanje članovima unije – Korišćenje sizeof operatora da bi se odredila veličina unije

Enumeracije • Skup cjelobrojnih konstanti predstavljenih identifikatorima • Enumeracione konstante su kao simboličke konstante

Enumeracije • Skup cjelobrojnih konstanti predstavljenih identifikatorima • Enumeracione konstante su kao simboličke konstante čije se vrijednosti automatski postavljaju – Vrijednosti počinju od 0 i inkrementiraju se za 1 – Vrijednosti se mogu eksplicitno postaviti sa = – Potrebna su jedinstvena imena konstanti

Bit polja • Članovi strukture čija je veličina (u bitovima) specificirana • Omogućavaju bolju

Bit polja • Članovi strukture čija je veličina (u bitovima) specificirana • Omogućavaju bolju upotrebu memorije • Moraju biti definisani kao int ili unsigned • Ne može se pristupati pojedinačnim bitovima

Bit polja • Neimenovana bit polja: – Polja koja se koriste kao dopuna (padding)

Bit polja • Neimenovana bit polja: – Polja koja se koriste kao dopuna (padding) u strukturi – Ništa se ne može smjestiti u njih struct Example { unsigned a : 13; unsigned : 3; unsigned b : 4; } – Neimenovana bit polja sa širinom polja 0 poravnavaju sledeće bit polje na novu granicu memorijske jedinice

Bitwise operatori

Bitwise operatori

Bitwise operatori

Bitwise operatori

Bitwise operatori dodjele

Bitwise operatori dodjele

Prioritet operatora u C-u

Prioritet operatora u C-u

Obrada datoteka

Obrada datoteka

Uvod • Datoteke se mogu kreirati, mijenjati i obrađivati u C programima • Koriste

Uvod • Datoteke se mogu kreirati, mijenjati i obrađivati u C programima • Koriste se za permanentno čuvanje podataka • C posmatra svaku datoteku kao niz bajtova • Tok (stream) se kreira pri otvaranju datoteke – Tok obezbjeđuje komunikacioni kanal između datoteke i programa – Otvaranje datoteke vraća pokazivač na FILE strukturu • Programi mogu obrađivati više datoteka • Svaka datoteka mora imati jedinstveno ime i imati svoj pokazivač na FILE.

Sekvencijalne datoteke • C ne pretpostavlja ništa o strukturi sekvencijalne datoteke – Bez naznaka

Sekvencijalne datoteke • C ne pretpostavlja ništa o strukturi sekvencijalne datoteke – Bez naznaka o zapisima u datoteci – Programer mora obezbijediti strukturu datoteke

Read/Write funkcije • fgetc -Čita jedan karakter iz datoteke – Ima argument tipa pokazivač

Read/Write funkcije • fgetc -Čita jedan karakter iz datoteke – Ima argument tipa pokazivač na FILE – fgetc( stdin ) je ekvivalentno sa getchar() • fputs - Upisuje jedan karakter u datoteku – Ima argument tipa pokazivač na FILE i karakter koji se upisuje kao argumente – fputc( 'a', stdout ) ekvivalentno sa putchar( 'a' ) • fgets - Učitava jedan red iz datoteke • fputs - Upisuje jedan red u datoteku • fscanf / fprintf - Rad sa datotekom ekvivavlentan sa scanf i printf

Mod pristupa fajlu

Mod pristupa fajlu

Datoteke sa slučajnim pristupom • Datoteke sa slučajnim pristupom omogućavaju: – Pristup pojedinačnom zapisu

Datoteke sa slučajnim pristupom • Datoteke sa slučajnim pristupom omogućavaju: – Pristup pojedinačnom zapisu bez pregledanja ostalih zapisa – Podaci koji su ranije smješteni u datoteku mogu se mijenjati ili brisati bez prepisivanja

Datoteke sa slučajnim pristupom • Implementiraju se pomoću zapisa fiksne dužine 0 100 200

Datoteke sa slučajnim pristupom • Implementiraju se pomoću zapisa fiksne dužine 0 100 200 300 400 500 }byte offsets 100 bytes } } } 100 bytes

Datoteke sa slučajnim pristupom • Podaci u datotekama sa slučajnim pristupom su neformatirani (čuvaju

Datoteke sa slučajnim pristupom • Podaci u datotekama sa slučajnim pristupom su neformatirani (čuvaju se kao sirovi bajtovi - "raw bytes") • Svi podaci istog tipa (na primjer int) korsite istu količinu memorije • Svi zapisi imaju isti tip fiksne dužine • Podaci nijesu čitljivi čovjeku

Read/Write funkcije • fwrite – za transfer bajtova iz bafera u datoteku – size_t

Read/Write funkcije • fwrite – za transfer bajtova iz bafera u datoteku – size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); • buffer – pokazivač na prvi od objekata koji upisujemo u datoteku • size – veličina jednog objekta • count – broj objekata • stream – pokazivač na fajl u koji upisujemo • fread – čita bajte iz datoteke – size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

Fseek funkcija • fseek - Postavlja pokazivač pozicije na određenu poziciju u datoteci –

Fseek funkcija • fseek - Postavlja pokazivač pozicije na određenu poziciju u datoteci – int fseek( FILE *stream, long offset, int origin ); • stream – pokazivač na fajl s kojim se manipuliše • offset – broj bajta za koji se pomjeramo u odnosu na origin • origin – uzima sljedeće vrijednosti SEEK_SET, SEEK_CUR, SEEK_END

Pretprocesor

Pretprocesor

Uvod • Pretprocesiranje – Dešava se prije prevođenja (kompilacije) programa – Uključivanje drugih datoteka

Uvod • Pretprocesiranje – Dešava se prije prevođenja (kompilacije) programa – Uključivanje drugih datoteka – Definisanje simboločkih konstanti i makroa – Uslovna kompilacija programskog koda – Uslovno izvršavanje pretprocesorskih direktiva

#include direktiva • Kopira datoteku iz include direktive na mjesto direktive • #include <filename>

#include direktiva • Kopira datoteku iz include direktive na mjesto direktive • #include <filename> – Pretražuje standardne biblioteke tražeći datoteku – Koristi se za datoteke iz standardnih biblioteka • include "filename" – Pretražuje tekući direktorijum, pa zatim standardne biblioteke – Koristi se za korisničke datoteke • Koristi se za: – Programe sa više source datoteka koje treba prevoditi zajedno – Header datoteke – imaju opšte deklaracije i definicije (klase, strukture, prototipove funkcija) • #include naredba u svakoj od datoteka

#define direktiva • Pretprocesoka direktiva zakreiranje simboličkih konstanti i makroa • Simboličke konstante –

#define direktiva • Pretprocesoka direktiva zakreiranje simboličkih konstanti i makroa • Simboličke konstante – Kada se program prevodi, sva pojavljivanja simboličke konstante zamjenjuju se odgovarajućim tekstom – Ne mogu se redefinisati • Format – #define identifier replacement-text

#define direktiva • Makro je operacija definisana sa pretprocesorskom direktivom #define • Makro bez

#define direktiva • Makro je operacija definisana sa pretprocesorskom direktivom #define • Makro bez argumenata se tretira kao simbolička konstanta • Makro sa argumentima – argumenti se zamjenjuju odgovarajućim tekstom • Izvodi se samo zamjena teksta – nema provjere tipa • Koriste se zagrade

#undef direktiva • #undef – Ukida definiciju simboličke konstante ili makroa – Ako je

#undef direktiva • #undef – Ukida definiciju simboličke konstante ili makroa – Ako je ukinuta definicija simboličke konstante ili makroa, on kasnije može biti redefinisan

Uslovna kompilacija • #if !defined( NULL ) #define NULL 0 #endif • Svako #if

Uslovna kompilacija • #if !defined( NULL ) #define NULL 0 #endif • Svako #if mora završiti sa #endif • #ifdef je skraćenica za #if defined( name ) • #ifndef je skraćenica za #if !defined( name ) • #elif – ekvivalentano sa else if u if naredbi • #else – ekvivalentano sa else u if naredbi

Ostale direktive • #error string – prikazuje dati string kao grešku i zaustavlja kompajliranje

Ostale direktive • #error string – prikazuje dati string kao grešku i zaustavlja kompajliranje • #line - Prenumeracija sledećih linija koda , počinje sa sa cjelobrojnom vrijednošću • #line 100 "my. File. c" • Linije su numerisane od 100 počevši sa sledećom source datotekom • makes errors more meaningful • # operator - Uzrokuje zamjenu tekst tokena u string sa navodnicima

Predefinisane simboličke konstante • __LINE__ - Broj tekuće linije koda (cjelobrojna konstanta). • __FILE__

Predefinisane simboličke konstante • __LINE__ - Broj tekuće linije koda (cjelobrojna konstanta). • __FILE__ - Pretpostavljeno ime source datoteke (string). • __DATE__ - Datum kada je datoteka kompajlirana (string oblika "Mmm dd yyyy") • __TIME__ - Vrijeme kada je datoteka kompajlirana (string oblika "hh: mm: ss").