240

Programski jezik C

Embed Size (px)

DESCRIPTION

Jezik C predavanje

Citation preview

Page 1: Programski jezik C
Page 2: Programski jezik C
Page 3: Programski jezik C

Obrada programa na jeziku C

• Unosenje izvornog koda programa u datoteku

• Prevodjenje izvornog koda programa

• Povezivanje prevedenog oblika programa sa potrebnim bibliotekama

• Izvrsavanje programa

Page 4: Programski jezik C

Koraci u razvoju C programaStart

Pisanje izvornogkoda

prevodjenje

greske

nepovezivanje

greske

nePokretanje programa

greske

Kraj

ne

da

da

da

Page 5: Programski jezik C

Elementi jezika

• Mala i velika slova engleskog alfabeta mala slova: a,b,c……………………z velika slova: A,B,C………………….Z

• Deset decimalnih cifara: 0,1,2……...9

• Specijalni znaci: +,=,-,_,(,),*,&,%,#,!,.,,,:,;,” ,’,?,{,},~,\,[,],^

Page 6: Programski jezik C

Leksicki simboli u jeziku C

• Identifikatori

• Konstante

• Sluzbene reci

• Operatori

• Separatori

Page 7: Programski jezik C

• Identifikatori sluze za oznacavanje svih vrsta elemenata programa (promenjivih, simbolickih konstanti,tipova podataka, labela i funkcija)

Sastoje se od slova,brojeva i znaka podvuceno ( _ ) .

Prvi znak ne sme da bude cifra. Ime moze sadrzati najvise 31 znak.

Page 8: Programski jezik C

• Sluzbene reci jezika C su rezervisane reci i ne mogu se koristiti kao identifikatori.

u sluzbene reci spadaju:

long,short,int,byte,float,double,insigned, char,void,auto,static,extern,register,switch, if,case,for,while,do,continue,break,default, return,goto,union,struct,enum

Page 9: Programski jezik C

• Leksicki simboli mogu da se pisu spojeno ili medjusobno razvojeno proizvoljnim brojem “belih” znakova.

u bele znakove spadaju: znak razmaka, tabulacija, vertikalna tabulacija, prelazak u novi red, povratak na pocetak reda i prelazak na novi list.

Page 10: Programski jezik C

• Komentari su proizvoljni tekstovi koji sluze kao obljasnjenje citaocu programa.

mogu se javiti u dva oblika: kao dupla kosa crta (//) i kao kosa crta zvezdica (/*).

komentar u obliku duple kose crte,ukazuje prevodiocu da ignorise sve sto sledi do kraja linije.

kometar kosa crta-zvezdica ukazuje prevodiocu da ignorise sve sto sledi dok ne naidje na oznaku kraja komentara zvezdica- kosa crta (*/)

Page 11: Programski jezik C

Tipovi podataka

• Tipovi podataka odredjuju moguce vrednosti i moguce operacije koje mogu da se izvode nad tim podacima.

podaci mogu da budu skalarni (nestruktuirani) ili struktuirani.

skalarni pred stavljaju osnovne tipove podataka iz kojih mogu da se izvode slozeniji,struktuirani tipovi.

Page 12: Programski jezik C

• Od skalarnih tipova jezik C poznaje -numericke tipove ( celi brojevi i racionalni brojevi )

osnovne celobrojne tipove cine: int ( integer ) - znakovni tip podataka char ( character ) varijante ovih tipova dobijaju se dodavanjem

modifikatora ispred ovih oznaka: unsigned char, signed char, short int, long int,

unsigned short int,unsigned long int. ako koristimo modifikator int moze da se

izostavi (short=short int)

Page 13: Programski jezik C

• Logicki podaci (tip logical) ne postoje kao zaseban tip podataka vec kada je potrebno celobrojni podaci (tip int) sa vrednoscu nula tumace se kao logicka neistina (false),bilo koja druga vrednost tumaci se kao logicka istina (true).

• Realni tip podataka

float (jednostruka tacnost)

double(dvostruka tacnost)

long double (visestruka tacnost)

Page 14: Programski jezik C

Tipovi podatakatip velicin vrednost

unsigned short int 2 bajta 0 do 65535

short int 2 bajta -32768 do 32767

unsigned long int 4 bajta 0do4294967295 (0do2^32-1)

long int 4 bajta -2147483648do2147483647

int (16 bita) 2 bajta -32768 do 32767

Int (32 bita) 4 bajta -2^31 do 2^31-1

unsigned int(16) 2 bajta 0 do 65635

unsigned int(32) 4 bajta 0 do 4294967295

char 1 bajt 256 znakova (-128 do 127)

float 4 bajta 1.2e-38 do 3.4e38

double 8 bajto 2.2e-308 do 1.8e308

Page 15: Programski jezik C

Promenjive

• U programskom jeziku C promenjiva predstavlja mesto za cuvanje informacija. To je lokacija u memoriji racunara na kojoj mozete da sacuvate vrednost i kasnije da preuzmete tu vrednost.

Page 16: Programski jezik C

• Promenjive se definisu naredbom oblika • kvalifikator oznakaTipa nazivPromenjive =pocetnaVrednost,...; • oznaka tipa moze da bude bilo koji tip podataka • naziv promenjive je identifikator promenjive• pocetna vrednost moze da bude proizvoljan izraz

odgovarajuceg tipa,u nedostatku pocetne vrednosti odgovarajuca promenjiva ima slucajnu pocetnu vrednost

• Kvalifikator ako postoji moze da bude const ili volatile const oznacava da vrednosti promenjivih ne mogu biti promenjene u toku izvrsavanja programa kvalifikator volatile oznacava da se vrednosti definisanih promenjivih mogu menjati mimo kontrole programa

Page 17: Programski jezik C

oznakaTipa nazivPromenjive ;

oznakaTipa nazivPromenjive1,nazivPromenjive2 ;

oznakaTipa nazivPromenjive = pocetnaVrednost ;

short int x,y,z ;

float alfa = 12 ;

char sl =‘A’ ;

int mojUzrast ;

long povrsina, duzina, sirina ;

long sirina = 5, duzina =8 ;

int mojeGodine =30, vaseGodine = 17, njegoveGodine ;

Page 18: Programski jezik C

Konstante• Poput promenjivih i konstante (koje se ne menjaju)

predstavljaju lokacije za smestanje podataka. Konstanta se mora inicijalizovati kada se se kreira i ne moze joj se kasnije promeniti vrednost.Mogu biti brojne, znakovne i simbolicke.

celobrojne konstante mogu da budu: - decimalne (prva cifra nije nula) 123 - oktalne (pocinju sa nula) 075 dozvoljene cifre 0,1,2,3,4,5,6,7 - heksadecimalne(pocinju sa 0x ili 0X) 0x12ab ili 0X12AB 16 heksadecimalnih mesta cifre od 0-9 i slova a,b,c,d,e i f slova predstavljaju redom

vrednosti 10,11,12,13,14,15

Page 19: Programski jezik C

• int mojeGodine = 15 ;

mojeGodine je promenjiva tipa int

15 je celobrojna konstanta

• Simbolicke konstante su predstavljene nazivom kao i promenjive.Posto se konstanta inicijalizuje njena vrednost se ne moze menjati

• Konstantu definisemo naredbom oblika

# define ucenikaUgrupi 15 ;

naredba define obavlja prostu zamenu teksta

Page 20: Programski jezik C

Konstante nabrajanja

• sintaksa za definisanje konstanti nabrajanja je

enum nazivTipa {imeKonstante = vrednost konstante};

• Konstante nabrajanja omogucavaju kreiranje izbrojivih tipova (enumerisani tip) i definisanje promenjivih tih tipova cije su vrednosti, ogranicene na skup mogucih vrednosti.

• enum boje {crvena, plava, zelena, crna };

ova naredba obavlja dva posla

-definise tip boje

-cini crvena simbolickom konstantom sa vrednoscu 0,plava sa 1,zelena sa 2 i crna sa 3

Page 21: Programski jezik C

• svaka konstanta nabraljanja ima celobrojnu vrednost. Ako se drugacije ne odredi prva konstanta ima vrednost 0, a ostale se racunaju od nje.

• enum boje {crvena=100, plava, zelena=500, crna };

• crvena ima vrednost 100, plava101, zelena500, crna 501};

mozemo da definisemo promenjive tipa boje, ali njima mozemo da dodelimo samo vrednosti nabrajanja koje se nalaze unutar viticastih zagrada

vazno je razumeti da su izbrojive promenjive u stvari tipa unsigned int i da su konstante nabrajanja jednake celobrojnim promenjivim.

Page 22: Programski jezik C

• svakom tipu podataka (osnovnom i izvedenom) moze se dodati novo ime naredbom oblika

typedef oznakaTipa nazivTipa ;

typedef unsigned short int ushort ;

Page 23: Programski jezik C

Vezbe• zadatak1.

Koje su od navedenih konstanti celobrojne;

001,0xFFFf,0x10.5, 0787, 123.4,12.3e2, 12345

• resenje

001,0xFFFf, 12345,• zadatak2.

Koje od navedenih konstanti ne pripadaju realnom tipu podataka

14.6 3. -8.86 .0678 6.6e+3 3.5,7

• resenje 3.5,7

Page 24: Programski jezik C

• pitanje

Koja je razlika izmedju

unsigned short int i long int

kljucna rec unsigned znaci da ce ova promenjiva imati samo pozitivne brojeve.

short integeri su dugacki 2byta a long 4byta

• pitanje

Koju vrednost ima konstanta blue

enum color {white, black=100, red, blue};

blue = 102

Page 25: Programski jezik C

• zadatak3.

deklarisite mojeGodiste kao promenjivu tipa

unsigned int unsigned int mojeGodiste;• zadatak4.

deklarisite promenjive sirina i duzina kao promenjive tipa long

long sirina, duzina ; • zadatak5.

deklarisite promenjive sirina i duzina kao promenjive tipa long i dodelite im vrednost 4 i 5

long sirina = 4, duzina = 5 ;

Page 26: Programski jezik C

Pretprocesor Pretprocesor jezika C je deo prevodioca koji vrsi

pripremnu obradu izvornog teksta programa (transformacije teksta kojim se stvara konacni oblik teksta koji treba da bude preveden).

Transformacije teksta obuhvataju:

-umetanje sadrzaja neke tekstualne datoteke na odredjeno mesto u tekstu,

- zamene leksickih simbola zadatim novim nizovima simbola

-uslovno ukljucivanje(ili izostavljanje)delova teksta

Page 27: Programski jezik C

Radom pretprocesora upravlja se pomocu specijalnih naredbi koje se nazivaju direktivama pretprocesora.

Direktive se obavezno pisu u zasebnim redovima i pocinju sa znakom #.

U svakom redu moze da bude samo jedna direktiva.

Ubacivanje tekstualne datoteke u upravo obradjivani tekst se izvodi direktivom include

ciji je opsti oblik:

#include “nazivDatoteke”

ili

#include <nazivDatoteke>

Page 28: Programski jezik C

Ukoliko se naziv datoteke stavlja izmedju znakova navoda, datoteka se prvo trazi u katalogu datoteka u kojem se nalazi izvorni tekst programa.

Ukoliko to ne uspe ili ako je naziv datoteke stavljeno izmedju znakova <......>, pretrazivanje kataloga se vrsi po sistemskim katalozima programa C.

Uz programski jezik C postoji veci broj standardnih bibliotekarskih funkcija koje su svrstane u nekoliko grupa (stdio.h, stdlib.h, string.h....)

Page 29: Programski jezik C

Programer i sam moze da napravi svoje datoteke(zaglavlja) za svoje pakete programa.

Ta zaglavlja ne treba da sadrze definicije funkcija ili globalnih promenjivih,vec samo razne deklaracije i to:

direktive define za definisanje simbolickih konstanti,

naredbe enum za definisanje nabrojanih konstanti,

naredbe tipedef za pridruzivanje identifikatora tipovima podataka,

direktive include za ukljicivanje drugih potrebnih zaglavlja.

Page 30: Programski jezik C

Standardne biblioteke funkcija

Jezik C u svom sastavu sadrzi izvestan broj standardnih biblioteka,koje sadrze veliki broj boblioteskih funkcija za cesto koriscene elementarne obrade.

Najvaznija od svih je biblioteka za rad sa datotekama (<stdio.h>).

U njoj se nalaze:

Page 31: Programski jezik C

Druga po vaznosti je biblioteka usluznih funkcija <stdlib.h> u kojoj se nalaze, funkcije za formiranje i unistavanje dinamickih objekata.

Biblioteka za matematicke funkcije <math.h>

Biblioteka za rad sa zakovnim nizovima<string.h>

Biblioteka za ispitivanje znakova <ctype.h>

Znacajne su i sledece biblioteke:

Page 32: Programski jezik C

Ucitavanje i izdavanje podataka

Za ispisivanje poruke na ekranu(izlaznu aktivnost) koristi se funkcija printf() , a za ucitavanje sa tastature(ulazna aktivnost) funkcija scanf() .

Ove dve funkcije izvrsavaju formatizovani standardni ulaz i izlaz (po unapred odredjenom i definisanom formatu).

Format ovih podataka odredjen je kontrolnim nizom koji se pise izmedju dvostrukih znakova navoda “...” .

Page 33: Programski jezik C

Funkcija printf()

Kontrolni niz funkcije printf() sastoji se od:

-znakova koji se direktno ispisuju na ekran,

-opisa formata podataka(npr. %d) i

-znakova sa posebnim znacenjem(npr. \ )

znakovi koji se direktno ispisuju na ekran su slovni znaci stavljeni izmedju znakova navoda.

printf(“volim programiranje”);

konverzioni znak % se koristi kada je potrebno definisati format izlaznog podatka

Page 34: Programski jezik C

tabela najcesce koriscenih konverzionih znakova

konverzioni karakter izlazni niz

c char

u unsigned

d int,short

ld long

f float(12.12)

lf double

e float(0.1234e+2)

Page 35: Programski jezik C

Znakovi sa posebnim znacenjem

\n u ispisu obezbedjuje prelazak na novu liniju

\t horizontalni tab(pomera kursor za 5ili8 pozicija

\v vertikalni tab

\r carriage return(pomera kursor na pocetak linije)

\b povratnik (pomera kursor za jednu poziciju nazad )

\f form feed(pomera hartiju stampaca na pocetak sledece stranice)

Page 36: Programski jezik C

Kontrola sirine izlaznog polja

Pod sirinom izlaznog polja podrazumeva se ukupan broj mesta koje zauzima podatak koji se prikazuje.

Pri pisanju podataka izmedju znaka % i oznake za format koji zajedno cine opis fomata upisuje se broj koji odredjuje sirinu izlaznog polja.

%[*][sirina][preciznost]kk Konverziona specifikacija

*-fleg polja - (ravnanje na levo),

+(ispis predznaka+),

0 (dodavanje vodecih nula)

Page 37: Programski jezik C

Kod podataka tipa float izmedju znaka % i oznake f upise se ceo broj,decimalna tacka i ceo broj.

primer

printf(“%10.2f”,123.456)

Prvi broj odredjuje sirinu izlaznog polja a drugi broj decimalnih mesta.

Primer

printf(“%10d”,654321);

Page 38: Programski jezik C

Funkcija scanf() Funkcija scanf() izvrsava formatizovani

standardni ulaz (ucitavanje podataka sa tastature) po unapred odredjenom formatu.

Opsti oblik funkcije scanf() je:

scanf(“opis formata”,&x)

Kada racunar naidje na instrukciju scanf(),zaustavlja izvrsenje programa i ceka da upisete podatke.Cim pritisnete taster ENTER, program prosledjuje podatke promenjivama iz kontrolne liste.

Page 39: Programski jezik C

Konverziona specifikacja

konverzioni karakter izlazni niz

c char

u unsigned

d int,short

ld long

f float(12,12)

lf double

e float(0.1234e+2)

%[*][sirina][preciznost]kk

*-preskace polje u ulaznoj liniji

Page 40: Programski jezik C

Vezbe

int A=1234, B=-183;

printf(“%d”,A); 1234

printf(“%5d”,A); 1234

printf(“%3d”,A); 1234

printf(“%+5”,A); +1234

printf(“%-5d”,A); 1234 printf(“%6d”,B); -183 printf(“%010d”,B); -000000183

zadatak1

Page 41: Programski jezik C

zadatak2 int i=777, j=-1; printf(“%10o”,i); 1411 printf(“%5x”,j); ffffffff printf(“%10u”,j); 4294967295

zadatak3 float x=1234,56; printf(“%f”,x); 1234,56 printf(“%10f”,x); 1234,56000 printf(“%10.3f”,x); 1234,560 printf(“%-10.0f”,x); 1234 printf(“%10e”,x); 1.23456e+03

Page 42: Programski jezik C

zadatak4 char slovo=‘a’; printf(“%c”,slovo); a

zadatak5 int x = 1234; printf(“x=%d”,x); x=1234

printf(“vrednostx=%5d”,x); vrednostx= 1234 printf(“bla bla”,x);

printf(“opet bla bla”); bla blaopet bla bla

printf(“\n Ovo je novi red”); Ovo je novi red

Page 43: Programski jezik C

zadatak6 int sat=16,min=34,sek=37; printf(“\n vreme=%2d:%2d:%2d”,sat,min,sek);

vreme=16:34:37

printf(“\n vreme=%d,%d,%d”,sat,sat,sat);

vreme=16,16,16zadatak7 int a,b; scanf(“%d %d”,&a,&b); 12 34

scanf(“%d,%d”&a,&b); 12,34

scanf(“%2d%3d”,&a,&b); 12345

Page 44: Programski jezik C

zadatak8 float x,y;

scanf(“%f %e”,&x,&y);

123.4 1.2e+3

zadatak9 int a,b;

scanf(“%d %*d %d”,&a,&b); 123 456 789

Page 45: Programski jezik C

Vezba1

/*Nas prvi program napisan u jeziku C*/#include<stdio.h>main(){printf("zdravo kako ste?\n");getchar();}

Page 46: Programski jezik C

zadatak1 Napisati program koji ce na ekranu ispisati

Ja se zovem xxxxxxxxx

i idem na kurs iz programskog jezika C

#include<stdio.h>main(){printf("Ja se zovem \ni idem na kurs iz programskog jezika C“ );getchar();}

Page 47: Programski jezik C

Vezba 2• /*program koji uzima korisnikovo ime i prezime i ispisuje

mu pozdrav na monitoru*/• #include<stdio.h>• #define mahVelimena 15• main()• {• char ime[mahVelimena];• //pitaj korisnika za ime• printf("unesite ime:\n");• //prihvati korisnikovo ime u bafer• gets(ime);• //stampaj pozdrav• printf("\nzdravo %s,i dobro dosao \n",ime);• //sacekaj pritisak tastera• getchar();• }

Page 48: Programski jezik C

zadatak2• /*Program koji od korisnika uzima datum rodjenja xxxx• i ispisuje mu poruku: Vi ste rodjeni xxxxxxxx*/• #include<stdio.h>• main()• {• char datum[15];• printf("Unesite datum rodjena:\n");• gets(datum);• printf("\nVas datum rodjena je %s\n",datum);• getchar();• }

Page 49: Programski jezik C

Operacije izrazi i operatori• Operatori predstavljaju simbole koji

oznacavaju odredjenu operaciju i koji povezuju jedan ili vise operanda (elementa)u jedan izraz.

• U zavisnosti od broja operanda koje jedan operator povezuje postoje

• unarni

• binarni

• ternarni ...

Page 50: Programski jezik C

• Svaki operator ima prioritet i asocijativnost

• Ukoliko operatori jednog izraza imaju razlicite prioritete,prvo se izracunava operacija sa operatorom koji ima najvisi prioritet itd.

• Redosled izvrsavanja operatora odredjuje se zagradama().Operatori unutar zagrada izvrsavaju se pre operatora izvan tih zagrada.

• U jeziku C postoji ukupno 15 nivoa operatora. Najvisi nivo je 15, a najnizi nivo 1.

• U slucaju niza operatora medjusobno jednakih prioriteta,operatori se izvrsavaju sleva u desno ili sdesna u levo u zavisnosti od smera grupisanja.

Page 51: Programski jezik C

• Primer

1+2+3*4+5*6=3+12+30=451+2-3*4+5=3-12+5=-4(1+2)-3*(4+5)=3-3*9=-24

U jeziku C operatori se dele na sledece grupe:

-aritmeticki operatori-operatori poredjenja-logicki peratori-operatori za operacije nad bitovima-operatori dodeljivanja-operatori umanjivanja i povecavanja

Page 52: Programski jezik C

Arimeticki operatori

• Sluze za obavljanje uobicajenih aritmetickih operacija.

- (negativan predznak)+(operator sabiranja)- (operator oduzimanja)* (operator mnozenja)/ (operator deljenja)% (moduo broja(celobrojni ostatak kod deljenja))

*,/,% imaju veci prioritet od + i -

7%3 je 1 10%2 je 0

Page 53: Programski jezik C

Operatori poredjenja• Operatori poredjenja predstavljaju logicki

uslov na osnovu koga se vrsi poredjenje operanda.

< (manje)

<= (manje ili jednako)

> (vece)

>= (vece ili jednako)

== (jednako) != (nije jednako)

Prva cetiri operatora su veceg prioriteta od ostala dva

Page 54: Programski jezik C

Prva cetiri operatora su veceg prioriteta od ostala dva.

Svaki operator poredjenja poredi dva operanda pri cemu je rezultat uvek u vidu brojne vrednosti.

Ukoliko je poredjenje tacno rezultat je 1, u suprotnom rezultat je 0

• Primer3.1 != 3.1 rezultat je 0

0 == 3.1 rezultat je 0

3.1== 3.1 rezultat je 1

Page 55: Programski jezik C

Logicki operatori• U jeziku C postoje tri logicka operatora.a

! NOT (negacija)&& AND (i)II OR (ili)

prioritet !,&&, II

Vrednost jednog operanda u logickoj operaciji (rezultata jedne logicke operacije) moze biti tacan i netacan.Ako je brojna vrednost jednog operanda 0,njegova logicka vrednost ce biti lazan za bilo koju drugu vrednost logicka vrednost operanda je tacan(dodeljuje mu se broj 1)

Page 56: Programski jezik C

Kod operatora && i II prevodilac uporedjuje brojnu vrednost operanda sa 0, pri cemu nultu vrednost uzima za netacno, a nenultu za tacno.

Page 57: Programski jezik C

• /*program za dodelu vrednosti dva cela broja,racunjanje zbira i stampanje rezultata*/

• #include<stdio.h>

• #include<stdlib>

• main()

• {

• /*opis podataka*/

• int broj1,broj2,broj3;

• broj1=3;

• broj2=5;

• broj3=broj1+broj2;

• /*stampanje*/

• printf("broj1+broj2=broj3\n");

• printf("%d+%d=%d\n",broj1,broj2,broj3);

• getchar();

• }

Page 58: Programski jezik C

Operatori dodele vrednosti

Svaka promenjiva koja se koristi u nekom programu mora se deklarisati i mora joj se dodeliti neka vrednost.

U programskom jeziku C postoje dve grupe operatora dodeljivanja vrednosti.

-elementarni operator dodele i

-slozeni operator dodele

Page 59: Programski jezik C

Elementarni operator dodele vrednosti

Elementarni operator dodele vrednosti je predstavljen simbolom “=“(jednako)

Opsti oblik dodeljivanja vrednosti ima oblik:

velicinaJedan = izraz;

primer

short int broj1,broj2;

broj1 = 10;

broj2 = broj1-2;

Page 60: Programski jezik C

Slozeni operatori dodele vrednosti

U jeziku C postoji 10 slozenih operatora dodele vrednosti:

+, -, *, /, %, <<, >>, &, I, ^

Opsti oblik ovog operatora je: op =

op jedan od operatora +, -, *, /, %, <<, >>, &, I, ^

Opsti oblik A op = B; u matematici A=A op B

primeri: x += 3; (x=x+3)

x -= 7; (x=x-7)

x /=12; (x=x/12)

Page 61: Programski jezik C

Operatori povecavanja i umanjivanja vrednosti

U jeziku C postoji po 1 operator za povecavanje i umanjivanje vrednosti.

-- operator umanjivanja vrednosti (dekrement)

++ operator uvecavanja vrednosti (inkrement)

-- umanjuje vrednost promenjive za 1

++ uvecava vrednost promenjive za 1

Page 62: Programski jezik C

Ova dva operatora se mogu koristiti kao :

-prefiksni ++t

-postfiksni t++

Kod prefiksnih, vrednost operanda(promenjive) se prvo povecava(smanjuje) za 1, pa se onda izvrsi operacija sa tom promenjivom

Kod postfiksnih, prvo izvrsimo operaciju nad promenjivom, pa se onda njena vrednost poveca (smanji) za jedan.

primer int broj1=3,broj2=6,proizvod1,proizvod2;

proizvod1=broj1*--broj2;

proizvod2=broj1*broj2--

1518

Page 63: Programski jezik C

Konverzija tipova podataka Pretvaranje jednog tipa podataka u drugi moze biti

eksplicitno(zahtevano) ili implicitno(automatski).

Eksplicitno pretvaranje se izvodi pomocu cast operatora ciji je opsti oblik:

(tip podataka) izraz;

izraz predstavlja promenjivu ili neki slozeni izraz ciji tip treba eksplicitno transformisati.

primer

int a;

(char) a;*/ pretvara int promenjivu u tip char

Page 64: Programski jezik C

Kod implicitne (automatske) konverzije operand jedno

stavnijeg tipa se pretvori u operand slozenijeg tipa i onda se izracunava rezultat operatora.

Pravila konverzije:

- ako je jedan operand long double, i drugi se pretvara u long double,

- ako je jedan od operand double, i drugi se pretvara u double

- ako je jedan operand float, i drugi se pretvara u float

- ako je bilo koji operand tipa char ili short, drugi se pretvara u tip int.

- u slucaju operatora dodele vrednosti, operand sa desne strane se uvek pretvori u tip operanda sa leve strane.

Page 65: Programski jezik C

Implicitno pretvaranje vrsi prevodilac u izrazima koji sadrze konstante i promenjive razlicitih tipova.

Pretvaranje tipova se vrsi tako sto se tipovi koji zauzimaju manji deo memorije pretvaraju u tipove koji zauzimaju veci deo memorije.

primer

int z;

z = 5/2; // z=2 odseca se razlomljeni deo

Page 66: Programski jezik C

Pisanje slozenih izraza Pravila pisanja u jeziku C:

- operator mnozenja * uvek mora da se napise,

- ne pisati razlomke na vise nivoa, vec ceo izraz pisati u jednom redu koriscenjem operatora za deljenje / izmedju brojioca i imenioca. Izrazi u brojiocu i imeniocu treba da se stave u zagrade.

- izraz se moze protezati u vise redova

primer

(x*y+(1+x))/((1-x)*(1+y))

Page 67: Programski jezik C

Vezba 4

/*program za prikazivanje celih brojeva u raznim brojnim sistemima (decimalni, oktalni, heksadecimalni */#include<stdio.h>main(){int k;/*stampanje*/printf("unesite ceo broj\n");scanf("%i",&k);printf("-decimalni prikaz zadatog broja: %d(%u)\n",k,k);printf("-oktalni prikaz zadatog broja: %o\n",k);printf(“-heksadecimalni prikaz zadatog broja %x(%x)\n”,k,k);getchar();}

Page 68: Programski jezik C

Vezba 5• //razni oblici prikazivanja realnih brojeva• //pozivanje biblioteke• #include<stdio.h>• //pozivanje osnovne funkcije• main()• {• //deklarsanje promenjive tipa double• double x;• //pitanje za korisnika• printf("unesite bilo koji realan broj:\n");• //ulazna funkcija• scanf("%lf",&x);• //prikaz rezultata na monitoru• printf("uneti broj je %12.4f %12.4e %12.4g\n",x,x,x);• //sacekaj pritisak bilo kog tastera• getchar();• getchar();• }

Page 69: Programski jezik C

Operacije nad bitovima

Jezik C je prenstveno namenjen za sistemsko programiranje. Operatori nad bitovima su sredstvo za kontrolu nad rezervacijom i oslobadjanjem operativne memorije.

Bajt se sastoji od osam bita koji predstavljaju binarne cifre i mogu imati vrednost 1 ili 0

Bajt memorisan na odredjenoj memoriskoj lokaciji prikazujemo pomocu niza od osam binarnih cifara

primer 01100110Bit najmanje

vaznostiBit najvece

vaznosti

Page 70: Programski jezik C

Prva cifra( posmatrajuci sdesna nalevo) nosi tezinu 1, druga 2, treca 4, cetvrta 8, peta16, sesta 32, sedma 64 i osma128.

01100110 u dekadnom sistemu iznosi:

0*128+1*64+1*32+0*16+0*8+1*4+1*2+0*1=102 102 u binarnom sistemu iznosi:

102/2=51 ostatak 0

51/2=25 ostatak 1

25/2=12 ostatak 1

12/2=6 ostatak 0

6/2=3 ostatak 0

3/2=1 ostatak 1

1/2=0 ostatak 1

01100110

Page 71: Programski jezik C

U jeziku C postoji sest operatora za operacije nad bitovima:

~ potpuni koplement,

<< logicko pomeranje ulevo,

>> logicko pomeranje udesno,

& logicko I za bitove u nizu,

^ iskljucivo logicko ili za bitove u nizu i

I logicko ili za bitne nizove.

Page 72: Programski jezik C

Operator potpunog koplementa ~ pretvara operand koji mu sledi u komplementarnu vrednost( sve binarne jedinice u nule i obrnuto).

Tabela istinitosti je: b ~b

1 0

0 1

primer

unsigned short int a,b; /*obe promenjive smestene u dva bajta */

a=0723; /*promenjiva a dobija oktalnu vrednost 723*/

b=~a;

Memoriske lokacije gde su smestene promenjive:

a:0000000111010011 b:1111111000101100

Page 73: Programski jezik C

• Operator pomeranja ulevo << vrsi pomeranje bitova, koji predstavljaju neku velicinu u memoriji, za odredjeni broj mesta ulevo. Ovaj operator je binarni( levi operand predstavlja velicinu nad kojom se vrsi pomeranje, dok desni operand odredjuje broj za koliko mesta se vrsi pomeranje). Prilikom pomeranja svi bitovi sa kraljne desne strane, koji su pomeranjem ostali ispraznjeni popunjavaju se nulama.

Page 74: Programski jezik C

Operator pomeranja udesno >> vrsi pomeranje bitova za odredjeni broj mesta udesno.

Postoje dva nacina za pomeranje bitova udesno, prvi nacin je da se vrednost bita najvece tezine upisuje u ispraznjene redove (aritmeticko pomeranje) .

Drugi nacin je da ispraznjene bitove zamenimo nulama( logicko pomeranje) .

primer unsigned char a,b;

a=0324;

b=a;

a<<4;

b>>3;

pre pomeranja a=b=11010100

posle pomeranja a=01000000

logicko pomeranje b=00011010

aritmet.pomeranje b=11111010

Page 75: Programski jezik C

Operator I (OR inkluzivno) povezuje svaki pojedini bit jednog operanda sa odgovarajucim bitom drugog operanda). Ukoliko su oba bita jednaka 0 rezultat je 0 u suprotnom rezultat je 1.

tabela istinitosti:

b1 b2 b1Ib2

0 0 0

0 1 1

1 0 1

1 1 1

Primer unsigned short int a=0723,b=071Ia;

a=0000000111010011

071=0000000000111001

b=0000000111101011

Page 76: Programski jezik C

Operator ^ (OR eskluzivno) povezuje svaki pojedini bit jednog operanda sa odgovarajucim bitom drugog operanda). Ukoliko su oba bita jednaka rezultat je 0 u suprotnom rezultat je 1.

tabela istinitosti:

b1 b2 b1^b2

0 0 0

0 1 1

1 0 1

1 1 0

Primer unsigned short int a=0723,b=071^a;

a=0000000111010011

071=0000000000111001

b=0000000111101010

Page 77: Programski jezik C

Operator & povezuje svaki pojedini bit jednog operatora sa odgovarajucim bitom drugog. Ukoliko su oba bita jednaka 1, i rezultat povezivanja je jedinica. Za sve druge slucajeve rezultat je 0.

tabela istinitosti:b1 b2 b1&b2

0 0 0

0 1 0

1 0 0

1 1 1

Primer unsigned short int a=0723,b=071&a;

a=0000000111010011

071=0000000000111001

b=0000000000010001

Page 78: Programski jezik C

Vezba 6/*program za stampanje vrednosti dva cela broja,racunjanje zbira i stampanje rezultata*/#include<stdio.h>main(){/*opis podataka*/int a,b,c;printf("unesite dva cela broja:a,b");scanf("%d,%d",&a,&b);c=a+b;/*stampanje*/printf("zbir unetih brojeva je:%d\n",c);getchar();getchar();}

Page 79: Programski jezik C

Vezba 7/*program za stampanje vrednosti dva racionalna broja, racunjanje zbira i stampanje rezultata*/#include<stdio.h>main(){/*opis podataka*/float a,b,c;printf("unesite dva racionalna broja:a,b\n");scanf("%f,%f",&a,&b);c=a+b;/*stampanje*/printf("zbir unetih brojeva je:%3.2f\n",c);getchar();getchar();}

Page 80: Programski jezik C

Vezba 8/*program za stampanje vrednosti dva racionalna broja,racunjanje zbira,razlike i stampanje rezultata*/#include<stdio.h>main(){/*opis podataka*/float a,b,z,r;printf("unesite dva racionalna broja:a,b\n");scanf("%f,%f",&a,&b);z=a+b;r=a-b;/*stampanje*/printf("zbir i razlika unetih brojeva iznose:z=%3.2f,r=%3.2f\n",z,r);getchar();getchar();}

Page 81: Programski jezik C

Naredbe Svaki program se sastoji od niza pojedinacnih

naredbi.Naredba je osnovna jedinica obrade u programu.

Naredbe mogu biti proste, slozene i upravljacke.

Prosta naredba

Prosta naredba predstavlja elementarnu obradu u programu.

Opsti oblik; izraz; Primer:

VrednostA=3;

printf(“%d\n”,x);

Page 82: Programski jezik C

Blok naredbi - sekvenca

Sekvenca predstavlja skup programskih naredbi koje cine jednu celinu.

U jeziku C sekvenca se oznacava parom viticastih zagrada{ }.Samo jedna naredba se moze staviti izmedju ovih zagrada, sto znaci da se blok naredbi interpretira kao jedna jedina naredba.

Izbori

Izbori ili selekcije su upravljacke strukture koje omogucavalju uslovno izvrsavanje naredbi (odaberu za izvrsavanje jednu od naredbi iz skupa od dve ili vise naredbi) .

Page 83: Programski jezik C

Osnovni izbor if-else Selekcijom if-else se uslovno izvrsava jedna od dve

moguce naredbe.

Fuslov

naredba1

T

naredba2

opsti oblik:

if (uslov) naredba1 else naredba2 Naredba if moze da se pise u jednom redu ili kao blok

naredbi sa viticastim zagradama.

Page 84: Programski jezik C

Naredba if izvrsava se tako sto prvo izracunamo vrednost iskaza u zagradi.Ako je vrednost izraza rezlicita od nule(tacan) izvrsava se naredba1, dok se deo sa else ne izvrsava. Ako izraz ima vrednost nula (netacan), izvrsava se naredba2, a naredba1 se ne izvrsava.

Sintaksa za iskaz if:

if (izraz)

naredba1;

else

naredba2;

Primer:if (Vrednost<10)

printf(“Vrednost je manja od10”);

else

printf(“Vrednost je veca od10”)

Page 85: Programski jezik C

• //izracunavanje stepena sigurnosti ako su dati kriticni i najveci radni napon

• #include<stdio.h>• main()• {• float S,G,Reh;• printf("unesite kriticni napon\n");• scanf("%f",&Reh);• printf("unesite najveci radni napon\n");• scanf("%f",&G);• S=Reh/G;• if (S>3)• printf("predimenzionisali ste konstrukciju, uzmite manji precnik!!!\n");• else• {• if (S>=2&&S<=3)• printf("stepen sigurnosti iznosi:S=%lf\n",S);• else• printf("konstrukcija je kriticna povecajte precnik\n");• }• getchar(); getchar(); }

Page 86: Programski jezik C

Primer:• /*program za poredjenje dva broja koji se unose sa tastature*/• #include <stdio.h>• main()• {• double prviBroj,drugiBroj,veciBroj;• printf("unesite prvi broj\n");• scanf("%lf",&prviBroj);• printf("unesite drugi broj\n");• scanf("%lf",&drugiBroj);• if(prviBroj > drugiBroj)• veciBroj=prviBroj;• else• veciBroj=drugiBroj;• printf("veci broj je %lf\n",veciBroj);• getchar();• getchar();• }

Page 87: Programski jezik C

/*program za izracunavanje povrsine pravougaonikaako su stranice a i b date u centimetrima*/#include<stdio.h>main(){float a,b,P;printf("unesite duzine atranica pravougaonika u cm:a,b\n");scanf("%f,%f",&a,&b);P=a*b;printf("povrsina pravougaonika je:P=%f",P);getchar();getchar();}

Vezba 9

Page 88: Programski jezik C

Vezba10// program za izracunavanje povrsine i obima kruga// ako je dat poluprecnik kruga#include<stdio.h>#define PI 3.141592655359main(){double r,O,P;printf("unesite poluprecnik kruga r\n");scanf("%lf",&r);O=2*r*PI;P=r*r*PI;printf("Obim kruga je:%lf\n",O);printf("Povrsina kruga je:%lf\n",P);getchar();getchar();}

Page 89: Programski jezik C

Vezba11// program za izracunavanje povrsine i obima kruga// ako je dat poluprecnik kruga#include<stdio.h>#define PI 3.141592655359main(){double r;printf("unesite poluprecnik kruga r\n");scanf("%lf",&r);printf("Obim kruga je:%.4lf\n",2*r*PI);printf("Povrsina kruga je:%.4lf\n",r*r*PI);getchar();getchar();}

Page 90: Programski jezik C

Selekcija pomocu skretnice switch

Naredba switch omogucava izbor izmedju vise mogucnosti.Primenjuje se za konstantne izraze.

Opsti oblik naredbe switch:

switch (izraz)

{

case vrednost1: niz naredbi1;

break;

case vrednost2: niz naredbi2;

break;

case vrednostN: niz naredbiN;

default: niz naredbi0;

}

Page 91: Programski jezik C

izracunata vrednost izraza se poredi sa vrednost1, vrednost2, ......, vrednostn sve dok se ne pronadje ekvivalentna vrednost. Ako se ta vrednost pronadje bice izvrsene sve naredbe koje se nalaze do kraja switch naredbe.

Ako zelimo da se izvrsi samo naredba u oda-branom case delu, koristimo naredbu break.

Ako ekvivalentna vrednost nije pronadjena iz-vrsava se naredba u default delu.

Ako default deo ne postoji, izvrsava se prva sledeca naredba posle switch.

Sve konstante moraju biti jednoznacne (pojavljuju se samo jedanput u jednoj switch naredbi) .

Page 92: Programski jezik C

//primer za switch

• #include<stdio.h>• main()• {• int ocena;• printf("unesite ocenu\n”) ;• scanf("%d",&ocena);• switch (ocena)

• {• case 5: printf ("odlican\n”); • case 4: printf ("vrlo dobar\n”); • case 3: printf ("dobar\n"); • case 2: printf ("dovoljan\n”); • case 1: printf ("nedovoljan\n”); • default: printf ("nekorektna ocena\n”);• }

• getchar();• getchar);• }

Page 93: Programski jezik C

//program za izracunavanje prostih aritmetickih operacija#include<stdio.h>main(){float operand1,operand2;char op;printf("ukucajte izraz za sabiranje,oduzimanje,mnozenje ili deljenje?\n");scanf("%f %c %f",&operand1,&op,&operand2); switch(op) { case'+':printf("%f\n",operand1+operand2); break; case'-':printf("%f\n",operand1-operand2); break; case'*':printf("%f\n",operand1*operand2); break; case'/':printf("%f\n",operand1/operand2); break; default:printf("nepoznat operator\n"); break; }getchar();getchar();}

Page 94: Programski jezik C

#include<stdio.h>main(){int broj;printf("unesite broj izmedju 1 i 5:\n");scanf("%d",& broj); switch(broj) { case 0:printf(“uneli ste premali broj!\n”) case 1:printf("odlicno!\n"); case 2:printf("izvaredno!\n"); case 3:printf("super!\n"); case 4:printf("predivno!\n"); case 5:printf("majstorski!\n"); break; default:printf("uneli ste prevelikroj\n"); break; }getchar(); getchar();}

Page 95: Programski jezik C

matematicke funkcije vrednost funkcije

sin(x) sin x

cos(x) cos x

tan(x) tg x

asin(x) arc sin x

acos(x) arc cos x

atan(x) arc tg x

atan2(x,y) arc tg x/y

sinh(x) sh x

cosh(x) ch x

tanh(x) th x

exp(x)

log(x) loge,x

log10(x) log10,x

pow(x,y)

sqrt(x)

xe

yx2/1x

Page 96: Programski jezik C

//program za izracunavanje sinusa datog ugla u stepenima#include<stdio.h>#include<math.h>#define PI 3.14159265359main(){double a,b;printf("unesite ugao u stepenima:\n");scanf("%lf",&a);//jezik C racuna uglove u radijanimab=sin(a*PI/180);printf("sinus datog ugla je:%lf\n",b);getchar();getchar();}

Vezba12

Page 97: Programski jezik C

//program za izracunavanje kvadratnog korena datog broja#include<stdio.h>#include<math.h>main(){double a,b;printf("unesite broj:\n");scanf("%lf",&a);b=sqrt(a);printf("kvadratni koren datog broja je broj:%lf\n",b);getchar();getchar();}

Page 98: Programski jezik C

Ciklusi Ciklusi su upravljacke strukture koje omogucavaju

ponovljeno izvrsavanje neke naredbe.

Prema nacinu zadavanja uslova za postavljanje ciklusa, postoje:

- ciklusi koji traju dok je neki uslov ispunjen,

- ciklusi koji traju dok neki uslov nije ispunjen,

- brojacki ciklusi.

U jeziku C se primenjuju sledeca tri ciklusa:

- While ciklus,

- For ciklus i

- Do while ciklus.

Page 99: Programski jezik C

Osnovni ciklus s izlazom na vrhu-while

Ciklusi su upravljacke strukture koje omogucavaju ponovljeno izvrsavanje neke naredbe.

Fuslov

Tnaredba

Na pocetku svakog prolaska kroz ciklusa izracunava se vrednost logickog izraza.Naredba se izvrsava sve dok je vrednost izraza razllicita od nule (istina).

Page 100: Programski jezik C

Opsti oblik naredbe while je:

while (uslov) naredba; primer:

Napisati while petlju koja broji od 100 do 200 sa inkrementom 2.

int x = 100;

while (x <= 200)

x+= 2;

Page 101: Programski jezik C

//automat za izdavanje karata#include<stdio.h>main(){float cenaKarte,iznosNovca,ostatak;printf("%35s","Automat za izdavanje karata\n");printf("Kolika je cena karte?\n");scanf("%f",&cenaKarte);printf("\nKoliki je iznos ubacenog novca?\n");scanf("%f",&iznosNovca);ostatak=cenaKarte-iznosNovca;//ubaciti potrebnu kolicinu novca while (ostatak > 0) { printf("\Nedostaje jos %fdinara\n",ostatak); printf("Molimo Vas, ubacite jos novca!\n"); scanf("%f",&iznosNovca); ostatak=ostatak-iznosNovca; }printf("Hvala na kupovini!\n");getchar();getchar();}

Page 102: Programski jezik C

/*program za izracunavanje modula G u stapu*/#include<stdio.h>#define PI 3.14159265359main(){double F,d,G;printf("Unesite silu F u KN i precnik stapa d u cm:F,d\n");scanf("%lf,%lf",&F,&d);G=4*F/(d*d*PI);printf("Napon u stapu je:G=%lfKN/cm2\n",G);getchar();getchar();}

Vezba13

l

dF

Page 103: Programski jezik C

Vezba14/*program za izracunavanje napona G u stapu,i poredjenje sa dozvoljenim naponom*/#include<stdio.h>#include<math.h>#define PI 3.14159265359main(){double F,d,G,Gd;printf("Unesite silu F u KN, precnik stapa d u cm i dozvoljeni napon Gd:F,d,Gd\n");scanf("%lf,%lf,%lf",&F,&d,&Gd);G=4*F/(d*d*PI);if (G <= Gd)printf("napon je u granicama dopustenog i iznosi:G=%lfKN/cm2\n",G);elseprintf("napon je veci od dozvoljenog, povecajte precnik ili promenite materijal\n");getchar();getchar();}

Page 104: Programski jezik C

Ciklus sa izlazom na dnudo...while

Petlja do...while izvrsava telo petlje pre testiranja njenog uslova i osigurava da se telo izvrsi bar jednom.

F

uslovT

naredba

Page 105: Programski jezik C

Opsti oblik naredbe do...while je:

do

naredba;

while (uslov);

Iskaz se izvrsava, a onda se proracunava uslov. Ako je uslov istina (true), petlja se ponavlja, u suprotnom petlja se zavrsava.

Page 106: Programski jezik C

//izracunavanje zbira n prvih prirodnih brojeva#include<stdio.h>main(){int zbir,ukupBr,i;printf("\n%50s\n\n","izracunavanje zbira aritmetickog niza");printf("\nkoliko prvih brojeva treba sabrati?\n");scanf("%d",&ukupBr);zbir=0;i=1; do { zbir +=i; i++; } while (i<=ukupBr);printf("\nzbir prvih %d brojeva je:%d\n",ukupBr,zbir);getchar(); getchar();}

Page 107: Programski jezik C

Vezba15//rastojanje duzi u ravni#include<stdio.h>#include<math.h>int main(){double xA,yA,xB,yB,a;//kordinate tacaka duziprintf("unesite koordinate tacaka AB u obliku:Xi,Yi\n");printf("-prvo teme(koordinate tacke A):");scanf("%lf,%lf",&xA,&yA);printf("-drugo teme(koordinate tacke B):");scanf("%lf,%lf",&xB,&yB);//izracunavanje duzine duzia=sqrt(pow(xA-xB,2)+pow(yA-yB,2));printf("duzina duzi je:%lf\n",a);getchar();getchar(); }

Yb

B

Ya

XaXb

x

y

A

Page 108: Programski jezik C

//povrsina trougla u ravni#include<stdio.h>#include<math.h>main(){double xA,yA,xB,yB,xC,yC,a,b,c,s,P;//temena trouglaprintf("unesite koordinate temena trougla A,B,C u obliku:Xi,Yi\n");printf("prvo teme(teme A):");scanf("%lf,%lf",&xA,&yA);printf("drugo teme(teme B):");scanf("%lf,%lf",&xB,&yB);printf("trece teme (teme B):");scanf("%lf,%lf",&xC,&yC);a=sqrt(pow(xB-xC,2)+pow(yB-yC,2));b=sqrt(pow(xC-xA,2)+pow(yC-yA,2));c=sqrt(pow(xA-xB,2)+pow(yA-yB,2));//izracunavanje poluobima i povrsine trouglas=(a+b+c)/2;P=sqrt(s*(s-a)*(s-b)*(s-c));//Heronov obrasacprintf("povrsina trougla je:%lf\n",P);getchar();getchar();}

Page 109: Programski jezik C

Ciklus sa izlazom na vrhu - for

Fuslov2

Tnaredba

Izraz1;

Izraz3;

Page 110: Programski jezik C

izraz1; predstavlja pripremu za ulazak u ciklus. Priprema sluzi za postavljanje pocetnih vrednosti.

uslov2; je logicki izraz koji predstavlja uslov za nastavljanje ciklusa.

izraz3; predstavlja zavrsne radnje na kraju svakog prolaska kroz ciklus( menjanje brojaca koji kontrolise broj prolazaka kroz ciklus).

Opsti oblik ciklusa for:

for (izraz1;uslov2;izraz3)

naredba; primer:

//stampa “zdravo” 10 puta

for (int i = 0;i < 10; i++)

printf(“zdravo”);

Page 111: Programski jezik C

//izracunavanje srednje vrednosti n brojeva#include<stdio.h>main(){float broj,aritSredina;int n,i;printf("%50s\n\n\n","Izracunavanje aritmeticke sredine");printf("Koliko brojeva zahtevate?\n");scanf("%d",&n); for (i=1;i<=n;++i) { printf("\nupisite broj!\n"); scanf("%f",&broj); aritSredina +=broj; }aritSredina /= n;printf("\nAritmeticka sredna datih brojeva je:%f\n",aritSredina);getchar();getchar();}

Page 112: Programski jezik C

/* Izracunavanje sume prvih n=10 celih brojeva primenom ralicitih pelji */#include<stdio.h>main(){int i,n=10,sumaFor=0,sumaWhile=0,sumaDoWhile=0; //pomocu for petlje for(i=0;i<=10;++i) sumaFor+=i; //pomocu do while petlje i=1; do { sumaDoWhile+=i; i++; } while(i<=n);

Page 113: Programski jezik C

//pomocu while petlje i=1; while(i<=n) { sumaWhile+=i; ++i; } //stampanje rezultata printf("\nSumaFor=%10d\nSumaDoWhile=%10d\nSumaWhile=%10d“ ,sumaFor,sumaDoWhile,sumaWhile); getchar(); getchar();}

Page 114: Programski jezik C

Naredbe kontrolisanog skoka U naredbe kontrolisanog skoka spadaju:

-break

-continue i

-go to.

Naredba break se koristi za prevremeno prekidanje naredbi (for,while,do while i switch).

opsti oblik: break; Naredba continue ne prekida izvrsenje celokupne

naredbe vec samo njeno trenutno ponavljanje (izvrsenje skace na vrh petlje)

opsti oblik: continue;

Page 115: Programski jezik C

Naredba goto uzrokuje bezuslovni programski skok na zahtevano mesto u programu.Da bi koristili goto, potrebna nam je labela.Labela je samo ime sa (:) na kraju. Labela stoji uvek sa leve strane iskaza.

primer:

if (vrednost > 10)

goto end;

printf(“ovo nije to”);

end: printf(“to je to”);

Naredbu goto izbegavati, jer se njenom upotrebom stvaraju nepregledni i zapetljani programi.

Page 116: Programski jezik C

//sastaviti program za izracunavanje komponente sile F u pravcu x i y ose#include<stdio.h>#include<math.h>#define PI 3.14159265359main(){double alfa,Fx,Fy,F;printf("unesite ugao koji zaklapa sila sa X-osom u stepenima \nalfa=");scanf("%lf",&alfa);printf("unesite silu u KN \nF=");scanf("%lf",&F);Fx=F*cos(alfa*PI/180);Fy=F*sin(alfa*PI/180);printf("komponenta sile u pravcu X-ose je Fx=%lf\n",Fx);printf("komponenta sile u pravcu Y-ose je Fy=%lf\n",Fy);getchar();getchar();}

x

y

F

Page 117: Programski jezik C

Definisanje funkcije Svaka funkcija jezika C mora biti definisana.

Definicija funkcije sadrzi sledece elemente:

- ime funkcije,

- telo funkcije,

- listu parametara,

- deklaracije parametara,

- tip rezultata funkcije i

- klasu memorije funkcije.

Funkcija je u stvari potprogram, koji moze raditi sa podacima i vratiti vrednost.

Page 118: Programski jezik C

Format funkcije moze imati sledece oblike:

1. Preporuceni oblik

[klasa memorije] [tip rezultata] ime funkcije(tip param1,param2..)

{

naredbe;

}

2. Moguci oblik [klasa memorije] [tip rezultata] ime funkcije([lista parametara])

[deklaracije parametara]

{

telo funkcije;

}

Svi elementi u uglastim zagradama se mogu izostaviti

Page 119: Programski jezik C

Ime funkcije

Imena funkcija su predstavjena identifikatorima koji predstavljaju adrese.

Telo funkcije

Telo funkcije u opstem slucaju predstavlja blok naredbi koje treba izvrsiti.

Povratak iz funcije u pozivajuci program vrsi se naredbom return ciji je opsti oblik:

return izraz;

ili

return;

Izraz “izraz” je rezultujuca vrednost funkcije

Kod funkcija void( ) naredba return ne sme da sadrzi izraz.

Page 120: Programski jezik C

Funkcije vracaju ili vrednost ili void(ne vracaju nista) . Vrednost funkcije je vrednost izraza u naredbi return.

Funkcija koja sabira dva cela broja moze da vrati zbir i zato se definise da vraca celobrojnu vrednost

Funkcija koja samo stampa nema sta da vrati i zato se definise da vraca void.

Lista parametara

Lista parametara predstavlja argumente funkcije pomocu kojih se unose pocetni podaci u funkciju. Vrednost f-je se izracunava na osnovu tih podataka

Page 121: Programski jezik C

Lista parametara sledi uvek posle imena funkcije i uvek je data unutar malih zagrada.

Primer

pow(a,b);

Opsti oblik niza parametara je:

tip param,tip param1,tip param2....,tip paramn Za svaki parametar posebno moramo navesti

oznaku tipa. Ukoliko uz ime funkcije nije data lista parametara,

svakom parametru iz liste moramo dodeliti neki tip.

Dodeljivanje tipova (deklaracija parametara) se vrsi posle imena funkcije a pre oznake “{“ koja oznacava pocetak tela funkcije. Parametri se deklarisu isto kao i promenjive.

Page 122: Programski jezik C

Pokazivaci na funkcije

Opis tipa za pokazivace na funkciju ima sledeci oblik.

(*identifikatorPokazivaca)(nizTipovaArgumenata)

Page 123: Programski jezik C

//primer definisanja funkcije#include<stdio.h>//pravimo funkciju zbir koja treba da sabira dva cela brojaint zbirDvaBroja(prviBroj,drugiBroj,zbir)int prviBroj,drugiBroj,zbir;

{ zbir=prviBroj+drugiBroj; return(zbir); }//glavna funkcijamain(){int a,b;printf("unesite brojeve koje zelite da saberete(a,b)\n");scanf("%d,%d",&a,&b);printf("zbir brojeva je:%d\n",zbirDvaBroja(a,b));getchar();getchar();}

Page 124: Programski jezik C

//program za resavanje kvadratne jednacine#include<stdio.h>#include<math.h>main(){double a,b,c,/*kojeficijenti jednacina*/ d,/*diskriminanta jednacine*/ x1,x2,/*realni koreni*/ y1,y2;/*imaginarni koreni*/typedef enum {realni,dvostruki,kompleksni,pogresna} Vrsta;Vrsta vrsta; //vrsta resenja jednacineprintf("unesite kojeficijente kvadratne jednacine: a,b,c\n");scanf("%lf,%lf,%lf",&a,&b,&c);

Page 125: Programski jezik C

if (a){ d=b*b-4*a*c; if(d>0){ vrsta=realni; x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); } else if(d==0){ vrsta=dvostruki; x1=-b/(2*a); }else{ vrsta=kompleksni; x1=-b/(2*a); x2=x1; y1=sqrt(-d)/(2*a); y2=-y1; } } else vrsta=pogresna;

Page 126: Programski jezik C

switch(vrsta){case realni:printf("realni koreni su:%.2lf i %.2lf\n",x1,x2);break;case dvostruki:printf("dvostruki realni koren je:%.2lf\n",x1);break;case kompleksni:printf("kompleksni koreni su:(%.2lf,%.2lf) i (%.2lf,%.2lf)\n",x1,y1,x2,y2);break;case pogresna:printf("podaci nemaju smisla!\n");break ;}getchar();getchar();}

Page 127: Programski jezik C

Rekurzivne funkcije

Rekurzivne funkcije su funkcije koje pozivaju same sebe (sa izmenjenim parametrima).

Primeri rekurzivnih funkcija : 1.Faktorijeli

n!=n*(n-1)!

2.Fibonacijevi brojevi

fn=fn-1+fn-2

1,1,2,3,5,8,13,21,34.......

Page 128: Programski jezik C

//program za rekurzivno izracunavanje faktorijela brojeva od 1 do 10#include<stdio.h>long faktorijel(n) //funkcija za izracunavanjeint n;{if(n==0)return(long(1));elsereturn(n*faktorijel(n-1));//rekurzivni poziv}//glavna funkcijamain(){int i;//izracunavanje faktorijela 1do10for (i=0;i<=10;++i)printf("%2d!=%ld\n",i,faktorijel(i));getchar();getchar();}

Page 129: Programski jezik C

//program za prikazivanje prvih 20 fibonacijevih brojeva#include<stdio.h>long fibo(int n) { int fb; if (n>2) fb=fibo(n-1)+fibo(n-2); else fb=1; return fb; }main(){int i;for (i=1;i<=20;++i)printf("%d fibonacijev broj je %ld\n",i,fibo(i));getchar();getchar();}

Page 130: Programski jezik C

Pokazivaci Pokazivac je specijalni tip promenjive, koji sadrzi

memorijsku adresu nekog drugog podatka promenjive.

Pokazivac pokazuje na podatak ciju adresu sadrzi. Pokazivac je promenjiva u koju moze da se smesti

adresa neke lokacije u memoriji.

Operacija adresiranja (&) Memorija racunara se sastoji od veceg broja

memoriskih elemenata. Svakom memoriskom elementu se dodeljuje adresa koja ga definise.

& je poseban operator koji daje adresu neke promenjive.

Page 131: Programski jezik C

int promenjiva =5;

Int *pPokazivac = &promenjiva;

promenjiva je deklarisana kao celobrojna promenjiva i dodeljena joj je vrednost 5.

*pPokazivac je deklarisan kao pokazivac na celobrojnu vrednost.

Adresa koju pPointer cuva je adresa promenjive promenjive

Vrednost na adresi koju pPointer cuva je 5.

Page 132: Programski jezik C

Vezbe

napisati program koji deklarise intedzer i pokazivac na intedzer.Dodelite adresu intedzer-a pokazivacu. Iskoristite pokazivac za postavljanje vrednosti intedzer promenjive.

int intedzer;

int *pIntedzer = &intedzer;

*pIntedzer = 5;

Page 133: Programski jezik C

Memorijske klase

Promenjive u jeziku C imaju dva atributa:

-memorijsku klasu i

-tip Memorijska klasa odredjuje lokaciju i vreme postojanja

memorijskog bloka dodeljenoj promenjivoj ili funkciji.

Tip odredjuje znacenje memorisane vrednosti u bloku.

U jeziku C koristimo sledece cetiri klase:

-auto,

-register,

-static i

-extern.

Page 134: Programski jezik C

Klasa memorije auto Svaki podatak koji pripada klasi auto ima automatsko

trajanje i lokalnu oblast vazenja. Ova klasa memorije se moze koristiti samo za

deklarisanje podataka unutar jednog bloka naredbi. Svaka promenjiva cija klasa memorije nije definisana

ima implicitno klasu auto. primer:

int broj1,broj2;

float broj3,broj4;

auto int broj1,broj2;

auto float broj3,broj4;

Page 135: Programski jezik C

Klasa memorije register

Ova klasa ima samo jednu razliku u odnosu na klasu auto

Na pocetku izvrsenja bloka prevodilac smesta promenjivu u jedan ili vise registara racunara. Broj registara svakog racunara je ogranicen pa nije moguce sve promenjive smestiti u njih.

Upisivanje i ocitavanje vrednosti smestene u registrima je nekoliko puta brze od upisivanja i ocitavanja vrednosti smestenih u memoriji.

Klasu memorije register koristiti za promenjive koje se najcesce koriste u programu.

primer:

register int broj1,broj2;

register char r;

Page 136: Programski jezik C

Klasa memorije static

Ova klasa omogucava promenjivoj da zadrzi vrednost i nakon zavrsetka bloka u kojem je deklarisana.

primer:

static double promenjiva = 0

U zavisnosti od mesta gde je podatak klase static definisan postoje :

-static-podaci deklarisani u funkciji(unutrasnje promenjive) i

-static-podaci deklarisani izvan funkcije(spoljne promenjive)

Page 137: Programski jezik C

Klasa memorije static u funkciji

Ovi podaci imaju lokalnu oblast vazenja i staticki ciklus trajanja. Ovi podaci nastaju kada program naidje na njih, a gube vrednost kada izadju iz opsega.

Iako ovi podaci zadrzavaju svoju vrednost u memoriji za sve vreme izvrsenja programa ne moze im se pristupiti izvan funkcije u kojoj su deklarisani.

Klasa memorije static izvan funkcije

Ovi podaci vaze na celom nivou programa i imaju staticki ciklus trajanja.

Page 138: Programski jezik C

Klasa memorije extern Ovi podaci imaju neogranicenu oblast vazenja i staticki

ciklus trajanja. Svaka promenjiva ili funkcija koja pripada ovoj klasi memorije, moze se koristiti u svim izvornim programima jedne C datoteke.

Jezik C omogucava modularno programiranje( veci program se moze sastojati iz vise modula ili datoteka).

Promenjive koje se unutar tih programa koriste mogu biti globalne i eksterne.

Promenjiva je globalna ako je deklarisana van svih funkcija u modulu.Memorijski prostor joj se trajno dodeli i njena memorijska klasa je extern.Ovoj promenjivoj se moze pristupiti iz svih funkcija u modulu. Int grupa = 0;

Da bi promenjiva bila dostupna i iz drugih modula, mora se u tim modulima definisati dodavanjem extern.

extern int grupa;

Page 139: Programski jezik C

#include<stdio.h>#include<math.h>#define PI 3.14159main(){double F,L,l,alfa,XA,YA,XB,FA,FB;printf("Unesite: F,L,l,alfa");scanf("%lf,%lf,%lf,%lf",&F,&L,&l,&alfa);XA=F*cos(alfa*PI/180);YA=F*sin(alfa*PI/180)*(1-l/L);FA=sqrt(pow(XA,2)+pow(YA,2));FB=F*sin(alfa*PI/180);printf("FA je:%lf,FBje:%lf\n",FA,FB);getchar();getchar();}

Page 140: Programski jezik C

Struktuirani tipovi podataka

nizovi

Niz je kolekcija lokacija za smestanje podatataka. Sve te lokacije se nazivaju elementi niza.

Nizovi mogu biti jednodimenzionalni( vektori i nizovi) i visedimenzionalni.

Niz je jednodimenzionalni ako ima skalarne elemente u jednom redu.

Dvodimenzionalni niz (matrica) je niz ciji su elementi nizovi skalarnih podataka.

Visedimenzioni nizovi se grade kao nizovi nizova.

Page 141: Programski jezik C

Jednodimenzionalni nizovi

Deklaracija niza se vrsi odredjivanjem tipa,iza cega sledi ime niza i subscript.

tip ime [n];

tip odredjuje zajednicki tip elemenata niza.

subscript odredjuje broj elemenata niza.

primer: long dugiNiz[25];

deklarisemo niz od 25 long intedzera, sa imenom dugiNiz.

Kada prevodilac primeti ovu deklaraciju on odvaja dovoljno memorije za smestaj 25 podataka (100 bajta)

[... ] je operator indeksiranja niza

Page 142: Programski jezik C

Elementi niza Elementi niza se broje od nule ,prvi element ima

indeks 0, drugi 1,.........,n-ti (n-1).//program za zadavanje i stampanje elemenata niza#include<stdio.h>main(){int i,mojNiz[5];for (i=0;i<5;++i) { printf("Vrednosti za mojNiz[%d]:",i); scanf("%d",&mojNiz[i]); } for (i=0;i<5;++i) printf("%d:%d\n",i,mojNiz[i]);getchar();getchar();}

Page 143: Programski jezik C

//program za ispisivanje slova ako se unese broj sa tastature#include<stdio.h>main(){char slovo[26];int i,broj;for(i=0;i<=25;++i)slovo [i]=65+i;//65 je decimalna vrednost od A u ASCII kodu do //ulazak u prvi ciklus iako uslov nije ispunjen { printf("\nUpisite celobrojnu vrednost izmedju 1 i 26\n"); scanf("%d",&broj); if(broj<1||broj>26) printf("\nuneli ste pogresan broj!\n"); else { printf("\nNa %d mestu abecede se nalazi",broj); printf(“slovo %c",slovo[broj-1]); } } while(broj>=1&&broj<=26);getchar();getchar();}

Page 144: Programski jezik C

Inicijalizacija nizova

Inicijalizacija nizova se moze izvrsiti i prilikom deklaracije niza.

Primer: int dugiNiz[5] = {1,4,76,45,3};

je isto kao i

int dugiNiz[ ] = {1,4,76,45,3};

Ne sme se izvrsiti inicijalizacija vise elemenata nego sto je deklarisano u nizu

Primer: int dugiNiz[5] = {1,4,76,45,3,8};

Page 145: Programski jezik C

Ukoliko se ne izvrsi inicijalizacija nekog clana niza, njegova vrednost ce biti nula.

Primer: int dugiNiz[5] = {1,4,8};

Nizovi mogu imati bilo koje ime ali ne mogu imati isto ime kao i druge promenjive.

//primer za niz#include<stdio.h>main(){enum daniSedmice{ned,pon,uto,sre,cet,pet,sub,danUsedmici};int nizSedmica[danUsedmici]={10,20,30,40,50,60,70};printf("vrednost za utorak je:%d",nizSedmica[uto]);getchar();getchar();}

Page 146: Programski jezik C

#include<stdio.h>#include<math.h>main(){while(1){//elementi nizadouble a[10],s,d; int n,i;//unosenje broja elemenata nizaprintf("unesite broj elemenata niza:\n"); scanf("%d",&n);//ispitivanje broja elemenata nizaif(n<=0)break;//unosenje elemenata nizaprintf("unesite elemente niza odvojene razmakom:\n");a[i]=0;s=0,d=0;for (i=0;i<n;i++){scanf("%lf",&a[i]);s+=a[i];d+=a[i]*a[i];}s/=n;d=sqrt(d/n-s*s);printf("srednja vrednost niza je:%lf\n",s);printf("standarda devijacija je:%lf\n",d);getchar();getchar();} }

Page 147: Programski jezik C

Adresna aritmetika Pretposavimo sledece:

n je celobrojni izraz,

a je vektor sa elementima proizvoljnog tipa T,

v je izraz tipa T,

pa1, pa2 su pokazivaci na tip T.

Pravila adresne aritmetike: a – je pokazivac na prvi element vektora a,

&[0] –je pokazivac na prvi element vektora a,

&a[n] –je pokazivac na n+1 element vektora a,

*pa1 –je element vektora a na koji pa1 pokazuje,

*pa1=v –dodeljuje vrednost v elementu na koji pa1 pokazuje

++pa1-postavlja pa1 na sledeci element vektora

-pa1 –postavlja pa1 na prethodni element vektora

Page 148: Programski jezik C

*++pa1 –inkrementira pa1, a zatim pristupa elementu vektora a na koji pa1 ukazuje,

*pa1++ -pristupa elementu vektora na koji pa1 ukazuje, pa inkrementira pa1,

pa1+n –je pokazivacki izraz koji pokazuje na n-ti naredni element vektora a u odnosu na koji pa1 pokazuje,

pa1-n –je ..........prethodni ..................,

*(pa1+n)=v dodeljuje vrednost v narednom n-tom elementu vektora a, u odnosu na element na koji pa1 pokazuje,

pa1>pa2 –ispituje vrednost adresa pa1 i pa2,

pa2-pa1 –odredjuje broj elemenata vektora a, smestenih izmedju pokazivaca pa2i pa1,

*(a+n) –je n-ti element vektora a

Page 149: Programski jezik C

Nizovi karaktera (stringovi) Sluze za manipulaciju sa teksovima

Za njihovo predstavljanje se koristi tip char [ ]

Iza poslednjeg znaka dodaje se prazan znak ,,\0”, da bi prevodilac znao kada je kraj znakovnog niza.

Znakovne konstante Znakovna konstanta je ceo broj cija je vrednost

jednaka kodu navedenog znaka, i njen tip je int,

‘znak’ znakovi \,’ i “ ne mogu se stampati ovako.

oktalne vrednosti pisu se nizom od 1 do 3 oktalne cifre iza obrnute kose crte (\). Vodeca 0 nije potrebna

Page 150: Programski jezik C

Heksadecimalne vrednosti pisu se nizom od 1 do 2 heksadecimalne cifre iza znakova \x.

Simbolicke oznake su dodeljene najcesce koriscenim upravljackim

znakovima, da bi se mogli koristiti na svim racunarima bez obzira na korisceni kod.

\a – davanje zvucnog signala,

\b – pomak za jedno mesto unazad,

\f – skok na vrh novog lista,

\n – skok na pocetak narednog reda,

\p – povratak na pocetak tekuceg reda,

\t – tabulacija i

\v – vertikalna tabulacija

Page 151: Programski jezik C

\\ - oznacava pocetak specijalnih oblika prikazivanja znakova (oktalno,heksadecimalno ili simbolicki),

\’ – oznacava pocetak i kraj znakovne konstante.

primer:

koje su znakovne konstante ispravne:

‘a’

‘\177’

‘\b’

‘\x5e’

‘\”’

‘\18’

‘as’ i ‘\m’

Page 152: Programski jezik C

Konstante tipa znakovnog niza Konstantni znakovni niz je niz znakova stavljen

izmedju para znakova navoda.

“Ovo je znakovni niz”

“program!” predstavlja niz od 8 znakova

‘p’ ‘r’ ‘o’ ‘g’ ‘r’ ‘a’ ‘m’ ‘!’ ‘\0’

“prva” “grupa”

jednako je

“prva grupa”

Page 153: Programski jezik C

Simbolicke konstante Koriste se za numericke i znakovne tipove

podataka, za pojedinacne znakove i za znakovne nizove.

Koristimo ih tako sto ispred simbolickih konstanti stavimo direktivu #define .

primeri: #define bell’\007’

#define Poruka “pozdrav svima”

U biblioteci <stdio.h> definisane su i konstante EOF i NULL. Konstanta EOF oznacava kraj datoteke i najcesce ima vrednost -1.

Konstanta NULL ima vrednost 0 i vraca se kao rezultat nekih funkcija za slucaj upravljanja.

Page 154: Programski jezik C

Ulazno izlazna konverzija scanf i printf se pored rada sa numerickim tipovima

podataka koriste i za citanje i pisanje znakovnih podataka.

Postoje dve vrste konverzija c i s.

Vrsta konverzije s oznacava citanje znakovnog niza(tip string). Citanje pocinje od prvog ne belog znaka i zavrsava se nailaskom na prvi beli znak. Pomocu parametra konverzije n moze se ograniciti citanje na n znakova.

pr: %5s (n=5) Vrsta konverzije c oznacava citanje tacno n znakova

(jednog znaka ako se ne navede n). Za razliku od ostalih konverzija ovde nema preskakanja belih znakova ni pre ni u toku citanja.

Page 155: Programski jezik C

Ovde za razliku od s konverzije ne dodajemo zavrsni znak \0.

primeri ispisivanja znakovnih podataka:

printf(“Autor knjige je %s %s.\n”,ime,prezime);

printf(“%2d %-20.20s %10.2f %10.2f %12.2f\n”, redniBroj,naziv,kolicina,cena,kolicina*cena);

Citanje i pisanje znakova bez konverzije

U standardnoj biblioteci funkcija jezika C postoje specijalizovane funkcije za prenos samo znakovnih podataka. Svaka od tih funkcija vrsi samo jednu vrstu operacija ali to izvrsava mnogo efikasnije od univerzalnih funkcija scanf i printf.

Page 156: Programski jezik C

getchar() ova funkcija cita sledeci znak, ukljucujuci i bele znakove, preko tastature.

putchar(c) ova funkcija ispisuje znak c na ekranu racunara.

gets(s) ova funkcija cita jedan red teksta (do \n) i smesta ga u znakovni niz s (tipa char[ ] )

puts(s) ova funkcija ispisuje sadrzaj znakovnog niza s (tipa char[ ] ) do zavrsnog znaka \0 kao red teksta na ekranu, dodajuci znak \n iza poslednjeg znaka.

Page 157: Programski jezik C

Ispitivanje znakova Funkcije za ispitivanje znakova odredjuju u koju

kategoriju znakova (slovo, cifra....) spada dati znak. Osobine ovih funkcija su definisane u standardnoj datoteci ctype.h

isalnum(c) Da li je c slovo ili cifra?

isalpha(c) Da li je c slovo?

islower(c) Da li je c malo slovo?

isupper(c) Da li je c veliko slovo?

isdigit(c) Da li je c decimalna cifra?

isxdigit(c) Da li je c heksadecimalna cifra?

isspace(c) Da li je c beli znak?

isgraph(c) Da li je c stampajuci znak, ali nije razmak?

Page 158: Programski jezik C

isprint(c) Da li je c stampajuci znak(ukjucujuci razmak)

ispunct(c) Da li je c specijalan znak?

iscntrl(c) Da li je c upravljacki znak?

Vrednost izracunavanja svih ovih funkcija je tipa logical, a tip argumenta c je char.

Rad sa znakovnim nizovima Funkcije koje se koriste za operacije nad znakovnim

podacima su opisane u standardnoj datoteci string.h

strcpy(t,s) funkcija prepisuje znakovni niz s u niz t,

strcpy(t,s,n) prepisuje najvise n znakova iz s u t,

strcat(t,s) funkcija dopisuje znakovni niz s na kraj t,

strncat(t,s,n) dopisuje n znakova iz niza s na kraj t,

Page 159: Programski jezik C

strcmp(t,s) funkcija uporedjuje znakovne nizove t i s

strlen(s) funkcija odredjuje duzinu znakovnog niza

argumenti t i s su tipa string, a argument n je tipa int

Konverzija u numericke tipove podataka

Funkcije koje ovo omogucavaju su opisane u standardnoj datoteci stdlib.h

atof(s) vrsi konverziju realnog broja iz niza cifara oblika +-ccc.cccE+-ee, u binarni ekvivalent. Vrednost funkcije je tipa double.

atoi(s) vrsi konverziju u ceo broj iz niza cifara oblika +-cccc u binarni ekvivalent. Vrednost funkcije je int

Page 160: Programski jezik C

atol(s) vrsi konverziju celog broja iz niza cifara oblika +-cccc u binarni ekvivalent. Vrednost funkcije je tipa long int

Vrednost argumenta s je tipa string koji sadrzi niz znakova za cifre broja koji se konvertuje.

Page 161: Programski jezik C

primer: Program za prikazivanje tablice ASCII kodova za sve stampajuce znakove.

• #include<stdio.h>• main()• {• char c;int i;• printf("\t\t tablica ASCII kodova je: \n\n");• for (c=' ';c<' '+19;c++)• {• for(i=0;i<95;i+=19)• printf("%3d %c",c+i,c+i);• putchar('\"n');• }• getchar();getchar(); }

Page 162: Programski jezik C

//izracunavanje skalarnog proizvoda dva vektora#include<stdio.h>#define DIM 50main(){while(1) //ciklus sa izlazom na vrhu { double a[DIM],b[DIM],skalPro; //elementi vektora a i b int i,n; printf("\nDuzina vektora (najvise %d):",DIM);scanf("%d",&n); //provera da li je duzina vektora u granicama DIM if(n<=0||n>DIM) break; //unosenje komponente vektora A printf("unesite komponente vektora A odvojene razmakom\n"); for(i=0;i<n;scanf("%lf",&a[i++])); //unosenje komponenti vektora B printf("unesite komponente vektora B odvojene razmakom\n"); for(i=0;i<n;scanf("%lf",&b[i++])); for(skalPro=i=0;i<n;i++) skalPro+=a[i]*b[i]; //prikazivanje rezultata na monitoru printf("skalarni proizvod dva vektora je %10.3lf \n",skalPro); }getchar();getchar();}

Page 163: Programski jezik C

//program za sortiranje realnih brojeva od najmanjeg do najveceg#include<stdio.h>#include<stdlib.h>#define DIM 500main(){int n,i,j;float priv,x[DIM]; do { printf("koliko brojeva za sortiranje imate(max%d)",DIM); scanf("%d",&n); }while (n>DIM || n<=0);printf("unesite brojeve\n\n");for (i=0;i<n;++i) { printf("broj X[%2f]=",i); scanf("%f",&x[i]); }

Page 164: Programski jezik C

//sortiranjefor (j=0;j<n-1;++j)for (i=j+1;i<n;++i)if (x[i]<x[j]) { priv=x[j]; x[j]=x[i]; x[i]=priv; }printf("\nSortirani brojevi su:\n");for (i=0;i<n;++i)printf("x[%2d]=%15.6e\n",i,x[i]);getchar();getchar();}

Page 165: Programski jezik C

Matrice char sahTabla [8][8];

Prva dimenzija oznacava redove(vrste), a druga kolone niza.

matrica 4*3 u matematici 13 -18 21

36 101 0

-5 0 -9

3 1 9 matrica 4*3 u jeziku C

static int M [4] [3] = {

{13,-18,21},

{36,101,0},

{-5,0,-9},

{3,1,9}

};

Page 166: Programski jezik C

Strukture

Strukture su složeni tipovi podataka koji se sastoje od određenog broja elemenata, koji se nazivaju polja strukture.

Polja struktura mogu biti prostog i složenog tipa, i obeležavaju se identifikatorima.

Razlika izmedju nizova i struktura

- elementi nizova su međusobno jednakih tipova, i obeležavaju se rednim brojevima unutar niza i pristupa im se indeksiranjem.

- strukture se koriste za opisivanje složenih apstraktnih objekata kao sto su:

- tačka u ravni opisuje se realnim i imaginarnim delom

Page 167: Programski jezik C

- automobil se opisuje registarskim brojem, oznakom modela, godinom proizvodnje, nazivom proizvođača, imenom vlasnika.

- knjiga se opisuje imenom autora, naslovom, nazivom izdavača, godinom izdavanja, brojem stranica ...

Definisanje strukture Struktura je tip podataka koje definiše sam

programer.

struct imeStrukture {nizDeklaracija} ime strukture je identifikator strukture koju

definišemo. pri kasnijim pozivima strukture uvek pišemo

struct imeStrukture

Page 168: Programski jezik C

sintaksni dijagram naredbe struct:

naredba

structstruct

Identifikator

strukture

opis

strukture;

polja strukture se nabrajaju nizom deklaracija, gde svaka deklaracija u nizu ima oblik naredbe za definisanje podataka:

tip polje,polje,...polje;

tip predstavlja osnovni tip svakog pojedinacnog polja.

Page 169: Programski jezik C

sintaksni dijagram opisa strukture:

opis

structure{

Definisanje

promenjivih}

struktura ne može da sadrži samu sebe kao polje jer u trenutku definisanja nije poznata njena veličina.

struktura može da sadrzi pokazivač na samu sebe zato sto u trenutku definisanja znamo ime strukture i veličinu pokazivačkog tipa (koliko memorije zauzima pokazivač)

Page 170: Programski jezik C

Načini dodele početnih vrednosti

prvi način: {vrednost,vrednost,...vrednost}

sve vrednosti unutar viticastih zagrada moraju biti konstantni izrazi, i one se dodeljuju uzastopnim poljima strukture.

drugi nacin: izraz zadavanje pocetne vrednosti strukture je u obliku

adresnog izraza ciji je rezultat strukturnog tipa ili poziv funkcije.

Page 171: Programski jezik C

primeri definisanja strukturnih tipova podataka:

struct tacka {int x,y;} a,b,c;

struct tacka p= {35,-12} ,q;

struct pravougaonik {

struct tacka doleLevo,goreDesno;

};

definišemo dve promenjive tipa struct tacka p i q

definišemo tip struct tacka za predstavljanje tačaka u ravni kao strukturu od dva celobrojna broja x i y

definišemo tip struct pravougaonik sa dva polja koja su tip struct tacka koji predstavljaju donji levi i gornji desni ugao pravougaonika

Page 172: Programski jezik C

struct pravougaonik w,t,y={{1,1,3,3}};

definišemo tri pravougaonika w,t i y i za pravougaonik y dajemo pocetnu vrednost za donji levi ugao kordinate (1,1) i za gornji desni ugao koordinate (3,3)

typedef struct {char ime[16],prezime[16];}Ime;

definišemo da se tip Ime sastoji od licnog imena i prezimena koje se sastoje od po 16 znakova

typedef struct {char dan[9],mesec[9];short int godina;}Datum;

definišemo da se tip Datum sastoji od dana,meseca i godine

Page 173: Programski jezik C

typedef struct {

char licniBroj[13];

Ime osoba;

Datum datumRodjenja;

char adresa[30];

}Gradjanjin;

Gradjanin Marinko,Milisav,Sofronije;

definisemo tip Gradjanin pomocu pomoćnih funkcija Ime i Datum. Na kraju definisemo tri promenjive tipa Gradjanin.

Page 174: Programski jezik C

Napraviti strukturu krug koja se sastoji od sledećih polja: centarKruga tipa struct tacka i poluprecnik tipa float.

Napraviti strukturu motoKultivator koja se sastoji

od sledećih polja: vlasnik i model tipa string (znakovni niz), cena tipa float.

Page 175: Programski jezik C

Upotreba struktura

Podaci strukturnih tipova se koriste na isti način kao i skalarni (smatraju se pojedinačnim podacima bez obzira na njihovu složenost).

Podaci međusobno jednakih tipova mogu međusobno da se dodeljuju pomocu operatora za dodelu vrednosti (=).

Dva strukturna podatka su jednakih tipova ako se za njihovo definisanje koristi isti identifikator tipa.

Pomoću operatora adresiranja (&) moze se pristupiti adresi strukturne promenjive.

Operator (*) se koristi za pristup pokazivačkim strukturama.

Page 176: Programski jezik C

Strukture i pokazivači

Pošto strukture mogu da budu velike preporučuje se da se one u funkcije prenose preko pokazivača.

Pomoću naredbe sizeof dobitijamo podatak o veličini strukture u operativnoj memoriji.

Kada se struktura prenosi po vrednosti (kopira član po član) proces kopiranja je vrlo spor, dok ako strukturu prenosimo preko pokazivača,ubrzavamo proces (kopira se pokazivač na nju, a ne cela struktura).

Zastita strukture koja se samo kopira i prenosi preko pokazivača: const s*s

Promena vrednosti strukture vrsi se bez const

Page 177: Programski jezik C

Poljima strukture se pristupa pomocu binarnog operatora (.). Levi operand je strukturnog tipa s, a drugi operand je identifikator polja p takve strukture.

s.p ukoliko je ps pokazivac na strukturu,polju p te

strukture pristupa se pomocu: (*ps).p

Za pristup polju p strukture na koju pokazuje pokazivač ps koristi se i binarni operator (->): ps->p

Polja struktura su podaci cija se adresa dobija pomoću izraza &s.p .

Ako adresu dodelimo pokazivaču px (px=&s.p), polju p moze da se i pristupi i sa *px

Page 178: Programski jezik C

primeri dodele vrednosti promenjivama strukturnih tipova:

a.x=12;a.y=-23; nikako a={12,-23}

dodela vrednosti poljima je moguca samo pojedinačno.

Page 179: Programski jezik C

/************************************************************ Ovaj C program ilustruje definisanje i koriscenje * struktura.***********************************************************/

#include <stdio.h>

#define NULL_TERMINATOR_STRINGA 1#define MAX_BROJ_ZNAKOVA 65

struct oznaka_kuce {char vlasnik[ MAX_BROJ_ZNAKOVA + NULL_TERMINATOR_STRINGA ], ulica[ MAX_BROJ_ZNAKOVA + NULL_TERMINATOR_STRINGA ], grad [ MAX_BROJ_ZNAKOVA + NULL_TERMINATOR_STRINGA ]; int broj_soba; float cena;} A_Kuca;

Page 180: Programski jezik C

void main(){ printf("Ko je vlasnik kuce? "); gets(A_Kuca.vlasnik);

printf("\nU kojoj ulici se nalazi kuca? "); gets(A_Kuca.ulica);

printf("\nU kom gradu se nalazi kuca? "); gets(A_Kuca.grad);

printf("\nKoliko soba ima kuca? "); scanf("%d", &A_Kuca.broj_soba);

printf("\nKoja je cena kuce? "); scanf("%f", &A_Kuca.cena);

printf("\f");

Page 181: Programski jezik C

printf("================ KUCA 1 ============================= "

"\nVlasnik:\t\t%25s" "\nUlica:\t\t\t%25s" "\nGrad:\t\t%25s" "\nSobe:\t%25d" "\nCena:\t\t%25.2f\n",

A_Kuca.vlasnik,A_Kuca.ulica,A_Kuca.grad, A_Kuca.broj_soba,A_Kuca.cena); getchar(); getchar(); }

Page 182: Programski jezik C

//program za odredjivanje sledeceg dana u nedelji#include<stdio.h>main(){int k;enum dani {ponedeljak,utorak,sreda,cetvrtak,petak,subota,nedelja} sledeciDan;printf("unesite danasnji dan:\n");printf("1=ponedeljak,2=utorak,3=sreda,4=cetvrtak\n");printf("5=petak,6=subota,7=nedelja\n? [1..7]:");scanf("%d",&k);k+=1;k%=7;sledeciDan=(enum dani)k;printf("\nSledeci dan je %d,dan u nedelji\n",(int)sledeciDan);getchar();getchar();}

Page 183: Programski jezik C

//koriscenje pokazivaca za ispisivanje imena po redu u nizu#include<stdio.h>main(){char *ime[5]={{"Ivan"}, {"milos"}, {"Marko"}, {"Boban"}, {"Jana"}};int ctr;for (ctr=0;ctr<5;ctr++)printf("Ime %d je %s\n",(ctr+1),*(ime+ctr));getchar();getchar();}

Page 184: Programski jezik C

Unije

Unije su slozeni tipovi podataka koji omogucavaju da se u isti memorijski prostor smeste podaci razlicitih tipova.

Definisu se pomocu naredbe union na isti nacin kao i strukture (umesto struct naredba union)

struct {

int i;

double d;

char *c

}s;

union {

int i;

double d;

char *c

}s;

Page 185: Programski jezik C

Kod strukture sva polja imaju istovremeno definisanu vrednost, dok kod unija u datom momentu samo jedno polje ima definisanu vrednost (poslednje od polja kome je dodeljena vrednost).

Kod strukture polja se u memoriju smestaju jedno za drugim.Velicina strukture je priblizno jednaka zbiru velicina polja.

Kod unija sva polja se smestaju od iste pocetne vrednosti (dodela vrednosti jednom polju ponistava ranije dodeljenu vrednost nekom drugom polju).

Page 186: Programski jezik C

Datoteke i operacije sa datotekamaPristup standardnoj programskoj datoteci

stdio.h

stdio.h sadrzi deklaracije makroa i konstanti koje su potrebne pri ulazu i izlazu podataka. Stdio.h sadrzi i definicije vecine standardnih ulazno-izlaznih funkcija.

Kada program napisan u jeziku C pocne da se izvrsava, otvaraju se tri standarne tekstualne datoteke:

stdin – standardna ulazna datoteka,

stdout – standardna izlazna datoteka,

stderr – standardna datoteka o greskama

Page 187: Programski jezik C

Otvaranje i zatvaranje datoteka

U jeziku C datoteka se otvara standardnom funkcijom fopen koja ima oblik:

file *fopen(nazivDatoteke,modus)

funkcija fopen je definisana kao pokazivac na podatak tipa file.

modus predstavlja nacin pristupanja datoteci r – citanje iz datoteke,

w – pisanje u datoteku,

a – prosirivanje datoteke dopisivanjem podataka na njenom kraju, r+ - za citanje i pisanje,

w+ - brisanje sadrzaja datoteke i otvaranje za citanje i pisanje i

a+ - otvaranje za citanje i pisanje pri cemu se pise na kraju dato.

Page 188: Programski jezik C

Pored fopen za otvaranje datoteka koristi se i funkcija freopen oblika:

file *freopen(nazivDat,modus,otvorenDat)

otvorenDat predstavlja pokazivac na jednu otvorenu datoteku koja se zatvara posle izvrsenja funkcije freopen koja otvara datoteku nazivDat

Za zatvaranje datoteke koristi se funkcija fclose:

int fclose(pointDat)

Formativno citanje i pisanje zadatak funkcije printf je da prvo pretvori podatke iz

jednog tipa u drugi i da ih onda ispise u standardnu izlaznu datoteku stdout.

Page 189: Programski jezik C

int printf(format,param1,param2,...)

format odredjuje nacin na koji se pojedini parametri pretvaraju iz jednog tipa u drugi,formatiraju i ispisuju. Za svaki parametar postoji po jedan nezavisni deo formata ciji je oblik:

%pz.zlk % - pocetak jednog dela formata

p – znak za poravnjavanje

z.z – znakovni deo formata

l – pripadajuci parametar tipa long

k – znak za pretvaranje podataka u odgovarajuci tip

znak p se cesto menja znakom – koji poravnjava ulevo (ako je izostavljen pomera udesno).

Page 190: Programski jezik C

znak za pretvaranje podataka k prestavlja se sa:

d – pretvara parametar u celobrojnu vrednost,

u – pretvara parametar u celobrojnu vrednost bez predznaka,

v – pretvara parametar u oktalni broj bez predznaka,

x – pretvara parametar u xeksadecimalni broj bez predznaka,

C – pretvara parametar u jedan jedini znak,

g – pretvara parametar u znakovni niz ,

f – pretvara parametar u broj, predstavljen pokretnim zarezom bez eksponenta,

e – pretvara parametar u broj, predstavljen pokretnim zarezom sa eksponentom i

g – parametar se pretvara u e ili f (bira se kraci oblik)

Page 191: Programski jezik C

znakovni deo formata moze biti sastavljen iz jednog znakovnog niza(z) ili dva (z.z)

znakovni niz z definise mimimalnu duzinu polja u kojem se ispisuje parametar. Ukoliko duzina polja nije dovoljna za smestanje dolazi do automatskog produzenja polja za potreban broj bajtova.

ukoliko je parametar kraci od duzine polja, ostatak polja se popunjava praznim znakovima. Ako na pocetku znakovnog dela formata stoji nula ostatak polja se popunjava nulama.

Znak za procenat se ispisuje navodjenem dvostrukog znaka “%%”

Page 192: Programski jezik C

#include<stdio.h>main(){int intBroj=20;float flBroj;flBroj=14.0/9.0;printf("|%10d|\n",intBroj);printf("|%10x|\n",intBroj);printf("|%10.4f|\n",flBroj);printf("|%10.4e|\n",flBroj);printf("|%-10.4g|\n",flBroj);printf("|%25s|\n","programski jezik C");printf("|%-25s|\n","programski jezik C");printf("|%25.10s|\n","programski jezik C");printf("|%%%-024s|\n","programski jezik C");getchar();getchar();}

Page 193: Programski jezik C

Pored funkcije printf postoje jos dve standarne funkcije za formatirano ispisivanje podataka:

fprintf i sprintf

int fprintf(pointDat,format,param1,param2,....)

pointDat je pokazivac koji pokazuje na datoteku u kojoj se formatirano ispisuju podaci.

int sprintf(tab,format,param1,param2,...)

Svaki parametar funkcije sprintf se formatira i smesta u odgovarajuci element tabele tab.

Page 194: Programski jezik C

Funkcija scanf ucitava znak po znak iz standardne ulazne datoteke stdin.

int scanf(format,param1,param2,...)

Na pocetku formata uvek se nalazi znak % dok se na kraju nalazi znak za formatiranje, koji moze biti:

c – pretvaranje u jedan znak iz skupa znakova,

d – pretvaranje u celobrojnu vrednost,

e ili f – pretvaranje u realan broj,

h – pretvaranje u podatak tipa short int,

o – pretvaranje u oktalan broj,

s – pretvaranje u znakovni niz,

x – pretvaranje u heksadecimalan broj.

Page 195: Programski jezik C

Pored funkcije scanf postoje jos dve standarne funkcije za formatirano ucitavanje podataka:

fscanf i sscanf

int fscan(pointDat,format,param1,param2,....)

int sscanf(tab,format,param1,param2,...)

Svaki parametar funkcije sprintf ucitava se iz odgovarajuce elementa tabele tab.

Page 196: Programski jezik C

Pisanje i citanje znakova

standardna funkcija fgetc ucitava jedan bajt iz neke datoteke.

int fgetc(pointDat)

ekvivalentna funkciji fgetc je fukcija getc.

funkcija getchar takodje ucitava jedan bajt ali ona nema parametara.

int getchar(void)

standardna funkcija fputc ispisuje jedan bajt u neku datoteku.

int fputc(param,pointDat)

int putc(param,pointDat)

Page 197: Programski jezik C

za ispisivanje jednog bajta koristi se i funkcija putchar

int putchar(param)

standardne funkcije za citanje i pisanje dva bajta su getw i putw.

int getw(pointDat)

int putw(rec,pointDat)

ove dve funkcije ne prepoznaju kraj datoteke EOF, pa se u tu svrhu koriste sledece funkcije

int feof(pointDat)

Za citanje jednog celog znakovnog niza koristi se funkcija fgets oblika:

char *fgets(tab,maksBroj,pointDat)

Page 198: Programski jezik C

Za citanje jednog celog znakovnog niza iz standardne ulazne datoteke koristi se funkcija gets:

char *gets(tab)

Za ispisivanje znakovnog niza u datoteku koristi se funkcije: fputs i puts:

int fputs(tab,pointDat)

upisuje sadrzaj tabele tab u datoteku, na koju pokazuje pokazivac pointDat:

int puts(tab)

upisuje sadrzaj tabele tab u standardnu izlaznu datoteku stdout

Page 199: Programski jezik C

Za citanje i pisanje blokova memorije koriste se funkcije fread i fwrite:

int fread(tab,brojBajt,brojBlok,pointDat)

brojBlok oznacava koliko se blokova ucitava

brojBajt oznacava koliko bajtova svaki blok sadrzi

int fwrite(tab,brojBajt,brojBlok,pointDat)

Page 200: Programski jezik C

Standardne funkcije za direktan pristup datoteci

Kod direktnog pristupa vreme pristupa podatku neke datoteke ne zavisi od mesta na kome se taj podatak nalazi. Dok kod sekvencijalnog pristupa to nije slucaj

Da nekom podatku direktno pristupili potrebno je znati njegovo rastojanje (u bajtovima) od pocetka datoteke.

Page 201: Programski jezik C

Za pozicioniranje pokazivaca datoteke na odredjeno mesto unutar datoteke koristi se funkcija fseek oblika

int fseek(pointDat,n,modus) modus =0 – pozicioniranje pokazivaca za n bajtova

od pocetka datoteke, modus =1 – pozicioniranje pokazivaca za n bajtova

od trenutne pozicije, modus =2 – pozicioniranje pokazivaca za n bajtova

od kraja datoteke n se mora definisati kao podatak tipa long int

Za dobijanje trenutne pozicije pokazivaca datoteke koristi se funkcija ftell oblika:

long int ftell(pointDat)

rezultat ove funkcije je broj bajtova od pocetka datoteke

Page 202: Programski jezik C

Da bi vratili poziciju pokazivaca na pocetak datoteke koristi se funkcija revind oblika:

void revind(pointDat)

Elmentarne funkcije za otvaranje i zatvaranje datoteka

Deskriptor datoteke predstavlja pozitivnu int promenjivu, koju vraca odgovarajuca ulazna/izlazna funkcija. Koristi se umesto imena datoteke kada zelimo da ucitamo ili upisemo neku otvorenu datoteku.

0 – standardna ulazna datoteka,

1 – standardna izlazna datoteka i

2 – standardna datoteka za greske

Page 203: Programski jezik C

Sve otvorene datoteke se automatski zatvaraju nakon zavrsetka programa.

Ako zelimo da zatvorimo neku datoteku pre zatvaranja programa koristimo funkciju close.int close(deskriptorDat)

Za odstranjivanje postojece datoteke iz kataloga koristi se naredba unlink oblika:

int unlink(imeDatoteke)

Page 204: Programski jezik C

Elmentarne funkcije za citanje i pisanje

Za ucitavanje podataka iz datoteke koristi se funkcija read oblika:

int read(deskriptorDat,pufer,brojBajt)pufer daje pocetnu adresu memorije u koju treba smestiti podatake (pufer je predstavljen tabelom, ciji su elementi tipa char) .Za ispisivanje podataka u datoteku koristi se funkcija write oblika:int write(deskriptorDat,pufer,brojBajt)pufer daje pocetnu adresu memorije iz koje se podaci ispisuju u datoteku.

Page 205: Programski jezik C

Elmentarne funkcije za direktan pristup podacima u datoteci

Elementarna funkcija lseek pomera pokazivac za citanje, odnosno upisivanje za odredjeni broj bajtova.

long int lseek(deskriptorDat,n,modus)

modus =0 – pozicioniranje pokazivaca za n bajtova od pocetka datoteke,

modus =1 – pozicioniranje pokazivaca za n bajtova od trenutne pozicije,

modus =2 – pozicioniranje pokazivaca za n bajtova od kraja datoteke

Za dobijanje trenutne pozicije pokazivaca za citanje i pisanje koristi se funkcija tell oblika:

long int tell(deskriptorDat)

Page 206: Programski jezik C

U slucaju da dodje do greske ove funkcije vracaju vrednost -1 .

Ne preporucuje se istovremeno koriscenje standardnih i elementarnih funkcija zbog nepredvidivih gresaka koje se tesko otkrivaju.

Page 207: Programski jezik C

Elementarna funkcija za otvaranje datoteke naziva se open:

int open(imeDatoteke,modus)

Rezultat ove funkcije je vrednost deskriptora datoteke.

modus moze imati sledece vrednosti:

0 – datoteka otvorena samo za citanje,

1 – datoteka otvorena samo za pisanje i

2 – datoteka otvorena za citanje i pisanje.

Ukoliko pri otvaranju datoteke dodje do greske vrednost deskriptora je -1

Page 208: Programski jezik C

Dinamicke strukture podataka

Strukturni tipovi podataka omogucavaju obrazovanje slozenih dinamickih struktura podataka.

Dinamicnost se odnosi na broj podataka i na njihovu medjusobnu logicku povezanost (oba mogu da se menjaju u vremenu) .

Linearne listeLinearne liste su najprostije dinamicke strukture i sluze za predstavljanje nizova podataka.

Podaci se nalaze na proizvoljnim mestima u memoriji i medjusobno se povezuju pokazivacima. Ne zahteva se da podaci budu u uzastopnim lokacijama u memoriji.

Page 209: Programski jezik C

Elementi liste su strukture sa po dva polja. Prvo polje sadrzi podatak a drugo pokazivac na naredni elemenat liste. Pokazivac u poslednjem redu je Null.

typedef struct element{int broj;struct element*sled;}Element

polje broj predstavlja podatak u elementu liste,sled je pokazivac na sledeci element liste,tip toga elementa je pokazivac na podatke tipa struct element, a to je tip koji se upravo deklarise. Celokupna lista u programu definise se skalarnim pokazivacem nizElement *niz;

Page 210: Programski jezik C

Pokazivac na pocetak liste naziva se glava liste.

Dodavanje novog podatka u listu trazi dodelu prostora za jedan element u dinamickoj zoni memorije i podesavanje pokazivaca.

Podatak se moze dodati na pocetak (iza glave) ili na kraj liste. Ukoliko je lista uredjena novi element se dodaje tako da ne narusi uredljenost liste.

Ako zelimo da eliminisemo nepotrebni element moramo podesiti sve pokazivace iza njega i osloboditi prostor u dinamickoj zoni memorije.Prvo se obrise struktura pa pokazivac na nju( u suprotnom ne mozemo pristupiti memoriji gde se nalazi dinamicka struktura pa je ne mozemo ni obrisati)

Page 211: Programski jezik C

Jednostruko povezana lista je skup cvorova povezanih pokazivacima u jednom smeru. Svaki cvor je strukturna promenjiva koja sadrzi clan koji pokazuje unapred i sadrzi promenjivi broj cvorova.

tekuci

deklaracije

typedef struct cvorSt)

struct cvorSt*sledeci;

//.........

)JCVOR;

JCVOR pocetak liste,*pocetak, *tekuci;

pocetak liste

pocetak

Page 212: Programski jezik C

kreiran je cvor pocetak liste i dve pokazivacke promenjive: pocetak i tekuci.pocetak liste je pomocni cvor (cvor prethodnik)

Jednostruko povezana lista ima jedan pokazivac za svaki cvor za povezivanje unapred. Pokazivac unapred je istog tipa kao i sami cvorovi liste.

Naredba typedef kreira tip JCVOR koji se koristi kao sinonim za struct cvorSt

cvor

pokazivac

. . .pocetak pocetak liste

tekuci

Page 213: Programski jezik C

Dvostruko vezana lista omogucava prolazenje kroz listu unazad. Koristi se kod editora teksta i na mestima gde se zahteva brzo pozicioniranje napred- nazad.

Prepoznaju se po paru clanova pokazivaca na cvor kojima se cvorovi mogu povezati napred-nazad odnosno u oba smera.

deklaracije

typedef struct dcvorSt{

struct dcvorSt*sledeci,prethodni;

//.........

}DCVOR;

DCVOR pocetak liste,*pocetak, *tekuci;

Page 214: Programski jezik C

cvor

pokazivac

. . .pocetak pocetak liste

tekuci

. . .

Deklaracija tipa DCVOR formira novo ime za tip strukture dcvorSt. Pokazivaci unapred (sledeci) i unazad (prethodni) pokazuju na tip DCVOR.

Page 215: Programski jezik C

Binarno stablo (drvo)Binarno stablo je orijentisani graf kod kojeg iz svakog cvora polaze najvise dve grane.

1

2 3

4 5 6

7

8 9

Page 216: Programski jezik C

Cvor grafa iz kojeg samo izlaze grane naziva se korenom stabla, a cvorovi u koje samo ulaze grane listovi stabla.Stablo se sastoji od korena i dva podstabla ispod korena. Za predstavljanje cvorova binarnog stabla koristi se strukturni tip sa najmanje tri polja. Prvo polje predstavlja koristan podatak koji se nalazi u datom cvoru. Preostala dva polja su pokazivaci na korene podstabala ispod tog cvora.

Za pristup samom stablu dovoljan je jedan skalarni pokazivac na koren stabla.

Page 217: Programski jezik C

5 9 9

5 9 9 3 9

4 5

7

8 9

Page 218: Programski jezik C

Definicija strukture jednog cvora i definicija pokazivaca stabla moze da se predstavi naredbom:

struct cvor {int broj;struct cvor *levo,desno;}*stablo;

program ce biti mnogo pregledniji ako se strukture opisuju zasebnih naredbi typedef, a pojedini podaci definisu zasebnim naredbama.

Page 219: Programski jezik C

//program za sabiranje i mmozenje kompleksnih brojeva #include<stdio.h> typedef struct{ float re,im;}COMPLEX;//funkcija za dodeljivanje vrednosti kompleksnih brojevaCOMPLEX assign(float re,float im){COMPLEX z;z.re=re;z.im=im;return(z);}//funkcija za sabiranje kompleksnih brojevaCOMPLEX add(COMPLEX x,COMPLEX y){COMPLEX z;z.re=x.re+y.re;z.im=x.im+y.im;return(z);}

Page 220: Programski jezik C

//funkcija za mnozenje kompleksnih brojevaCOMPLEX multiply(COMPLEX x,COMPLEX y){COMPLEX z;z.re=x.re*y.re-x.im*y.im;z.im=x.re*y.im+x.im*y.re;return(z);}//pocetak programamain(){COMPLEX x,y,z;//dodela vrednosti kompleksnom brojux=assign(12.0,14.0);y=assign(8.5,-10.5);getchar();getchar();}//sabiranje kompleksnih brojevaz=add(x,y);printf("%.2f+i*(%.2f)+(%.2f+i*(%.2f))=%.2f+i(%.2f)\n“,x.re,x.im,y.re,y.im,z.re,z.im);

Page 221: Programski jezik C

//mnozenje kompleksnih brojevaz=multiply(x,y);//stampanje rezultata mnozenjaprintf("%.2f+i*(%.2f)+(%.2f+i*(%.2f))=%.2f+i(%.2f)\n",x.re,x.im,y.re,y.im,z.re,z.im);getchar();getchar();}

Page 222: Programski jezik C

inicijalizovati matricu 12 33 24 -43 31 45 35 64 57 24 54 56

1.

2.definisati strukturu adresa koja se sastoji od pet podataka (ime, prezime, ulica, mesto i postanski broj)

Page 223: Programski jezik C

static int M [5] [4] ={

{12,33,24},

{-43,31,45},

{35,64,57},

{24,54,56}

};

inicijalizovati matricu 12 33 24 -43 31 45 35 64 57 24 54 56

Page 224: Programski jezik C

definisati strukturu adresa koja se sastoji od pet podatka (ime, prezime, ulica, mesto, broj),

typedef struct{

char ime[16];

char prezime[16];

char ulica[30];

char mesto16];

int postanskiBroj;

} adresa;

Page 225: Programski jezik C

//mnozenje matrice skalarom#include<stdio.h>#include<math.h>main(){int vrsta,kol;float skalar;// definisanje elemenata matricestatic float matrica[3][5]={{4.0,6.65,2.34,5.64,3},{10.0,3.45,6.78,8.7,3.6},{4.5,6.7,7.7,5.7,8.5}};//stampanje date matriceprintf("inicijalna matrica:\n");for(vrsta=0;vrsta<3;++vrsta) { for(kol=0;kol<5;++kol) printf("%10f\n",matrica[vrsta][kol]); }

Page 226: Programski jezik C

//unosenje skalarnog brojaprintf("upisite skalarni broj\n");scanf("%f",&skalar);for(vrsta=0;vrsta<3;++vrsta)for(kol=0;kol<5;++kol)//mnozenjematrica[vrsta][kol]*=skalar;printf("\matrica posle skalarnog mnozenja:\n");for(vrsta=0;vrsta<3;++vrsta) { for(kol=0;kol<5;++kol) //stampanje rezultata mnozenja printf("%12f\n",matrica[vrsta][kol]); }getchar();getchar();}

Page 227: Programski jezik C

//program za mnozenje dve matrice tipa 3*3#include<stdio.h>#include<math.h>main(){int i,j,k;static float m1[3][3]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0}, m2[3][3]={9.0,9.0,7.0,6.0,5.0,4.0,3.0,2.0,1.0};float m3[3][3];//mnozenje matricafor(i=0;i<3;++i)for(j=0;j<3;++j)for(m3[i][j]=0,k=0;k<3;++k)m3[i][j]+=m1[i][k]*m2[k][j];//stampanje rezultataprintf("proizvod matrica m1*m2 je:\n");printf("-----------------------\n");for(i=0;i<3;++i)for(j=0;j<3;++j)printf("%15.2f\n",m3[i][j]);getchar();getchar();}

Page 228: Programski jezik C

//program za transponovanje matrice#include<stdio.h>#include<math.h>//funkcija za transponovanje matricetransMatrica(m1,v,k,m2)int v,k;float m1[][4],m2[][3];{int i,j;for(i=0;i<v;++i)for(j=0;j<k;++j)m2[j][i]=m1[i][j];}//pocetak programamain(){int i,j;

Page 229: Programski jezik C

//upisivanje elemenata matricestatic float m2[4][3],m1[3][4]={{1.0,2.0,3.0,4.0}, {5.0,6.0,7.0,8.0}, {9.0,10.0,11.0,12.0}};transMatrica(m1,3,4,m2);printf("matrica pre transponovanja\n");printf("---------------------------\n");for(i=0;i<3;++i)for(j=0;j<4;++j)printf("%5.2f%c",m1[i][j],(j/3==1)?'\n':' ');printf("\nmatrica posle transponovanja\n");printf("-----------------------------\n");for(i=0;i<4;++i)for(j=0;j<3;++j)printf("%5.2f%c",m2[i][j],(j/2==1)?'\n':' ');getchar();getchar();}

Page 230: Programski jezik C

zadatak: // program za proveru stepena sigurnosti uzduznog klina bez nagiba za vezu zupcanika sa vratilom.

postoje klinovi oblika A sa zaobljenim krajevima, B sa ravnim, C sa jednim zaobljenim krajem.

Ft=2T Ka/d povrsinski pritisak na dodiru klina sa glavcinom pg

pg=Ft/(t2 la)

povrsinski pritisak na dodiru klina sa vratilom pv

pv=Ft /(t1 la)

T – obrtni moment koji prenosi klin KA - kojeficijent neravnomernosti raspolozenja d – precnik vratila t2,t1 – visina dodirne povrsine u glavcini i vratilu la – aktivna duzina dodira klina i vratila (zupcanika)

Page 231: Programski jezik C

stepen sigurnosti protiv plasticnih deformacija povrsinskog sloja na dodiru klin/glavcina sg, odnosno kin/vratilo sv sg =min( Tg, Tk) / pg , sv =min( Tg, Tk) / pv

Tg – trajna dinamicka cvrstoca materijala glavcine, Tk – trajna dinamicka cvrstoca materijala klina i Tv - trajna dinamicka cvrstoca vratila.

=FT / (b lr)

lr-redukovana duzina klina za tip A lr=l-b/2 B lr=l C lr=l-b/4

stepen sigurnosti protiv plasticnih deformacija smicanja: S =0.8 Tk / stepen sigurnosti od normalnih napona : S =pgk pgv / (pgk+pgv)ukupan stepen sigurnosti: Su=S S /

22 SS

Page 232: Programski jezik C

//proracun stepena sigurnosti klina bez nagiba#include<stdio.h>#include<math.h>main(){int itk;double dv,T,KA,Ft,lk,la,Gek,Geg,Gev,bk,hk,pg,pv,tau,sg,sv,ss,lr,t1,t2,s,su;printf("unesite obrtni moment T koji se prenosi u Nm\n");scanf("%lf",&T);printf("unesite precnik vratila dv u mm\n");scanf("%lf",&dv);printf("unesite faktor radnih uslova KA\n");scanf("%lf",&KA);printf("unesite tip klina za A=1 za B=2 za C=3\n");scanf("%d",&itk);

Page 233: Programski jezik C

if(itk<=3) { printf("unesite duzinu klina lk u mm\n"); scanf("%lf",&lk); printf("unesite sirinu klina bk u mm\n"); scanf("%lf",&bk); printf("unesite visinu klina hk u mm\n"); scanf("%lf",&hk); printf("unesite dubinu zleba u glavcini t1 u mm\n"); scanf("%lf",&t1); printf("unesite dubinu zleba u vratilu t2 u mm\n"); scanf("%lf",&t2); printf("unesite trajnu dinamicku cvrstocu Gek materijala klina u N/mm2\n"); scanf("%lf",&Gek); printf("unesite trajnu dinamicku cvrstocu Geg materijala glavcine u N/mm2\n"); scanf("%lf",&Geg); printf("unesite trajnu dinamicku cvrstocu Gev materijala vratila u N/mm2\n"); scanf("%lf",&Gev); Ft=2000*T*KA/dv;

Page 234: Programski jezik C

switch(itk) { case 1: la=lk-bk; lr=lk-bk/2; break; case 2: la=lk; lr=lk; break; case 3: la=lk-bk/2; lr=lk-bk/4; break; default: printf("pogresan unos tipa klina(A=1,B=2,C=3)\n"); }

Page 235: Programski jezik C

pg=Ft/(t2*la); pv=Ft/(t1*la); sg=Geg/pg; sv=Gev/pv; tau=Ft/(bk*lr); ss=0.8*Gek/tau; s=(sg*sv)/(sg+sv); su=(s*ss)/sqrt(pow(s,2)+pow(ss,2)); printf("povrsinski pritisak na glavcini/klin je pg=%lf KN/mm2\n“,pg); printf("povrsinski pritisak na vratilu/klin je pv=%lf KN/mm2\n“,pv); printf("napon smicanja u klinu je tau=%lf KN/mm2\n“,tau); printf("stepen sigurnosti protiv gnjecenja klin/glavcina je sg=%lf\n“,sg); printf("stepen sigurnosti protiv gnjecenja klin/vratilo je sv=%lf\n“,sv); printf("stepen sigurnosti protiv smicanja klina je ss=%lf\n“,ss); printf("stepen sigurnosti normalnih napona pritiska na klinu je s=%lf\n“,s); printf("ukupan stepen sigurnosti klina je su=%lf\n“,su); }elseprintf("pogresan unos tipa klina(A=1,B=2,C=3)\n");getchar();getchar();}

Page 236: Programski jezik C

zadatak: // program za proracun klina sa nagibom

])(/[ tgtgFaFn Fa-aksijalna silaFn-normalna sila

1F -sila trenja na dodiru klin/vratilo

Sila neophodna za demontazu veze: ])([ tgtgFnFd Obrtni moment : ]

6)([1

btdFnT

arctg

Povrsinski pritisak klin/vratilo:

bL

Fnp

Page 237: Programski jezik C

1=normalni i klin sa kukom:d=6do500mm2=niski klin:d=12do230mm;

Page 238: Programski jezik C

#include <stdio.h>void f() { printf("\n\n Na raspolaganju su vam sledece usluge"); printf("\n1.Prizemlje-Agencija za promet nekretnina"); printf("\n2.Suteren-Lekarska ordinarcija-internista"); printf("\n3.Drugi sprat-Banka\n(izaberite broj usluge)\n");}void f1(){float p,u; int b,c; printf("\n\nIzabrali ste Agenciju za promet nekretnina\nUnesite Povrsinu stana,"); printf("\nudaljenost od centra u km i\nbroj direktnih autbuskih linija i cenu po kvadratu (u evrima)\n"); scanf("%f %f %d %d",&p,&u,&b,&c); if(u<10||b>3) printf("\nprocenjena vrednost stana ako je vrednost po kvadratu %d eura %.2f eura",c,7*c*p/u+1200*b); else printf("\nE vi ste u nekoj zabiti, bogu iza *****\npa je procenjena vrednost sa %d eura po kvadratu %.2f eura",c,7*c*p/u+1200*b);

Page 239: Programski jezik C

}void f2() {int g,t,gp,dp; float v; printf("\n\nIzabrali ste lekarsku ordinaciju\nUnesite Visinu, Tezinu, Godine starosti,\nGornji i Donji pritisak\n"); scanf(" %f %d %d %d %d",&v,&t,&g,&gp,&dp); printf("\nVasa optimalna tezina je %.2f\nOptimalni donji pritisak %.2f\nOptimalni gornji pritisak %.2f",v-110+g/10.,60+g/6.,120+g/5.); if((v-110+g/10.)<t) printf("\nBucko malo smrsaj, idi u teretanu, drzi dijetu... nece da ti skodi,\na sto ne skodi znaci da koristi"); else printf("\nPod hitno da nabacis koju kilu "); }

void f3(){float s; printf("\n\nUnesite sumu koju zelite da vam se odobri u vidu 6-mesecnog gotovinskog kredita\n"); scanf("%f",&s);printf("\nVelicina mesecne rate sa kamatom od 9.43 posto je %.2f",(s+s*0.0943)/6);}

Page 240: Programski jezik C

main () {int n; char c; printf("\n**********************************\n*>>>Dobro dosli u trzni centar<<<*\n**********************************\n");ulaz:f(); scanf("%d",&n); switch(n) { case 1: f1(); break; case 2: f2(); break; case 3: f3(); break; } printf("\n\nDa li zelite drugu vrstu usluge? \n"); scanf("%s",&c); if(c=='d') goto ulaz; else printf("\n\n*********************************\n*>>>Dovidjenja i dodjite opet<<<*\n*********************************\n"); getchar (); getchar ();}