programiranje 2. semestar...programiranje 2 (450/iii) stil programa, ˇ 6 programiranje 2 11...

16
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

Upload: others

Post on 01-Jan-2020

21 views

Category:

Documents


0 download

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.

Programiranje 2 (450/III)

Stil programa, � 16

Razno, …

KRAJ!!!