cjezikjasno prez
DESCRIPTION
CJezikProgramiranjeTRANSCRIPT
-
4/3/2013
1
Why Use C? In today's world of computer
programming, there are many high-level languages to choose from, such as C, Pascal, BASIC, and Java. These are all excellent languages suited for most programming tasks. Even so, there are several reasons why many computer professionals feel that C is at the top of the list:
-
4/3/2013
2
Why Use C?
C is a powerful and flexible language. What you can accomplish with C is limited only by your imagination. The language itself places no constraints on you. C is used for projects as diverse as operating systems, word processors, graphics, spreadsheets, and even compilers for other languages.
Why Use C?
C is a popular language preferred by professional programmers. As a result, a wide variety of C compilers and helpful accessories are available.
-
4/3/2013
3
Why Use C?
C is a portable language. Portable means that a C program written for one computer system (an IBM PC, for example) can be compiled and run on another system (a DEC VAX system, perhaps) with little or no modification. Portability is enhanced by the ANSI standard for C, the set of rules for C compilers.
Why Use C?
C is a language of few words, containing only a handful of terms, called keywords, which serve as the base on which the language's functionality is built. You might think that a language with more keywords (sometimes called reserved words) would be more powerful. This isn't true. As you program with C, you will find that it can be programmed to do any task.
-
4/3/2013
4
Why Use C?
C is modular. C code can (and should) be written in routines called functions. These functions can be reused in other applications or programs. By passing pieces of information to the functions, you can create useful, reusable code.
Why Use C? What about C++?
You might have heard about C++ and the programming technique called object-oriented programming. Perhaps you're wondering what the differences are between C and C++ and whether you should be teaching yourself C++ instead of C.
-
4/3/2013
5
Why Use C?
Not to worry! C++ is a superset of C, which means that C++ contains everything C does, plus new additions for object-oriented programming. If you do go on to learn C++, almost everything you learn about C will still apply to the C++ superset.
Why Use C?
In learning C, you are not only learning one of today's most powerful and popular programming languages, but you are also preparing yourself for object-oriented programming.
Another language that has gotten lots of attention is Java. Java, like C++, is based on C. If later you decide to learn Java, you will find that almost everything you learned about C can be applied.
-
4/3/2013
6
Prednosti C jezika
Jednostavnost
Univerzalnost i slobodne forme programiranja, ine ga jezikom opte namene i primene
Razvijena sredstva za prikazivanje strukture podataka
Projektovanje programa metodom odozgo na dole
Optimizovani C prevodioci za kreiranje efikasnih programa za sistemsko programiranje
Uvod u jezik C++ u kome su uspeno zaivele ideje objektno orjentisanog programiranja
Tradicionalni, klasini, algoritamski nain programiranja je u osnovi proceduralan, zasnovan na funkcionalnoj dekompoziciji korisnikog, a zatim i programskog zahteva.
(tipicno unos, obrada prikaz)
Pri tome, podaci (atributi) koji se obrauju i operacije nad njima nisu grupisani zajedno u objektima kao to je to sluaj kod OBJEKTNO ORJENTISANOG PROGRAMIRANJA, ved su razbacani po programu.
-
4/3/2013
7
Procesi u izvravanju programa
Tekst editor. Pisanje izvornog koda programa
Pretprocesor. Transformie izvorni kod prema direktivama koji se u njemu nalaze
Kompajler. Transformie izvorni kod u kod na asemblerskom jeziku
Asembler. Asemblerski kod translira u objektni kod.
Linker. Od formiranog koda i modula iz biblioteke C jezika kreira izvriv file
Lets go ! Example 1. Linear function
#include main () { int a,b,x,y; a=2; b=4; x=1; y=a*x+b; printf("%10d\n",y); }
-
4/3/2013
8
Osnovni elementi C jezika
Identifikator je sekvenca velikih i malih slova, cifara, i karaktera _. Koristi se za dodeljivanje imena objektima u programu (funkcije, promenljive...)
printf("%10d\n",y); je iskaz C jezika i predstavlja elementarnu obradu koju program treba da obavi. Mora se zavriti karakterom ;
{ i - su karakteri koji objedinjuju vie pojedinanih iskaza u jednu programsku celinu, analogno komandama BEGIN i END u Pascalu.
Osnovni elementi C jezika, nastavak
main, printf i scanf su identifikatori sistemskih funkcija
Funkcija main informie program gde treba poeti izvravanje programa, a ( ); oznaava da sistemska funkcija main nema argumenata.
#include Sve pretprocesorske direktive poinju znakom # i ne
pripadaju C jeziku. #include je instrukcija prevodiocu da
upotrebi standardne ulazno izlazne funkcije koje su definisane u file-u
-
4/3/2013
9
Funkcije za realizaciju ulazne i izlazne aktivnosti
Funkcije printf i scanf obavljaju formatizovanu ulazno izlaznu aktivnost.
Argumenti obe funkcije podeljeni su u dva dela:
A) Kontrolni ili konverzioni niz
B) Lista argumenata
Razlika funkcija scanf i printf je u u listi argumenata. Argumenti funkcije printf se prenose vrednodu, dok se argumenti funkcije scanf prenose svojom adresom, jer se uitana vrednost mora vratiti u pozivajudi program. To se postie navoenjem karaktera & ( operator indirekcije ) ispred liste argumenata.
Izlazna funkcija printf() Sintaksa
printf (Upravljaki string *Arg1,Arg2,+)
Upravljaki string
A) printf ( Ispis izlaznih izvestaja)
Konstantni tekst
Ispis izlaznih izvestaja
B) Sadri specifikaciju konverzije
printf ( Broj Pi ima vrednost %f\n, Pi)
Karakter % f odreuje na kom mestu i u kom formatu de se tampati vrednost odgovarajudeg argumenta iz liste.
\n Jedan karakter. Nekim karakterima se moe promeniti uobiajeno znaenje ako im prethodi karakter \ , tzv. Escape karakteri.
-
4/3/2013
10
Opti oblik specifikacije konverzije
%[-][ irina_polja][. Tanost][1] konverzioni_karakter
[-] Argument se poravnava na levoj strani zadane irine
irina_polja Zadaje maksimalnu irinu polja. Mesto na kome se tampa argument naziva se polje, a broj karaktera u polju je irina polja.
Tanost Definie se za realne brojeve, koliko se cifara ispisuje desno od decimalne take
Konverzioni_karakter definie konverziju (iz tabele)
Simboli specifikacije konverzije
Simbol konverzije
Tip argumenta Osobina izlazne funkcije
c char Jedan znak
d int Ceo dekadni broj
u int Ceo dek. br.bez znaka
o int Ceo okt. br. bez znaka
x, X int Ceo hksdek. br. bez znaka
s string String
f float double Dekadni zapis real. broja
e, E float double Eksponencijalni zapis
g,G float double Kradi zapis izmeu %f i %e
-
4/3/2013
11
Example No 2
main()
{
printf("karakteri:\n%3c\n%5c\n%7c\n",'A','B','C');
}
Izlaz programa
Karakteri:
A
B
C
Ulazna funkcija scanf()
Sintaksa scanf (Upravljaki string *Arg1,Arg2,+)
Upravljaki string sadri niz konverzionih specifikacija
Lista argumenata sadri adrese promenljivih.
Ispred imena promenljive obavezan je znak &, osim kod string promenljive. scanf(%d%d%d,,&i,&j,&k);
-
4/3/2013
12
Opti oblik konverzione specifikacije
%**+ irina_polja] konverzioni_znak
* Odgovarajude ulazno polje se ignorie i ne dodeljuje promenljivoj
irina_polja - Predstavlja maksimalnu irinu ulaznog polja
konverzioni_znak Definie konverziju (data tabelom)
Tabela konverzionih znakova
Simbol konverzije Tip argumenta
c char
d int
ld ili D long
h short
o int
lx, X long
s string
f float
le, lE double
g,G float double
-
4/3/2013
13
Example No 3 main() { int x; printf( Upotreba f. scanf:\n Ukucajte broj\n:) ; scanf ( %d\n, &x); printf(Ukucali ste\n%d\n, x); }
Izlaz programa Upotreba f. scanf: Ukucajte broj 23 Ukucali ste 23
Example No 4 main() { int i,j,k; scanf("%2d%3d%2d",&i,&j,&k); printf("/%d/%d/%d%\n",i,j,k); scanf("%d%d%d",&i,&j,&k); printf("/%d/%d/%d%\n",i,j,k); } Za ulazne vrednosti
123 456 789 12 34 56
Ispisuje se /12/3 /45/ /6//789/12/
-
4/3/2013
14
Osnovni tipovi podataka
Promenljive i konstante su objekti u okviru programa koji se karakteriu svojim: Imenom,
tipom podataka koji se moe dodeliti promenljivoj,
Skupom operatora koji se moe primeniti nad tim vrednostima
Memorijskim prostorom za smetaj podataka
Osnovni tipovi podataka su:
int, float, double i char
Tipovi podataka
Osnovni Celobrojni (int)
Realni (float)
Znakovni (char)
Nabrojivi (enum)
Prazan (void)
Slozeni ili Struktuirani Nizovi
Strukture
Unije
-
4/3/2013
15
Promenljive tipa Int
U ovu kategoriju podataka ubrajaju se konstante, promenljive, izrazi i funkcije.
Tri notacije za predstavljanje celobrojnih vrednosti dekadna, oktalna i heksadecimalna.
Pri deklarisanju promenljivih i konstanti moe se vriti i inicijalizacija promenljivih, npr. program Example No5
Opseg celobrojnih vrednosti je razliit i moe se menjati primenom kvalifikatora Long i Short
Unsigned deklarie promenljivu za memorisanje + vrednosti
long int x;
short int y;
unsigned int z;
Example No 5
main()
{
int x =11,y =22,z =33;
printf(x = %d\n y = %d\n z = %d\n,x,y,z);
}
Izlaz programa x = 11
y = 22
z = 33
-
4/3/2013
16
Promenljive tipa float i double
Promenljive tipa float i double memoriu vrednosti realnih brojeva i vrednosti sa decimalnim zarezom.
Razlika izmeu tipa float i double je u tanosti predstavljanja realnih vrednosti( brojem decimalnih cifara koje se mogu memorisati).
Konstante sa pokretnim zarezom se u C jeziku se mogu predstaviti u obinoj i naunoj konotaciji.
Ne postoji razlika izmeu konstanti tipa float i double C prevodilac sve konstante sa pokretnim zarezom predstavlja kao tip double
Promenljive tipa double mogu memorisati grubo dvaput vie decimalnih cifara od promenljivih tipa float
Example No 6 main()
{
float pi = 3.14159265358979323845;
double sqrt_3 = 1.732050875687729356;
printf(pi = %20f\n sqrt_3 = %20f\n\n, pi,sqrt_3);
}
Izlaz programa:
pi = 3.14159274101257320000
sqrt_3 = 1.73205087568877260000
-
4/3/2013
17
Promenljive tipa char
Promenljive i konstante tipa char memoriu karaktere.
Promenljive i konstante tipa char uestvuju u izrazima svojom kodnom vrednodu u kome je svaki karakter kodiran svojom. 7-bitnom vrednodu ASCII koda. Poto su karakteri kodirani celobrojnim vrednostima (leksikografsko ureenje ), mogude je sortiranje karaktera rei i linija.
Promenljive i konstante tipa char uestvuju u izrazima svojom kodnom vrednodu koja se tretira kao celobrojna vrednost. Promenljiva car sadri karakter a . Sukcesivnim inkrementiranjem promenljive kar dobijaju se karakteri b i c, program example No 7
Example No 7 main()
{
char car = 'a';
printf("karakter je %c\n",car);
printf("karakter je %c\n",car+1);
printf("karakter je %c\n",car+2);
printf("Kodna vrednost je %d\n",car+3);
}
Izlaz programa
Karakter je a
Karakter je b
Karakter je c
Kodna vrednost je 100
-
4/3/2013
18
Example No 8
main()
{
char c = 'A';
printf("/ %c / %d / %o / %x \n",c,c,c,c);
}
Izvrsavanjem programa dobija se:
/A/65//101/41
65- ASCII dekadna vrednost
101- ASCII oktalna vrednost
41- ASCII heksadekadna vrednost
Operacije, izrazi i operatori
Operaciju predstavlja simbol koji oznaava odreenu akciju nad odreenim podatkom koji se naziva operand.
Izraz se sastoji od jednog ili vie operanada i simbola operacija.
Operacija operira nad operandom
Aritmetike operacije * - mnoenje
/ - deljenje
% - izdvaja ostatak pri deljenju celih brojeva
+ - sabiranje
- - oduzimanje
-
4/3/2013
19
Operacije, izrazi i operatori
Operacije poreenja
> - vede
>= - vede ili jednako
< - manje
= , izvrava se tako to se vrednost desnog operanda, (izraz) dodeljuje levom operandu (promenljiva), koji predstavlja vrednost izraza sa operacijom dodeljivanja.
Operator
X = Y = Z = 1;
Se izvrava tako to izraz Z = 1 dobije vrednost 1 koja je dodeljena promenljivoj Z, izraunata vrednost izraza 1 se dodeljuje promenljivoj y i postaje vrednost izraza y = 1, i na kraju se vrednost izraza dodeljuje promenljivoj x
-
4/3/2013
20
Operacije, izrazi i operatori
Pojam operatora
Operatori su sastavni delovi programa koji predstavljaju potpunu instrukciju raunaru.
X = 2 je samo izraz, dok je X = 2; operator.
Operacije uvedavanja i umanjivanja
Izraz ++ x uvedava vrednost promenljive x za 1, a izraz - - x umanjuje vrednost promenljive x za 1.
Prefiksni oblik ++x, promenljiva se najpre uvedava pa tek onda koristi u izrazu
Postfiksni oblik x++ promenljiva se najpre koristi u izrazu pa tek onda uvedava.
Grananje u programu
Uslovni operator se pojavljuje u slededim oblicima: If (izraz) operator1
If (izraz) operator1 else operator2
Ako su operator1 i operator2 prosti operatori
if (izraz) operator1
else operator2
-
4/3/2013
21
Ako su operator1 i operator2 sloeni operatori
if (izraz)
{
operator11
operator12
operator1k
}
else
{
operator21
operator22
operator2k
}
Operator viestrukog izbora SWITCH
Omogudava grananje u programu izborom jednog izmeu vie operatora
switch (izraz)
{
case konstanta1:
operator1
break;
case konstanta2:
operator2
break;
case konstantan:
operator n
break;
default :
operator0
break;
}
-
4/3/2013
22
Operator viestrukog izbora SWITCH
Iza slubene rei switch navodi se izraz (selektor) ija je vrednost celobrojna, ili znakovna koja se automatski konvertuje u celobrojnu.
Operatorom viestrukog grananja izvrava se ona grupa operatora ispred koje se nalazi konstanta koja je jednaka vrednosti selektora. Ako nije jednaka nijednoj od konstanti izvrava se grupa operatora koja se nalazi iza default alternative.
Operator switch na osnovu brojnih ocena 5,4,3,2,1 ispisuje ocene odlian, vrlo dobar, dobar, dovoljan, nedovoljan u example No 8
Example No 8 switch (ocena)
{
case 5: printf (odlian\n); break; case 4: printf (vrlo dobar\n); break; case 3: printf (dobar\n); break; case 2: printf (dovoljan\n); break; case 1: printf (nedovoljan\n); break;
default: printf (nekorektna ocena\n); }
Break operator se koristi u switch operatoru da bi se obezbedio izlaz neposredno iza njega. Ako se iza neke grupe operatora u switch- u ispusti break, tada de se u sluaju izbora te grupe izvravati sve preostale alternative do pojave break- a ili kraja switch.-a.
-
4/3/2013
23
Organizacija ciklusa
Niz operatora koji se moe izvravati vie puta naziva se ciklus.
Telo ciklusa - Niz operatora koji obrazuju ciklus
Izlazni kriterijum Uslov koji odreuje da li de se telo ciklusa ponovo izvravati.
U zavisnosti od poloaja izlaznog kriterijuma u odnosu na telo ciklusa, ciklusi mogu biti sa:
Preduslovom (while), skradeno varijanta sa (for)
Postuslovom (do while)
Ciklus while
Operator ciklusa sa preduslovom while omogudava organizovanje ciklusa sa nepoznatim brojem ponavljanja koji zavisi od izraunavanja u telu ciklusa.
Opti oblik operatora while je: while (izraz)
operator
Ako je vrednost izraza tano , izvride se operator koji ini telo ciklusa. Operator se izvrava dok god izraz ima vrednost tano. Svaki takav korak naziva se iteracija.
-
4/3/2013
24
Example No 9
/* Stepen celog broja*/
main()
{
int a,n, i=1,stepen=1;
printf("Ucitaj a i n:\n");
scanf("%d%d",&a,&n);
while (i++
-
4/3/2013
25
Example No 10 /* Faktorijel*/
main()
{
long i,n,fakt;
scanf("%ld",&n);
for (fakt=1,i= 1; i
-
4/3/2013
26
Example No 11 /* Stepeni dvojke*/
main()
{
int stepen,granica;
printf("Uneti granicu\n");
scanf("%d",&granica);
stepen=2;
do{
printf("%d\n",granica);
stepen*=2;
}
while (stepen
-
4/3/2013
27
Definicija funkcije
Funkcije se dele na dve osnovne kategorije:
Funkcije koje vradaju vrednost (rezultat) pozivajudoj funkciji (main ili neka druga)
Funkcije koje ne vradaju vrednost pozivajudoj funkciji (main ili neka druga).
Kod funkcija koje ne vradaju vrednost kao tip rezultata navodi se void.
Sintaksa Funkcije ima slededi oblik:
Tip_rezultata ime_funkcije(formalni parametri)
Opis formalnih parametara
{
Definicije i deklaracije
Operator1
....
OperatorN
}
Example No 12 a
/* Funkcija izraunava sumu kvadrata celih brojeva od m do n*/
long suma_kvadrata(m,n){
int i;
long s=0;
for(i=m;i
-
4/3/2013
28
Example No 12
/* main funkcija ilustruje koridenje funkcije suma_kvadrata */ main() { int m,n,k,l; long p; long suma_kvadrata(); p=suma_kvadrata(2,4); printf("%ld %ld\n",p,suma_kvadrata(-1,3)); scanf("%d%d%d%d",&m,&n,&k,&l); p=suma_kvadrata(m,n)+suma_kvadrata(k,l); printf("%ld %ld\n",p,suma_kvadrata(m+k,n+l)); } /* Funkcija izracunava sumu kvadrata celih brojeva od m do n*/ long suma_kvadrata (int m,int n) { int i; long s=0; for(i=m;i
-
4/3/2013
29
Podela memorije izmeu promenljivih koje koriste funkcije main () i suma_kvadrata()
main()
m
n
k
l
p
P = suma_kvadrata (2,4)
suma_kvadrata()
m
n
s
i
Pokazivake promenljive (Pointeri)
Pokazivaka promenljiva je promenljiva koja pokazuje na drugu promenljivu, odnosno sadri adresu memorijske lokacije u kojoj se uva ta promenljiva
Deklarie se tako to se u specifikaciji zada tip promenljive na koju ukazuje pokazivaka promenljiva. Ispred imena promenljive pie se * int *pi /*pokaziva na celobrojnu promenljivu */
char *pc /*pokaziva na znakovnu promenljivu */
float *pf1, *pf2 /*pokaziva na float promenljive */
j = *pi //dodeljuje promenljivoj j celobrojnu vrednost koja se nalazi na adresi sadranoj u promenljivoj pi.
-
4/3/2013
30
Pretpostavimo da postoji slededa deklaracija i inicijalizacija promenljive prom:
int prom= 0 ;
Deklaracija int * ukaz_prom; nam omogudava da indirektno pristupimo vrednosti promenljive prom.
Za promenljive prom i ukaz_prom moemo pisati iskaz:
ukaz_prom = &prom;
koji promenljivoj ukaz_prom dodeljuje adresu promenljive prom.
Ako je promenljiva x deklarisana kao int, tada se iskazom
x = *ukaz_prom;
dodeljuje vrednost promenljive na koju pointer ukaz_prom ukazuje. Poto je promenljiva ukaz_prom
u ranijem iskazu postavljena na vrednost &prom efekat prethodnog iskaza dodeljivanje promenljivoj x vrednost promenljive prom.
Operatori & i * su unarni istog prioriteta i inverzni su meusobno.
Pointeri
Pretpostavimo da imamo deklaraciju int x,y,*u Tada su iskazi u = &x y= *u; Ekvivalentni iskazu y = *&x Koji je opet ekvivalentan iskazu y = x Operatori dodeljivanja
pi = &i j = *pi
Imaju isti efekat kao j = i
Pointeri
-
4/3/2013
31
Pokazivai
Int x=1, y=2;
Int *ip
ip=&x x y ip 100 200 1000
y= *ip x y ip 100 200 1000
x=ip x x y ip 100 200 1000
*ip=3 x y ip 100 200 1000
1 2 100
3 2 100
100 2 100
1 1 100
Pointeri, opet, ali malo drugaije
Pokaziva se definie kao i ostale promenljive. Razlika je to se nazivu promenljive dodaje unarni operator simbol (*) ispred identifikatora odreene promenljive. Zvezdica (*) je simbol za indirektno adresiranje pa se zato i sam operator (*) naziva i operatorom indirektnog adresiranja.
Kada se operator indirekcije (*) primeni na neki pokaziva, njime se pristupa objektu na koji pokaziva pokazuje.
int *p1; /* pokaziva na integer promenljivu
char *p2; /* pokaziva na char promenljivu
long double *p4; /* pokaziva na long double prom.
-
4/3/2013
32
Pointeri
Pokaziva je dakle promenljiva koja sadri adresu objekta tj. neke promenljive na koji pokazuje. Kada je sadraj pokazivaa adresa nekog objekta tada je pokaziva inicijalizovan.
Adresa nekog objekta u memoriji koji je predstavljen svojim identifikatorom, moe da se dobije pomou prefiksnog unarnog operator (&), odnosno adresa neke promenljive dobija se koridenjem ovog adresnog operatora.
Jedan pouan primer
int broj; /* promenljiva tipa int
int *pok; /* pokaziva na int tip
broj = 10; /* inicijalizacija promenljive broj na 10
pok = &broj; /* inicijalizacija pokazivaa tako da pokazuje na promenljivu broj
*pok = 100; /* promena sadraja promenljive broj na 100 preko pokazivaa .
broj = 100;
-
4/3/2013
33
DEKLARACIJA POKAZIVAA
Pokaziva omogudava indirektan nain pristupa vrednosti odreenog podatka, i to pomodu adresa podatka u memoriji raunara. Kako to funkcionie na najjednostavnem primeru:
int broj = 10, *pok;
Da bi se uspostavila veza izmeu promenljivih broj i pok, koristi se operator (&) koji daje adresu odgovarajude promenljive.
pok = &broj
Ovim je pridruena memorijska adresa promenljive broj pokazivau pok, tj. sadraj promenljive pok je adresa promenljive broj
-
4/3/2013
34
Vrednost promenljive broj pridruuje se nekoj drugoj promenljivoj npr x upotrebom promenljive pok, koristedi operator (*). x = *pok;
ima isto znaenje kao i: x = broj;
tj. u jednom i drugom sluaju vrednost promenljive x je 10.
Veza izmeu funkcija koridenjem pokazivaa
Funkcija kvadrat_kub () koja je definisana iza glavne funkcije main() u primeru No14 ima etiri parametra m, n, kv i kub. Prva dva parametra su ulazni podaci koje ne elimo menjati u toku izvretka funkcije i nazivaju se vrednosni parametri. Pre izvravanja funkcije tim parametrima se dodeljuju vrednosti stvarnih parametara.
Pri pozivu funkcije kvadrat_kub(2,4 ,&p&q); predaju se adrese promenljivih p i q to znai da de formalni parametri kv i kub
koji su definisani u zaglavlju funkcije kvadrat_kub (m, n, kv, kub) biti opisani kao pokazivai.
Poto su p i q celobrojne promenljive promenljive kv , kub treba da budu opisane kao pokazivai na celobrojne promenljive, pa se deklariu na slededi nain
int m, int n, int *kv, int *kub Ovi parametri se nazivaju adresni parametri, i koriste se za odreivanje izlaznih
vrednosti funkcije ili promenu vrednosti odgovarajudih stvarnih parametara. Na mestu programa na kome se funkcija izvrava prvi put promenljivim p i q se
dodeljuju vrednosti stvarnih parametara 2 i 4. Pokazivake promenljive *kv, i *kub
dobijaju adrese stvarnih parametara &p i &q tako da se sve operacije koje se u funkciji realizuju nad *kv, i *kub su operacije koje se realizuju nad stvarnim parametrima p i q
-
4/3/2013
35
Example No 14 main()
{
int m,n,k,l,p,q,r;
void kvadrat_kub();
kvadrat_kub(2,4,&p,&q); printf("p = %d q =%d\n",p,q);
scanf("%d%d%d%d",&m,&n,&k,&l);
kvadrat_kub(m,n,&p,&q);
printf("p = %d q =%d\n",p,q);
kvadrat_kub(m-k,n+l,&p,&r);
printf("p = %d q =%d\n",p,r);
}
void kvadrat_kub(int m, int n, int *kv, int *kub) {
int i;
*kv = *kub =0;
for(i=m;i
-
4/3/2013
36
Prosleivanje argumenata funkciji upotrebom pokazivaa
U nekim sluajevima nije dovoljno da funkcija vrada samo jednu vrednost. Naredbom return mogude je vratiti samo jednu vrednost. U cilju reavanja ovog problema, potrebno je razmotriti osobine koje imaju parametri funkcije. U trenutku prenosa promenljive kao parametra funkcije, u okviru funkcije se automatski kreira lokalna kopija promenljive. Ukoliko funkcija menja vrednost parametara (dodeljuje mu vrednost i sl.), promena je ''vidljiva'' samo u okviru funkcije, jer se menja samo vrednost lokalne kopije promenljive, a ne i ''originala''. Da bi promena vrednosti parametara bila vidljiva i van okvira funkcije, tj. u okviru programa koji je funkciju pozvao, potrebno je funkciji preneti ne promenljivu, ved adresu promenljive. U tom sluaju se ne kreira kopija promenljive.).
Prosleivanje argumenata funkciji upotrebom pokazivaa
Prenos promenljive na nain na koji se kreira lokalna kopija promenljive se naziva prenos po vrednosti, a prenos promenljive na nain na koji se koristi ''zajednika' promenljiva se naziva prenos po referenci. Prenos po vrednosti i prenos po referenci su ilustrovani na slededem primeru:
-
4/3/2013
37
Prenos parametara po vrednosti
void f_ja(int x) { x = x + 3; } void main() { int param = 5; f_ja(param); } Nakon poziva funkcije f_ja vrednost promenljive param je 5 (nepromenjena).
Prenos parametara po referenci
void f_ja(int *x) { *x = *x + 3; } void main() { int param = 5; f_ja(¶m); } Nakon poziva funkcije f_ja vrednost promenljive param je 8 (promenjena)
-
4/3/2013
38
Memorijske klase
Pored pripadnosti odredjenom tipu promenjlive imaju i svoju memorijsku klasu.
Memorijska klasa daje mogudnost da se odredi sa kojim funkcijama je povezana promenljiva ili koje funkcije imaju pristup promenljivoj.
Pri opisu memorijske klase koriste se sledede rezervisane rei: auto static register extern
Automatske promenljive
Automatske promenljive se deklariu rezervisanom rei auto ispred specifikacije tipa kao u slededem primeru:
{
auto int a;
auto int b=777;
auto double d;
}
Oblast u kojoj deluje automatska promenljiva ograniena je blokom (u granicama definisanim zagradama { } u kome je deklarisana). Dok god se blok koji je sadri izvrava ona ivi , kada program napusti taj blok promenljiva iezava. Ona je dostupna i u svakom podbloku bloka u kome je deklarisana. Primer No 15 ilustruje oblast delovanja automatskih promenljivih.
-
4/3/2013
39
Example No 15
main()
{
/*spoljasnji blok*/
auto int x=1;
{
/*podblok #1 */
auto int y=2;
printf(%d%d\n,x,y);
}
{
/*podblok #2*/
printf(%d%d\n,x,y);/*linija 12 */
}
printf(%d%d\n,x,y);/*linija 14*/
}
Statike promenljive
Kao i automatske, statike promenljive su lokalne u funkciji odnosno bloku u kome su deklarisane. Razlika je u tome to statike promenljive ne iezavaju kada funkcija koja ih sadri prekine izvravanje. Ako program ponovo pree na izvravanje funkcije koja sadri statiku promenljivu ona de imati vrednost sa kojom je prekinuta funkcija u prethodnom izvravanju. Primer deklaracije i inicijalizacije:
{
static int a = 1;
float c = 0,0;
...
}
U slededem primeru Example No 16 funkcija uvedaj () se poziva tri puta. Inicijalna vrednost promenljive x je 0. U slededim pozivima funkcije koristi se vrednost sauvana iz prethodnog izvravanja.
-
4/3/2013
40
Example No 16 main()
{
void uvecaj();
uvecaj();
uvecaj();
uvecaj();
}
void uvecaj() {
static int x=0;
x++;
printf(%d\n,x);
}
Ispisuje se
1
2
3
Spoljanje promenljive
Promenljiva deklarisana van funkcije naziva se spoljanja promenljiva. Ona se moe deklarisati i u funkciji koja je koristi navoenjem rezervisane rei extern. Na primer:
int x; /*deklaracija spoljasnje promenljive x */
char c;
double x;
main()
{
extern int a;
extern char c ;
extern double x ;
..
}
Navoenjem rezervisane rei extern spoljanja promenljiva postaje dostupna funkciji definisanoj bilo gde u tom i u bilo kom file-u
-
4/3/2013
41
Primeri deklarisanja spoljanjih promenljivih
int x = 707; /* globalna deklaracija promenljive x */
main()
{
printf(%d/n, x);
}
Poto je promenljiva x definisana van funkcije main() ona je globalna I funkcija joj moe pristupiti. Izvravanjem programa dobija se 707
A izvrenjem programa
int x = 707; /* globalna deklaracija promenljive x */
main()
{
int x = 101; /* lokalna deklaracija promenljive x */
printf(%d/n, x);
}
dobija se 101
U toku izvravanja funkcije vaeda je vrednost lokalne promenljive
Example No17
int x; /*deklaracija spoljasnje promenljive x */ main() { printf("Pocetna vrednost od x je%d\n",x); dodaj(); oduzmi(); dodaj(); oduzmi(); printf("krajnja vrednost od x je %d\n",x); } /*uvecava spoljasnju promenjivu x*/ dodaj() { x++; printf("dodavanjem 1 dobija se %d\n",x); } /*umanjuje spoljasnju promenjivu x*/ oduzmi() { x--; printf("oduzimanjem 1 dobija se %d\n",x); }
-
4/3/2013
42
Kreiranje projekta
U okruenju C jezika programi koji se formiraju iz vie file-ova nazivaju se projekti. Svaki projekat je povezan sa projektnim file-om koji treba kreirati i u kome se nalazi opis projekta, ili spisak file-ova koji obrazuju projekat. Projektni file-ovi moraju imati ekstenziju PRJ. Na primer ako treba napraviti program iz file-ova
PRVI. C
main()
{
printf(Ovo je iz file-a1.\n);
pisi() /*U File-u DRUGI.C */
}
i DRUGI. C
pisi()
{
printf(Ovo je iz file-a2.\n);
}
Treba kreirati projektni file npr. PRVIPROJ. PRJ:
PRVI
DRUGI
U podmeniju Project u opciji Project Name navede se ime projekta PRVIPROJ. Opcijom RUN zadaje se kompilacija i izvravanje projekta. U podmeniju Compile opcija Make kreira se EXE verzija projekta.
Nizovi Niz je ogranien ureen skup promenljivih istog tipa, koje se nazivaju
komponente. Tip komponenti se naziva bazni tip. Vrednostima pojedinih komponenti moe se pristupiti pomodu indeksa, koji ukazuje koju komponentu treba obraivati.Pri definisanju nizova treba voditi rauna o dve stvari:
Treba ukazati na broj komponenti i nain referisanja na komponente. Treba ukazati na tip vrednosti koje se u njemu uvaju.
Opis niza Niz se opisuje kao i ostali podaci, samo to se dodaju kvadratne zagrade iza
imena niza. Unutar zagrada se navodi broj koji pokazuje broj elemenata u nizu.
Int broj [1000] ; Ovom deklaracijom se uvodi niz broj koji se sastoji iz 1000 celobrojnih
promenljivih sa imenima broj [0], broj [1] ... broj [999]. Indeksiranje elemenata niza je od 0. Svaka promenljiva poto je celobrojna zauzima dva bajta.
-
4/3/2013
43
Example No 18
//Izracunati srednju vrednost niza od n elemenata(n
-
4/3/2013
44
Example No 20 //Izracunati indeks najveceg elemenata niza x od n elemenata (n
-
4/3/2013
45
Inicijalizacija Nizova Nizovima je u C jeziku moguce dodeljivati pocetne vrednosti. Ako se
inicijalizacija ne zadaje eksplicitno niz se inicijalizuje nulom, Medjutim ako je potrebno da se niz inicijalizuje vrednostima razlicitim od nule potrebno je da se pri deklaraciji niza izmedju viticastih zagrada navedu zeljene vrednosti razdvijene zarezom.
Int dani [12]= {31,28,31,30,31,30,31,31,30,31,30,31}
main() { int i; extern int dani[ ]; /*neobavezna deklaracija*/ for (i=0; i
-
4/3/2013
46
Nizovi i pokazivai
Oba dela jednakosti X= &x[0] definiu adresu nultog elementa niza. Obe oznake su konstante pokazivakog tipa i ne mogu se menjati. Prema tome njih moemo dodeljivati pokazivakim promenljivim.
x+2 ==&x[2] /*jer su im iste adrese*/
*(x+2) == x[2] /*jer su im iste vrednosti*/
Odavde se vidi da se pokazivai mogu koristiti za adresiranje elemenata niza , kao i za dobijanje njihove vrednosti.
Nizovi i pokazivai
Kada se navede X+2 to kompajler tretira kao adresu koja se dobija dodavanjem na adresu X ne 2, ved 2 puta broj baytova koje zauzimaju komponente niza X.
U sutini se radi o razliitim oznakama za jedno te isto, jer kompajler pretvara oznake niza u pokazivae , pa je brzine radi, preporuljivo koristiti pokazivae.
-
4/3/2013
47
Ilustracija pokazivaa i adresa na koje ukazuju
pti pti+1 pti+2 pti+3 Adresa: 56006 56007 56008 56009 56010 56011 56012 56013
Pokazivaci pti, pti+1, pti+2 i pti+3
redom pokazuju na adrese: 56006, 56008, 56010 i 56012
i elemente niza: x[0], x[1], x[2] i x[3],
X[0]
X[0] X[1] X[2] X[3]
POKAZIVAI NA NIZOVE
1004 v[0]
1008 v[1]
1012 v[2 ]
1016 v[3]
1020 \0
.....
2010
int v[ ] = {1, 2, 3,4}; /*niz */ int* p1 = v;
/*pokaziva na niz odnosno uvek na prvi element niza tj. p1=&v[0] */
int* p2 = &v[1]; /*pokaziva na prvi element niza */ int* p3 = &v[4]; /*pokaziva na poslednji element niza */
1004 p1
1
2
3
4
1004 p2 1020 p3 for (i = 0; i
-
4/3/2013
48
Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...
Prenoenja nizova kao argumenata moe se analizirati na problemu odreivanja broja studenata koji su imali natprosene rezultate na proveri znanja iz osnova programskog jezika C.
Algoritam ovog problema se moe razloiti na sledede module
Uitavanje vrednosti elemenata niza
Izraunavanje prosenog rezultata
Prebrojavanje natprosenih rezultata
Ispis izlaznog izvetaja
Example No .
main(){ int n,i,broj,ocena[50]; /*niz od 50 elemenata*/ float prosek(); printf('\n Unesi broj takmicara:'); scanf(%d',&n); /*ucitavanje elemenata niza*/ printf('\n Unesi rezultate:\n'); for (i:=0;i
-
4/3/2013
49
Contnue.
/*prebrojavanje natprosecnih rezultata*/
broj=0
for(i=0;iprosek(ocena,n))
broj++;
printf(''prosecan rezultat je:%f.\n'',prosek(ocena,n));
printf (''natprosecne rezultate je imalo:%d takmicara.\n'',broj);
}
float prosek(int x [],int n){
int i,suma;
suma=0;
for(i=0;i
-
4/3/2013
50
Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...
Poziv funkcije
prosek (ocena,n) sadri ime ocena koje predstavlja adresu nultog elementa od najvie 50 elemenata.
Time se pri pozivu funkcije predaje pokazivaka konstanta (adresa nultog elementa niza)
ocena = &ocena[0]
To znai da je formalni parametar funkcije pokazivakog tipa pa se u funkciji prosek() moe izvriti deklaracija na slededi nain
prosek(int *x,int n)
Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...
Operatori int x []; int*x;
Su ekvivalentni jer oba deklariu promenljivu x kao pokaziva na niz celih brojeva
... Operatori koji u funkciji prosek () koriste pokaziva *X rade sa nizom ocena koji se nalazi u telu funkcije main() Poziv funkcije inicijalizuje pokaziva X tako da pokazuje na ocena [0] Kada index i u funkciji prosek () uzme vrednost 4 tada je izraz x [4] ekvivalentan sa *(x+4).
-
4/3/2013
51
Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...
Znai poto (x+0) pokazuje na ocena[0] to x+4 pokazuje na ocena[4].
Prenos jednodimenzionalnih nizova se ostvaruje navoenjem imena niza u pozivu funkcije bez ikakvog indeksa. Na ovaj nain u funkciju se prenosi informacija (adresa) o lokaciji niza u pozivajudoj funkciji.
Funkcije, nizovi, pokazivai, parametri, prenoenje argumenata ...
ak i deklaracija x [100] ima isto znaenje kao i x [] jer C kompajler generie kod koji funkciji predaje pokaziva tako da je beznaajna specificirana duina niza.
X== &x[0]
X +0== &x[0]
X+2 ==&x[2] /*jer su im iste adrese*/
*(x+2) == x[2] /*jer su im iste vrednosti*/
*(x+i) == x[i]
Prema tome jednodimenzionalni nizovi se prenose iskljuivo po adresi
-
4/3/2013
52
Sortiranje nizova Program kojim se koridenjem odgovarajude funkcije uitani niz sortira u monotono neopadajudi poredak
Example No 21 main() { int float a[50]; void citaj(); void pisi(); void sort1(); printf(\nUneti broj elemenata niza:); scanf(%d,&n); printf(\nUnesi elemente niza:\n); citaj(a,n); sort1 (a,n); printf(Niz posle sortiranja je:\n); pisi(a,n);
}
Example No 21 void citaj(float x[],int n)
{
int i;
for(i=0;i
-
4/3/2013
53
Example No 21
void razmeni(float*a,float*b) { float pom; pom=*a;*a=*b;*b=pom; } void sort(float a[],int n) { int i,j; for(i=0;i
-
4/3/2013
54
Viedimenzionalni nizovi
Prema navedenoj deklaraciji vai:
poki =& a [0][0]
Poki+1 =& a [0][1]
Poki+2 =& a [1][0]
Poki+3 =& a [1][1]
Poki+4 =& a [2][0]
Poki+5 =& a [2][1]
U ovom primeru a je ime dvodimenzionalnog niza a, a [0], a [1], a [2]
su imena jednodimenzionalnih nizova koje predstavljaju vrste matrice.
Ime niza je pokaziva na taj niz jer pokazuje na njegov prvi element, tako da vai:
a [0] =& a [0][0]
a [1] =& a [1][0]
a [2] =& a [2][0]
Ova osobina nam koristi da funkciju namenjenu za obradu jednodimenzionalnog niza koristimo pri obradi vrsta dvodimenzionalnog niza.
Example No 22 main()
{
static float a[3][4]={
{1.0,2.0,3.0,4.0},
{11.5,22.4,33.3,44.2},
{10.1,20.2,30.3,40.4}
};
int i;
float sredina();
for (i=0;i 3;i++)
printf(srednja vrednost vrste %d je %f\n,i,sredina(a*i+,4));
/*a[i] je jednodimenzionalni niz od etirielementa*/
}
float sredina(float x[],int n)
{
int i;
float suma=0;
for (i=0;i
-
4/3/2013
55
Example No 23
main()
{
int i,n;
int x[10][10]
void citaj();
void pisi();
void sort1();
printf(\nUneti broj vrsta matrice:);
scanf(%d,&n);
printf(\nUnesi elemente matrice po vrstama :\n);
citaj(x,n);
sort1(x[i],n);
printf(matrica posle sortiranja je:\n);
pisi(x,n);
}
Example No 23
/*funkcija koja ucitava elemente matrice*/
void citaj(int x[][10],int n) {
int i,j;
for(i=0;i
-
4/3/2013
56
Example No 23
void razmeni(int*a,int*b)
{
float pom;
pom=*a;*a=*b;*b=pom;
}
void sort_po_vrstama(int a[][10],int n)
{
int i,j,k;
for(i=0;i
-
4/3/2013
57
(Malo podsedanja)
main() { char c = A; printf(/ %c / %d / %o / %x \n,c,c,c,c); } Izvrsavanjem programa dobija se: /A/65//101/41 65- ASCII dekadna vrednost 101- ASCII oktalna vrednost 41- ASCII heksadekadna vrednost
Da sumiramo
Znai, izraz A je znakovna konstanta
a, A je prikriven, skradeni, prikaz konstantnog znakovnog niza sastavljenog iz dve znakovne konstante A i \0 .
-
4/3/2013
58
Inicijalizacija znakovnih nizova
Rekli smo da je nizovima u C jeziku mogude dodeljivati poetne vrednosti. Ako se inicijalizacija ne zadaje eksplicitno niz se inicijalizuje nulom, meutim, ako je potrebno da se niz inicijalizuje vrednostima razliitim od nule potrebno je da se pri deklaraciji niza izmedju vitiastih zagrada navedu eljene vrednosti razdvijene zarezom.
Inicijalizacija znakovnih nizova
Nizovi se mogu inicijalizovati koridenjem string konstanti. Na primer, operator static char tekst * +=,F,e,s,t,i,n,a,t,a,m, s,e,m,e,n,t,e,m, s,a,e,p,e, d,e,c,i,p,e,r,e,, s,e,r,o,t,i,n,a,m,s,e,m,p,e,r,\0 -;
inicijalizuje statiki niz tekst datom string konstantom ili skradeni oblik inicijalizacije izgleda ovako: static char tekst [ ]={ Festinatam sementem saepe decipere, serotinam semper };
-
4/3/2013
59
Nizovi karaktera i pokazivai Poto je ime niza ekvivalentno adresi njegovog nultog
elementa ( predstavlja pokaziva na nulti element) tako je i string konstanta pokaziva na nulti element niza u kome je registrovan string.
Operator static char s[ ] = IBM PC ; inicijlizije statiki niz s
datom string konstantom On predstavlja skradeni oblik inicijalizacije
static char s[ ] = ,I,B,M, P,C, \0-; Ako bi se izostavio zavrni znak to vie ne bi bio string
ved samo niz znakova. Kao i kod drugih nizova ime s predstavlja pokaziva na
nulti element.
s =& s[0], *s = I , *(s +1) = s[1] = B ,
Nizovi karaktera i pokazivai
Za kreiranje stringa moe se koristiti i pokaziva. Na primer deklaracijom: char *pok = Festinatam sementem saepe decipere, serotinam semper ;
pokaziva pok je inicijalizovan adresom nultog znaka stringa
Ekvivalentna inicijalizacija se moe realizovati slededim operatorima: char *pok; pok = Festinatam sementem saepe decipere, serotinam semper ;
Za razne operacije nad ovim stringom dovoljno je da znamo adresu njegovog nultog znaka.
-
4/3/2013
60
Example N0 .... koji ispisuje string u direktnom i inverznom poretku.
main()
{
static char s[ ]={ Festinatam sementem saepe decipere, serotinam semper };
char *pok;
pok = s;
while (*pok) /*ili while (*pok!= \0 ) */
putchar (*pok++);
while (--pok >=s)
putchar (*pok);
putchar (\n );
}
Inicijalizacija stringova
Opisom stringa pomodu niza u statikoj memoriji se kreira niz. Svaki element niza se inicijalizuje odgovarajudim znakom a ime niza postaje sinonim adrese nultog elementa. Ime niza je konstanta pokazivakog tipa koja se ne moe menjati.
Opisom stringa pomodu pokazivaa takoe se u statikoj memoriji kreira niz ali i rezervie memorijski prostor za pokazivaku promenljivu koja pokazuje na poetak stringa. Njena vrednost se moe menjati na primer sa ++ pok da bi se definisao pokaziva na slededi znak stringa.
-
4/3/2013
61
Pokazivai na stringove
Primer funkcije kojom se na osnovu parametara koji je
POKAZIVA NA STRING
ispituje da li je dati string palindrom
Funkcija palindrom
int palindrom (char * strpok)
{
char *strpok1 = strpok;
while (*strpok1)
++strpok;
--strpok1; /* povratak unazad za jedan znak */
while (strpok
-
4/3/2013
62
Testiranje funkcije palindrom
main()
{
if (palindrom(ANAVOLIMILOVANA))
printf(string 1 je palindrom\n);
if (palindrom(ASTERIX))
printf(string 2 je palindrom\n);
}
Example No 25
char veliko (char c)
{
if (c=a)
return (A+c-a);
else return (c)
}
-
4/3/2013
63
Nizovi pokazivaa na stringova
Koristedi niz stringova Stringu se moe pristupiti preko indexa. Deklaracijom:
static char *jezici [4] = ,PASCAL,MODULA,C++, ADA-;
Definisan je niz pokazivaa jezici na stringove
Nulti pokaziva jezici [0] pokazuje na nulti string, prvi pokaziva jezici [1] pokazuje na prvi string , tako da vai :
*jezici *0+=P, *jezici *1+=M, *jezici *2+=C, *jezici *3+=A
jezici [0] PASCAL
MODULA
C++
ADA
jezici [1]
jezici [2]
jezici [3]
NIZOVI POKAZIVAA
#include
main()
{
static char *dani[] = {"Nedelja", "Ponedeljak",
"Utorak", "Sreda", "Cetvrtak", "Petak", "Subota"};
int i;
for( i = 0; i < 6; ++i );
printf( "%s\n", dani[i]);
}
1004 1036 Dan[0]
1008 1044 Dan[1]
....
1032 1077 Dan[6]
1036 N
1037 e
1038 d
1039 l
1040 j
1041 a
1042 k
1043 \0
1044 P
1045 o
..... ..
1052 \0
1053 U
.... ..
1081 t
1082 a
1083 \0
.....
Adr. Vred. Naziv
Rezultat
Nedelja
Ponedeljak
Subota
\0
0
1
\0
-
4/3/2013
64
Nizovi pokazivaa
Ime niza je dani. Veliina niza nije specificirana. Prevodilac, onaj bistrooki, de izraunati veliinu niza.
Svaki element niza je pokaziva na znak. Zbog prisustva konstantnih znakovnih nizova u inicijalizatorskoj listi nizovi se smetaju negde u memoriji, a njihove adrese u NIZ DANI. U elementu 0 nalazi se adresa konstantnog znakovnog niza Nedelja a, u elementu 1 adresa niza Ponedeljak....
Strukture
Struktura predstavlja skup podataka kojim se opisuju svojstva objekta ili, strukture predstavljaju sloene objekte koji se sastoje od komponenti raznih tipova
Komponente koje obrazuju strukturu nazivaju se elementi strukture
Opis strukture: struct oznaka_str
{
Tip ime _elementa1
Tip ime _elementa2
};
-
4/3/2013
65
Deklaracija strukturnih promenljivih
Ako definiemo model strukture oznaene sa linost ispred funkcije main () #define MAXIME 31
#define MAXADRESA 41
struct licnost
{
char ime [MAXIME];
char adresa [MAXADRESA];
unsigned starost;
};
Tada u funkciji moemo opisati strukturne promenljive koridenjem oznake strukture
struct licnost osoba 1, osoba2;
Strukture koje sadre pokazivae
Dva niza znakova u ovoj strukturi zauzimaju prostor fiksne veliine . Poto su lanovi strukture ime i adresa nizovi oni zauzimaju podjednako veliki memorijski prostor bez obzira ta je u njih upisano.
Efikasniji nain organizovanja podataka je koridenje POKAZIVAA kao lanova strukture i njihovo usmeravanje na efikasnije i ekonominije smetanje znakovnih nizova.
-
4/3/2013
66
Strukture koje sadre pokazivae
Nova deklaracija ablona strukture
struct licnost
{
char *ime;
char *adresa ;
unsigned starost;
};
Dva niza znakova zamenjena su pokazivaima na znak pri emu svaki zauzima onoliko mesta koliko je potrebno za pokaziva
Deklaracija strukturnih promenljivih
Pri opisu strukturnog modela dozvoljeno je da se definiu i promenljive, tako da je:
struct licnost osoba 1, osoba2;
skradeni zapis struct licnost { char ime [MAXIME]; char adresa [MAADRESA]; unsigned starost; }osoba1, osoba2;
-
4/3/2013
67
Inicijalizacija i dodela vrednosti strukturnim promenljivim
Elementima strukturne promenljive mogud je direktan pristup ( bez nabrajanja elemenata koji mu prethode.
Pristup elementima ime, adresa, starost promenljive osoba1 moe se ostvariti pomodu sloenih imena
osoba1. ime
osoba1.adresa
osoba1.starost
Inicijalizacija i dodela vrednosti strukturnim promenljivim
Elementima strukture mogu se uitavati vrednosti koridenjem funkcija gets() i scanf()
gets(osoba1.ime);
gets(osoba1.adresa);
scanf(%d,&osoba1.starost);
-
4/3/2013
68
Inicijalizacija i dodela vrednosti strukturnim promenljivim
Za uitavanje stringova jednostavnije je koristiti funkciju gets() od scanf().
Funkcija gets() prihvata znake sa tastature dok ne naie na
znak za novu lininju (\n) koji se proizvodi pritiskom na taster ENTER. Funkcija predaje uitane znake pozivajudoj funkciji ignoriudi znak za novu liniju i dodajudi zavrni ili nulti znak (\0)
Funkcija scanf() omogudava uitavanje meovitih podataka u standardnoj formi. o poinje znakom koji nije praznina, o ako je specifikacija %s uitava se do prvog praznog znaka, ali ignoriudi ga
Strukturne promenljive i pokazivai
Ako je definisana pokazivaka promenljive osoba: struct linost*osoba;
Elementima strukture na koju ova promenljiva pokazuje moe se pristupiti koridenjem operatora taka (*osoba).ime (*osoba).adresa (*osoba).starost
Radi jednostavnijeg pristupa elementima strukturne promenljive na koju pokazuje pokazivaka promenljiva uveden je operator strelica u desno (->) osoba->ime osoba->adresa osoba->starost
-
4/3/2013
69
Example No .
Napisati program kojim se uitavaju podaci za dve osobe i ispisuju podaci o starijoj
#include
#define MAXIME 31
#define MAXADRESA 41
struct licnost
{
char ime[MAXIME];
char adresa[MAXADRESA];
unsigned starost;
};
Example No .
void citaj(struct licnost * osoba)
{
printf(Unesite ime osobe:);
gets(osoba->ime);
printf(Unesite adresu osobe:);
gets(osoba->sdresa);
printf(Unesite starost osobe:);
scanf(%u,&osoba->starost);
while(getchar()!=\n);
/*ocistiti ulazni string iz scanf jer je nova linijaseparator */
}
-
4/3/2013
70
Example No .
main() { struct licnost osoba 1,osoba2,*stariji; printf(Unesi poidatke za prvu osobu:\n); citaj(&osoba 1); printf(Unesi podatkke za drugu osobu:\n); citaj(&osoba2); if (osoba1.starost>osoba2.starost) stariji=&osoba1; else stariji=&osoba2; printf(Stariji je:); printf(%s,%s,star:%ug.\n,stariji->adresa,stariji->starost); }
Nizovi struktura
Niz struktura se opisuje kao i svaki drugi niz deklaracijom
struct licnost osoba[MAXOS]
Ovom deklaracijom opisuje se struktura od MAXOS elemenata. Svaki element predstavlja strukturu tipa linost.
Ako deklariemo pokaziva na strukturu licnost
struct licnost osoba[MAXOS], *pok_lic;
Otada su inicijalizacije pokazivake promenljive
pok_lic=osoba;
pok_lic=&osoba [0]; ekvivalentne
Poto pok_lic pokazuje na osoba [0], to pok_lic +1 pokazuje na osoba [1].
osoba [0].starost == (*pok_lic) starost== pok_lic-> starost
-
4/3/2013
71
Example No .
Napisati program kojim se itaju broj fudbalskih ekipa, za svaku ekipu: naziv, broj osvojenih bodova i gol razlika , a zatim ispisuje tabela sa gol razlikom.
# define MAXIME 30
#define MAXEKIPA 20
struct tabela
{
char ime [maxekipa];
unsigned bodovi;
int razlika;
};
main() { int n; struct tabela ekipa[MAXEKIPA]; void citaj(); void pisi(); void sort(); printf(''\n Unesi broj ekipa:''); scanf(''%d'',&n); printf(''\n Unesi ime,bodove I gol-razliku svake ekipe:\n''); citaj(ekipa,n); sort(ekipa,n); printf(''Niz posle sortiranja je :\n''); pisi(ekipa,n); }
-
4/3/2013
72
void citaj(struct tabela x[],int n) { int i; for(i=0;
-
4/3/2013
73
void razmeni(struct tabela *a, struct tabela *b)
{
struct tabela pom;
pom=*a;*a=b;*b=pom;
}
void sort (struct tabela a[],int n) { int I,j; for(i=0;i
-
4/3/2013
74
DINAMIKO DODELJIVANJE MEMORIJE
U programskom jeziku C mogude je izvriti dinamiku dodelu memorijskog prostora, tako da se u toku izvrenja programa koristi samo potreban memorijski prostor. Statika dodela je neracionalna. Dinamikim zauzimanjem memorijskog prostora, koje se obavlja tokom izvrenja programa, postie se racionalno koridenje memorije. U toku programa mogude je dodeljivanje i otkazivanje "rezervacije" memorijskog prostora.
DINAMIKO DODELJIVANJE MEMORIJE
Za razliku od statike dodele memorije gde se podacima pristupa preko imena promenljivih, dinamiki pristup podacima vri se uglavnom preko pokazivaa. Sama dodela memorije obavlja se uz pomod bibliotenih funkcija koje se nalaze u kao to su:
malloc(n) - funkcija dodeljuje memoriju od n bajtova;
calloc(x,n) - dodeljuje memorijski prostor za x komponenti niza od n bajtova.
free(p) - oslobaa prostor.
-
4/3/2013
75
malloc
char *malloc( unssigned n)
gde n predstavlja broj bajtova koje izdvaja funkcija.
Vreednost funkcije je znakovni pokaziva na prvi bajt izdvojene oblasti.
Slededi operatori funkcijom malloc izdvajaju 200 bajta
int *pint
pint = (int*) malloc(200)
sizeof
sizeof (izraz) - Vrada memorijski prostor neophodan za uvanje izraza
sizeof (T) - Vrada memorijski prostor neophodan za uvanje vrednosti tipa T
-
4/3/2013
76
Statika dodela memorije
Prilikom definicije niza od n lanova u pokazivau niz poinje sa adresom u memoriji prvog elementa niza.
int *niz;
niz=calloc(n,sizeof(int));
Na ovaj nain dodeljivanja memorijskog prostora unapred je definisan broj lanova niza n, tj veliina memorije na poetku izvrenja program. Ovako se rezervie n puta 2 (4) bajta jer je sizeof(int) 2 ili 4 u zavisnosti od raunara.
Dinamika dodela memorije
Kada je potrebno rezervisati prostor za pokaziva p sa jo nedefinisanim sadrzajem treba napisati sledede: p=(int*)malloc(sizeof(int);
-
4/3/2013
77
Dinamika dodela memorije
Rezervisanom prostoru se moe pristupiti samo preko pokazivaa p naredbom:
*p=5;
na adresi 1253 dolazi vrednost 5.
Dinamika dodela memorije
Funkcija free oslobaa prostor u memoriji koji je prethodno rezervisan preko funkce malloc, a ija se adresa nalazila u pokazivau p.
free(p)
Vrednost koja se nalazi na toj adresi na koju je upudivao pokaziva p ostaje, ali joj se vie ne moe pristupiti
-
4/3/2013
78
Dinamika dodela memorije
Vrednost koja se nalazi na toj adresi na koju je upudivao pokaziva p ostaje, ali joj se vie ne moe pristupiti
Example N
#include /* Neophodno je ukljuciti stdlib.h */ #include main() { int n; /* Deklaracija int a[n]; nije dozvoljena, jer kompajler ne moze u vreme prevodjenja da odredi potrebnu kolicinu memorije. Umesto ovoga, vri se dinamika alokacijai memorije tj. rezervacija memorije u fazi izvrsavanja rograma kada bude poznata vrednost broja n. Zbog toga je potrebno upamtiti samo adresu pocetka alociranog bloka sto se postize koriscenjem sledeceg pokazivaca: */
-
4/3/2013
79
Example N
int* a;
int i, max;
printf("Unesi dimenziju niza : ");
scanf("%d", &n);
/* U ovom treunutku se zna koliko je memorije potrebno i poziva se funkcija malloc za dinamicku alokaciju. */
Example N
a = (int*) malloc(n*sizeof(int));
/* U slucaju da nema dovoljno memorije malloc vraca NULL */
if (a == NULL)
{
printf("Greska : Nema dovoljno memorije!\n");
return 1;
}
-
4/3/2013
80
/* Kao obican niz */ for (i = 0; i
-
4/3/2013
81
heap
memory manager
user code
Potreban je memorijski blok veliine n malloc(n) ili calloc(x,n)
DINAMIKA ALOKACIJA MEMORIJE
Ovde je pokaziva bloka Nije vie potreban memorijski blok
free(p)
Rezervacija i oslobadjanje
malloc(n) - funkcija dodeljuje memoriju od n bajtova; calloc(x,n) - dodeljuje memorijski prostor za x komponenti niza od n bajtova. free(p) - oslobaa prostor.
*/#include /* Neophodno je ukljuciti stdlib.h */ #include int main(){ int n; int* a; int i, max; printf("Unesi dimenziju niza : "); scanf("%d", &n); a = (int*) malloc(n*sizeof(int)); /* U slucaju da nema dovoljno memorije malloc vraca NULL */ if (a == NULL) { printf("Greska : Nema dovoljno memorije!\n"); return 1; } /* Nadalje a koristimo kao obican niz */
for (i = 0; i
-
4/3/2013
82
POKAZIVAI NA MATRICE
U memoriji su smetene u jednodimenzionalni niz tako to se prvo smeta prvi red matrice a zatim redom i ostali stoga pokaziva ukazuju na niz pokazivaa koji ukazuju na niz(red) podataka.
Matrica je po definiciji
dvodimenzionalni niz.
Matrica predstavlja niz
jednodimenzionalnih
nizova.
int i, j, n; /*i, j indeksi matrice; n veliina*/
double **a;
a = (double **) calloc(n, sizeof(double *));
for (i = 0; i < n; ++i)
a[i] = (double *) calloc(n, sizeof(double));
DINAMIKA ALOKACIJA MATRICE
a[n-1] 0 1 2 3 ... n-1
.... ....
a[1] 0 1 2 3 ... n-1
a a[0] 0 1 2 3 ... n-1
Alociranje memorije za redove matrice
(n elementa-double)
Alociranje memorije za n elemenata double pokazivaa
-
4/3/2013
83
FORMIRANJE I BRISANJE MARTICE
I polu dinamiko II dinamiko #include #include main () { int *a[5]; /* Niz pokazivaca na int. */ int m, n, i, j; /* Broj vrsta i kolona: */ printf ("m,n? "); scanf ("%d%d", &m, &n); /* Stvaranje matrice: */ for (i=0; i
-
4/3/2013
84
Jednostruko povezane liste
Jednostruko povezana lista je skup vorova povezanih pokazivaima u jednom smeru.
Svaki vor je strukturna promenljiva koja ima najmanje dva elementa:
jedan za uvanje informacija, i
drugi koji se koristi za uvanje pokazivaa na slededi vor liste
Deklaracija jednostruko povezane liste vezane liste
typedef char TIP
typedef struct cvor_st
{
TIP inf;
struct cvor_st *sledeci ;
} LCVOR;
LCVOR *pocetak_liste;
Na poetak liste pokazuje pokazivaka promenljiva pocetak_liste. Krajnji vor liste u elementu za vezu (sledeci) sadri vrednost NULL.
-
4/3/2013
85
Kreiranje vora
Da bi se kreirao prvi dinamiki objekat ( vor liste ) mora mu se dodeliti neophodan memorijski prostor.
novi = (LCVOR*)malloc(sizeof (LCVOR));
Gde je novi pokazivac na LCVOR
Dinamikom objektu (voru liste ) mogu se dodeliti vrednosti
novi->inf = A;
novi->sledeci = pocetak_liste ;
Da bi se promenljiva pocetak_liste pokazivala na poetak treba joj dodeliti vrednost promenljive novi
pocetak_liste = novi
Novi vor liste
novi = (LCVOR*)malloc(sizeof (LCVOR));
Gde je novi pokazivac na LCVOR
Dinamikom objektu (voru liste ) mogu se dodeliti vrednosti
novi->inf = B;
novi->sledeci = pocetak_liste ;
Da bi promenljiva pocetak_liste zaista pokazivala na poetak ponavlja se dodela
pocetak_liste = novi
-
4/3/2013
86
Dvostruko povezane liste
Dvostruko povezane liste se prepoznaju po paru lanova pokazivaa na vor kojima se vorovi mogu povezati u oba smera.
Deklaracija tipa DCVOR formira novo ime za tip strukture dcvor_st. Pokazivaci unapred ( sledeci) i unazad ( prethodni) pokazuju na tip DCVOR
Deklaracija vora dvostruko povezane liste
typedef struct dcvor_st
{
TIP inf;
struct dcvor_st *sledeci, *prethodni ;
} DCVOR;
LCVOR *pocetak_liste*pocetak, *tekuci;
-
4/3/2013
87
Rezime
Algoritmi, struktura podataka, kontrola toka programa, funkcije i pokazivai predstavljaju sr programiranja. Programerska vetina podrazumeva poznavanje ovih pojmova i daje solidnu osnovu za osedaj trenutka kada i kako ih treba primeniti.
Osobine jezika C++
Tradicionalni nain programiranja je u osnovi proceduralan, zasnovan na funkcionalnoj dekompoziciji korisnikog, a zatim i programskog zahteva.
Pri tome, podaci (atributi) koji se obrauju i operacije nad njima nisu grupisani zajedno u objektima kao to je to sluaj kod OBJEKTNO ORJENTISANOG PROGRAMIRANJA, ved su razbacani po programu.
-
4/3/2013
88
Osobine jezika C++
Osnovna ideja objektno orjentisanog programiranja je da sve te podatke (atribute ) izvuemo iz navedenih struktura i grupiemo po klasama zajedno sa relevantnim operacijama (funkcijama). Klase zatim struktuiramo hijerarhijski, formirajudi hijerarhijsko stablo klasa, vodedi rauna da atributi i operacije koji su zajedniki za sve klase budu na viim hijerarhijama, kako bi ih nie hijerarhije mogle koristiti preko mehanizma nasleivanja
Osobine jezika C++
Time se izbegava redundansa podataka i operacija. Tako uaurenim podacima i operacijama definiemo interface prema korisniku tih klasa a takoe i interface izmeu pojedinih klasa u hijerarhiji klasa, sakrivajudi kao implementacione detalje sve ono to nije bitno za njihovo koridenje. Na taj naiin stvaramo softverske komponente ( softverske ipove ) koje moemo nasleivati novim klasama i na taj nain iste ugraujemo u nove softverske proizvode.
-
4/3/2013
89
Objektno Orijentisano Programiranje osnovni koncept
apstrakcija (abstraction)
nasleivanje (inheritance)
polimorfizam (polymorphism)
Klase su :
Prototipski mehanizam za stvaranje objekta, omogudavajudi njihovu klasifikaciju po grupama sa istim osobinama
Model za sve objekte koji se grade, Agregacija podataka (atributa) obino razliitog tipa i
operacija, realizovanim funkcijama, nazvanim metodama koje obrauju te atribute
Kolekcija vie objekata koji imaju istu strukturu Prototipski mehanizam stvaranja objekata,
omogudavajudi njihovu klasifikaciju po grupama sa slinim osobinama
Korisniki izveden tip podataka,
-
4/3/2013
90
Objekti su:
Nezavisne programske celine koje sadre metode (funkcije) i podatke
Razliita pojavljivanja iste klase
Promenljive koje se kreiraju iz struktura tipa klase
Individualna realizacija klasa
Klasi su pridodata svojstva:
Enkapsulacije (sakrivanje, uaurenje) podataka (atributa i operacija nad njima)
Metode (operacije nad atributima klase)
Nasleivanje ( osobina da klase sa niih hijerarhijskih nivoa mogu naslediti atribute i metode klasa sa viih hijerarhijskh nivoa
-
4/3/2013
91
Enkapsulacija, sakrivanje ili uaurenje podataka
Klasa omogudava zatvaranje i sakrivanje podataka (atributa i metoda ) unutar klase.
C++ omogudava tri nivoa zatite podataka.
Public
Private
Protected
Public:
Kada je mogud m pristup svim lanicama objekta klase iz:
bilo koje lanice te iste klase,ili bilo koje druge klase, ili bilo koje predefinisane funkcije (definisane u heder
datotekama), ili bilo koje nae (sopstvene )funkcije, ili bilo kog izraza u glavnom programu ili izvan njega pod uslovom da je taj objekat u svom opsegu
vaenja (scope)
-
4/3/2013
92
Private:
pristup podacima klase je dozvoljen samo lanicama klase tj metodama koje pripadaju toj klasi .
Izuzetno, prisatup je dozvoljen specijalnim metodama ispred ijeg naziva se stavlja re FRIEND
Protected:
kada je mogud pristup svim podacima objekta bazne klase od strane bilo koje lanice izvedene klase ( klase koja nasleuje baznu klasu)
-
4/3/2013
93
Metode
Funkcije koje su uaurene sa podacima (atributima) unutar jedne klase nazivaju se metode. Iste su obino public, ali mogu biti i private i protected. Dve specijalne metode koje slue za inicijalizaciju i unitavanje objekata su:
konstruktor i destruktor.
Konstruktor
Objekti mogu imati jednu ili vie specijalnih metoda koje se nazivaju konstruktorima, i koje se koriste za inicijalizaciju objekata prilikom njihovog deklarisanja kao pojavljivanja neke klase. Ime konstruktora nosi ime svoje klase.
-
4/3/2013
94
Primer.......
class AutomatNovca // Definisanje klase { double trezor; .................. // clan klase (podatak
atribut) public : //Kontrola pristupa
podacima automatNovca (double p) {trezor=p;} // Kada se neka
metoda implementira u okviru same klase za istu se kaze da je inline Ista se tada ponasa kao makro.
Void ulaganje (double); // clan klase (metoda) Double podizanje (double); // clan klase (metoda) };
Destruktor
Specijalna metoda destruktor koristi se za brisanje ( unitavanje ) objekata. Nosi ime svoje klase sa znakom ~ ispred imena.
Destruktor se automatski poziva uvek kada objekat napusta svoj opseg scope vazenja
-
4/3/2013
95
Ilustracija...
class AutomatNovca // Definisanje klase { double trezor; .................. // clan klase (podatak atribut) public : //Kontrola pristupa podacima AutomatNovca (double p) {trezor=p;} // Kada se neka metoda
implementira u okviru same klase za istu se kaze da je inline Ista se tada ponasa kao makro.
~AutomatNovca(void ) {cout'' destruktor se obavezno koristi kod dinamickih
-
4/3/2013
96
Nasleivanje
Nasleivanje se moe koristiti i viestruko po dubini
Nasleivanje je kljuni deo objektno orjentisanog programiranja i omogudava dve vane prednosti kod programiranja:
Visok stepen ponovnog koridenja istog koda reuseability
Polimorfizam, koridenje istog naziva za funkcije koje rade sline stvari.