01. Uvod u Programski Jezik C

Post on 24-Jul-2015

176 Views

Category:

Documents

11 Downloads

Preview:

Click to see full reader

DESCRIPTION

Uvod u programski jezik c++

Transcript

Goran Banjac

1. Uvod u programski jezik C++

10/28/2010

“C++ is a general-purpose programming language with a bias towards systems programming that: is a better C, supports data abstraction, supports object-oriented programming, and supports generic programming. ”(Bjarne Stroustrup, autor programskog jezika C++)

C++ nije “čisti” objektno-orijentisani programski jezik (OOPL) koji bi korisnika naterao da ga koristi na OO način

Veliki deo jezika C++ je nasleđen iz jezika C, pa C++ predstavlja (uz minimalne izuzetke) nadskup jezika C

Programski jezici 1 2

MinGW kompajliranje:

▪ g++ -c compile-options file.cpp

linkovanje:▪ g++ -o prog link-options file1.o file2.o ... other-libraries

izvršavanje: ▪ prog arguments

Programski jezici 1 3

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

cout << "Hello, world!" << endl;

return 0;

}

Linije koje započinju “hash” znakom (#) su pretprocesorske direktive

Nisu iskazi nego indikatori za pretprocesor Obrađuju se pre prevođenja programa Pretprocesorske direktive su: #if, #ifdef, #ifndef, #else, #elif, #endif #include

#define

#undef

#line

#error

#pragma

NULL direktiva Predefinisani macro-i

Programski jezici 1 4

Kada pretprocesor naiđe na #include direktivu zamenjuje je sadržajem datoteke koja se navodi kao parametar

Dva načina navođenja parametra: #include <nazivdatoteke>

#include “nazivdatoteke”

Razlikuju se po direktorijumima u kojima će kompajler tražiti datoteku

Primeri: #include <iostream>

#include <cmath>

Programski jezici 1 5

Za definisanje pretprocesorskih macro-a koristi se: #define ime zamena

Primeri: #define PI 3.14159

#define MAX(a,b) ((a)>(b)?(a):(b))

#define REV(T,A,B) { T tmp = A; A = B; B = tmp; }

Programski jezici 1 6

Programski jezici 1 7

#include <iostream>

#define PI 3.14159

#define MAX(a,b) ((a)>(b)?(a):(b))

#define REV(T,A,B) { T abc = A; A = B; B = abc; }

using namespace std;

int main(int argc, char **argv)

{

int a = 10, b = 20;

cout << PI << " " << MAX(a, b) << endl;

REV(int,a,b)

cout << a << " " << b << endl;

cout << MAX(++a, ++b) << endl;

return 0;

}

Namespace omoguća grupisanje entiteta (kao što su, na primer, klase, objekti i funkcije) pod nekim imenom

Na ovaj način, globalni opseg može biti podeljen na podopsege

Definisanje: namespace ime

{

entiteti

}

Za pristup elementima nekog namespace-a koristi se operator ::

Programski jezici 1 8

Svi entiteti u C++ standardnoj biblioteci su deklarisani u okviru std namespace-a

Programski jezici 1 9

#include <iostream>

namespace myNamespace

{

int x = 11;

double y = 12.25;

}

int main(int argc, char **argv)

{

std::cout << myNamespace::x << " " << myNamespace::y << std::endl;

return 0;

}

Ključna reč using se koristi da se uvede ime iz nekog namespace-a u trenutni deklarativni region

Programski jezici 1 10

#include <iostream>

using namespace std;

namespace firstNamespace

{

int x = 11, y = 12;

}

namespace secondNamespace

{

int x = 21, y = 22;

}

int main(int argc, char **argv)

{

using firstNamespace::x;

using secondNamespace::y;

cout << x << " " << y;

return 0;

}

Programski jezici 1 11

C++ Library Headers

<algorithm> <iomanip> <list> <ostream> <streambuf>

<bitset> <ios> <locale> <queue> <string>

<complex> <iosfwd> <map> <set> <typeinfo>

<deque> <iostream> <memory> <sstream> <utility>

<exception> <istream> <new> <stack> <valarray>

<fstream> <iterator> <numeric> <stdexcept> <vector>

<functional> <limits>

C++ Headers for C Library Facilities

<cassert> <ciso646> <csetjmp> <cstdio> <ctime>

<cctype> <climits> <csignal> <cstdlib> <cwchar>

<cerrno> <clocale> <cstdarg> <cstring> <cwctype>

<cfloat> <cmath> <cstddef>

C++ standardna biblioteka uključuje header datoteku <iostream> gde su deklarisani standardni ulazni i izlazni objekti za rad sa tokovima (eng. stream – dugački niz bajtova)

Podrazumevani standarni izlaz programa je ekran, a objekat za rad sa izlaznim tokom koji pristupa standarndnom izlazu je cout

Standardni ulazni uređaj je obično tastatura, objekat za rad sa ulaznim tokom je cin

Programski jezici 1 12

Primeri: cout << “Hello, world!”;

cout << “Hello, ” << “world!”;

cout << “Hello, ”;

cout << “world!”;

cout << 350;

cout << hello;

cout << “Hello, world!\n”;

cout << “Hello, world!” << endl;

int a;

cin >> a;

int a, b;

cin >> a >> b;

Programski jezici 1 13

Programski jezici 1 14

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

int a;

cout << "Hello, world!\n";

cout << "Hello" << "," << " " << "world" << "!" << "\n";

cout << "Hello" << "," << " " << "world" << "!" << endl;

cout << "Hello";

cout << ",";

cout << " ";

cout << "world";

cout << "!";

cout << endl;

cin >> a;

cout << "Echo: " << a;

return 0;

}

Formiraju se od slova, cifara i znaka “_” (eng. underscore) ne mogu započinjati cifrom case-sensitive ključne reči (npr. new, int) se ne mogu koristiti kao identifikatori

Preporučuje se da se kod izbora naziva identifikatora vodi računa o tome šta taj identifikator označava, pa da mu se u skladu s tim da odgovarajući naziv

Primeri validnih identifikatora: value

_abc

abC

ABC

var10

hello_world

Primeri nevalidnih identifikatora: 10var

else

int

new

ab.c

Programski jezici 1 15

Opseg vidljivosti identifikatora je blok u kojem je deklarisan, kao i u svim ugnježdenim podblokovima, osim ako u njima nije maskiran drugim identifikatorom istog imena

U istom bloku ne može se više puta deklarisati isti identifikator

Programski jezici 1 16

Promenljiva je simboličko ime za neku memorijsku lokaciju

Svaka promenljiva ima naziv, tip i vrednost Svaka promenljiva mora biti deklarisana pre nego što bude

upotrebljenja Deklaracijom se specificira njen tip i naziv Promenjiva može biti inicijalizovana prilikom deklaracije Tip promenljive se ne može menjati tokom izvršavanja

programa (može da se menja samo vrednost) Primeri: int a, b = 10, c;

double pi = 3.14;

char neg = „-‟, s;

Programski jezici 1 17

Konstante odgovarajućeg tipa se mogu definisati korištenjem const prefiksa

Definisanoj konstanti nije moguće promeniti vrednost

Primer: const double PI = 3.14;

Programski jezici 1 18

U C++ postoje dve vrste komentara:

jednolinijski – započinje sa dve kose crte i završava krajem linije

višelinijski – započinje parom simbola /* izavršava sa parom simbola */

Primeri: // ovo je jednolinijski komentar

/* Ovo je

viselinijski

komentar */

Programski jezici 1 19

Ugrađeni tipovi podataka u C++ se dele na: logičke (bool) znakovne (npr. char) celobrojne (npr. int) realne (npr. double)

Postoji i: tip koji se koristi da označi nedostatak informacija (void)

Dodatno, korisnik može definisati: prebrojive tipove podataka za predstavljanje specifičnog skupa

vrednosti (enum) Iz navedenih tipova moguće je konstruisati druge tipove: pokazivače (npr. double*) nizove (npr. int[]) reference (npr. char&) strukture podataka i klase

Programski jezici 1 20

Logički tip podataka - bool Koristi da se iskaže rezultat logičkih operacija Može imati dve vrednosti: true i false true ima celobrojnu vrednost 1, false 0 Celobrojni podaci se mogu konvertovati u

logičke:

0 se konvertuje u false

sve osim 0 se konvertuje u true

Programski jezici 1 21

Programski jezici 1 22

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

bool t1 = true, f1 = false, t2 = 350, f2 = 0;

int a = true, b = false, c = 350;

bool rez1 = t1+f1, rez2 = f1+f2, rez3 = a+c;

int rez4 = t1+f1, rez5 = f1+f2, rez6 = a+c;

cout << t1 << " " << f1 << " " << t2 << " " << f2 << endl;

cout << a << " " << b << " " << c << endl;

cout << rez1 << " " << rez2 << " " << rez3 << endl;

cout << rez4 << " " << rez5 << " " << rez6 << endl;

return 0;

}

Znakovni tipovi podataka su: char

signed char

unsigned char

wchar_t

Varijable tipa char se koriste za smeštanje karaktera iz osnovnog skupa karaktera implementacije (npr. ASCII), a wchar_t za smeštanje karaktera iz većeg skupa karaktera (npr. Unicode)

Svaka znakovna konstanta ima celobrojnu vrednost Implementacijom je definisano da li je char označena ili neoznačena

vrednost Literali tipa char se navode pod jednostrukim navodnicima Primeri:

char a = „a‟;

char b = „0‟;

char c = „\n‟;

char d = 0x40;

Programski jezici 1 23

‘a’: 6016 + 116 = 6116 = 97 ‘B’: 4016 + 216 = 4216 = 66

Programski jezici 1 24

0 1 2 3 4 5 6 7 8 9 A B C D E F

00 NULL BELL BS HT LF VT FF CR

10 CAN ESC

20 SPC ! “ # $ % & ‘ ( ) * + , - . /

30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?

40 @ A B C D E F G H I J K L M N O

50 P Q R S T U V W X Y Z [ \ ] ^ _

60 ` a b c d e f g h i j k l m n o

70 p q r s t u v w x y z { | } ~ DEL

Name ASCII Name C++ Name

New line NL (LF) \n

Horizontal tab HT \t

Vertical tab VT \v

Backspace BS \b

Carriage return CR \r

Form feed FF \f

Alert BEL \a

Backslash \ \\

Question mark ? \?

Single quote ' \'

Double quote " \"

Octal number ooo \ooo

Hexadecimal number hh \xhh

Programski jezici 1 25

Programski jezici 1 26

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

char a = 'a';

char b = 'B';

char c = 48;

cout << a << " " << int(a) << '\n';

cout << b << " " << int(b) << '\n';

cout << c << " " << char(48) << '\n';

cout << int('\n') << '\n';

return 0;

}

Celobrojni tipovi podataka su: int

signed int

unsigned int

Veličine celobrojnih tipova podataka: short int (short) int

long int (long) long long int (long long)

Celobrojni tipovi podataka su, podrazumevano, signed Upotreba unsigned tipa umesto int tipa u cilju dobijanja jednog bit-a

više za predstavljanje pozitivnih celobrojnih podataka nije dobra ideja Takođe, upotreba unsigned tipa ne znači da neki podatak ne može biti

negativan (zbog implicitne konverzije) usigned tipovi su idelni za upotrebu kada se prostor posmatra kao niz

bit-a

Programski jezici 1 27

Literali celobrojnih tipova podataka mogu biti: decimalni (0, 78, 123) oktalni (0, 0116, 0173) – prefiks kod oktalnih literala je 0 heksadecimalni (0x0, 0x4e, 0x7B) – prefiks kod heksadecimalnih literala je

0x

Kod celobrojnih literala moguće je koristiti i sufikse za specifikaciju tipa: celobrojni literal bez sufiksa je, podrazumevano, tipa int unsigned literal se specificira korištenjem sufiksa u ili U long literal se specificira korištenjem sufiksa l ili L long long literal se specificira korištenjem sufiksa ll ili LL

Primeri: 123

123u

123l

123ul

Programski jezici 1 28

Programski jezici 1 29

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

unsigned int a = 65535u;

int b = 123, c = 0173, d = 0x7B, e = -654;

unsigned long ul = 9876543ul;

short f = a;

cout << a << endl;

cout << b << " " << c << " " << d << " " << e << endl;

cout << ul << endl;

cout << f << endl;

return 0;

}

Realni tipovi podataka služe za predstavljanje brojeva u pokretnom zarezu

Tri veličine realnih tipova podataka: float (single-precision) double (double-precision) long double (extended-precision)

Literali: podrazumevani literal za predstavljanje realnih podataka je tipa double float literal se specificira korištenjem sufiksa f ili F long double literal se specificira korištenjem sufiksa l ili L

Primeri: 1.23

.23f

1.

1.23e2

123e-2

Programski jezici 1 30

Programski jezici 1 31

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

float a = 1.23, b = 1., c = .23, d = 1.23e2f;

double e = 1.23456;

cout << a << " " << b << " " << c << " " << d << endl;

cout << e << endl;

cout << 1/2 << " " << 1/2.f << " " << 1/2. << endl;

return 0;

}

Standardom nisu definisane veličine ugrađenih tipova podataka <limits>, <climits> i <cfloat> pružaju detalje o

implementaciji ugrađenih tipova podataka Takođe, veličina nekog objekta ili nekog tipa podatka se može

dobiti korištenjem operatora sizeof Ono što je garantovano, kada su veličine ugrađenih tipova u

pitanju, je sledeće: char ima najmanje 8 bit-a shortint ima najmanje 16 bit-a long int ima najmanje 32 bit-a 1 ≡ sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long

long) sizeof(float) ≤ sizeof(double) ≤ sizeof (long double) sizeof (N) ≡ sizeof (signedN) ≡ sizeof (unsignedN)

▪ N može biti char, short int, int ili long int

Programski jezici 1 32

Primer:

Programski jezici 1 33

Tip Veličina

char 1 byte

wchar_t 2 byte-a

short int 2 byte-a

int 4 byte-a

long int 4 byte-a

long long int 8 byte-ova

bool 1 byte

float 4 byte-a

double 8 byte-ova

long double 12 byte-ova

Programski jezici 1 34

#include <iostream>

#include <limits>

using namespace std;

int main(int argc, char **argv)

{

cout << "sizeof(char) = " << sizeof(char) << endl;

cout << "char digits = " << numeric_limits<char>::digits << endl;

cout << "char is_signed = " << numeric_limits<char>::is_signed << endl;

cout << "int max = " << numeric_limits<int>::max() << endl;

cout << "int min = " << numeric_limits<int>::min() << endl;

cout << "float has_denorm = " << numeric_limits<float>::has_denorm << endl;

return 0;

}

Tip void se koristi kao:

povratni tip za funkcije koje nemaju povratne vrednosti

pokazivač na objekat nekog tipa

Ne postoje objekti void tipa

void val; //greska

Programski jezici 1 35

enum je tip koji može sadržavati skup vrednosti specificiranih od strane korisnika

Definisanje: enum ime { lista-enumeratora };

Programski jezici 1 36

#include <iostream>

using namespace std;

enum Week { Mon, Tue = 2, Wed, Thu = Tue+Wed, Fri, Sat, Sun = 10 };

int main(int argc, char **argv)

{

cout << Mon << " " << Tue << " " << Wed << " " << Thu << " ";

cout << Fri << " " << Sat << " " << Sun << endl;

return 0;

}

Pokazivač je promenljiva koja sadrži adresu nekog objekta Ako promenljiva pa sadrži adresu nekog objekta a, tada

“pa pokazuje na a” Operatori za rad sa pokazivačima: adresni operator: & (daje adresu nekog objekta u memoriji) operator indirekcije: * (omogućava indirektan pristup

promenljivoj koristeći pokazivač na tu promenljivu) Deklaracija pokazivača: T *ime;

Pošto niti jedan objekat ne može biti alociran sa adresom 0, 0 se ponaša kao pokazivački literal koji označava da pokazivač ne pokazuje na objekat

Programski jezici 1 37

Programski jezici 1 38

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

char c = 'a';

char *pc = &c;

char **ppc = &pc;

char c2 = *pc;

char c3 = **ppc;

cout << c << " " << c2 << " " << c3 << endl;

return 0;

}

‘a’c:

&cpc:

&pcppc:

Korištenjem operatora new moguće je dinamički alocirati potrebnu količinu memorije na heap-u

Sintaksa: new tip

new tip(args)

new tip[broj-elemenata]

Operator new vraća pokazivač na dodeljeni prostor, a tip pokazivača je tip *

Za oslobađanje dinamički zauzete memorije koristi se operator delete

Sintaksa: delete pokazivac;

delete [] pokazivac;

Programski jezici 1 39

Programski jezici 1 40

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

int *pi = 0;

char *pc = 0;

pi = new int;

*pi = 10;

pc = new char('a');

cout << *pi << " " << *pc;

delete pi;

delete pc;

return 0;

}

Referenca je alternativno ime za neki objekat Ne zauzima prostor u memoriji i ne može da se

dobije njegova adresa Mora da se inicijalizuje prilikom definisanja

(mora da upućuje na neki stvarni objekat) Sve operacije deluju na stvarne podatke, a ne na

reference Glavna primena referenci je prenos argumenata

u funkciju Primer: int a = 10;

int &ra = a;

Programski jezici 1 41

Programski jezici 1 42

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

int a = 10;

int &ra = a;

cout << a << " " << ra << endl;

ra++;

cout << a << " " << ra << endl;

int b = ra;

cout << b << endl;

b = 15;

cout << a << " " << ra << " " << b << endl;

a = 20;

cout << a << " " << ra << " " << b << endl;

return 0;

}

Aritmetički operatori: + (sabiranje), - (oduzimanje), *(množenje), / (deljenje) i % (moduo), ++ (inkrement) i --(dekrement)

Relacioni operatori: < (manje), > (veće), <= (manje ili jednako), >= (veće ili jednako), == (jednako) i != (različito)

Logički operatori: && (AND), || (OR) i ! (NOT) Bitski operatori: & (bitsko AND), | (bitsko OR), ~ (bitsko

NOT), ^ (bitsko XOR) Operatori pomeranja: << (pomeranje bita u levo), >>

(pomeranje bita u desno) Operator dodele vrednosti: = Složeni operatori dodele: +=, -=, *=, /=, %=, >>=, <<=, &=, |=, ^=

Programski jezici 1 43

Uslovni (ternarni) operator: uslov ? izraz1 : izraz2

Primer: a = (b == 0) ? 0 : 1;

Inkrement i dekrement: i++ ≡ ++i ≡ i = i + 1

i-- ≡ --i ≡ i = i – 1

Primer: i = 10;

j = (i++) + 10;

// i = 11, j = 20

i = 10;

j = (++i) + 10;

// i = 11, j = 21

Programski jezici 1 44

Prioriteti operatora i pravila asocijativnosti definišu kako će izraz biti izračunat kada se u njemu javlja više operatora

Primer izraza, bez zagrada i sa zagradama, koji se identično izračunavaju: x + y * z

x + (y * z)

Ako operatori imaju isti prioritet, onda se redosled operacija određuje na osnovu pravila asocijativnosti: x * y / z

(x * y) / z

Programski jezici 1 45

Programski jezici 1 46

Prioritet Operatori Asocijativnost

Najviši :: →

[] () {} . -> ++ --

typeid→

++ -- sizeof new delete

~ ! - + & * (type)←

.* ->* →

* / % →

+ - →

<< >> →

< <= > >= →

== != →

& →

^ →

| →

&& →

|| →

?: ←

= *= /= %= += -= >>=

<<= &= |= ^=←

Najniži , →

Programski jezici 1 47

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

short a = 0x9B, r1, r2, r3, r4, r5;

r1 = a & 0xA;

r2 = a | 0xA;

r3 = a ^ 0xA;

r4 = ~a;

r5 = -0x9B;

int b = 3, c = -8, d, e, f;

d = b << 2;

e = b >> 1;

f = c >> 2;

int p1 = 10, p2, p3;

p2 = 10 + 5/2*p1;

p3 = 10 + 5/2.*p1;

double p4 = 10 + 5/2*p1, p5 = 10 + (double)5/2*p1;

cout << r1 << " " << r2 << " " << r3 << " " << r4 << " " << r5 << endl;

cout << d << " " << e << " " << f << endl;

cout << p2 << " " << p3 << " " << p4 << " " << p5 << endl;

return 0;

}

Programski jezici 1 48

#include <iostream>

using namespace std;

int x;

int main(int argc, char **argv)

{

int a = 1;

cout << x << endl;

int x = 20;

cout << x << " " << ::x << endl;

{

int a = 2;

cout << a << " ";

a = x == 0 ? 10 : 20;

cout << a << endl;

}

cout << a << endl;

return 0;

}

Postoje 4 osnovne kategorije naredbi za kontrolu toka:

naredbe uslovnog grananja: if, if else i switch

naredbe petlji: while, do while i for

naredbe za nasilnu promenu toka: break, continue i return

naredbe za rad sa izuzecima: try catch i throw

Programski jezici 1 49

Koristi se kada se treba odlučiti da li će se neki iskaz/složeni iskaz izvršiti u zavisnosti od ispunjenosti određenog uslova

Sintaksa: if (uslov)

iskaz ili slozeni-iskaz

Primeri: if (a > 0)

cout << “Broj je pozitivan.”;

if (a > 0)

{

cout << “Broj je pozitivan.”;

}

Programski jezici 1 50

Koristi se kad je potrebno odlučiti koji će se iskaz/složeni iskaz od dva izvršiti u zavisnosti od ispunjenosti nekog uslova

Sintaksa: if (uslov)

iskaz1 ili slozeni-iskaz1

else

iskaz2 ili slozeni-iskaz2

Primer: if (a > 0)

cout << “Broj je pozitivan.”;

else

cout << “Broj nije pozitivan.”;

Programski jezici 1 51

if else naredbe je moguće ugnježdavati gde se naredna if else naredba povezuje sa prethodnom else klauzulom

Na taj način se dobija kaskada if elsenaredbi

Primer: if (a > 0)

cout << “Broj je pozitivan.”;

else if (a < 0)

cout << “Broj je negativan.”;

else

cout << “Broj je jednak 0.”;

Programski jezici 1 52

Omogućava realizaciju selektivnog višeblokovskog grananja

Sintaksa: switch (selektorski-izraz)

{

case labela1: niz-iskaza1

case labela2: niz-iskaza2

case labelan: niz-iskazan

default: niz-iskaza

}

switch izraz mora da proizvede celobrojnu vrednost Ako se želi izlaz iz naredbe kada se završi odgovarajući case, treba koristiti naredbu break (inače će propasti u sledeći case)

Programski jezici 1 53

Primer: switch (number)

{

case 1:

cout << “Jedan”;

break;

case 2:

cout << “Dva”;

break;

case 3:

cout << “Tri”;

break;

default:

cout << “Nepoznat broj”;

}

Programski jezici 1 54

Sintaksa: while (uslov-izvrsavanja-petlje)

telo-petlje

Uslov izvršavanja while petlje izvršava se pre izvršavanja tela petlje

Ukoliko je uslov izvršavanja petlje nije istinit pri prvom testiranju, telo petlje se neće izvršiti niti jednom

Programski jezici 1 55

Primer: int i = 1, suma = 0;

while (i < 100)

{

suma += i;

i++;

}

Programski jezici 1 56

Sintaksa: do

telo-petlje

while (uslov-izvrsavanja-petlje);

Uslov izvršavanja petlje se izračunava nakon izvršavanja tela petlje

Telo do while petlje se uvek izvršava bar jedanput, tj. telo do while petlje se može izvršiti jednom ili više puta

Programski jezici 1 57

Primer: int i = 1, suma = 0;

do

{

suma += i;

i++;

}

while (i < 100);

Programski jezici 1 58

Sintaksa: for (inicijalizacija; uslov-izvrsavanja-petlje; izraz-

za-inkrementiranje)

telo-petlje

for petlja se sastoji iz zaglavlja i tela petlje Zaglavlje for petlje čine tri sekcije: sekcija za inicijalizaciju

sekcija za testiranje uslova izvršavanja petlje

sekcija u kojoj se nalazi izraz za inkrementiranje Inicijalizacija podrazumeva deklaraciju i inicijalizaiciju

promenljive koja kontroliše telo petlje i izvršava se samo jednom (prilikom ulaska u petlju)

Programski jezici 1 59

Ako je uslov izvršavanja petlje istinit izvršava se telo petlje U suprotnom, telo petlje se ne izvršava Nakon svake iteracije izvršava se izraz za inkrementiranje Nakon toga proverava se uslov izvršavanja petlje Opseg vidljivosti promenljivih koje su deklarisane za

vreme inicijalizacije for petlje je određen blokom forpetlje, tako da ove promenljive nisu dostupne nakon završetka for petlje

Za vreme inicijalizacije moguće je deklarisati više promenljivih, odvojenih zarezom

Sve sekcije u for petlji su opcione Izostavljanje sekcije za proveru uslova izvršavanja petlje

označava da je uslov uvek istinit

Programski jezici 1 60

Primeri: int suma = 0;

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

{

suma += i;

}

for (int i = 0, j = 1; i < 10 && j != 15;

i++, j *= 2)

cout << i + j << “ ”;

for ( ; ; )

;

Programski jezici 1 61

break naredba: prekida naredbu petlje i prelazi na prvi iskaz iza naredbe

petlje

prekida naredbu switch i prelazi na prvi iskaz iza naredbe switch

continue naredba: prekida naredbu petlje i otpočinje sledeću iteraciju petlje

return naredba: izlazak iz funkcije

▪ prekida izvršavanje funkcije (svi iskazi iza return se ignorišu)

▪ prekid programa (iz funkcije main)

omogućava da funkcija vrati neku vrednost

Programski jezici 1 62

Programski jezici 1 63

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

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

{

if (i == 75)

break;

if (i % 10 == 0)

continue;

cout << i << " ";

};

return 0;

}

Nizovi

jednodimenzionalni

višedimenzionalni

Strukture Unije

Programski jezici 1 64

Najjednostavniji način da se napravi složeniji tip podatka (u odnosu na ugrađene tipove) jeste davanje alternativnih imena (alijasa) drugim imenima pomoću ključne reči typedef

Sintaksa: typedef postojeci-tip alijas

Primer: typedef unsigned long ulong

ulong a, b;

Programski jezici 1 65

Niz ili vektor je jednodimenzionalno polje Skup podataka istog tipa U memoriji se smešta u niz uzastopnih

memorijskih lokacija Ime niza predstavlja početnu adresu niza u

memoriji Svaki element je određen imenom niza i

indeksom (pomerajem u odnosu na početak niza) ako niz ima n elemenata prvi element niza ima indeks 0, a poslednji n-1

Programski jezici 1 66

Deklaracija niza: tip ime-niza [broj-elemenata] = { lista-vrednosti }

Primeri: int niz[5];

char text[255];

int niz1[3] = {1, 2, 3}; // 1, 2, 3

int niz2[] = {1, 2, 3}; // 1, 2, 3

int niz3[3] = {10}; // 10, 0, 0

niz3[1] = 5; // 10, 5, 0

niz3[2] = niz3[0] + niz3[1]; // 10, 5, 15

int niz[3] = {1, 2, 3, 4}; // greska

int niz[]; // greska

Programski jezici 1 67

Programski jezici 1 68

#include <iostream>

using namespace std;

const int MAX_SIZE = 10;

int main(int argc, char **argv)

{

int n, sum = 0, a[MAX_SIZE];

double avg;

do

{

cout << "Unesite broj elemenata niza: ";

cin >> n;

}

while (n < 1 || n > 10);

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

{

cout << i+1 << ". element: ";

cin >> a[i];

sum += a[i];

}

avg = double(sum)/n;

cout << endl;

cout << "Aritmeticka sredina: " << avg << endl;

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

if (a[i] > avg)

cout << a[i] << " ";

return 0;

}

Elementni niza mogu biti drugi nizovi; na taj način se dobijaju višedimenzionalni nizovi

Primeri: int mat[2][3];

int mat[2][3] = {{1, 2, 3}, {4, 5, 6}}; // mat[0][1] == 2

▪ // 1, 2, 3 | 4, 5, 6

int mat[2][3] = {{1, 2, 3}};

▪ // 1, 2, 3 | 0, 0, 0

int mat[2][3] = {1, 2, 3, 4, 5, 6};

▪ // 1, 2, 3 | 4, 5, 6

int mat[][3] = {{1, 2, 3}, {4, 5, 6}};

▪ // 1, 2, 3 | 4, 5, 6

int mat[][3] = {1, 2, 3, 4, 5, 6, 7};

▪ // 1, 2, 3 | 4, 5, 6 | 7, 0, 0

int mat[][3] = {{1, 2}, {3, 4, 5}, {6}, {7}};

▪ // 1, 2, 0 | 3, 4, 5 | 6, 0, 0 | 7, 0, 0

int mat[][3]; //greska

int mat[2][] = {{1, 2, 3}, {4, 5, 6}}; //greska

int a[3][4][5];

int a[][7][8]; //greska

int b[3][3][3][3];

Programski jezici 1 69

Programski jezici 1 70

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

int mat1[][3] = {{1}, {0, 1}, {0, 0, 1}};

int mat2[3][2] = {{1, 2}, {3, 4}, {5, 6}};

int mat3[3][2] = {0};

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

for (int j = 0; j < 2; j++)

for (int k = 0; k < 3; k++)

mat3[i][j] += mat1[i][k] * mat2[k][j];

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

{

for (int j = 0; j < 2; j++)

cout << mat3[i][j] << " ";

cout << endl;

}

return 0;

}

Ime jednodimenzionalnog niza predstavlja adresu početnog elementa niza i samo po sebi je pokazivač (statički pokazivač)

Primeri: int a[10] = {0};

int *p = a; // int *p = &a[0];

int *q = &a[4]; //

*p = 10; // a[0] = 10;

*(p+1) = 20; // a[1] = 20;

p++; // p = &a[1];

*(p-1) = 30; // a[0] = 30;

*q++ = 10; // a[4] = 10; q = &a[5];

(*q)++; // a[5]++;

*++q = 40; // a[6] = 40;

a[3] = q – p; // a[3] = 5;

int a[2][3] = {0};

int *p = &a[0][0]; //int *p = a[0];

*(p + 3*i + j) = 10; // a[i][j] = 10;

Programski jezici 1 71

Programski jezici 1 72

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

int a[10] = {0};

int *p = a;

int *q = &a[4];

*p = 10;

*(p+1) = 20;

p++;

*(p-1) = 30;

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

cout << *(p+i-1) << " ";

cout << endl;

*q++ = 10;

(*q)++;

*++q = 40;

a[3] = q - p;

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

cout << a[i] << " ";

return 0;

}

Programski jezici 1 73

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

int a[2][3] = {0};

int *p = &a[0][2];

*p = 1;

p++;

*p = 2;

*(p+1) = 3;

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

{

for (int j = 0; j < 3; j++)

cout << a[i][j] << " ";

cout << endl;

}

p = a[0];

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

{

for (int j = 0; j < 3; j++)

cout << *(p + 3*i + j) << " ";

cout << endl;

}

return 0;

}

Programski jezici 1 74

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

int n, *parray = 0;

do

{

cout << "Unesite broj elemenata niza: ";

cin >> n;

}

while (n < 1 || n > 100);

parray = new int[n];

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

{

cout << i+1 << ". element: ";

cin >> *(parray + i);

}

for (int i = n - 1; i > -1; i--)

cout << *(parray + i) << " ";

delete [] parray;

return 0;

}

String je jednodimenzionalni niz znakova koji završava null-znakom („\0‟) – znak čiji je kod 0

String literal je niz znakova koji se navodi pod dvostrukim navodnicima “Ovo je string literal”

Primeri: char c1[] = “Hello”;

char c2[] = {„H‟, „e‟, „l‟, „l‟, „o‟, „\0‟};

char c3[] = "a\xd\0127"

Programski jezici 1 75

Programski jezici 1 76

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

char str[] = "Banja Luka";

char *p = str;

int i;

for (i = 0; *(p + i); i++)

;

cout << "strlen (\"" << str << "\"): " << i;

return 0;

}

Struktura je skup heterogenih podataka koji su međusobno logički povezani

Deklaracija: struct ime-strukture

{

tip1 element1;

tip2 element2;

tipn elementn;

} lista-promenljivih;

Primer: struct point

{

double x, y;

} var1, var2, varArray[100], *pvar;

Programski jezici 1 77

Alternativni oblik deklaracije: struct ime-strukture

{

tip1 element1;

tip2 element2;

tipn elementn;

};

ime-strukture lista-promenljivih;

Primer: struct point

{

double x, y;

};

point var1, var2, varArray[100], *pvar;

Programski jezici 1 78

U slučaju da u istom bloku postoji podatak prostog tipa i stuktura sa istim imenom tada se mora koristiti ključna reč struct

Primer: struct point

{

double x, y;

};

int point = 10;

struct point a;

Programski jezici 1 79

Elementima strukture se pristupa pomoću operatora . Primer:

struct point

{

double x, y;

};

point var, varray[5];

var.x = 10.0;

var.y = 20.0;

varray[0].x = 15.5;

varray[0].y = 100;

U slučaju da imamo definisan pokazivač na strukturu, tada se elementima strukture može pristupiti pomoću operatora ->

Primer: struct point

{

double x, y;

};

point var, *pvar = &var;

pvar->x = 10.0; // (*pvar).x = 10.0;

pvar->y = 20.0; // (*pvar).y = 20.0;

Programski jezici 1 80

Element strukture može da bude neka druga struktura Primer: struct point

{

double x, y;

};

struct line

{

point a, b;

};

line l;

l.a.x = 10.0;

l.a.b = 20.0;

Programski jezici 1 81

Element strukture može da bude i pokazivač Primer: struct point

{

double *x, *y;

};

double a = 10.0, b = 20.0;

point p, *pp = &p;

p.x = &a;

pp->y = &b;

*p.x = 15.0;

*pp->y = 25.0;

Programski jezici 1 82

Programski jezici 1 83

#include <iostream>

#include <cmath>

using namespace std;

struct point

{

double x, y;

};

struct line

{

point a, b;

};

int main(int argc, char **argv)

{

point p = {3.0, 4.0};

line l;

l.a = p;

l.b.x = 0.0;

l.b.y = 0.0;

double len = sqrt((l.a.x-l.b.x)*(l.a.x-l.b.x) + (l.a.y-l.b.y)*(l.a.y-l.b.y));

cout << len;

return 0;

}

Programski jezici 1 84

#include <iostream>

using namespace std;

struct point

{

double *x, *y;

};

int main(int argc, char **argv)

{

double xx, yy;

point p, *pp = &p;

p.x = &xx;

*p.x = 10.0;

pp->y = &yy;

*pp->y = 20.0;

cout << xx << " " << yy;

return 0;

}

Kombinovanjem pokazivača na strukturu i strukture sa pokazivačem možemo da dobijemo strukturu sa pokazivačem na istu strukturu tj. imamo povezane strukture

Primer (jednostruko povezana lista): struct node

{

int data;

node *next;

};

node *head = new node;

head->data = 10;

head->next = 0;

node *second = new node;

second->data = 20;

second->next = 0;

head->next = second;

Programski jezici 1 85

10 20 0

head nextdata nextdata

Unija je skup podataka različitih tipova koji su smešteni u isti memorijski prostor

Promena jednog podataka u uniji može dovesti do promene drugog podataka u uniji

Deklaracija: union ime-unije

{

tip1 element1;

tip2 element2;

tipn elementn;

} lista-promenljivih;

Primer: union example

{

char c;

int x;

} var;

Programski jezici 1 86

Alternativni oblik deklaracije: union ime-unije

{

tip1 element1;

tip2 element2;

tipn elementn;

};

ime-unije lista-promenljivih;

Primer: union example

{

char c;

int x;

};

example var, varArray[100], *pvar;

Programski jezici 1 87

U slučaju da u istom bloku postoji podatak prostog tipa i unija sa istim imenom tada se mora koristiti ključna reč union

Primer: union example

{

char c;

int x;

};

int example= 10;

union example a;

Programski jezici 1 88

Elementima unije se pristupa preko operatora .

Primer: union example

{

char c;

int x;

};

example a;

a.x = 10;

a.c = „a‟;

Programski jezici 1 89

Uniju je moguće definisati i bez korštenja identifikatora iza ključne reči union – bezimena unija

Članovi bezimene unije ponašaju se kao “obične promenljive”

Primer: union { int x; char c; };

x = 10;

c = „a‟;

Unija za koju je definisan neki podatak nije bezimena Primer: union { int x, char c; } var;

var.x = 10;

var.c = „a‟;

Programski jezici 1 90

Programski jezici 1 91

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

union example

{

char c;

int x;

};

example ex;

ex.x = 256;

ex.c = 'a';

cout << ex.c << " " << ex.x;

return 0;

}

Funkcija se obično definiše kao potprogram koji na osnovu određenog broja argumenata daje jedan rezultat

Podatak koji vraća funkcija naziva se povratna vrednost funkcije

Tip funkcije je tip podataka koji funkcija vraća

Programski jezici 1 92

Definicija funkcije: tip ime-funkcije(tip1 arg1, tip2 arg2, … , tipn argn)

telo-funkcije

Formalni argumenti – automatske promenljive kroz koje funkcija prima podatake

Opšti oblik poziva funkcije: ime-funkcije(sarg1, sarg2, … , sargn)

Stvarni argumenti – parametri koji se šalju funkciji

Programski jezici 1 93

Deklaracija (prototip) funkcije predstavlja “opis funkcije za spoljašnji svet”

Deklaracija funkcije sadrži tip funkcije, ime funkcije, tipove (a može i imena) argumenata

Opšti oblik deklaracije: tip ime-funkcije(tip1, tip2, … , tipn);

Programski jezici 1 94

Programski jezici 1 95

#include <iostream>

using namespace std;

int circleLeftShift8(int value)

{

int res, left, right;

left = value << 8;

right = value >> 24;

res = left | right & 0xff;

return res;

}

int main(int argc, char **argv)

{

int a = 0xefffffff, r;

r = circleLeftShift8(a);

cout << r << endl;

cout << circleLeftShift8(1) << endl;

r = 10 + circleLeftShift8(a);

cout << r << endl;

return 0;

}

Programski jezici 1 96

#include <iostream>

using namespace std;

int duplicate(int);

int main(int argc, char **argv)

{

cout << duplicate(10);

return 0;

}

int duplicate(int x)

{

return 2*x;

}

Programski jezici 1 97

#include <iostream>

using namespace std;

void printHello()

{

cout << "Hello, world!" << endl;

}

int main(int argc, char **argv)

{

printHello();

return 0;

}

Prenos parametara u funkciju putem vrednosti prilikom poziva funkcija šalje se vrednost funkcija prihvata vrednost u formalne argumente po izlasku iz funkcije formalni argumenti automatski

nestaju Dakle, kod prenosa parametara u funkciju putem

vrednosti, u funkciji se kreira slika stvarnih argumenata i koriste se te slike, a ne stvarne promenljive

Nakon izlaska iz funkcije stvarne promenljive ostaju nepromenjene

Programski jezici 1 98

Programski jezici 1 99

#include <iostream>

using namespace std;

void increase(int x)

{

cout << "increase: " << x << endl;

x++;

cout << "increase: " << x << endl;

}

int main(int argc, char **argv)

{

int x = 10;

cout << "main: " << x << endl;

increase(x);

cout << "main: " << x << endl;

return 0;

}

Da bi se omogućilo da funkcija menja vrednost stvarnog argumenta, potrebno je:

1. način:

▪ formalni argument definisati kao pokazivač

▪ u telu funkcije koristiti operator indirekcije

▪ prilikom poziva funkcije proslediti adresu stvarnog argumenta

2. način:

▪ vršiti prenos parametara u funkciju putem reference

Programski jezici 1 100

Programski jezici 1 101

#include <iostream>

using namespace std;

void increase(int *x)

{

cout << "increase: " << *x << endl;

(*x)++;

cout << "increase: " << *x << endl;

}

int main(int argc, char **argv)

{

int x = 10;

cout << "main: " << x << endl;

increase(&x);

cout << "main: " << x << endl;

return 0;

}

Programski jezici 1 102

#include <iostream>

using namespace std;

void increase(int &x)

{

cout << "increase: " << x << endl;

x++;

cout << "increase: " << x << endl;

}

int main(int argc, char **argv)

{

int x = 10;

cout << "main: " << x << endl;

increase(x);

cout << "main: " << x << endl;

return 0;

}

U definiciji funkcije moguće je navesti podrazumevane vrednosti formalnih argumenata

Podrazumevane vrednosti formalnih argumenata se koriste kad u pozivu funkcije nedostaju stvarni argumenti

Ako se za neki argument navede neka podrazumevana vrednost, onda se podrazumevana vrednost mora navesti i za sve argumente iza njega

Prilikom poziva funkcije mogu se izostaviti samo poslednji argumeni (nema preskakanja)

Dozvoljeno je navođenje podrazumevanih vrednosti za sve argumente

Programski jezici 1 103

Programski jezici 1 104

#include <iostream>

using namespace std;

int add(int a, int b = 0)

{

return a+b;

}

int main(int argc, char **argv)

{

int a = 10, b = 20;

cout << add(a, b) << endl;

cout << add(a) << endl;

return 0;

}

Preklapanje imena funkcija (eng. function overloading) – moguće je definisati više funkcija istog imena ukoliko se one razlikuju po broju i/ili tipu argumenata

Dakle, prevodilac razlikuje preklopljene funkcije samo preko argumenata

Posebnu pažnju treba obratiti kod funkcija sa podrazumevanim vrednostima argumenata

Programski jezici 1 105

Programski jezici 1 106

#include <iostream>

using namespace std;

int add(int a, int b)

{

cout << "int2" << endl;

return a+b;

}

int add(int a, int b, int c)

{

cout << "int3" << endl;

return a+b+c;

}

double add(double a, double b)

{

cout << "double" << endl;

return a+b;

}

int main(int argc, char **argv)

{

cout << add(10, 20) << endl;

cout << add(10, 20, 30) << endl;

cout << add(10.5, 20.5) << endl;

return 0;

}

Programski jezici 1 107

#include <iostream>

using namespace std;

int add(int a, int b = 0)

{

cout << "int" << endl;

return a+b;

}

int add(int a, double b = 0.0)

{

cout << "double" << endl;

return a+b;

}

int main(int argc, char **argv)

{

cout << add(10, 10) << endl;

cout << add(10, 10.0) << endl;

//cout << add(10) << endl;

return 0;

}

Inline funkcije – za jednostavnije funkcije pogodnije je direktno ugrađivanje u kod, nego da se nezavisno prevode i pozivaju iz nekog koda jer se tako ubrzava rad, štede resursi

Prevodilac ne mora da uvaži inline sugestiju i u tom slučaju se funkcija ponaša kao “standardna” funkcija

Opšti oblik: inline tip ime-funkcije (tip1 arg1, … , tipn argn)

telo-funkcije

Programski jezici 1 108

Programski jezici 1 109

#include <iostream>

using namespace std;

inline int max(int a, int b)

{

return (a > b) ? a : b;

}

int main(int argc, char **argv)

{

int a = 10, b = 20;

cout << max(a, b) << endl;

cout << max(++a, ++b) << endl;

return 0;

}

Rekurzivne funkcije su funkcije koje pozivaju same sebe

Na taj način se rešavanje nekog problema svodi na rešavanje istog, ali jednostavnijeg problema i funkcija poziva samu sebe sve dok problem ne postane trivijalan

Rekurzivne funkcije su manje efikasne, ali postoje problemi koji su po prirodi jednostavni i koje je gotovo nemoguće rešiti bez rekurzije

Programski jezici 1 110

Programski jezici 1 111

#include <iostream>

using namespace std;

int factorial(int x)

{

if (x == 0)

return 1;

else

return x*factorial(x-1);

}

int main(int argc, char **argv)

{

cout << factorial(5);

return 0;

}

automatske promenljive: navode se korištenjem ključne reči auto definišu se u telu funkcija i mogu da se koriste samo u funkciji u kojoj su

definisane nastaju automatski u funkciju i automatski nestaju nakon izlaska iz funkcije podrazumeva se da je promenljiva automatska, ukoliko se drugačije ne

navede nemaju podrazumevanu vrednost

globalne promenljive: definišu se izvan svih funkcija ako se u definiciji ne navede vrednost, podrazumeva se da je vrednost

definisane promenljive 0

vidljiva je u svim funkcijama koje su definisane nakon definicije date promenljive

korištenjem ključne reči extern moguće je eksplicitno navesti korištenje neke globalne promenljive u funkciji

Programski jezici 1 112

registarske promenljive: automatske promeljive za kojima je izražena želja da se drže u

registrima procesora ne garantuje se da će promenljiva strvarno biti registarska –

zavisi od konkretnog prevodioca, procesora, ukupnog broja registarskih promenljivih

definišu se korištenjem ključne reči register statičke promenljive: definišu se korištenjem ključne reči static vrednost im se određuje pre početka izvršavanja progama ukoliko se vrednost ne navede, podrazumeva se početna

vrednost 0

postoje od početka do kraja izvršavanja programa (vrednost im ostaje sačuvana do sledećeg poziva date funkcije)

Programski jezici 1 113

Programski jezici 1 114

#include <iostream>

using namespace std;

int g;

void function()

{

auto int i = 10;

static int si = 10;

i++;

si++;

g++;

cout << i << " " << si << " " << g << endl;

}

int main(int argc, char **argv)

{

cout << g << endl;

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

function();

return 0;

}

main(int argc, char **argv)

argc – broj argumenata

argv – niz argumenata

Argumenti komandne linije su stringovi Naziv programa se prosleđuje kao prvi

argument Primer: for (int i = 0; i < argc; i++)

cout << *(argv + i);

Programski jezici 1 115

Programski jezici 1 116

#include <iostream>

using namespace std;

int main(int argc, char **argv)

{

if (argc == 3)

{

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

{

if (i == 0)

cout << "Naziv programa je: " << *argv << endl;

else

cout << i << ". argument je: " << *(argv + i) << endl;

}

}

else

{

cout << *argv << ": broj argumenata je pogresan" << endl;

cout << "Koristenje: " << *argv << " arg1 arg2";

}

return 0;

}

top related