programiranje 2. semestar...programiranje 2 (450/iii) stil programa, ˇ 6 programiranje 2 11...
TRANSCRIPT
Programiranje 2 (450/III)
Stil programa, � 1
Programiranje 2
Razno
Programiranje 2 2
Sadržaj� Specifikatori printf funkcije� Rukovanje unosom podataka� typedef� exit� Argumenti funkcije main� Unije� Brojivi tipovi podataka� Uvjetno prevođenje� Sistemski pozivi� Vrijeme izvršavanja programa� Bit polja� Operacije s bitovima� Funkcije s varijabilnim brojem elemenata� Pokazivači na funkcije
Programiranje 2 (450/III)
Stil programa, � 2
Programiranje 2 3
Specifikatori printf funkcije� printf(“ %d”, 5); // Što radi ova naredba?
� Format ispisa printf funkcije je moguće zadati preko slijedećih polja:%[prefiks][širina_ispisa][.preciznost][veličina tipa]tip _arg
� Format mora započeti s znakom % i završiti s oznakom tipa argumenta –sva ostala polja su opcionalna.
� prefiks – sadrži jedan znak koji ima slijedeće značenje:� - ispis se poravnava prema lijevoj granici ispisa određenog
poljem širina ispisa (inače se ispisuje desno);� + pozitivnim vrijednostima se ispisuje predznak +� razmak ako je vrijednost pozitivna dodaje se razmak ispred ispisa
broja da bi se poravnao ispis poz. i neg. vrijednosti;� 0 mjesta razmaka se popunjavaju 0� # dodatni stil formatiranja koristi se samo s određenim
tipovima argumenta (o, x, X, e, E, f, g, G).
Programiranje 2 4
Specifikatori printf funkcije� širina_ispisa – zadaje minimalni broj mjesta predviđenih za ispis neke
vrijednosti. Ako je vrijednost manja ispisuju se prazna mjesta, a ako je veća ispis se proširuje.� Ukoliko se kao širina_ispisa stavi * onda se broj mjesta uzima iz
polja .preciznost .� .preciznost
� To je cijeli broj koji određuje:� broj decimalnih mjesta koja se ispisuju kod float tipa podataka;� minimalni broj znamenki cijelog broja koje će se ispisati;� maksimalni broj znakova koji će se ispisati iz stringa.
� Polje započima znakom . iza kojeg dolazi ili cijel broj ili * (vrijednost će se očitati iz argumenta veličina_tipa).
� Ukoliko se ne koristi realni brojevi će se ispisati sa 6 decimalnih znamenki.
Programiranje 2 (450/III)
Stil programa, � 3
Programiranje 2 5
Specifikatori printf funkcije� veličina_tipa
� Sadržava samo jedan znak koji se upisuje neposredno prije oznake tipa a to može biti:� h pripadni tip_argumenta se tretira kao short int ili kao
unsigned short int� l pripadni argument je long int ili unsigned long int� L pripadni argument realnog tipa je double
Programiranje 2 6
Specifikatori printf funkcije� tip_argumenta
� c – znak iz ASCII skupa� d, i – cijeli broj� e, E – realni broj koji se ispisuje u eksponencijalnom formatu� f – realni broj koji se ispisuje u decimalno formatu� g, G – realni broj koji se ovisno o vrijednosti ispisuje u decimalnom ili eksp.
obliku.� # e, E, f, g i G ispis prisiljavaju da se ispišu sva mjesta
iza decimalne točke� p – ispis adrese varijable� s – niz znakova� u – cijeli broj bez predznaka (unsigned int)� o – ispis oktalne vrijednosti� x, X – ispis heksadecimalne vrijednosti
� # o, x i X ispisanim vrijednostima dodaju 0, 0x i 0X
Programiranje 2 (450/III)
Stil programa, � 4
Programiranje 2 7
Primjer prefiksaint x = 125;printf("1. %d obican ispis\n\n", x);printf("2. %8d sirina_ispisa = 8\n", x);printf("3. %-8d sirina_ispisa = 8, poravnaj lijevo\n", x);printf("4. %+8d sirina_ispisa = 8, ispisi + ako je >0\n", x);printf("5. %08d sirina_ispisa = 8,u prazna mjesta ide 0\n", x);printf("\nTest razmaka: \n");printf("6.\t.% d\n\t.% d\n\n", x, x*(-1));
Programiranje 2 8
Primjer prefiksa i tipa argumentaint x = 125; float y = 2.21; double z = 2.01e-16;
printf(" %o = %#o\n %x = %#x\n %X = %#X\n\n", x,x,x,x,x,x);
printf(" y = %e = %E = %f = %g = %G\n", y,y,y,y,y);
printf(" z = %e = %E = %f = %g = %G\n\n", z,z,z,z,z);
printf(" y = %#e = %#E = %#f = %#g = %#G\n", y,y,y,y,y);
printf(" z = %#e = %#E = %#f = %#g = %#G\n\n", z,z,z,z,z);
Programiranje 2 (450/III)
Stil programa, � 5
Programiranje 2 9
Primjer preciznostiint x = 125;
float y = 2.128888;
printf(" x = %d = %.5d\n", x, x);
printf(" y = %f = %.2f\n", y, y);
printf(" \n %s %.3s\n\n", "Zdravo", "svima!");
Programiranje 2 10
Rukovanje unosom podataka � Što će se dogoditi ako scanf očekuje cijeli broj, a korisnik unese
string?� Program ne javlja grešku, ali varijabla
ima neku nepoznatu vrijednost.
� Format unosa scanf funkcije je moguće zadati preko slijedećih polja:%[*] [širina] [{h | l | I64 | L}]tip _arg
� * - ukoliko je prisutna unos s tastature se radi ali se varijabli ne dodjeljuje unesena vrijednost.
� širina – je cijeli broj koji definira koliko će maksimalno znakova biti uneseno bez obzira koliko znakova upiše korisnik.
� {h | l | I64 | L} – polja kao i veličina tipa kao kod printf-a (I64 – 64 bitni cijeli broj).
Programiranje 2 (450/III)
Stil programa, � 6
Programiranje 2 11
Rukovanje unosom podataka � tip _arg – standardni argumenti (c, d, f, e, s)
� Umjesto standardnog argumenta s moguće je korištenje niza znakova u [], s tim da se u zagradama navedu svi oni znakovi čiji je unos dozvoljen. Ako se unese bilo koji drugi znak to se smatra krajem stringa.
� Ukoliko se u [] kao prvi znak postavi ^, efekt je obrnut, tj. svi znakovi navedeni iza njega se smatraju krajem stringa.
� Primjer:
Programiranje 2 12
Primjeri – Unos podataka
Programiranje 2 (450/III)
Stil programa, � 7
Programiranje 2 15
typedef� Ključna riječ koja se koristi za definiranje sinonima za neki tip
podatka.� Najčešće se definira ispred main-a kako bi novi naziv tipa podatka bio
poznat svim funkcijama. � Sintaksa:
typedef naziv_tipa nadimak_tipa;� naziv_tipa – tip podatka čiji naziv želimo promijeniti (int, char,
struct osoba, …)� nadimak_tipa – novo ime tipa podatka koje će se koristiti u
programu� Primjer:
Programiranje 2 16
exit� Funkcija exit, deklarirana u stdlib.h, prekida izvršavanje C programa.
� Sintaksa:void exit( int status );
� status – vrijednost koja se po izlasku iz programa vrača operacijskom sustavu kao izlazni kod programa. Najčešće 0 (EXIT_SUCCESS) znači da je program uspješno završen, a 1 da je došlo do greške (EXIT_FAILURE).
Programiranje 2 (450/III)
Stil programa, � 8
Programiranje 2 17
Argumenti funkcije main� Kod poziva c programa iz komandne linije je moguće prenijeti određene
parametre u program.
� Sintaksa:main( int argc, char *argv[ ] )� argc – cjelobrojna vrijednost koja sadrži broj elemenata u nizu
argv, ne unosi se već nastaje kao rezultat ulaznog broja argumenata.
� argv – niz stringova koji predstavljaju argumente komandne linije s tim da je:� argv[0] – je naredba s kojom je pozvan program (ime
programa)� argv[1] – prvi argument komandne linije � …� argv[argc] – je uvijek NULL (posljednji argument je
argv[argc-1]).
Programiranje 2 18
Primjer argumenata� Pokrećemo program
iz VC++
� Pokrećemo program iz komandne linije
Programiranje 2 (450/III)
Stil programa, � 9
Programiranje 2 19
Unije� Poseban tip podatka, po definiciji sličan strukturi s razlikom da se u
jednom trenutku može koristiti samo jedan element unije.
� Sintaksa:union ime_unije {
tip_1 element_1;tip_2 element_2;…tip_N element_N;
}
� Može se koristiti i typedef, kao kod struktura.
Programiranje 2 20
Primjer unije
Programiranje 2 (450/III)
Stil programa, � 10
Programiranje 2 21
Brojivi tipovi podataka� Brojivi tipovi podataka su korisnički tipovi podataka koji se sastoje od
niza konstanti kojima se pristupa preko njihovih brojčanih vrijednosti.� Sintaksa:
enum ime {konst_string_1 [=cjelobrojna_vr_1], konst_string_2 [=cjelobrojna_vr_2], ...
}
� Ukoliko nisu definirane brojčane vrijednosti konstanti, tada je prva=0, a sve ostale se uvećavaju za 1 .
� Ukoliko se definira brojčana vrijednost samo prve konstante, ostale se uvećavaju za 1.
� Moguće je korištenje i u kombinaciji s typedef.
Programiranje 2 22
Primjer brojivih tipova podataka
� Kod brojivih tipova podataka može se ispisivati samo njihova cjelobrojna vrijednost, ako se u printf-u stavi %s javlja grešku!!!!
� Varijabli enum tipa se mogu dodijeliti samo vrijednosti definirane u inicijalizacijskoj listi.
Programiranje 2 (450/III)
Stil programa, � 11
Programiranje 2 23
Uvjetno prevođenje� Uvjetno prevođenje omogućava da se dio koda prevodi (kompajlira)
samo ako su određeni uvjeti zadovoljeni. � Ove se naredbe mogu koristiti bilo gdje u kodu.
� Sintaksa:#if uvjet_1
blok_1#elif uvjet_2
blok_2…#else
blok_n#endif
� Kod prevođenja, prevest će se samo onaj dio koda za kojeg je uvjet zadovoljen.
� Uvjet je isti kao kod običnog if-a, s tim da se ne smije koristiti sizeof() i float tipovi podataka.
� Uvjeti mogu i ne moraju biti u ().
Programiranje 2 24
Primjer 1 (uvjetno prevođenje)� Program koji koristi informacije specifične za neku zemlju (novac ili
poruke na odgovarajućem jeziku):
Programiranje 2 (450/III)
Stil programa, � 12
Programiranje 2 25
Primjer 2 (uvjetno prevođenje)� Ukoliko nije dostupan debugger, korištenjem simboličke konstante i
uvjetnog prevođenja moguće je ovisno o želji programera ispisivati ili ne vrijednosti varijabli u kodu.
Programiranje 2 26
Operator defined() – uvjetno prevođenje� Operator defined() ukoliko je definirana simbolička konstanta vrača 1,
tj. 0 ako nije.� Može se koristiti samo u #if
� Umjesto defined() se mogu koristiti direktive #ifdef i #ifndef.
� Ili:#define PR
#ifdef PRprintf (“je”);
#elseprintf(“nije”);
#endif
� Npr:#define PR
#if defined(PR)printf (“je”);
#elseprintf(“nije”);
#endif
� Ili:#define PR
#ifndef PRprintf (“nije”);
#elseprintf(“je”);
#endif
Programiranje 2 (450/III)
Stil programa, � 13
Programiranje 2 27
Primjer 3 (uvjetno prevođenje)
Programiranje 2 28
Sistemski pozivi� Pozivom funkcije system moguće je u C-u izvršiti standardne naredbe
operacijskog sustava.� Potrebno je uključiti stdlib.h.
� Problem je što takvi programi nisu prenosivi s jednog operacijskog sustava na drugi.
� Primjer:1) system(“cls”); //cls – DOS komanda koja briše sadržaj ekrana
2) #if defined(WIN)char naredba[] = “dir”; //dir – DOS naredba koja ispisuje sadržaj tren. dir.
#else char naredba[] = “ls”; //ls – UNIX naredba koja radi isto što i dir
system(naredba);
Programiranje 2 (450/III)
Stil programa, � 14
Programiranje 2 29
Vrijeme izvršavanja programa� Trajanje programa u C-u je moguće odrediti korištenjem dvije
funkcije:� time – vrijeme u sekundama koje je prošlo od 00:00:00 01.01.1970,
prema sistemskom satu. � clock – vrača vrijeme u tisućinkama sekunde (sekunde *
CLOCKS_PER_SEC) koje je proteklo od početka programa.� Za obije funkcije je potrebno uključiti time.h.
� Sintaksa:� time_t time( time_t *timer );
� timer – pokazivač na lokaciju na koju se sprema vrijeme (može biti i NULL).
� povratna vrijednost – proteklo vrijeme u sekundama od 01.01.1970.
� clock_t clock( void );
� povratna vrijednost – vrijeme u ms koje je proteklo od početka programa
Programiranje 2 30
Primjer (vrijeme izvršavanja)
Programiranje 2 (450/III)
Stil programa, � 15
Programiranje 2 31
Bit polja� U C-u je moguće pojedine članove strukture razbiti na bitove.
Programiranje 2 32
Operacije s bitovima� C omogućava direktnu manipulaciju bitovima a dozvoljene operacije su:
Operacije Operator Primjer Poč. vrij. Vrij. nakon
AND & x = x & 2 x = 4 x = 0
OR | x = x | 2 x = 4 x = 6
XOR ^ x = x^2 x = 4 x = 6
komplement 1 ~ x = ~x x = 4 x = -5 (hex. FFFFFFFB)
left shift << x = x << 2 x = 4 x = 16
right shift >> x = x >> 2 x = 4 x = 0
� x je int varijabla.