c++ uvod u programiranje

33
II Programiranje pomo u programskog jezika C++ Da bismo napisali program, neophodna su nam dva specijalizovana programa: jedan koji koristimo da napišemo izvornu datoteku, i drugi (kompajler) sa kojim dobijamo izvršnu datoteku. Danas se ova dva prgrama naj eš e kombinuju u jedinstven paket – razvojno okruženje. Najpoznatije C++ okruženje predstavlja Microsoftov proizvod Visual C++.NET. Me utim, ve ina ovakvih programa je komercijalna i nije dostupna svim korisnicima. Ipak, mogu e je na i veliki broj besplatnih C++ okruženja. Jedno od takvih okruženja je i Dev-C++. Najnoviju verziju pomenutog programa mogu e je na i na web stranici firme BloodshedSoftware (http://bloodshed.net/download.html tj. http://bloodshed.net/dev/devcpp.html ). 1 Programski paket Dev-C++ 1.1 Instalacija Instalacija Dev-C++ programa ni u emu se ne razlikuje od ve ine instalacionih datoteka u Windows okruženjima. Dovoljno je dvostrukim klikom pokrenuti instalacionu datoteku (npr. devcpp-4.9.9.2_setup.exe) i pratiti poruke na ekranu. Nakon instalacije preporu ljivo je podesiti neke opcije, mada to nije od velike važnosti za programe koji e se koristiti na ovom kursu. Ipak, u meniju Tools, i podmeniju Compiler options, prvo treba izabrati opciju Code Generation. U prozoru koji se dobije opciju Enable Exception Handling treba aktivirati (staviti na yes). Zatim treba izabrati opciju Linker i aktivirati Generate Debugging Information. Na ovaj na in instalacija je završena. 1.2 Kreiranje prvog programa 1.2.1 Upisivanje koda Nakon pokretanja programa Dev-C++, prvi korak u kreiranju koda je otvaranje novog zadatka. Dev-C++ pruža više opcija, ali e se u ovom kursu uglavnom raditi na jednostavnim datotekama sa izvršnim kodom (opcija File/New/Source File). Nakon odabira ove opcije, otvara se prozor u koji treba upisati kod, na primjer Nakon upisa kod sa uvamo na nekom mjestu na hard disku, npr. pod imenom hello.cpp #include <iostream> using namespace std; int main() { cout << “Hello, world!” << endl; system("PAUSE"); return 0; } Programski jezici, C++ 1

Upload: bojan-jevtic

Post on 06-Mar-2016

237 views

Category:

Documents


4 download

DESCRIPTION

Instalacija Dev-C++ programa ni u emu se ne razlikuje od veine instalacionih datoteka u Windows okruženjima. Dovoljno je dvostrukim klikom pokrenuti instalacionu datoteku (npr. devcpp-4.9.9.2_setup.exe) i pratiti poruke na ekranu. 1.2.1 Upisivanje koda 1.2 Kreiranje prvog programa Nakon upisa kod sauvamo na nekom mjestu na hard disku, npr. pod imenom hello.cpp 1 1.1 Instalacija Na ovaj nain instalacija je završena.

TRANSCRIPT

Page 1: C++ UVOD U PROGRAMIRANJE

II Programiranje pomo u programskog jezika C++

Da bismo napisali program, neophodna su nam dva specijalizovana programa: jedan koji koristimo

da napišemo izvornu datoteku, i drugi (kompajler) sa kojim dobijamo izvršnu datoteku. Danas se

ova dva prgrama naj eš e kombinuju u jedinstven paket – razvojno okruženje. Najpoznatije C++

okruženje predstavlja Microsoftov proizvod Visual C++.NET. Me utim, ve ina ovakvih programa

je komercijalna i nije dostupna svim korisnicima. Ipak, mogu e je na i veliki broj besplatnih C++

okruženja. Jedno od takvih okruženja je i Dev-C++. Najnoviju verziju pomenutog programa

mogu e je na i na web stranici firme BloodshedSoftware (http://bloodshed.net/download.html tj.

http://bloodshed.net/dev/devcpp.html ).

1 Programski paket Dev-C++

1.1 Instalacija

Instalacija Dev-C++ programa ni u emu se ne razlikuje od ve ine instalacionih datoteka u

Windows okruženjima. Dovoljno je dvostrukim klikom pokrenuti instalacionu datoteku (npr.

devcpp-4.9.9.2_setup.exe) i pratiti poruke na ekranu.

Nakon instalacije preporu ljivo je podesiti neke opcije, mada to nije od velike važnosti za programe

koji e se koristiti na ovom kursu. Ipak, u meniju Tools, i podmeniju Compiler options, prvo treba

izabrati opciju Code Generation. U prozoru koji se dobije opciju Enable Exception Handling treba

aktivirati (staviti na yes). Zatim treba izabrati opciju Linker i aktivirati Generate Debugging

Information.

Na ovaj na in instalacija je završena.

1.2 Kreiranje prvog programa

1.2.1 Upisivanje koda

Nakon pokretanja programa Dev-C++, prvi korak u kreiranju koda je otvaranje novog zadatka.

Dev-C++ pruža više opcija, ali e se u ovom kursu uglavnom raditi na jednostavnim datotekama sa

izvršnim kodom (opcija File/New/Source File). Nakon odabira ove opcije, otvara se prozor u koji

treba upisati kod, na primjer

Nakon upisa kod sa uvamo na nekom mjestu na hard disku, npr. pod imenom hello.cpp

#include <iostream> using namespace std; int main() { cout << “Hello, world!” << endl; system("PAUSE"); return 0; }

Programski jezici, C++

1

Page 2: C++ UVOD U PROGRAMIRANJE

1.2.2 Generisanje izvršne datoteke

Nakon što se sa uva ovaj kod, treba ga kompajlirati, tj. proizvesti izvršnu mašinsku datoteku. Ovo

se izvodi korištenjem kombinacije tipki Ctrl+F9 na tastaturi, ili izborom opcije Compile u meniju

Execute, ili pritiskom na ikonu u nizu alata.

Nakon startanja procesa kompajliranja, pojavljuje se prozor sa porukama koje prate proces

kompajliranja. Dev-C++ daje poruku u slu aju da na e bilo kakvu grešku u programu. U slu aju da

nema grešaka, stvara se izvršna datoteka koja se naziva hello.exe.

1.3 Pokratanje programa

Pokretanje programa, koji smo prethodno kompajlirali, u Dev-C++ okruženju izvodi se izborom

opcije Run u meniju Execute, kombinacijom tipki Ctrl+F10 na tastaturi, ili pritiskom na ikonu

Prethodna dva procesa (kompajliranje i pokretanje) mogu e je objediniti pritiskom na tipku F9 na

tastaturi, izborom opcije Compile&Run u meniju Execute, ili izborom ikone .

Program je mogu e pokrenuti i van Dev-C++ okruženja, dvostrukim klikom na izvršnu datoteku

hello.exe.

2 Osnove programiranja

2.1 Struktura programa

C++ program se sastoji od jedne ili više cjelina za prevo enje, pri emu ove cjeline predstavljaju

dio programa koji treba kompajlirati odvojeno od drugih cjelina. Ta nije, cjelina za prevo enje je

rezultat primjene preliminarne faze kompilacije, koja se naziva predprocesiranje, na izvornu

datoteku (source).

Izvorna datoteka obi no po inje sa jednom ili više (predprocesorskih) direktiva #include, pri emu

svaka od njih navodi predprocesor da kopira deklaracije entiteta (funkcija, globalnih varijabli,

tipova, itd), koji su definisani u ostalim cjelinama za prevo enje.

Posmatrajmo primjer iz prethodnog poglavlja:

U liniji 1 pozvana je datoteka iostream. Prvi karakter (#) predstavlja symbol, koji daje signal

predprocesoru. Svaki put kada pokrenemo kompajler, predprocesor je ve pokrenut. U principu,

predprocesor ita kroz izvornu datoteku i traži linije koje po inju sa ovim karakterom, tako da ih

predprocesor pro e prije nego kompajler starta sa radom. Ukratko ova linija zna i: Ono što slijedi je

1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 cout << “Hello, world!” << endl; 6 system("PAUSE"); 7 return 0; 8 }

Programski jezici, C++

2

Page 3: C++ UVOD U PROGRAMIRANJE

ime datoteke. Na i tu datoteku i odmah je pro itaj. Uglaste zagrade (<>) daju naredbu

predprocesoru da na e zadatu datoteku koja je dio standardne biblioteke (u datom primjeru to je

datoteka koja sadrži definicije za ispis i upis). U slu aju kada bismo htjeli uvrstiti neku svoju

datoteku, umjesto zagrada bismo koristili znake navoda. Dakle, ova linija kaže predprocesoru da

na e datoteku koja se zove iostream i da je odmah pro ita. Naravno, sadržaj tražene datoteke

bismo mogli upisati u izvornu datoteku bez korištenja direktive #include.

Linija 2 omogu uje pristup standardnom entitetu (namespace) koji se naziva std. Bez ove linije,

linija 5 bi se morala izvršiti na druga iji na in (std::cout << ....)

Linijom 3 po inje stvarni program sa funkcijom koja se naziva main(). Svaki C++ program sadrži

ovu funkciju. Funkcija predstavlja dio koda koji odra uje odre enu radnju. Ina e, program može da

ima proizvoljan broj funkcija, pri emu je funkcija main() specijalna. Kada god se program starta,

ona se automatski poziva. Sve funkcije po inju zagradom { i završavaju zagradom }, a sve izme u

ovih zagrada predstavlja dio funkcije.

Glavni dio programa je linija 5, koja predstavlja neku naredbu, tj. ra unarski korak koji daje neku

vrijednost. Kraj naredbe uvijek zavr ava ta ka-zarezom. Naredba u datom primjeru šalje string

"Hello world \n" na tok cout (output stream). String je svaki niz karaktera koji se nalazi izme u

znaka navoda. Posljednji karakter u datom stringu (\n) je karakter koji ozna ava novi red (vidi

poglavlje II.2.10). Stream je objekat koji izvršava ulazne i izlazne naredbe. cout je standardni

izlazni stream u C++ (standardni izlazni stream je obi no ekran). Simbol << je izlazni operator

(usmjeriva toka) kojem je lijevi operand izlazni stream, a desni izraz, i koji uzrokuje da se ovaj

posljednji posalje na prvopomenuti. Dakle, u ovom slu aju string "Hello world \n" se šalje na

cout, tj. uzrokuje njegov ispis na ekranu.

Linija 6 zaustavlja izvršenje programa, kako bismo bili u mogu nosti vidjeti rezultat njegovog rada.

Bez ove linije program bi se nakon pokretanja izvršio, a konzola bi se zatvorila tako brzo da bismo

imali osje aj da program nije ništa ni uradio.

2.2 Proces kompajliranja

Kompajliranje C++ programa obuhvata nekoliko koraka, koji su ve inom nevidljivi za korisnika:

prvo, C++ predprocecsor ide kroz program i izvodi instrukcije koje su specificirane

predprocesorskim direktivama (npr. #include). Rezultat ovoga je modificirani tekst

programa koji više ne sadrži nikakve direktive.

zatim, C++ kompajler prevodi programski kod. Kompajler može biti pravi C++ kompajer

koji pravi osnovni (asemblerski ili mašinski) kod, ili samo prevodilac, koji kod prevodi u C

jezik. U drugom slu aju, rezultuju i C kod je zatim proveden kroz C kompajler kako bi se

napravio osnovni kod. U oba slu aja, rezultat može biti nepotpun zbog toga što program

poziva podprogramske biblioteke koje nisu definisane u samom programu.

Na kraju, linker završava objektni kod njegovim povezivanjem sa objektnim kodom bilo

kojeg modula biblioteka koji program može pozvati. Kona an rezultat je izvršna datoteka.

Slika II.2.1 ilustruje prethodno navedene korake i za C++ prevodilac i za C++ prirodni kompajler.

U praksi su sve ove komande obi no izvršene jednom komandom (npr. CC), a korisnik ni ne vidi

datoteke koje su se napravile u me ufazama.

Programski jezici, C++

3

Page 4: C++ UVOD U PROGRAMIRANJE

Slika II.2.1 C++ kompilacija

2.3 Varijable

Varijabla je simboli ko ime za memorijsku lokaciju u koju se mogu pohraniti podaci i naknadno ih

pozvati. Varijable se koriste za uvanje vrijednosti podataka tako da se iste mogu koristiti u raznim

prora unima u programu. Sve varijable imaju dvije važne osobine:

Tip, koji se postavlja kada se varijabla definiše (npr. cijeli broj, realni broj, karakter, ...)

Kada se jednom definiše, tip varijable u C++ se ne može promijeniti.

Vrijednost, koja se može promijeniti davanjem nove vrijednosti varijabli. Vrsta vrijednosti

koja se može pridružiti nekoj varijabli zavisi od njenog tipa. Na primjer, integer varijabla

može da uzima samo vrijednosti cijalih brojeva (npr. -5, 13, ..)

Kada se varijabla definiše, njena vrijednost je nedefinisana sve dok joj se ne pridruži neka.

Pridruživanje vrijednosti nekoj varijabli po prvi put naziva se inicijalizacija. Neophodno je

obezbijediti da se svaka varijabla inicijalizira prije nego se koristi. Tako er je mogu e da se

varijabla definiše i inicializira u isto vrijeme, što je vrlo prakti no. Naredni primjer pokazuje

razli ite na ine definisanja i inicijaliziranja varijabli.

2.4 Memorija

Za pohranjivanje izvršnog koda kao i podataka sa kojima progam manipuliše, kompjuter ima na

raspolaganju RAM memoriju (Read Access Memory). Memorija se može zamisliti kao neprekidan

Objektni

kodC++

program

C++

prirodni

kompajler

linker Izvršna

datoteka

C++

programC++

prevodilac

C

kodC

kompajler

#include <iostream>

using namespace std;

main()

{

int a,b,c;

float x = 4.32;

int e,f,g;

char ime;

e = 4;

f = g = 12;

ime = 'C'

}

Programski jezici, C++

4

Page 5: C++ UVOD U PROGRAMIRANJE

niz bita, od kojih svaki može da pohrani binarni broj (0 ili 1). Obi no je memorija podijeljena na

grupe od 8 uzastopnih bita (ovo predstavlja bajt, byte). Bajtovi su uzastopno adresirani, tako da je

svaki bajt jedinstveno predstavljen svojom adresom (Slika II.2.2).

Slika II.2.2 Bitovi i bajtovi u memoriji

C++ kompajler generira izvršni kod, koji mapira ulazne veli ine na memorijske lokacije. Na

primjer, definicija varijable

int zarada = 500;

navodi kompajler da alocira nekoliko bajta kako bi predstavio varijablu zarada. Ta an broj bajta

koji je alociran i metod koji se koristi za binarnu reprezentaciju cijelog broja zavisi od specifi nosti

C++ implementacije, ali uzmimo da se radi o 2 bajta. Kompajler koristi adresu prvog bajta na koju

se alocira zarada kako bi ozna io varijablu. Prethodna jednakost uzrokuje da se vrijednost 500

pohrani u ova dva bajta koja su alocirana (Slika II.2.3)

Slika II.2.3 Reprezentacija cijelog broja u memoriji

Treba napomenuti da je organizacija memorije i korištenje adresa koji se odnose na podatke veoma

važno za programera, dok ta na binarna reprezentacija podataka koje on koristi to nije.

2.5 Ulazno/izlazne naredbe

Naj eš i na in na koji program komunicira sa vanjskim svijetom je preko jednostavnih

ulazno/izlaznih (IO) operacija. C++ omogu uje dva korisna operatora za ovu svrhu: >> za ulaz, i <<

za izlaz. U ranijem tekstu pokazana je upotreba operatora <<. Naredni primjer pokazuje upotrebu

operatora >>.

1211 1212 1213 1214 1215 1216 1217

... bajt bajt bajt bajt bajt bajt bajt ... Memorija

adresa

1 1 0 1 0 0 0 1

bit

1211 1212 1213 1214 1215 1216 1217

... bajt bajt bajt 10110011 10110011 bajt bajt ... Memorija

zarada

Programski jezici, C++

5

Page 6: C++ UVOD U PROGRAMIRANJE

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#include <iostream>

using namespace std;

int main (void)

{

int radniDani = 22;

float radniSati = 7.5;

float satnica, plata;

cout << "Kolika je satnica? ";

cin >> satnica;

plata = radniDani * radniSati * satnica;

cout << "Plata = ";

cout << plata;

cout << '\n';

}

Linija 9 ita ulaznu vrijednost, koju unosi korisnik i kopira je u satnica. Ulazni operator >> uzima

ulazni stream kao lijevi operand (cin je standardni C++ ulazni stream koji odgovara podacima

unesenim pomo u tastature), a varijablu (na koju se kopira ulazni podatak) kao desni operand.

2.6 Komentari

Komentar je dio opisnog teksta koji objašnjava neke aspekte programa. Kompajler u potpunosti

ignoriše komentare u programu, tako da je jedina svrha koju komentar ima, da pomognu onome koji

e itati program. C++ daje dvije mogu nosti pisanja komentara:

Bilo šta napisano nakon //, pa do kraja date linije smatra se komentarom

Bilo šta napisano izme u /* i */ smatra se komentarom.

1

*1

2

3

4

5

6

7

8

9

10

11

12

13

#include <iostream>

using namespace std;

/* Ovaj program racina ukupnu platu radnika, koja se zasniva na ukupnom broju

radnih sati i satnici. */

int main (void)

{

int radniDani = 22; // Broj radnih dana u mjesecu

float radniSati = 7.5; // Broj radnih sati u danu

float satnica = 33.50; // Satnica

float plata; // Ukupna mjesecna plata

plata = radniDani * radniSati * satnica;

cout << "Plata = " << plata << '\n';

}

Jasno da je da se prvi primjer može koristiti za komentar jedne i samo jedne linije (ili dijela jedne

linije), dok se posljednjim može komentarisati tekts upisan u više linija.

2.7 Imena

Programski jezici koriste imena kako bi se ozna ile razli ite cjeline koje ine program. Osim imena

varijabli, ovdje spadaju i imena funkcija, tipova, te makroa. C++ postavlja sljede a pravila za

Programski jezici, C++

6

Page 7: C++ UVOD U PROGRAMIRANJE

pravilno kreiranje imena (ili identifikatora). Ime traba da se sastoji od jednog ili više karaktera, od

kojih bilo koji može biti slovo (tj, slova engleske abecede a-z i A-Z), broj (0-9) i znak "_", pri

emu na prvom mjestu ne može da bude broj. Uz to, velika i mala slova se razlikuju, tako da se, na

primjer, varijable zarada i Zarada razlikuju.

C++ ne postavlja nikakvo ograni enje na broj karaktera u nekom identifikatoru. Me utim, ve ina

implementacija ima ovo ograni enje, ali je ono toliko veliko da ne predstavlja nikakav problem

(npr. i do 255 karaktera). Treba imati na umu da postoje odrežene rije i u C++ koje su rezervisane,

tako da identifikatori ne mogu uzimati njihova imena. Te rije i se nazivaju rezervisane ili klju ne

rije i i date su u tabeli

Tabela II.2.1 Klju ne (rezervisane) rije i u C++ asm continue float new signed try

auto default for operator sizeof typedef

break delete friend private static union

case do goto protected struct unsigned

catch double if public switch virtual

char else inline register template void

class enum int return this volatile

const extern long short throw while

2.8 Cijeli brojevi

Cijeli broj (integer) se može definisati pomo u tipova short, int i long. Jedina razlika je u

tome da int koristi više ili barem isto bajta kao short, a long koristi više ili barem isto bajta nego

int. Ovo zavisi od ra unara na kojem se radi.

Konvencija je da cjelobrojne varijable uzimaju u obzir i pozitivne i negativne brojeve (kaže se da su

signed). Me utim, u slu aju kada se koriste kao unsigned, onda mogu uzeti samo pozitivne

vrijednosti (sa 0).

2.9 Realni brojevi

Realni broj se može definisati sa tipom float i double. double koristi više bajta i time

omogu uje ve u opseg i ve u ta nost pri predstavljanju realnih brojeva.

2.10 Karakteri

Varijabla karakter se definiše tipom char. Ona obuhvata jedan jedini bajt koji sadrži kod datog

karaktera. Ovaj broj je numeri ka vrijednost i zavisi od sistema kodiranja karaktera koji se koristi

(to je zavisno od mašine). Naj eš i sistem je ACSII (Amercan Standard Code for Information

Interchange). Na primjer, karakter A ima ASCII kod 65, a karakter a 97.

Kao i interger i karakter može da bude signed i unsigned. Tako, signed karakter može da sadrži

numeri ke vrijednosti izme u -128 i 127, a unsigned 0 do 255.

Programski jezici, C++

7

Page 8: C++ UVOD U PROGRAMIRANJE

Karakteri koji imaju posebnu namjenu (ne predstavljaju karaktere koji se ispisuju) predstavljaju se

pomo u escape sekvenci, kao npr:

‘\n’ – novi red

‘\t’ – novi tabulator

‘\v’ – novi vertikalni tabulator

‘\b’ – backspace

‘\’’ – znak navoda (apostrof)

‘\”’ – dvostruki znak navoda

‘\\’ – backslash (/)

‘\a’ – zvu ni signal

2.11 Stringovi

String je uzastopni niz karaktera koji se završavaju nultim karakterom. Tako je, barem, bilo u jeziku

C. Ipak, u C++ uveden je novi tip podataka koji se naziva C++ string klasa, pa je mogu e na mnogo

prirodniji na in manipulisati varijablama sa više karaktera. Sljede i primjer pokazuje njenu

upotrebu.

Ovaj primjer dobro funkcioniše jer završava program ako se unese "k" ili "K", odnosno program se

nastavlja ako se unese bilo koji drugi karakter. Problem nastaje ako korisnik programa pritisne

samo tipku ENTER. U tom slu aju objekat "cin" o ekuje da se unese neka vrijednost, pa tek onda

pritisne ENTER.

3. Operatori

Ovo poglavlje obra uje ugra ene C++ operatore koji se koriste za stvaranje izraza, pri emu izraz

predstavlja bilo kakav prora un koji daje neku vrijednost. C++ nudi operatore za izvršavanje

aritmeti kih, ralacijskih, logi kih, bitwise i uslovnih izraza. Tako er nudi veoma korisne “popratne

efekte” (side-effect) kao što su pridruživanje, inkrement i dekrement.

3.1 Aritmeti ki operatori

C++ nudi pet osnovnih operatora, koji su sumirani u Tabeli II.3.1.

#include <iostream>

using namespace std;

main()

{

char ch;

do {

cout << "Pritisnite K ili k za kraj, a bilo koju tipku za

nastavak \n";

cin >> ch;

if (ch != 'K' && ch != 'k')

cout << "Zelite nastaviti?\n";

else

cout << "Kraj programa";

} while (ch != 'K' && ch != 'k');

}

Programski jezici, C++

8

Page 9: C++ UVOD U PROGRAMIRANJE

Tabela II.3.1 Aritmeti ki operatori

Operator Ime Primjer + Sabiranje 12 + 4.9 // daje 16.9

- Oduzimanje 3.98 - 4 // daje -0.02

* Množenje 2 * 3.4 // daje 6.8

/ Dijeljenje 9 / 2.0 // daje 4.5

% Ostatak pri dijeljenju 13 % 3 // daje 1

Osim ostatka pri djeljenju (%) svi aritmeti ki operatori prihvataju miješanje cijelih i realnih brojeva.

Op enito, ako su oba operanda cijeli brojevi, i rezultat je cijeli broj. Me utim, ako je jedan od

operanada realan, onda je i rezulat realan (tipa double).

Kada su oba operanda pri dijeljenju cijeli brojevi, rezultat je tako er cijeli broj (tzv. cjelobrojno

dijeljenje). U tom slu aju rezultat se zaokružuje na donju vrijednost, tj.

9 / 2 // daje 4, a ne 4.5!

-9 / 2 // daje -5,a ne -4.5!

S obzirom da neželjeno cjelobrojno dijeljenje predstavlja jednu od naj eš ih greški u

programiranju, neophodno je da promijenimo jedan od operanada da bude realan broj, kao npr.

int cijena = 100;

int volumen = 80;

double jedinicnaCijena = cijena / (double) volumen; // daje 1.25

Operator % daje ostatak pri dijeljenju dva cijela broja (oba operanda moraju biti cijeli brojevi), npr.

13%3 daje 1

3.2 Relacijski operatori

C++ nudi 6 relacijskih operatora za ra unanje brojnih veli ina (Tabela II.3.2)

Tabela II.3.2 Relacijski operatori

Operator Ime Primjer == Jednakost 5 == 5 // daje 1

!= Nejednakost 5 != 5 // daje 0

< Manje od 5 < 5.5 // daje 1

<= Manje ili jednako 5 <= 5 // daje 1

> Ve e od 5 > 5.5 // daje 0

>= Ve e ili jednako 6.3 >= 5 // daje 1

Treba zapamtiti da se operatori <= i >= mogu korisiti samo u tom obliku, a da =< i => ne zna e ništa

u ovom kontekstu.

Operandi nekog relacijskog operatora moraju biti brojevi. No, i karakteri su ispravni operandi pošto

predstavljaju brojnu vrijednost (sjetimo se ASCII tabele).

Relacijski operaotri se ne smiju korisiti ze pore enje stringova, pošto se u tom slu aju porede

njihove adrese, a ne sadržaj. U tom slu aju, rezlutat je neodre en. Ipak, postoje funkcije koje mogu

porediti i leksikografsku razliku dva stringa.

Programski jezici, C++

9

Page 10: C++ UVOD U PROGRAMIRANJE

3.3 Logi ki operatori

Za kombinovanje logi kih izraza C++ nudi tri logi ka operatora (Tabela II.3.3). Sli no relacijskim

operatorima, rezultat pri korištenju logi kih operatora je 0 (false) ili 1 (true).

Tabela II.3.3 Logi ki operatori

Operator Ime Primjer ! Logi ka negacija !(5 == 5) // daje 0

&& Logi ko i 5 < 6 && 6 < 6 // daje 1

|| Logi ko ili 5 < 6 || 6 < 5 // daje 1

Logi ka negacija je unarni opearator, tj. ima samo jedan operand kojem daje negativnu vrijednost.

3.4 Inkrementalni i dekrementalni operatori

Takozvani auto inkremetalni (++) i auto dekrementalni (--) operatori obezbije uju prigodan na in

za pove avanje, odnosno smanjivanje brojne varijable za 1. Upotreba ovih operatora je sumirana u

Tabeli II.3.4., pri emu se predpostavlja da je

int k = 5;

Tabela II.3.4 Inkrement i dekrement operatori.

Operator Ime Primjer ++ Inkrement (prefiks) ++k + 10 // daje 16

++ Inkrement (postfiks) k++ + 10 // daje 15

-- Dekrement (prefiks) --k + 10 // daje 14

-- Dekrement (postfiks) k-- + 10 // daje 15

Kao što se vidi, oba operatora se mogu korisiti u prefiksnom ili postfiksnom obliku. Razlika je

velika, jer kada se operator koristi u prefiksnom obliku prvo se primijenjuje operator, a onda se u

izrazu koristi rezultat. Kada se koristi u postfiksnom obliku, prvo se ra una izraz, a onda se

primijenjuje operator.

Oba operatora se mogu primijeniti kako na cjelobrojne, tako i na realne brojeve, iako se ova

karakteristika veoma rijetko koristi na realnim brojevima.

3.5 Operatori pridruživanja

Operator pridruživanja se koristi za pohranjivanje vrijednosti na neku memorijsku lokaciju (koja je

obi no pridružena nekoj varijabli). Lijevi operand operatora treba biti neka lijeva_vrijednost,

dok desni operand može biti proizvoljni izraz. Desni operand se izra una i pridruži lijevoj strani. Pri

tome lijeva_vrijednost predstavlja bilo šta što zauzima neku memorijsku lokaciju na koju se

može pohraniti neka veli ina, može biti varijabla, te zasnovana na pointerima i referencama.

Operator pridruživanja može imati mnogo varijanti, koje se dobijaju njegovim kombinovanjem sa

aritmeti kim i bitwise operatorima. Ove varijante su date u sljede oj tabeli.

Programski jezici, C++

10

Page 11: C++ UVOD U PROGRAMIRANJE

Tabela 2.3.5 Operatori pridruživanja

Operator Primjer Ekivalentno sa = n = 25

+= n += 25 n = n + 25

-= n -= 25 n = n - 25

*= n *= 25 n = n * 25

/= n /= 25 n = n / 25

%= n %= 25 n = n % 25

Kako operator pridruživanja sam po sebi predstavlja izraz ija se vrijednost pohranjuje u lijevi

operand, on se može korisititi kao desni operand za narednu operaciju pridruživanja, odnosno može

se napisati:

int m, n, p;

m = n = p = 100; // zna i: n = (m = (p = 100));

m = (n = p = 100) + 2; // zna i: m = (n = (p = 100)) + 2;

ili

m = 100;

m += n = p = 10; // zna i: m = m + (n = p = 10);

2.6 Uslovni (ternarni) operator

Uslovni operator treba tri operanda (odatle ime ternarni). On ima opštu formulu:

operand1 se izra unava, i tretira se kao logi ki uslov. Ako je rezultat razli it od nule, tada se

izra unava operand2. U suprotnom, izra unava se operand3. Na primjer:

int m = 1, n = 2;

int min = (m < n ? m : n); // min dobija vrijednost 1

Provjeriti šta je rezultat sljede e upotrebe uslovnog operatora:

int min = (m < n ? m++ : n++);

Postoji još nekoliko vrsta operatora (npr. zarez operator, sizeof operator), ali o njema ne e biti rije i

u ovom kursu.

4 Naredbe

Ovo poglavlje opisuje razne oblike C++ naredbi koje služe za pisanje programa. Kao i ve ina

ostalih programskih jezika, C++ nudi razli ite vrste naredbi koje se koriste u razli ite svrhe. Tako se

deklaracione naredbe koriste za definisanje varijabli, naredbe pridruživanja za jednostavne

prora une, itd. U narednom teksu bi e objašnjene neke od njih.

operand1 ? operand2 : operand3

Programski jezici, C++

11

Page 12: C++ UVOD U PROGRAMIRANJE

4.1 Jednostavne i složene naredbe

Jednostavna naredba je svaka naredba koja završava ta ka-zarezom. Definicije varijabli i izrazi koji

završavaju sa ta ka-zarezom su neki primjeri:

int i; // deklaraciona naredba

++i; // naredba sa popratnim efektom

double d = 10.5; // deklaraciona naredba

d + 5; // beskorisna naredba

Posljednji primjer pokazuje beskorisnu naredbu, jer nema nikakvih popratnih efekata.

Najjednostavniji oblik naredbe je linija koja sadrži samo ta ka-zarez, tzv. null-naredba. No, i

ovakva naredba ponekad ima smisla, što e se pokazati u kasnijem tekstu.

Mnogostruke naredbe se mogu kombinovati u složene naredbe kada se grupišu izme u velikih

zagrada ({}), kao na primjer

{ int min, i = 10, j = 20;

min = (i < j ? i : j);

cout << min << '\n';

}

Ovakve naredbe su korisne iz dva razloga: a) omogu uju da se mnogostruka naredba postavi tamo

gdje bi ina e mogla da se postavi samo jedna, i b) omogu uju da se u program uvede scope (

prostor). Scope predstavlja dio programa unutar kojeg varijabla ostaje definisana. Izvan scope-a ona

to više to nije. Ovo je veoma važna osobina o kojoj e više biti rije i kada se budu objašnjavale

funkcije.

4.2 Naredba if

Ponekad je poželjno da se izvrši odre ena naredba koja zavisi od ispunjenja nekog uslova. Upravo

tu mogu nost pruža if naredba, iji je opšti oblik:

Prvo se izvršava izraz, i ako je rezultat razli it od nule izvršava se naredba. U suprotnom, ništa se

ne dešava.

Na primjer, ako bismo željeli provjeriti da li je pri djeljenju djelilac razli it od nule, imali bismo:

if (djelilac != 0)

Kolicnik=djelitelj/djelilac;

Da bismo izvršili više naredbi koje ovisi o nekom istom uslovu, koristimo složenu naredbu, tj. sve

naredbe stavljamo izme u zagrada.

Varijanta if naredbe koja omogu uje da se specificiraju dvije alternativne naredbe, jedna koja se

izvršava kada je uslov ispunjen i druga kada nije, se naziva if-else naredba i ima oblik:

if (izraz) naredba;

if (izraz) naredba1;

elsenaredba2;

Programski jezici, C++

12

Page 13: C++ UVOD U PROGRAMIRANJE

Ovdje se najprije izvršava izraz, i ako je rezultat razli it od nule, izvršava se naredba1. U

suprotnom, izvršava se naredba2, što pokazuje i sljede i primjer:

#include <iostream>

using namespace std;

main()

{

int x;

cout << "Unesite neki broj";

cin >> x;

if (x % 2 == 0)

cout << "Broj je paran" << endl;

else

cout << "Broj je neparan" << endl;

}

Pored prethodno navedenih varijanti, postoji i ugniježdena if naredba, u kojoj se javljaju više od

dvije alternative. Primjer takve varijente je:

if (callHour > 6) { if (duzinaPoziva <= 5) cijena = duzinaPoziva * tarifa1; else cijena = 5 * tarifa + (duzinaPoziva - 5) * tarifa2; } else

cijena = osnovnaCijena;

4.3 Naredba switch

switch naredba omogu uje izbor izme u više alternativa, koje su zasnovane na vrijednosti izraza.

Opšti oblik switch naredbe je:

Prvo se ra una izraz (koji se naziva switch tag), a zatim se rezultat poredi sa svakom od

numeri kih konstanti (koje se nazivaju labele), po redu kako se javljaju, dok se ne poklopi sa

jednom od komponenti. Nakon toga se izvršavaju naredbe koje slijede. Izvršavanje se izvodi sve

dok se ne nai e na naredbu break ili dok se ne izvrše sve naknadne naredbe. Posljednji slu aj

(default) može, a i ne mora da se koristi, i pokre e se ako nijedna od prethodnih konstanti nije

zadovoljena.

Klasi ni primjer ocijenjivanja nekog rada na osnovu osvojenih bodova dat je u daljem teksu:

switch (izraz) { case konstanta_1: naredbe; ... case konstanta_n: naredbe; default: naredbe;

}

Programski jezici, C++

13

Page 14: C++ UVOD U PROGRAMIRANJE

#include <iostream> using namespace std;

main(){ int ocj; cout << "Unesite ocjenu: "; cin >> ocj; switch (ocj) { case 5: cout << "Imate 90 – 100 bodova" << endl; break; case 4: cout << "Imate 80 – 89 bodova" << endl; break; case 3: cout << "Imate 70 – 79 bodova" << endl; break; case 2: cout << "Imate 60 – 69 bodova" << endl; break; default: cout << "Imate ispod 60 bodova" << endl; } }

4.4 Naredba while

Naredba while (naziva se i while petlja) omogu uje ponavljanje neke naredbe sve dok je ispunjen

neki uslov. Opšti oblik ove naredbe je:

Prvo se izra unava izraz (naziva se i uslov petlje). Ako je rezultat razli it on nule tada se izvršava

naredba (naziva se i tijelo petlje) i cijeli proces se ponavlja. U suprotnom, proces se zaustavlja.

Na primjer, ako bismo željeli izra unati zbir svih brojeva od 1 do n, upotreba while naredbe bi

izgledala kao:

i = 1;

sum = 0;

while (i <= n)

sum += i++;

Interesantno je da nije neuobi ajeno za while naredbu da ima prazno tijelo petlje, tj. null-naredbu.

Takav primjer je problem nalaženja najve eg neparnog faktora nekog broja

while (n % 2 == 0 && n /= 2)

;

Ovdje uslov petlje izvršava sve neophodne kalkulacije, tako da nema potrebe za tijelom.

4.5 Naredba do

Naredba do (naziva se i do petlja) je sli na naredbi while, osim što se prvo izvršava tijelo petlje, a

zatim se provjerava uslov. Opšti oblik naredbe je:

while (izraz) naredba;

Programski jezici, C++

14

Page 15: C++ UVOD U PROGRAMIRANJE

Prvo se izvršava naredba, a zatim provjerava izraz. Ako je izraz razli it od nule cijeli proces se

ponavlja. U suprotnom, petlja se zaustavlja.

do petlja se manje koristi nego while petlja. Obi no se koristi kada se tijelo petlje mora izvr iti

najmanje jedanput bez obzira na ispunjenje uslova. Takav primjer je ponovljeno unošenje nekog

broja i izra unavanje njegovog kvadrata dok se ne unese 0:

do {

cin >> n;

cout << n * n << '\n';

} while (n != 0);

Za razliku od while petlje, do petlja se nikada ne koristi sa praznim tijelom prvenstveno zbog

jasno e.

4.6 Naredba for

Naredba for (for petlja) je sli na naredbi while, ali ima dvije dodatne komponente: izraz koji se

izra unava samo jednom prije svega, i izraz koji se izra unava jednom na kraju svake iteracije.

Opšti oblik naredbe for je:

Prvo se izra unava izraz1. Svakim prolazom proz petlju se izra unava izraz2. Ako je rezultat

razli it od nule izra unava se izraz3. U suprotnom petlja se zaustavlja. Oblik while petlje koja je

ekvivalenta do petlji je:

for petlja se naj eš e koristi u situacijama kada se neka promjenljiva pove ava ili smanjuje za

neku veli inu u svakoj iteraciji, odnosno kada je broj iteracija unaprijed poznat. Sljede i primjer

ra una zbir svih brojeva od 1 do n:

sum = 0;

for (i = 1; i <= n; ++i)

sum += i;

Bilo koja od komponenti u petlji može biti prazna. Na primjer, ako se uklone prvi i tre i izraz, onda

do petlja li i na while petlju:

do naredba; while (izraz);

for (izraz1; izraz2; izraz3) naredba;

izraz1;while (izraz2) { naredba;

izraz3; }

Programski jezici, C++

15

Page 16: C++ UVOD U PROGRAMIRANJE

for (; i != 0;) // je ekvivalentno sa: while (i != 0)

bilo-sta; // bilo-sta;

Uklanjanje svih izraza u petlji daje beskona nu petlju:

for (;;) // beskona na petlja

bilo-sta;

Pošto petlje predstavljaju naredbe, mogu se pojaviti unutar drugih petlji (tzv. ugniježdene petlje).

Na primjer:

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

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

cout << '(' << i << ',' << j << ")\n";

daje parove skupa {1,2,3}

5 Funkcije

Ovo poglavlje opisuje funkcije, koje definiše korisnik, kao jedan od glavnih gra evinskih blokova u

C++ programiranju. Funkcije obezbije uju prikladan na in upakivanja nekog numeri kog recepta,

koji se može koristiti koliko god je to puta potrebno.

5.1 Definicija funkcije

Definicija funkcije se sastoji od dva glavna dijela: zaglavlja ili interfejsa, i tijela funkcije. Interfejs

(neki ga nazivaju i prototip) definiše kako se funkcija može koristiti. On se sastoji od tri dijela:

Imena. Ovo je, u stvari, jedinstveni identifikator.

Parametara (ili potpisa funkcije). Ovo je niz od nula ili više identifikatora nekog tipa koji

se koriste za proslije ivanje vrijednosti u i iz funkcije.

Tipa funkcije. Ovo specificira tip vrijednosti koji funkcija vra a. Funkcija koja ne vra a

nijednu vrijednost bi trebala da ima tip void.

Tijelo funkcije sadrži ra unske korake (naredbe) koji ine neku funkciju.

Korištenje funkcije se izvodi njenim pozivanjem. Poziv funkcije se sastoji od imena funkcije,

pra enim zagradama za pozivanje (). Unutar ovih zagrada se pojavljuje nula ili više argumenata

koji se odvajaju zarezom. Broj argumenata bi trebao odgovarati broju parametara funkcije. Svaki

argument je izraz iji tip bi trebao odgovarati tipu odgovaraju eg parametra u interfejsu funkcije.

Kada se izvršava poziv funkcije, prvo se ra unaju argumenti i njihove rezultuju e vrijednosti se

pridružuju odgovaraju im parametrima. Nakon toga se izvršava tijelo funkcije. Na kraju, funkcija

vra a vrijednost (ako ista postoji) pozivu.

Sljede i primjer ilustrativno pokazuje definiciju jednostavne funkcije koja izra unava vrijednost

stepen cijelog broja na neki cijeli broj.

Programski jezici, C++

16

Page 17: C++ UVOD U PROGRAMIRANJE

1

2

3

4

5

6

7

int Stepen (int baza, unsigned int eksponent) {

int rezultat = 1;

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

rezultat *= baza;

return rezultat;

}

Linija 1 definiše interfejs funkcije. Ona po inje tipom funkcije koji se vra a (u ovom slu aju int).

Nakon toga je dato ime funkcije (Stepen), a zatim njena lista parametara. Funkcija Stepen ima dva

parametra (baza i eksponent) koji su tipa int. Sintaksa parametara je sli na sintaksi definisanja

varijabli, tj. nakon tipa daje se ime parametra. Me utim, nije mogu e nakon tipa dati niz parametara

odvojenih zarezom, kao u

int Stepen (int baza, eksponent) // Ovo je pogrešno!

Zagrada { u liniji 2 predstavlja po etak tijela funkcije.

Linija 3 definiše lokalnu varijablu.

Linije 4 i 5 ra unaju stepen varijable baza na varijablu eksponent pomo u for petlje. Rezultat se

pohranjuje u varijablu rezultat.

U liniji 6 vra a se vrijednost rezultat kao rezultat funkcije.

Zagrada } u liniji 7 predstavlja kraj tijela funkcije.

Naredni primjer pokazuje kako se funkcija poziva. Posljedica poziva funkcije je da se vrijednosti

argumenata 2 i 8 pridružuju parametrima baza i eksponent, respektivno, a zatim se ra una tijelo

funkcije.

#include <iostream>

using namespace std;

main (void)

{

cout << "2 ^ 8 = " << Stepen(2,8) << '\n';

}

Kada se program pokrene daje sljede i izlaz:

2 ^ 8 = 256

Op enito, funkcija se treba definisati prije nego se koristi. To se može uraditi na više na ina, kao što

je pokazano u narednim primjerima.

Primjer 1.

#include <iostream> using namespace std;

double Stepen (int baza, int eksponent) { double rezultat = 1;

for (int i = 0; i < eksponent; ++i) rezultat *= baza;

Programski jezici, C++

17

Page 18: C++ UVOD U PROGRAMIRANJE

return rezultat; }

main () { int a,b; cout << "Unesi bazu:"; cin >> a; cout << "\nUnesi eksponent:"; cin >> b; cout << a<<"^" <<b<<" = " << Stepen(a,b) << '\n'; system("PAUSE"); }

Primjer 2.

Treba napomenuti da se deklaracija funkcije sastoji od njenog prototipa, tako da je za deklarisanje

dovoljno ispisati samo njen prototip. Na taj na in, kompletna definicija funkcije se može dati

kasnije, kao što je pokazano u narednom primjeru. Tako er je mogu e izostaviti nazive parametara

u deklaraciji, ali to nije preporu ljivo.

#include <iostream> using namespace std;

double Stepen (int baza, int eksponent); // deklarisanje funkcije

/* moguce je funkciju daklarisati i na sljedeci nacin double Stepen (int, int);*/

main () { int a,b; cout << "Unesi bazu:"; cin >> a; cout << "\nUnesi eksponent:"; cin >> b; cout << a<<"^" <<b<<" = " << Stepen(a,b) << '\n'; system("PAUSE"); }

double Stepen (int baza, int eksponent) { double rezultat = 1;

for (int i = 0; i < eksponent; ++i) rezultat *= baza; return rezultat; }

Primjer 3.

Radi preglednosti veoma je korisno sakupiti sve funkcije u posebne datoteke, i umjesto njihovog

definisanja u sklopu izvršne datoteke, treba samo pro itati tu datoteku. Na primjer, ako je definicija

funkcije Stepen data u datoteci StepenInt.h, onda bi prehodni program bio:

#include <iostream> #include “StepenInt.h”

using namespace std;

main () { int a,b;

Programski jezici, C++

18

Page 19: C++ UVOD U PROGRAMIRANJE

cout << "Unesi bazu:"; cin >> a; cout << "\nUnesi eksponent:"; cin >> b; cout << a<<"^" <<b<<" = " << Stepen(a,b) << '\n'; system("PAUSE"); }

Ovdje treba paziti gdje se datoteka StepenInt.h nalazi. U primjeru koji je dat, ona se nalazi u

istom direktoriju kao i izvršna datoteka. U suprotnom, treba dati ta an (relativni ili apsolutni)

položaj (path) iste.

5.2 Parametri i argumenti

C++ podržava dva oblika parametara: vrijednost i referencu. Parametar po vrijednosti prima kopiju

vrijednosti argumenata koja im se prenosi. Kao posljedica toga, ako funkcija napravi bilo kakvu

promjenu na parametrima, ovo ne e promijeniti vrijednosti argumenta. Na primjer,

#include <iostream> using namespace std;

void Foo (int broj) { broj = 0; cout << "broj = " << broj << '\n'; }

int main () { int x = 10;

Foo(x); cout << "x = " << x << '\n'; system("PAUSE"); return 0; }

parametar broj u funkciji Foo je parametar po vrijednosti. On se ponaša kao lokalna varijabla u

funkciji. Kada se funkcija pozove i vrijednost x se prenese, varijabla broj primi kopiju vrijednosti

varijable x. Kao rezultat toga, iako varijabla num u funkciji mijenja vrijednost na 0, to ne e utjecati

na varijablu x. Program e dati sljede i izlaz:

broj = 0;

x = 10;

Za razliku od parametra po vrijednosti, parametar po referenci prima argument koji se prenosi i sve

obavlja direktno na njemu. Bilo koja promjena parametra po referenci u samoj funkciji, direktno se

odnosi i na argument, tj. i on se mijenja. Da bismo definisali parametar po referenci, potrebno je

dodati simbol & iza tipa parametra u interfejsu funkcije, tj. u predhodnom primjeru interfejs funkcije

Foo bio bi

void Foo (int& num)

U kontekstu pozivanja funkcija, a na osnovu prethodno iznesenog, razlikujemo dvije vrste

pridruživanja: priduživanje prema vrijednosti i pridruživanje prema referenci. U praksi (u pogledu

funkcija) se mnogo više koristi priduživanje prema vrijednosti.

Programski jezici, C++

19

Page 20: C++ UVOD U PROGRAMIRANJE

5.3 Globalne i lokalne varijable (globalni i lokalni scope)

Za sve što se definiše izvan programskog scope-a se kaže da ima globalni scope. Tako, sve funkcije

koje smo do sada koristili imaju globalni scope, i predstavljaju globalne funkcije. No, i varijable se

mogu defnisati u globalnom scope-u, tj. izvan svih funkcija koje se koriste u programu. Na primjer:

int godina = 1994; // globalna varijabla

int Maksimum (int, int); // globalna funkcija

int main (void) // globalna funkcija

{

//...

}

Treba zapamtiti da su globalne varijable automatski inicijalizirane na vrijednost nula.

Pošto su globalni entiteti vidljivi na svim programskim novoima, oni moraju biti jedinstveni na nivu

programa. To zna i da se globalne varijable ili funkcije na globalnom scope-u ne mogu definisati

više nego jedanput, iako se ime funkcije može definisati više puta sve dok su im parametri (njen

potpis) jedinstveni. Globalni entiteti su op enito pristupa ni bilo gdje u programu.

Svaki blok u programu definiše lokalni scope. Na taj na in, tijelo funkcije predstavlja lokalni scope.

Parametri funkcije imaju isti scope kao i tijelo funkcije. Varijable koje su definisane unutar

lokalnog scope-a su vidljive samo u tom scope-u. Lokalni scope može da bude ugniježden, pri emu

unutrašnji scope poništava vanjski. Na primjer, u

int xyz; // xyz je globalna varijabla

void Foo (int xyz) // xyz je lokalna varijabla u tijelu funkcije Foo

{

if (xyz > 0) {

double xyz; // xyz je lokalna varijabla u ovom bloku

//...

}

}

Imamo tri razli ita scope-a, od kojih svaki ima razli itu varijablu xyz.

Op enito, životni vijek varijable je ograni en na njen scope. Tako, na primjer, globalne varijable

traju svo vrijeme izvršenja programa, dok se lokalne varijable kreiraju kada se u e u njihov scope, a

uništavaju kada se izlazi iz njihovog scope-a. Memorijski prostor za lokalne varijable je rezervisan

prije izrvršenja programa, dok je memorijski prostor za lokalne varijable alociran ‘u hodu’ u toku

izvršenja programa.

Pošto lokalni scope poništava globalni, to lokalne varijable sa istim imenom kao globalne varijable

onemogu avaju pristup globalnim varijablama unutar lokalnog scope-a. Na primjer, u

int greska;

void Greska (int greska)

{

//...

}

globalna varijabla greska je nepristupa na unutar funkcije Greska, pošto je poništena lokalnim

parametrom greska.

Ovaj problem se može prevazi i korištenjem unarnog operatora :: (unary scope operator), koji

globalni entitet uzima kao argument, kao u primjeru

Programski jezici, C++

20

Page 21: C++ UVOD U PROGRAMIRANJE

int greska;

void Greska (int greska)

{

//...

if (::greska != 0) // odnosi se na globalnu varijablu error

//...

}

5.4 Rekurzivne funkcije

Za funkciju koja poziva samu sebe kažemo da je rekurzivna. Rekurzija je opšta programska metoda

koja se primijenjuje na probleme koji se definišu u odnosu na same sebe. Na primjer, problem

ra unanja faktorijela je primjer rekurzivne funkcije. Faktorijel je definisan sa:

Faktorijel od 0 je 1.

Faktorijel pozitivnog broja n je n puta faktorijel od n-1

Posljednji dio definicije jasno pokazuje da je faktorijel definisan u odnosu na samog sebe, te se

stoga može predstaviti rekurzivnom funkcijom, npr.

int Faktorijel (unsigned int n)

{

return n == 0 ? 1 : n * Faktorijel(n-1);

}

U principu, sve rekurzivne funkcije se mogu napisati koriste i iteracije. Naime, treba imati u vidu

da u slu aju velikog broja poziva funkcija (u primjeru faktorijela je to veliki broj n), dolazi do

zauzimanja velikog memorijskog prostora (tzv. runtime stack), pa je upotreba iteracija bolje

rješenje. No, u nekim slu ajevima elegantno i jednostavno rekurzivno rješenje može da bude bolja

opcija.

U slu aju faktorijela, iterativna opcija je bolja, pa bi funkcija imala oblik:

int Factorijel (unsigned int n)

{

int rezultat = 1;

while (n > 0) rezultat *= n--;

return rezultat;

}

5.5 Optere ene (overloaded) funkcije

U prethodnim poglavljima je pomenuto da je mogu e definisati više funkcija sa istim imenom, pri

emu njen potpis mora biti druga iji. Ovaj postupak se naziva optere ivanje (overloading, specijalni

oblik polimorfizma) i predstavlja jednu od osnovnih karakteristika OOP.

Ako bismo željeli da naša funkcija Stepen ima mogu nost korištenja realnih brojeva umjesto

cijelih, ili ak da izra unava vrijednost stepena broja 2 na neki realan broj, onda bismo definisali

dvije dodatne funkcije sa istim imenom, ali razli itim potpisom. Sljede i primjer pokazuje

korištenje ovakvih funkcija.

#include <iostream> #include <cmath>

using namespace std;

int Stepen (int baza, int eksponent) {

Programski jezici, C++

21

Page 22: C++ UVOD U PROGRAMIRANJE

int rezultat = 1;

for (int i = 0; i < eksponent; ++i) rezultat *= baza; return rezultat; }

double Stepen (double baza, double eksponent) // funkcija Stepen sa realnim parametrima { return exp(eksponent*log(baza)); }

double Stepen (double eksponent) // funkcija Stepen sa jednim parametrom za izra unavanje stepena broja 2 { return Stepen(2.0,eksponent); }

main (void) { double a,b; cout << "Unesi bazu:"; cin >> a; cout << "\nUnesi eksponent:"; cin >> b; cout << a<<"^" <<b<<"= " << Stepen(a,b) << '\n'; cout << "2^" <<b<<"= " << Stepen(b) << '\n'; system("PAUSE"); }

Iz primjera se vidi da sve funkcije imaju isto ime, ali razli ite tipove, a u drugom slu aju i razli it

broj parametara. Treba paziti da pri pozivu pojedinih funkcija svi tipovi argumenata odgovaraju

tipovima parametara (broj 2 je cijeli broj, dok je 2.0 realan!!!)

6. Polja

Ovo poglavlje objašnjava polja i ilustruje njihovu upotrebu pri definisanju varijabli. Polje se sastoji

od niza objekata (nazivaju se i elementi niza), koji su istog tipa i zauzimaju neprekidan memorijski

prostor. Op enito, samo polje ima simboli ko ime, a ne njegovi elementi. Svaki elemenat je

identificiran njegovim indeksom, koji pokazuje položaj nekog elementa u nizu. Broj elemenata u

nizu naziva se dimenzija polja. Dimenzija polja je fiksirana i prethodno odre ena, i ne može se

promijeniti u toku izvršenja programa.

Polja su pogodna za predstavljanje podataka koji se sastoje od mnogo sli nih, individualnih

objekata. Primjeri za to su lista imena, tabela gradova i njihovih sezonskih temperatura.

6.1 Definisanje i inicializacija polja

Varijabla polje je definisana specificiranjem njegove dimenzije i tipa njegovih elemenata. Na

primjer, polje koje obuhvata 10 mjerenja visine (od kojih je svaka cijeli broj) može se definisati na

sljede i na in:

int visina[10];

Pristup individualnim elementima nekog niza vrši se indeksiranjem niza. Prvi elemenat niza uvijek

ima indeks 0. Na taj na in, visina[0] i visina[9] ozna avaju prvi i posljednji elemenat niza

Programski jezici, C++

22

Page 23: C++ UVOD U PROGRAMIRANJE

visina, respektivno. Svaki elemenat niza se može tretirati kao varijabla tipa cijeli broj. Tako, na

primjer, da bi smo tre em elementu ovog niza pridružili vrijednost 177, pisali bismo:

visina[2] = 177;

Pokušaj pristupa nepostoje em elementu nekog niza (na primjer visina[-1] ili visina[10]) može

uzrokovati ozbiljnu grešku (tzv. runtime greška, ili greška 'indeks izvan granica’).

Procesiranje bilo kojeg niza obi no uklju uje korištenje petlje, koja ide kroz niz od elementa do

elementa. Sljede i primjer pokazuje funkciju koja ra una srednju vrijednost nekog niza:

const int velicina = 3;

double Srednja (int broj[velicina]) { double srednja = 0;

for (int i = 0; i < velicina; ++i) srednja += broj[i]; return srednja/velicina; }

Kao i kod ostalih varijabli, vrijednosti elemenata niza se mogu inicijalizirati. U tu svrhu koriste se

zagrade{}, izme u kojih se specificira lista po etnih vrijednosti elemenata niza koje su odvojene

zarezom. Na primjer,

int broj[3] = {5, 10, 15};

definiše niz broj, i inicijalizira tri elementa ovog niza na vrijednosti 5, 10, 15, respektivno. Ovo je

tzv. eksplicitno inicijaliziranje. Kada je broj vrijednosti u inicijalizatoru manji od dimenzije niza,

ostali elementi su inicijalizirani na nulu, kao u slu aju:

int broj[3] = {5, 10}; // broj[2] je inicijaliziran na 0

Kada se koristi potpuni inicijalizator (broj po etnih vrijednosti odgovara dimenziji niza), dimenzija

niza postaje suvišna i može se izostaviti, tj. broj elemenata je implicitan u inicijalizatoru (implicitna

inicijalizacija). U ovom slu aju inicijalizacija niza broj se može izvršiti i na sljede i na in:

int broj[] = {5, 10, 15}; // dimenzija nije potrebna

Još jedan primjer u kojem se dimenzija niza može izostaviti je kada je niz parametar u nekoj

funkciji. Na primjer, funkcija Average iz ranijeg primjera se može napisati na bolji na in, ako se

postavi da dimenzija niza nije fiksirana na neku konstantnu vrijednost, nego se dodaje još jedan

parametar, tj.

double Srednja (int broj[], int velicina) { double srednja = 0;

for (int i = 0; i < velicina; ++i) srednja += broj[i]; return srednja/velicina; }

Kompletan program bi, u tom slu aju, bio:

Programski jezici, C++

23

Page 24: C++ UVOD U PROGRAMIRANJE

#include <iostream> using namespace std;

double Srednja (int broj[],int velicina) { double srednja = 0;

for (int i = 0; i < velicina; ++i) srednja += broj[i]; return srednja/velicina; }

main () {

int velicina; cout <<"Broj elemenata ...."; cin >> velicina; int n[velicina]; for(int i=0;i<velicina;i++){ cout<<"n["<<i<<"]= "; cin>>n[i]; } cout << "Srednja vrijednost je .... "<<Srednja(n,velicina) << "\n"; system("PAUSE"); }

Sljede i program predstavlja primjer pomo u kojeg se unosi, sortira i ispisuje neki niz. Pri tome,

sortiranje je izvedeno od najve eg prema najmanjem elementu niza.

#include <iostream>

using namespace std;

int main ()

{

// DEKLARACIJA

int x[10];

int y[10];

int i, j, n;

// UNOSENJE

cout << "Unesite broj clanova polja: ";

cin >> n;

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

{

cout << "Unesite clan br. " << i << ": ";

cin >> x[i];

y[i] = x[i];

}

// SORTIRANJE

for (i = 0; i < n-1; i++)

{

for (j = i+1; j < n; j++)

{

if (y[i] < y[j]) swap(y[i],y[j]);

}

}

// STAMPANJE

cout << "x:" << '\t' << "y:" << endl;

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

{

cout << x[i] << '\t' << y[i] << endl;

}

}

Programski jezici, C++

24

Page 25: C++ UVOD U PROGRAMIRANJE

Interesantno je napomenuti da je i C++ string niz karaktera. Tako

char str[] = "HELLO";

definiše varijablu str kao niz šest (6) karaktera: pet slova i prazan karakter (null-character).

Završni prazan karakter postavlja kompajler. Za razliku od toga,

char str[] = {'H', 'E', 'L', 'L', 'O'};

definiše varijablu str kao niz od 5 elemenata.

6.2 Multidimenzionalni nizovi

Niz može da ima i više nego jednu dimenziju (dvije, tri, i više). Ipak, organizacija niza u memoriji

je ista kao i prije, tj. neprekidna sekvenca elemenata. Percepcija programera, pak, je druga ija. Na

primjer, pretpostavimo da je srednja vrijednost temperatura po godišnjim dobima za tri australijska

grada data sljede om tabelom

Tabela II.6.1 Srednje temperature gradova

Ovo se može predstaviti dvodimenzionalnim nizom cijelih brojeva:

int godDobTemp[3][4];

Ovo je u memoriji predstavljeno kao neprekidan niz od 12 elemenata tipa cijeli broj. Programer,

me utim, može to zamisliti kao tri reda od po 4 elementa u svakom, kao na Sl. II.6.1.

Slika II.6.1 Organizacija varijable godDobTemp u memoriji

Kao i kod jednodimezionalnih nizova, elementima nizova se pristupa preko indeksa. No, neophodan

je dodatni indeks za svaku dimenziju. Na primjer, srednja temperatura u Sidneju u toku ljeta, data je

elementom godDobTemp[0][1].

Inicijalizacija niza se može obaviti pomo u ugniježdenog inicijalizatora, kao:

int godDobTemp[3][4] = {

{26, 34, 22, 17},

{24, 32, 19, 13},

{28, 38, 25, 20}

};

Pošto se ovaj dvodimenzionalni niz mapira kao jednodimenzionalni niz od 12 elemenata, mogu e je

koristiti i:

int godDobTemp[3][4] = {

Prolje e Ljeto Jesen Zima

Sidnej 26 34 22 17

Melburn 24 32 19 13

Brizbejn 28 38 25 20

... 32 19 13 28 38 25 ...26 34 22 17 24 20

First row Second row Third rowPrvi red Drugi red Tre i red

Programski jezici, C++

25

Page 26: C++ UVOD U PROGRAMIRANJE

26, 34, 22, 17, 24, 32, 19, 13, 28, 38, 25, 20

};

Ipak, bolja opcija je korištenje ugniježdenog inicijalizatora, pošto ne samo da je pregledniji, nego

daje i dodatne mogu nosti. Na primjer, ako nam je samo prvi elemenat svakog reda razli it od nule,

a ostali su jednaki nuli, mogli bismo koristiti:

int godDobTemp[3][4] = {{26}, {24}, {28}};

Tako er je mogu e izostaviti prvu dimenziju (implicitna inicijalizacija), kao u:

int godDobTemp[][4] = {

{26, 34, 22, 17},

{24, 32, 19, 13},

{28, 38, 25, 20}

};

Procesiranje multidimenzionalnih nizova je sli no jednodimenzionalnim, s tim da se moraju korisiti

ugniježdene petlje. Sljede i primjer pokazuje pronalaženje maksimalnog elementa u

dvodimenzionalnom nizu iz prethodnih primjera.

#include <iostream> using namespace std;

const int redovi = 3; const int kolone = 4;

int godDobTemp[redovi][kolone] = { {26, 34, 22, 17}, {24, 32, 19, 13}, {28, 38, 25, 20} };

int najvecaTemp (int temp[redovi][kolone]) { int najveca = 0;

for (int i = 0; i < redovi; ++i) for (int j = 0; j < kolone; ++j) if (temp[i][j] > najveca) najveca = temp[i][j]; return najveca; }

main () { cout << najvecaTemp(godDobTemp) << "\n"; system("PAUSE"); }

Napomena: Treba paziti kako se inicijalizira vrijednost kontrolne varijable najveca u prethodnom

primjeru. Ovdje se koristila vrijednost nula. Me utim, najbolje bi bilo kada bi se inicijalizirala na

vrijednost prvog elementa niza, jer u slu aju svih negativnih elemenata niza, nula bi rezultat

funkcije bez obzira da li je lan niza ili ne.

7. Datoteke

Ovo poglavlje pokazuje kako se podaci dobiveni pokretanjem nekog programa mogu sa uvati

njihovim pohranjivanjem na neku datoteku. S obzirom da uvanje podataka nema svrhu ako tim

podacima ne možemo da pristupamo, bi e objašnjeno i kako pro itati podatke sa neke datoteke.

Programski jezici, C++

26

Page 27: C++ UVOD U PROGRAMIRANJE

Datoteka, pri tome, predstavlja skup podataka koji su snimljeni na neku formu trajne memorije

(hard disk, CD-ROM, floppy disk, ...). Datoteci se pristupa preko njenog imena (filename), u ijem

sastavu se obi no nalazi ekstenzija (dio imena iza ta ke), koja ozna ava tip podataka u datoteci

(npr. .doc za Microsoft Word, .xls Microsoft Excel, .cpp za C++ izvršnu datoteku, itd.).

U osnovi, postoje dvije vrste datoteka: tekstualne i binarne. Tekstualne datoteke sadrže tekst, dok

binarne mogu sadržavati i kompleksnije vrste podataka, kao što su slike, izvršni programi, baze

podataka, itd. Tekstualnim datotekama je nešto jednostavnije pristupiti, pisati podatke u njih, te

itati sa njih. Upravo to je i razlog zbog ega e se primjeri u ovom poglavlju odnositi samo na njih.

7.1 Standardna biblioteka fstream

U ranijim poglavljima koristili smo standardnu biblioteku iostream (io se odnosi na

input/output), koja pored ostalog, daje mogu nost ispisivanja na standardni izlaz (ekran, monitor)

pomo u cout, te itanje sa standardnog upisa (tastatura) pomo u cin. Me utim, ova datoteka nam

ne omogu ava da podatke trajno sa uvamo. U tu svrhu se koristi standardna biblioteka fstream (f

se odnosi na datoteku, tj. file), koja omogu ava pisanje na i itanje sa datoteka. Ovo se postiže

pozivanjem sadržaja fstream sa:

#include <fstream>

Datoteka fstream definiše tri nova tipa podataka:

ofstream. Ovaj tip podataka predstavlja stream za izlazne datoteke (o se odnosi na

output). Pravac izlaza je sa programa na datoteku. Ovaj tip podataka se koristi za kreiranje

datoteka i pisanje informacija na njih. Ne može se koristiti za itanje datoteka.

ifstream. Ovaj tip podataka predstavlja stream za ulazne datoteke (i se odnosi na input).

Pravac ulaza je sa datoteke prema programu. Ovaj tip podataka se koristi za itanje

informacija sa datoteka. Ne može se koristiti za kreiranje datoteka i pisanje na njih.

fstream. Ovaj tip podataka predstavlja op enito stream za datoteke, ima karateristike i

ofstream i ifstream. On može kreirati datoteke, pisati na njih i itati sa njih.

7.2 'Životni’ ciklus pristupa datotekama

Kada program pristupa datotekama, bez obzira da li ih ita, ili na njih piše, ili ini oboje, on prolazi

kroz sljede e korake:

Datoteka prvo mora da se otvori. Ovo otvara put u komunikaciji izme u datoteke i stream

objekta u programu (fstream, ifstream, ofstream), koji se koristi u pristupu datoteci.

Nakon otvaranja program ita sa datoteke, piše na nju, ili ini oboje.

Na kraju, program zatvara datoteku. Ovo je bitan korak, pošto održavanje komunikacije

izme u datoteke i stream objekta zahtijeva resurse, tako da zatvaranje datoteke osloba a

ove resurse kada više nisu potrebni. Uz to, postoji mogu nost da se kasnije u programu ne

može pristupiti datoteci ako nije zatvorena prije prethodnog pristupa.

7.2.1 Otvaranje datoteka

Bez obzira da li se sadržaj datoteke treba pro itati ili se na datoteku trebaju ispisati neki podaci,

datoteka prvo treba da se otvori. Naredna poglavlja pokazuju kako se to obavlja.

Programski jezici, C++

27

Page 28: C++ UVOD U PROGRAMIRANJE

Otvaranje datoteke za pisanje

Datoteke sa pisanje se mogu otvoriti pomo u fstream i ofstream objekata na dva na ina: (i)

pomo u metode (member function) open, ili (ii) pomo u konstruktora (constructor).

Otvaranje pomo u funkcije open

Prvi argument funkcije open je ime i lokacija datoteke koja se treba otvoriti. Me utim, mogu e je

dodati i drugi argument zavisno od toga da li se fstream i ofstream poziva funkciju open, ili se

želi neki drugi modul od onog koji se daje.

Datoteka u koju želimo pisati podatke ne mora postojati. U slu aju da ne postoji, ona e se

automatski kreirati pod imenom i na lokaciji koju smo upisali. Lokacija se može dati kao relativna

(relative path) i apsolutna (absolute path). Pri tome, relativni put predstavlja lokaciju u odnosu na

naš program, tj. datoteka se stvara u direktoriju u kojem se nalazi i naš program. Ovo postižemo na

sljede i na in:

ofstream izlaz;

izlaz.open("studenti.txt");

Za razliku od relativnog puta, apsolutni put predstavlja lokaciju koja zapo inje slovom drajva,

sadrže i sve direktorije i poddirektorije dok se ne do e do datoteke. Na primjer, ako je datoteka

studenti.txt u direktoriju Pedagoski, a ovaj je podirektorij direktorija UNZE, a sve se nalazi na

tvrdom disku sa slovom C, onda bi se datoteka otvorila na sljede i na in:

ofstream izlaz;

izlaz.open("C:\\MFZE\\Pedagoski\\studenti.txt");

Vidimo da se u tom slu aju koriste po dva znaka \\, jer samo jedan izme u navodnika predstavlja

escape-sekvencu (poglavlje II.2.10).

Bez obzira da li koristimo relativni ili apsolutni put, argument za funkciju open ne mora da bude

neko ime (rije ), nego i (string) varijabla, kao što je to u sljede em primjeru:

ofstream izlaz;char imeDatoteke[80];cout << "Unesite ime datoteke: ";cin >> imeDatoteke;izlaz.open(imeDatoteke);

Važno je zapamtiti da je korištenje relativnog puta bolja opcija, jer se može desiti da neki direktorij

u apsolutnom putu ne postoji, naro ito ako se program koristi na nekom drugom ra unaru (sa

druga ijim direktorijima).

Korištenje drugog argumenta u funkciji open definiše modul u kojem se datoteka treba otvoriti.

Neke od opcija (tzv. file mode flag), koje se mogu koristiti date su u Tabeli II.7.1.

Tabela II.7.1

Opcija (file mode flag) Opis

ios::app Postoje i sadržaj datoteke je o uvan i sav izlaz se ispisuje na

kraj datoteke.

ios::binary Informacija se na datoteku piše u binarnom obliku.

ios::in Infomacija e se itati sa datoteke. Datoteka se ne kreira ako ne

postoji.

ios::out Informacija e se zapisati u datoteku. Postoje i sadržaj datoteke

je poništen.

Programski jezici, C++

28

Page 29: C++ UVOD U PROGRAMIRANJE

Ako za otvaranje datoteke koristimo ofstream objekat, onda ne moramo koristiti dodatne

argumente, ali treba zapamtiti da u tom slu aju možemo samo upisivati informaciju da datoteku, ali

ne i itati sa nje. Ako bismo, na primjer, željeli da pratimo greške izazvane pokretanjem nekog

programa i željeli sa uvati sve zapise o tome, koristili bismo opciju ios::app, tj.

ofstream izlaz;

izlaz.open("studenti.txt", ios::app);

Me utim, ako se za otvaranje datoteke za pisanje koristi fstream objekat, treba se dodati još jedan

argument, tj. opcija za pisanje (ios::in). U ovom slu aju bi bilo:

fstream izaz;izlaz.open("studenti.txt", ios::out);

Otvaranje pomo u konstruktora

Konstruktori su funkcije koje se automatski pozivaju kada se pokušava kreirati primjerak (instanca)

nekog objekta (instanca prema objektu je isto što i varijabla prema tipu podatka). Oni mogu biti

optere eni (overloaded), tako da isti objekat može imati konstruktor sa nijednim, jednim, dva, ili

više argumenata. U prethodnim primjerima (npr. fstream izlaz;) korištene su naredbe sa

konstruktorima bez argumenata.

Naredni primjeri pokazuju upotrebu konstruktora sa jednim i dva argumenta, respektivno:

ofstream izaz("studenti.txt");fstream izaz("studenti.txt",ios::out);

Primjena konstruktora, u stvari, omogu ava deklarisanje i inicijalizaciju primjerka nekog objekta.

Kao i u slu aju deklarisanja i inicijalizacije varijabli, korištenje jednog od na ina otvaranja datoteke

zavisi od samog programa i naših potreba.

Otvaranje datoteka za itanje

Sve što je re eno u prethodnom poglavlju može se primijeniti i na otvaranje datoteka za itanje.

Jedina razlika je što se, uz korištenje objekta fstream, umjesto objekta ofstream koristi iostream

objekat. Uz to, datoteka sa koje se ita mora postojati, jer se pokretanjem jednog od prethodnih

objekata ne kreira datoteka.

Stoga, otvaranje datoteke za itanje se može otvoriti na jedan od sljede ih na ina:

ifstream ulaz;

ulaz.open("studenti.txt");

fstream ulaz;

ulaz.open("studenti.txt", ios::in); //obavezno dodati argument ios::in

ifstream ulaz("studenti.txt");

fstream ulaz("studenti.txt", ios::in);

Otvaranje datoteka za itanje i pisanje

Kao što je ranije re eno, objekat fstream se može koristiti za otvaranje datoteka i za pisanje i za

itanje. U tu svrhu koristi se sljede a sintaksa:

Programski jezici, C++

29

Page 30: C++ UVOD U PROGRAMIRANJE

fstream izlazUlaz;

izlazUlaz.open("studenti.txt", ios::in | ios::out);

ili pomo u konstruktora:

fstream izlazUlaz ("studenti.txt", ios::in | ios::out);

U oba primjera korišten je tzv. bitwise operator (|), koji ima isto zna enje kao logi ki operator ||

(ili).

Provjera da li je datoteka otvorena

Prije nego po nemo itati podatke sa neke datoteke, korisno je znati da li ona uopšte postoji.

Provjera se može izvršiti na dva na ina. Ako se datoteka ne može otvoriti za itanje, onda je: (i)

vrijednost ifstream objekta jednaka NULL (nula), (ii) vrijednost funkcije fail objekta ifstream je

true(1). Sljede i primjer ilustruje korištenje oba na ina.

#include <fstream> #include <iostream> using namespace std;

int main (){ ifstream ulaz; ulaz.open("studenti.txt"); cout << "(ulaz) = " << ulaz << endl; cout << "(ulaz.fail()) = " << ulaz.fail() << endl; return 0; }

Ako datoteka studenti.txt ne postoji nakon izvršenja programa dobijamo:

(ulaz) = 0

(ulaz.fail()) = 1

U slu aju da postoji izlaz bi, na primjer, bio:

(ulaz) = 0x22fed4

(ulaz.fail()) = 0

Pri emu 0x22fed4 predstavlja memorijsku lokaciju (adresu) ifstream varijable ulaz.

Za razliku od ifstream objekta, ofstream objekat koji pokušava otvoriti datoteku koja ne još

postoji nije NULL, a njegova fail funkcija ima vrijednost false(0). To je zbog toga što operativni

sistem kreira datoteku, ako ona ne postoji. Ipak, i u ovom slu aju je korisno provjeriti da li datoteka

postoji. Naime, ako datoteka postoji, ali ima osobinu read-only, dobi emo negativan odgovor o

njenom postojanju (vrijednost iostream objekta je NULL, a funkcije fail je true, tj. 1).

7.2.2 Zatvaranje datoteka

Svaka otvorena datoteka se treba zatvoriti prije nego se napusti program. To je zbog toga što svaka

otvorena datoteka zahtijeva sistemske resurse. Osim toga, neki operativni sistemi imaju ograni enje

na broj otvorenih datoteka kojima se ne 'manipuliše'.

Zatvranje datoteka se vrši pomo u funkcije close. Sljede i primjeri pokazuju njenu upotrebu pri

zatvaranju datoteka za pisanje i itanje:

Programski jezici, C++

30

Page 31: C++ UVOD U PROGRAMIRANJE

ofstream izlaz;izlaz.open("studenti.txt");// skup naredbioutfile.close();

ifstream ulaz;ulaz.open("studenti.txt");// skup naredbi ulaz.close();

7.2.3 Pisanje na datoteke

Pisanje podataka na datoteku se izvodi pomo u operatora za ispisivanje (<<), kao što je to bio slu aj

sa ispisivanjem na ekran (cout <<). Jedina razlika je u tome što se ovdje koristi fstream ili

iostrem objekat, a ne cout objekat.

Sljede i program pokazuje primjer upisivanja podataka na datoteku studenti.txt:

#include <fstream> #include <iostream> using namespace std;

int main (){ char podaci[80]; ofstream izlaz; izlaz.open("studenti.txt"); cout << "Zapisivanje u datoteku" << endl; cout << "=======================" << endl; cout << "Upisite razred: "; cin.getline(podaci, 80); izlaz << podaci << endl; cout << "Unesite broj studenata: "; cin >> podaci; cin.ignore(); izlaz << podaci << endl; izlaz.close(); return 0; }

Upotrebom drugog argumenta pri otvaranju datoteke za pisanje (ios::app) možemo dodavati

sadržaj na postoje u datoteku kao što to pokazuje sljede i primjer. U ovom primjeru zapisivanje se

prekida nakon unosa znakova ***.

#include <iostream> #include <string> #include <fstream> using namespace std;

int main () { string x; ofstream izlaz; izlaz.open("podaci.txt", ios::app); while (x != "***") { cout << "Unesite neki tekst (za kraj unesite ***):" << endl; cin >> x; izlaz << x << endl; } izlaz.close(); }

Programski jezici, C++

31

Page 32: C++ UVOD U PROGRAMIRANJE

7.2.4 itanje sa datoteka

Analogno prethodnom poglavlju, itanje podataka sa datoteka obavlja se pomo u operatora za

itanje (>>) kao što je to slu aj sa ispisivanjem sa tastature (cin>>). Sljede i primjer nadopunjava

onaj iz prethodnog poglavlja, tj. nakon što korisnik upisuje informacije na datoteku, program ita

iste podatke i ispisuje ih na ekran.

#include <fstream> #include <iostream> using namespace std;

int main (){ string podaci; ofstream izlaz; izlaz.open("studenti.txt"); cout << "Upisivanje u datoteku" << endl; cout << "=====================" << endl; cout << "Unesite razred: "; getline(cin,podaci); izlaz << podaci << endl; cout << "Unesite broj studenata: "; cin >> podaci; cin.ignore(); izlaz << podaci << endl; izlaz.close();

ifstream ulaz; cout << "Citanje sa datoteke" << endl; cout << "===================" << endl; ulaz.open("studenti.txt"); getline(ulaz,podaci); cout << podaci << endl; getline(ulaz,podaci); cout << podaci << endl; ulaz.close(); return 0; }

Me utim, vidimo da je u ovom slu aju korištena C++ string klasa umjesto varijable podaci tipa

char. Na taj na in se pomo u funkcije getline može ispisati ime razreda koje ima više od jedne

rije i.

Prethodni primjer se može napisati i na programerski adekvatniji na in upotrebom funkcija za

itanje i pisanje na datoteku.

#include <fstream> #include <iostream> #include <string> using namespace std;

bool upisiDatoteku (ofstream&, char*); bool citajDatoteku (ifstream&, char*);

int main (){

string podaci; bool status; ofstream izlaz; status = upisiDatoteku(izlaz, "studenti.txt"); if (!status) { cout << "Datoteka za ispisivanje se ne moze otvoriti\n"; cout << "Program se zavrsava\n"; system("PAUSE");

Programski jezici, C++

32

Page 33: C++ UVOD U PROGRAMIRANJE

return 0; } else { cout << "Pisanje u datoteku" << endl; cout << "==================" << endl; cout << "Upisite razred: "; getline(cin, podaci); izlaz << podaci<< endl; cout << "Unesite broj studenata: "; cin >> podaci; cin.ignore(); izlaz << podaci<< endl; izlaz.close(); }

ifstream ulaz; status = citajDatoteku(ulaz, "studenti.txt"); if (!status) { cout << "Datoteka za citanje se ne moze otvoriti\n"; cout << "Program se zavrsava\n"; system("PAUSE"); return 0; } else { cout << "Citanje se datoteke" << endl; cout << "===================" << endl; getline(ulaz, podaci); while(!ulaz.fail()) { cout << podaci << endl; getline(ulaz, podaci); } ulaz.close(); } system("PAUSE"); return 0; }

bool upisiDatoteku (ofstream& datoteka, char* strDatoteka) { datoteka.open(strDatoteka); if (datoteka.fail()) return false; else return true; }

bool citajDatoteku (ifstream& datoteka, char* strDatoteka) { datoteka.open(strDatoteka); if (datoteka.fail()) return false; else return true; }

Programski jezici, C++

33