You are on page 1of 38

PROGRAMSKI JEZICI I

I dio: Uvod u jezik C++

mr Draen Branin
Elektrotehniki fakultet Banja Luka
2012.
1.1. Uvod u C++
Malo istorije...

O programskom jeziku C
Nastao 70-ih godina prolog vijeka
1970. Ken Thompson, B
1972. Denis Ritchie, C

Zahtjevi koje je trebao da zadovolji:


Vii programski jezik sa implementiranim mogunostima mainskog jezika
(direktan pristup memoriji, vei skup operatora, ...)
prednosti: udobnost vieg programskog jezika, mo mainskog jezika
Programski jezik sa malim setom naredbi i bogatom bibliotekom funkcija
prednosti: jednostavnost programiranja i pojednostavljeni prevodioci

Standardizacija: ANSI, 1988.

2
1.1. Uvod u C++
Malo istorije...

Istorijat jezika C++


Pojava objektno-orijentisanih (OO) koncepata u programiranju
zahtijevala je nove mogunosti jezika C
1980. C sa klasama
dodate su klase jeziku C
strukture omoguavaju da podaci imaju samo vrijednosti
klase omoguavaju da se definiu i mogue operacije nad podacima
1983. C++
++ znai da se ne radi o novom jeziku nego o proirenom jeziku C
dodate virtuelne funkcije, omogueno preklapanje operatora
autor: Bjarne Stroustrup

Standardizacija:
ISO/IEC 14882:1998
ISO/IEC 14882:2003
ISO/IEC 14882:2011 (C++11)
3
1.1. Uvod u C++
Razvoj C/C++
programa?

Procedura za razvoj C/C++ programa

IZVORNI KOD
(SOURCE) OBJEKTNI KOD IZVRNI KOD

.C .OBJ .EXE
.CPP
EDITOR KOMPAJLER LINKER

4
1.1. Uvod u C++
cout ???

Standardni izlaz u jeziku C++


I u C++ jeziku moe da se koristi printf() funkcija iz <stdio.h>
C++ ima biblioteku <iostream> za rad sa U/I tokovima
tok = stream = dugaki niz bajtova
standardni tok za izlaz podataka
cout - upuiva na konzolu
u istom programu NE TREBA istovremeno koristiti printf() i cout

cout << izraz1 << izraz2 << ... << izrazN;

5
1.1. Uvod u C++
cout ???

Primjer:
#include <iostream.h> Prog. jezik C++
int main(int argc, char **argv)
{
cout << Prog. jezik C++;

return 0;
}

cout << Prog. << jezik << C++;

cout << Prog. ;


cout << jezik ;
cout << C++ ;

6
1.1. Uvod u C++
cout ???

Primjer:
#include <iostream.h> Jezik C++
int main(int argc, char **argv) _

{
cout << Jezik C++\n;

return 0;
}

cout << Jezik << C++ << \n;

cout << Jezik C++ << endl ;

manipulator za kraj linije (reda)

7
1.1. Uvod u C++
Svi entiteti u C++ standardnoj biblioteci su
namespace ??? deklarisani u okviru std namespace-a

Namespace
Namespace omoguava grupisanje razliitih entiteta (promjenljive,
funkcije, klase, objekti) pod nekim imenom.
Za pristup elementima nekog namespace-a, koristi se operator ::
#include <iostream>
11
namespace mySpace
12.25
{
int x = 11;
double y = 12.25;
}
int main(int argc, char **argv)
{
std::cout << mySpace::x << " " << std::endl;
std::cout << mySpace::y << " " << std::endl;
return 0;
}
8
1.1. Uvod u C++
Uobiajeno se koristi std namespace.
using ???

Kljuna re using se koristi da se uvede ime iz nekog namespace-a u


trenutni deklarativni region.
#include <iostream>
using namespace std;
namespace firstNamespace
{
int x = 11, y = 12; 11 22
}
namespace secondNamespace
{
int x = 21, y = 22;
}
int main(int argc, char **argv)
{
using firstNamespace::x;
using secondNamespace::y;
cout << x << " " << y << endl;
return 0;
}

9
1.1. Uvod u C++ 11 12

using ???

#include <iostream> #include <iostream>


using namespace std;
namespace firstSpace
{ namespace firstSpace
int x = 11, y = 12; {
} int x = 11, y = 12;
namespace secondSpace }
{ namespace secondSpace
int x = 21, y = 22; {
} int x = 21, y = 22;
}
int main(int argc, char **argv)
{ int main(int argc, char **argv)
using namespace firstSpace; {
using std::cout; using namespace firstSpace;
using std::endl; cout << x << " " << y << endl;
cout << x << " " << y << endl; return 0;
return 0; }
}

10
1.1. Uvod u C++
PROSTI TIPOVI ???

Prosti tipovi podataka


Standardom nisu definisane
Znakovni
veliine ugraenih tipova podataka!
char (1 bajt)
Veliina nekog objekta ili nekog
wchar_t (2 bajta) tipa podatka se moe dobiti
Cjelobrojni koritenjem operatora sizeof
short (2 bajta)
int (4 bajta) Kvalifikatori za cjelobrojne podatke
long (4 bajta) signed - oznaeni
long long (8 bajtova) ako se ne navede podrazumijeva se
Realni signed short (-32768..+32767)
float (4 bajta) unsigned - neoznaeni
double (8 bajtova) unsigned short (0..65535)

1 sizeof(char) sizeof(short) sizeof(int) sizeof(long) sizeof(long long)


sizeof (X) sizeof (signed X) sizeof (unsigned X)

11
1.1. Uvod u C++
LITERALI ???

Cjelobrojne konstante (literali)


decimalno (0, 78, 123)
oktalno (0, 0116, 0173) prefiks 0
heksadecimalno (0x0, 0x4e, 0x7B) prefiks 0x

SUFIKS za specifikaciju cjelobrojnih literala


int (podrazumijeva se) npr. 328
long l ili L npr. 328L
long long ll ili LL npr. 328LL
unsigned u ili U npr. 328U

SUFIKS za specifikaciju realnih literala


double (podrazumijeva se) npr. 3.28 123e+5
float f ili F npr. 1.23f
long double l ili L npr. 1.3L

12
1.1. Uvod u C++
LITERALI ??? 65535
123 123 123 -654
9876543
-1
#include<iostream>
1.23 1 0.23 1.23000e+10
using namespace std;
1.23456
int main(int rgc, char **argv)
0 0.5 0.5
{
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;
float aa = 1.23, bb = 1., cc = .23, dd = 1.23e10f;
double ee = 1.23456;
cout << aa << " " << bb << " " << cc << " " << dd << endl;
cout << ee << endl;
cout << 1/2 << " " << 1/2.f << " " << 1/2. << endl;
return 0;
}

13
1.1. Uvod u C++
LOGIKI PODACI ???

Logiki podaci u jeziku C


C ne raspolae logikim tipom podataka
Nisu implementirane ni logike konstante
TRUE (istina) i FALSE (la)
Bilo koji podatak moe da se posmatra kao logiki
ISTINA ... podatak <> 0
LA ... podatak = 0
Uobiajeno je da se koriste cjelobrojni podaci
Rezultati logikih operacija
rezultat=1 -> ISTINA (tano)
rezultat=0 -> LA (netano)

14
1.1. Uvod u C++
LOGIKI PODACI ???

Logiki podaci u jeziku C++


C++ ima ugraen tip bool
Implementirane su i logike konstante
TRUE (istina) ( 1 )
FALSE (la) ( 0 )
Naravno, i dalje bilo koji podatak moe da se posmatra kao logiki
ISTINA ... podatak <> 0
LA ... podatak = 0
Primjer:
#include <iostream.h>
main() 1
{ 0
bool t = TRUE, n = FALSE;
cout << t << endl << n;
}

15
1.1. Uvod u C++
LOGIKI PODACI ??? 1 0 1 0
1 0 350
1 0 1
1 0 351
Logiki podaci u jeziku C++
Primjer:
#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 = t2+c;
cout << t1 << " " << f1 << " " << t2 << " " << f2 << endl;
cout << a << " " << b << " " << c << endl;
cout << rez1 << " " << rez2 << " " << rez3 << endl;
cout << rez4 << " " << rez5 << " " << rez6 << endl;
return 0;
}

16
1.1. Uvod u C++
PROMJENLJIVE ???

Promjenljive u jeziku C++


Promjenljiva ne mora da bude definisana na poetku bloka (programa)
Moe biti definisana bilo gdje u programu (tamo gdje treba)
Doseg (domen vaenja) promjenljive je do kraja bloka u kojem je definisana
U istom bloku ne moe se vie puta definisati ista promjenljiva
Primjer:
#include <iostream.h>
int main()
{
int i=9;
cout << Prije bloka : << i << endl; Prije bloka : 9
{ U bloku : 5
int i=5; i=9 j=10
cout << U bloku : << i << endl;
}
int j=10;
cout << i= << i << j= << j << endl;
}
17
1.1. Uvod u C++
PROMJENLJIVE ???

Promjenljive u jeziku C++

Primjer:
#include <iostream.h> Dozvoljena definicija promjenljive u C++
int main() U jeziku C nije dozvoljeno, jer definicija
{ promjenljive mora biti na poetku bloka

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


{ ... }

for ( int k=n; k>0 ; k--)


{ ... }
NIJE GREKA !!!
} Ovo nije u istom bloku!!!

18
1.1. Uvod u C++
KONSTANTE ???

Konstante u jeziku C
Definisanje konstante mogue je preko pretprocesorske direktive
#define ime vrijednost

Konstante u jeziku C++


Uvedena je kljuna rije const za definisanje konstanti
Gubi se potreba za direktivom #define za definisanje konstanti
Opti oblik
const tip ime = vrijednost ;
Npr.
const int DIM = 100;
const char ODG = D;
const bool TACNO = 1;
Definisanoj konstanti nije mogue promijeniti vrijednost !!!
(konstanta = READ ONLY promjenljiva)
19
1.1. Uvod u C++
NOVI OPERATORI U
C++ ?

Operator za razrjeenje dosega (::)


Operator :: ima najvii priroritet
Bez operatora za razjeenje dosega nemogue je u unutranjem bloku
pristupiti identifikatoru iz spoljanjeg bloka ako je on maskiran
istoimenim identifikatorom
Komentar u C++
Primjer: // sve iza je komentar
...
int x = 1; // globalno x=1
int f()
{
int x = 2; // lokalno x=2
x++; // lokalno x=3
::x++; // globalno x=2
return x + ::x;
} u C++
vrijednost koja se vraa pomou return
ne mora da se navodi unutar zagrada
20
1.1. Uvod u C++
cin ???

Standardni ulaz u jeziku C++


I u C++ jeziku moe da se koristi scanf() funkcija iz <stdio.h>
C++ ima biblioteku <iostream> za rad sa U/I tokovima
tok = stream = dugaki niz bajtova
standardni tok za ulaz podataka
cin - upuiva na konzolu
u istom programu NE TREBA istovremeno koristiti scanf() i cin

cin >> prom1 >> prom2 >> ... >> promN;

21
1.1. Uvod u C++
cin ???

Primjer:
#include <stdio.h>
main()
{
int broj;
printf( Unesite cijeli broj:\n );
scanf( %d, &broj );
printf( Unijeli ste %d, broj );
}
#include <iostream>
using namespace std;
main()
{
int broj ;
cout << Unesite cijeli broj:\n ;
cin >> broj ;
cout << Unijeli ste << broj ;
}

22
1.3.1. Polja
Unesite cijeli broj: 234
Dinamiki niz ?
Unijeli ste: 234

Dinamiki niz u C++


C++ ima operatore new i delete za dinamiku (de)alokaciju
new tip delete pointer
new tip[dim] delete [] pointer
#include<iostream>
using namespace std;
int main(int argc, char **argv)
{
int *pointer;
pointer = new int;
cout << "Unesite cijeli broj: ";
cin >> *pointer;
cout << "Unijeli ste: " << *pointer;
delete pointer;
return 0;
}

23
1.3.1. Polja

Dinamiki niz ?

#include<iostream>
using namespace std;
int main(int argc, char **argv)
{
int *niz, n;
do
{ n=3
cout << "n="; cin >> n;
}
1. broj: 345
while (n<1); 2. broj: 23
niz = new int[n]; 3. broj: 76
for (int i=1; i<=n; i++) Obrnuti red: 76 23 345
{
cout << i << ". broj: ";
cin >> niz[i-1];
}
cout << "Obrnuti red: ";
for (int i=n-1; i>=0; i--)
cout << niz[i] << " ";
delete [] niz;
return 0;
}
24
1.3.1. Polja n=2
m=2
mat[0,0]= 1
Dinamika MATRICA ? mat[0,1]= 2
mat[1,0]= 3
mat[1,1]= 4
1 2
#include<iostream>
using namespace std; 3 4
int main(int argc, char **argv)
{
int **mat, n, m;
do for (int i=0; i<n; i++)
{ {
cout << "n="; cin >> n; for (int j=0; j<m; j++)
cout << "m="; cin >> m; cout << mat[i][j] << "\t";
} cout << endl;
while ((n<1) || (m<1)); }

mat = new int*[n]; for (int i=0; i<n; i++)


for (int i=0; i<n; i++) delete [] mat[i];
{ delete [] mat;
mat[i] = new int[m]; return 0;
for (int j=0; j<m; j++) }
{
cout << "mat[" << i << "," << j << "]= ";
cin >> mat[i][j];
}
}

25
1.3.2. Strukture

STRUKTURA?

Deklaracija strukture
Alternativni oblik deklaracije:
struct ime { Npr:
tip1 element1; struct osoba {
... char ime[15];
tipN elementN; int visina;
}; };
struct ime lista_promjenljivih; struct osoba student, klub[100];

Strukture u jeziku C++


Identifikator strukture moe da se koristi i kao identifikator tipa bez
korienja kljune rijei struct
Primjer:
struct osoba { char ime[15]; int visina; };
osoba student, klub[100];

26
1.3.2. Strukture

STRUKTURA?

Strukture u jeziku C++


U sluaju da u istom bloku postoji neki podatak prostog tipa i
struktura sa istim imenom tada se mora koristiti kljuna rije struct
Primjer:
struct alfa { int a, b, c };
struct osoba { char ime[15]; int visina; };
int alfa;
alfa = 65;
struct alfa a = { 1, 2, 3 };
osoba student, klub[100];

27
1.3.3. Unije

UNIJA?

Unija u jeziku C++


Identifikator unije moe da se koristi i kao identifikator tipa bez
korienja kljune rijei union
Primjer:
union alfa { double a,b,c; };
alfa a1, a2;

U sluaju da u istom bloku postoji neki podatak prostog tipa i unija sa


istim imenom tada se mora koristiti kljuna rije union
Primjer:
union alfa { int a, b, c };
int alfa;
alfa = 65;
union alfa a1, a2 = { 1, 2, 3 };

28
1.3.3. Unije

BEZIMENA UNIJA?

Bezimena unija
U jeziku C++ unije mogu da se definiu bez navoenja identifikatora
iza kljune rijei union. Takve unije zovu se bezimene unije.
lanovi bezimene unije ponaaju se kao obine promjenljive
Primjer:
union { int i; char c; };
char d; Promjenjljive i,c su elementi
i = 65; bezimene unije i pristupa im se kao
obinim promjenljivima
d = c;

Unija za koju je definisan neki podatak nije bezimena. Elementima


takve unije pristupa se preko identifikatora i operatora .
Primjer:
union { int i; char c; } u;
char d;
u.i = 65; d = u.c;
29
1.4. Funkcije
INLINE funkcije ?

Neposredno ugraivanje u kod (inline funkcije)


Za malene funkcije (sa malo koda) pogodnije je direktno ugraivanje u kod,
nego da se prevode nezavisno i pozivaju iz nekog koda jer se tako ubrzava rad,
tede resursi ...
Opti oblik:
inline tip imefunk ( parametri) { tijelo }

kvalifikator tip funkcije


funkcije

Prevodilac ne mora da uvai sugestiju da funkcija bude inline. Tada se to


ignorie i navedena funkcija se ponaa kao standardna funkcija
Inline funkcije podsjeaju na makroe
pogodnije su od makroa jer omoguavaju bolju kontrolu argumenata
obrada makroa je prosta leksika obrada (obrada teksta) moe da
dovede do neeljenih posljedica u sluaju bonih efekata
30
1.4. Funkcije
INLINE funkcije ?

Primjer:
#include <iostream.h> 3
#define max(a,b) ((a)>(b))?(a):(b) 5
main()
{
int a=3, b=2, c;
c = max(a,b); c = ((a)>(b)) ? (a):(b) ;
cout << c << endl;
c = max(++a,++b); c = ((++a)>(++b)) ? (++a):(++b);
cout << c << endl;
}
#include <iostream.h>
inline int max(int a, int b) 3
{ return ((a>b)? a:b); } 4
main()
{ int a=3, b=2, c;
c = max(a,b); cout << c << endl;
c = max(++a,++b); cout << c << endl;
}

31
1.4. Funkcije
podrazumijevane
vrijednosti ?

Podrazumijevane vrijednosti argumenata u funkciji


U definiciji funkcije mogu da se navedu podrazumijevane vrijednosti za
formalne argumente.
Podrazumijevane vrijednosti formalnih argumenata koriste se kad u
pozivu funkcije nedostaju stvarni argumenti
Ako se za neki argument podrazumijeva vrijednost, onda mora da se
podrazumijeva i za sve preostale argumente deklarisane iza njega
Prilikom poziva funkcije mogu da se izostave samo posljednji argumenti
(nema preskakanja)
Dozvoljeno je da se svi argumenti podrazumijevaju

32
1.4. Funkcije
podrazumijevane
vrijednosti ?

Primjer:
#include <iostream.h> 2.82843
#include <math.h> 1.41421

struct Tacka { double x,y; };


const Tacka O = {0,0};

double daljina ( Tacka a, Tacka b=O )


{ return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); }

main()
{
Tacka p={1,1}, q={-1,-1};
cout << daljina(p,q) << endl; // udaljenost od p do q
cout << daljina(p) << endl; // udaljenost od p do O
}

33
1.4. Funkcije
function
overloading ?

Preklapanje imena funkcija (function overloading)


Srodnim funkcijama mogue je dati isto ime.
Ako dvije funkcije imaju ista imena, kaemo da imamo funkcije sa
preklopljenim imenima (function overloading).
Prevodilac razlikuje preklopljene funkcije samo preko argumenata

Primjer:
...
int max (int i, int j) { return (i>j) ? i : j ; }
float max (float i, float j) { return (i>j) ? i : j ; }
char max (char i, char j) { return (i>j) ? i : j ; }
...
cout << max (2,6) << endl;
cout << max (B,A) << endl; 6
... B

34
1.4. Funkcije
function
overloading ?

Preklapanje imena funkcija (function overloading)


Preklopljene funkcije ne moraju nuno da imaju isti broj argumenata i
isto (slino) ponaanje
Primjer:
#include <iostream.h>
char max (char a, char b)
{ return (a>b) ? a : b ; }
int max (int i=0, int j=0, int k=0)
{ return (i>j) ? (i>k)?i:k : (j>k)?j:k ; }
main()
{
cout << max ('b','a') << endl;
cout << max (5, 10, 6) << endl; b
cout << max (10,5) << endl; 10
} 10

35
1.4. Funkcije
function
overloading ?

Preklapanje imena funkcija (function overloading)


Posebno treba paziti kod funkcija sa podrazumijevanim vrijednostima
argumenata!!!
Primjer:
B
#include <iostream.h>
C
char fun (char c, int i=0)
{ return c+i ; }
char fun (char c, double f=0)
{ return c + (int) f; }
main()
{
Poziva se funkcija kojoj se
cout << fun(A,1) << endl;
alje samo jedan argument,
cout << fun(A,2.5) << endl;
drugi se podrazumijeva.
// cout << fun(A) << endl;
Meutim, ne moe
}
jednoznano da se odredi
koja od funkcija treba da
se izvri!!!
36
1.7. Upuivai
UPUIVA ?

Upuivai (reference)
Upuiva je alternativno ime za neki podatak (upuuje na podatak kojem je pridruen)
Ne zauzima prostor u memoriji i ne moe da se dobije njegova adresa
Mora da se inicijalizuje prilikom definisanja (mora da upuuje na neki stvarni objekat)
Sve operacije djeluju na stvarne podatke, a ne na upuivae
Veoma su slini pokazivaima, ali pokazivai fiziki postoje a upuivai ne
Glavna primjena upuivaa: prenos argumenata u funkciju

Primjer:
int k=1; // definisana promjenljiva k
int &u=k; // definisan upuiva u na promjenljivu k
// i u i k predstavljaju isti podatak
int x=u; // definisana promjenljiva x (x=u=k=1)
u=2; // k=2
u++; // k++ -> k=3

37
1.7. Upuivai
UPUIVA ?

Upuivai (reference)
Glavna primjena upuivaa: prenos argumenata u funkciju
Primjer: Primjer:
(prenos pomou pokazivaa) (prenos pomou upuivaa)
#include <iostream.h> #include <iostream.h>
void inkrement (int *a) void inkrement (int &a)
{ *a += 1; } { a += 1; }
int main() int main()
{ {
int x=10; int x=10;
inkrement (&x); inkrement (x);
cout << x << endl; cout << x << endl;
} }

11 Korienje upuivaa
je elegantnije

38

You might also like