Sie sind auf Seite 1von 153

SADRAJ

1. Openito o programima i programskim jezicima


1.1. Ljudi i raunari...................................................................................................................6 1.2. Podjela programskih jezika..................................................................................................7

2. Programski Pristup
2.1. O proceduralnom i neprceduralno programiranju ...............................................................10 2.2. Osn ov e f az e raz voja p rog ramiran ja . .. ... ..... .... ... ... .. . .... . .. ... ... .... ... ... ... .... ... 1 2

3 .Algoritmi
3.1.Uvod u algoritme ..........................................................................................................13 3.2.Dijagram toka ..................................................................................................................14 3.3.Pravolinijske algoritamske strukture.....................................................................................18 3.4.Grananje..........................................................................................................................19 3.5.Petlje...............................................................................................................................23

4. Pseudo Jezik
4.1.Varijable..........................................................................................................................28 4.2. Operatori........................................................................................................................29 4.3.Funkcije...........................................................................................................................33

5 .Kako zapoeti?
5 . 1.M S Vis ual C++ .. .... ... ... ... .... ... ... ... .... ... ... ... . ... ... ... ... .... ... ... ... .... .. . ... ... . ... . 3 4 5.2.Programski paket DEV C++..............................................................................................37 Pitanja za utvrivanje ......................................................................................................41

6.Uvod u C++
6.1 Proces kompajliranja. .......................................................................................................42 6.2. Rijei u C++ programskom jeziku ......................................................................................44 6.3.Struktura programa...........................................................................................................45 6.4. Varijable .........................................................................................................................47 6.5. Memorija ........................................................................................................................48 6.6. Ulazno/izlazni usmjerivai toka ..........................................................................................49 6.7. Komentari .....................................................................................................................50

C++ programiranje za srednje kole prof.Smajo Meki

6.8. Imena (identifikatori) .......................................................................................................51 6.9. Tipovi podataka ...............................................................................................................52 Pitanja za utvrivanje .............................................................................................................55

7.Operatori
7.1 Aritmetiki operatori .......................................................................................................56 7.2 Relacijski operatori .....................................................................................................58 7.3 Logiki operatori .............................................................................................................59 7.4 Bitovni operatori .............................................................................................................59 7.5 Inkrementalni i dekrementalni operatori .............................................................................59 7.6 Operatori pridruivanja .....................................................................................................60 7.7 Operator razdvajanja (zarez-operator) ...............................................................................61 7.8 typedef imena ................................................................................................................61 7.9 sizeof operator ...............................................................................................................62 7.10 Hijerarhija operatora ......................................................................................................62 Pitanja za utvrivanje ............................................................................................................63

8.Naredbe
8.1 Jednostavne i sloene naredbe ...........................................................................................64 8.2 Naredba if........................................................................................................................66 8.3 Naredba switch-case .........................................................................................................72 8.4 Naredba for .....................................................................................................................75 8.5 Naredba while . ................................................................................................................78 8.6 Naredba do ......................................................................................................................79 Pitanja za utvrivanje .............................................................................................................81

9. Funkcije
C++ programiranje za srednje kole prof.Smajo Meki 9.1. Definicija ........................................................................................................................81 9.2. Parametri i argumenti ......................................................................................................84 9.3. Globalne i lokalne varijable ...............................................................................................85 9.4 Rekurzivne funkcije ..........................................................................................................86 Pitanja za utvrivanje ..........................................................................................................87

10. Polja (Arrays ),nizovi


10.1. Jednodimenzionalni niz ...................................................................................................87 10.2. Deklaracija niza..............................................................................................................88 10.3.Inicijalizacija niza............................................................................................................89 10.4.Pristup elementima niza...................................................................................................91 10.5.Multidimenzionalna polja(nizovi)........................................................................................94 Pitanja za utvrivanje ........................................................................................................96

11. Pointeri
11.1. Osnovno o pointerima ....................................................................................................97 11.2. Dinamika memorija ......................................................................................................97 11.3. Pointeri i polja ...............................................................................................................99 11.4. Aritmetika sa pointerima .................................................................................................99 11.5. Funkcijski pointeri ........................................................................................................101 Pitanja za utvrivanje ........................................................................................................102

12. Datoteke
12.1. Standardna biblioteka fstream .......................................................................................103 12.2. Otvaranje datoteka ......................................................................................................103 12.3. Zatvaranje datoteka .....................................................................................................107 12.4. Pisanje na datoteke ......................................................................................................108 12.5. itanje sa datoteka ......................................................................................................110 Pitanja za utvrivanje ........................................................................................................113

13.Zbirka zadataka

113

14.Rjeenja

123
C++ programiranje za srednje kole prof.Smajo Meki

Literatura

157

Kratka biografija autora Dipl.prof.Informatike Smajo(Irfana)Meki- zv.Smayson- roen 01.01.1972.u G.Bukovici Travnik; Srednju tehniku kolu zavrio u Zenici,Nastavniki fakultet zavrio na Univerzitetu emal Bijedi u Mostaru,nastavio studij na Panevropskom Univerzitetu Apeiron na FIT-u(Fakultet Informacionih Tehnologija) u Banjaluci smjer nastavnika informatiku gdje dobiva zvanje Diplomirani profesor Informatike,Specijalistiki studio zavrio na istom fakultetu,a Diplomski/Specijalistiki rad na temu Poreenje Pascala i C++ u nastavnom procesu odbranio pred akademikom dr.Zoran..Avramovi dipl.ing.elektrotehnike. Oenjen, otac etiri sina,trenutno nastanjen na Kalibunaru-Travnik, uposlen u Mjeovitim srednjim kolama Busovaa i Vitez.

Rje autora Autor ove knjige je pokuao na osnovu jako puno literature, dostupne u raznim formatima i na mnogim jezicima, na temu C++ programiranje , da u skladu sa nastavnim planom i programom za srednje kole izdvoji i obradi osnovne teme iz ove oblasti.Teme su uraene uz potovanje pedagokih nastavni principa.Cilj ove knjige je lake shvatanje predvienog gradiva ,postupno rjeavanja zadataka ,stjecanje rutina,navika,upornosti,preciznosti,analize i sinteze....Ovu knjigu prati projekat u html-u C++ programiranje za srednje kole na www.mssbusovaca.com.ba. ,takoer je u pripremi muldimedijalni DVD koji prati ovu knjigu. Uraeni materijal moe biti od koristi za sve one koji ele da naine prve korake u programiranju u programskom jeziku C++.Knjiga predstavlja radnu verziju i podlona je izmjenama,dopunama te se kao takva koristi interno i nije planirana komercijalizacija i umnoavanje.Zbirka rijeenih zadataka ima za cilj da motivie uenike za rad analizu,sintezu,da pokuaju da urade rjeenja na drugi nain. Autor je naveo koritene izvore za ovaj projekat,izvore nekih od tema je naveo kroz footnote, tako da je u potpunosti zatitio autorska prava navedene literature. Autor zahvaljuje menadmentima Mjeovite srednje kole Busovaa, direktoru Admiru Hodiu i menadmentu Mjeovite srednje kole Vitez direktor Hrusti Seadu na razumjevanju i podrci za ovaj projekat. Neke ideje,sugestije i primjedbe koje su ugraene u ovu knjigu predloili su moji dragi prijatelji; Dipl.prof. informatike Almin Halilovi, Prof.informatike i matematike Junuz Junuzovi, Dipl.ing.mainstva prof.abanovi Latif, Prof.Haski Selvedin.

C++ programiranje za srednje kole prof.Smajo Meki

1.Openito o programima i programskim jezicima


S programiranjem se danas susreete posvuda - bilo da programirate snimanje na videorekarderu, koristite mainu za pranje vea, vozite neki noviji automobil, koristite mobitel ili jednostavno programirate na raunaru. Zahvaljujui programiranju svijet je danas podesiv i prilagodljiv.I zato je dobro znati programirati. U ovom kratkom pregledu neemo odmah uskoiti u programiranje sistema za nadzor svemirske letjelice, ali ete razumjeti na emu se programiranje zasniva i kako funkcionira. 1 .1 . Ljud i i ra unar i Prosjeni raunar ba i nije pametna naprava . Ono nema mogunost samostalnog odluivanja, zakljuivanja , nema ono po emu se ljudi razlikuju od svih ostalih - pamet i iskustvo.Da bismo natjerali raunar da radi ono to mi elimo, moramo ga tome nauiti. Budui da raunari ne znaju samostalno misliti , programeri moraju u njih ugraditi upustva koji im govore to trebaju raditi.U situaciji slinoj programerovoj nalazi se roditelj kada svoje dijete eli nauiti jesti kaikom.Dijete je u ovom sluaju, slino kao i raunar , "prazna ploa" - treba ga nuiti i najsitnijim detaljima. Dijete prvo mora podii kaiku (ali da ne prospe njen sadraj), prinijeti je ustima, paziti da u kaici juha nije prevrua , otvoriti usta, staviti kaiku u usta (a ne pored usta), progutati sadraj kaike (ali ne i kaiku). Zapravo, ovo uope nije jednostavan postupak.Tako je i s raunarima. Njih takoer treba nauiti da rade ono to bismo mi eljeli. No ovdje je problem malo vei nego s djetetom jer raunari komuniciraju na razne naine - koriste, tj. razumiju razliite raunarske jezike. R aun ari ok o n as Danas se raunar nalazi u svakom novijem automobilu,u svakom mobitelu, ak i u najobinijem televizoru ili videorekorderu. Svi ti ureaji u sebi sadre raunar koji ima je potrebno naloiti to da rade. Tako e se televizor sam iskljuiti nakon nekog vremena,ako mu vi tako zadate, videorekorder e u 20:15 snimiti utakmicu na drugom programu u trajanju od 120 minuta, maina za pranje rublja e ukljuiti program za pranje osjetljivog rublja,a automobil e upotrijebiti neki od ugraenih sistema za sprjeavanje zanoenja na cesti. Spomenimo i obine line raunare. Oni su sposobnI obavljati mnogo kompliciraniji skup radnji nego raunari ugraenI u npr. kuanske ureaje. Unato tome, svi raunari imaju jednu zajedniku injenicu - ne mogu samostalno zakljuivati i donositi odluke. Zato im programer treba rei ta da rade. Programer to ini koristei poseban programski jezik i posebne naredbe pomou kojih komunicira s raunarom i opisuje mu to i kako treba raditi .Raunarski program je skup naredbi koji govori raunaru na koji nain da obavi odreeni zadatak. Tekst programa koji je itljiv programeru i korisniku zove se izvorni kod programa, dok je izvrna verzija programa binarna, i moe je itati i izvoditi samo raunar. Programski jezik je skup leksikih, sintaksnih i semantikih pravila koja uobliuju strogu strukturu pisanja izvornog koda. Svaki program sastoji se od naredbi. Naredbe se sastoje, u ovisnosti o programskom jeziku, od izraza, konstanti, identifikatora i poziva.Openito postoji vie nivoa programskih jezika, i podijeljeni su u generacije jezika. Do danas postoje jezici od prve do pete generacije, no to nije jedina podjela programskih jezika, oni se takoer razlikuju po namjeni, nainu izvravanja, strukturiranosti i proceduralnosti.1 1 .2 .Pod je l a pro gram sk ih jez i ka

Preuzeto i obraeno iz knjige Informatika i raunarstvo

C++ programiranje za srednje kole prof.Smajo Meki

Pod je la pr ogram sk i h jez ika po namje ni : Programski jezici za numerike probleme Programski jezici za poslovne probleme Programski jezici temeljeni na listama i nizovima Vienamjenski jezici (u ovu skupinu spadaju .NET jezici) Pod je la po na i nu i zvoe n ja : Imperativni postiu funkcionalnost pridruivanjem vrijednosti i njihovim ispitivanjem, te skokovima (Ada, C, FORTRAN, Pascal) Funkcionalni jezici ne postoji pridruivanje, temelje se na funkcijama i listama (Lisp, ML, LOGO) Ciljno orijentirani jezici temelje se na izvravanju upita, dok nain na koji se on izvrava ostaje sakriven (Sql, Prolog) Objektno orijentirani jezici temelje se na manipulaciji objektima (VB 6.0) Hibridni jezici u ovu grupu spadaju .NET jezici i C++

P o st ruk tu ri ran os ti jez ic i mog u b it i s truk tu riran i i n es t ruktu riran i . P o p roc edu raln osti mogu b it i p roc edu raln i i n ep roc edu ralni . Podjela programskih jezika po generacijama generacijsku podjelu danas smatraju najbitnijom. Jezici p rve ge nera ci je temelje se na mainskom jeziku, tj. kodovima naredbi koje izvodi direktno sam procesor. Programi su napisani u binarnim kodovima, i vrlo su neitljivi. Kasnije su dodani simbolini nazivi naredbama, no skokovi su bili izvedeni prema hardverskim adresama koje su zadane brojem.

Primjer programa u mainskom kodu:

C++ programiranje za srednje kole prof.Smajo Meki

Zanimljivo je to se i danas svaki program na kraju svodi na ovaj nivo, jer to je jedini oblik programa koji raunar razumije. Za prevoenje jezika vieg nivoa jezike nieg nivoa koriste se programi zvani p revod ioci ili comp il er i . D rug u ge ne rac i ju programskih jezika predstavljaju simboliki programski jezici ili Assembli. Od jezika prve generacije razlikuje se u tome to su uvedena simbolika imena adresa (labeli) i jednostavniji pristup adresiranjima putem mnemonikih kodova pojedinih naredbi. Mnenonik ili mnemoniki kod je simboliki prikaz binarne naredbe, npr. Naredba 001011 predstavlja se mnemonikom MOV. Primjer programa pisanog u jeziku druge generacije:

C++ programiranje za srednje kole prof.Smajo Meki

Programski jezici t r e e ge ne ra ci je temelje se na proceduralnoj paradigmi, tj. program se izvodi putem pozivanja procedura, osim samo jednostavnog dodjeljivanja vrijednosti i njihovog ispitivanja. Ovakvi jezici prevode se u jezike niih nivoa da bi se mogli izvoditi, i esto jedna naredba jezika ovog nivoa predstavlja mnogo naredbi jezika nieg nivoa. Uneseno je razrjeivanje izraza i prevodioc vri niz analiza koje olakavaju pisanje programa i ispravljanja greaka. U ovu grupu pripadaju jezici C, Pascal i drugi. Primjer jezika pisanog u jeziku tree generaci:

Jezici e tvr te g enera c i je temelje se uglavnom na objektno orijentiranoj paradigmi, te raznim generatorima koda i korisnikim interfejsom. Ovi jezici su obino kombinacija raznih alata, tako da je veina napornih i dugotrajnih postupaka automatizirana i pojednostavljena. U ovu grupu pripadaju .NET jezici, Java, Delphi itd. Program napisan u jeziku etvrte generacije predstavlja alat za brzu i jednostavnu izradu svih vrsta aplikacija. Primjer aplikacije u jeziku 4. generacije:

Jezici p e te ge ne raci je su uglavnom usko specijalizirani jezici koji esto kreiraju cijele aplikacije potpuno automatski putem raznih Wizarda i slino. Razvoj ovakvih jezika je u poetnoj fazi.

2. Programski pristup

C++ programiranje za srednje kole prof.Smajo Meki

2 .1 . O proced ura ln om p r og rami ran ju Za bilo koji problem vjerovatno postoji jednako puno naina da se isti analizira i rijei . Tako se sa programerskog aspekta, na primjer, problem moe podijeliti (dekompozirati) algoritamski ili proceduralno, tj. u odnosu na sekvencu ili proceduru dogaaja koji se moraju desiti. Alternativno, problem se moe rijeiti pomou "objektno-orijentisanog"pristupa, posmatrajui razne cjeline koje utjeu jedne na druge i uzimajui u obzir njihovo meusobno djelovanje. Ova dva pristupa u dekompoziranju problema algoritamski i objektno-orijentisani su dva pristupa koji programeri najee koriste. Pristupi su figurativno prikazani na Sl.2.1. Algoritamski pristup poinje optim zadatkom koji treba izvriti (kao to je "omoguiti korisniku da izvri opte bankarske funkcije"), zatim dijeli opti zadatak na naredne nivoe specificiranijih podzadataka (kao to je "proces podizanja novca", te "proces stavljanja depozita"), te na dalje nivoe jo specifinijih zadataka (kao to su "upitaj korisnika na vrijednost depozita" ili "verifikuj unesenu vrijednost kao vaeu").

Slika 2.1: Dva pristupa u dekompoziranju problema

10

C++ programiranje za srednje kole prof.Smajo Meki

Slika 2.2: Algoritamska dekompozicija problema Kada se zadatak prikae u obliku dijagrama, najoptiji zadatak je obino na vrhu, a najspecifiniji zadaci se granaju prema dnu. Razni pravougaonici u takvom "stablu" odgovaraju raznim procedurama i podprocedurama koje treba programirati, kao to je prikazano na Sl.2.2. Algoritamske ili proceduralne metode u dizajniranju softvera su razvijene u kasnim 60tim kako bi se ukazalo na probleme u kojem se u to vrijeme nalazilo opte stanje u razvijanju softvera. Poto su novi pristupi omoguili strukturni pristup programiranju (u odnosu na haotini "hack and run" pristup, koji su koristili neki programeri), moe se naii i na podatak da se algoritamski ili proceduralni pristup programiranju zove "strukturno programiranje". S obzirom da ovaj pristup poinje na vrhu (opti zadatak koji treba izvriti) i dijeli najvii zadatak na naredne nivoe specifinijih podzadataka prema dnu,ovaj pristup se ponekad naziva i "top-down" pristup. Neki autori ga zovu i proceduralni pristup, imajui u vidu da se algoritamski pristup fokusira na procedure koje izvravaju zadatak. Dakle, ovaj pristup dizajniranju softvera ima razliite nazive, i to: Funkcionalna dekompozicija Algoritamska dekompozicija Strukturno programiranje "top-down" programiranje proceduralno programiranje Bez obzira na naziv, ovaj pristup se fokusira na funkcionalnost programa,poinjui sa vrha (najoptija funkcija), i idui prema dnu ka najspecifinijim funkcijama. Mnogi programeri i danas koriste ovaj pristup, a jo uvijek je koristan za izradu kvalitetnih softvera , naroito za manje programe ili softverske module. Bez obzira na injenicu da je C++ u osnovi OOP jezik, ovaj tekst se bavi osnovama C++ sintakse u oblasti proceduralnog programiranja, kao uvod u OOP paradigmu. Nep ro ced ura lno p rogram ira n je Ovaj pristup programiranju temelji se na slijednom izvoenju nekog programa. Uglavnom se sastoji od jednostavnog niza naredbi gdje je izvedeno grananje putem goto ili sline naredbe. Ne postoje pozivi metoda i funkcija. Ovi jezici su zastarjeli i nedovoljno razvijeni za dananje potrebe.

Modularno programiranje

11

C++ programiranje za srednje kole prof.Smajo Meki

Modularno programiranje omoguava fragmentaciju koda na module koji mogu biti pisani u razliitim datotekama, i tako pojednostavljuje programe i poveava njihovu itljivost. Unesen je pojam dijeljenja koda izmeu aplikacija. 2 .2 .O snove faze razvo ja prog rami ran ja Analiza problema Postavljanje modela Izrada algoritma Izrada dijagrama toka Kodiranje programa Prevoenje programa Testiranje programa Dokumentiranje programa Eksploatacija programa Svrha programa je rjeavanje problema, najei nain rjeavanja je pomou tri modela model podataka model procesa i model resursa. Model podataka sadri definiciju podataka (nazive, vrste, dimenzije, ogranienja vrijednosti...) te strukture podataka (nizovi, skupovi, datoteke, tablice...). Model procesa moe biti prikazan razliitim tehnikama (dijagram toka, dijagram strukture procesa, dijagrami akcija....), ali svi oni, na svoj nain, prikazuju slijed odvijanja procesa. Model resursa sadri definiciju raunarskih resursa i njihovih svojstva (operativni sistem, vrsta programskog prevodioca, svojstva jedinica raunara...) koje su potrebne da bi program uredno radio.

MODEL RESURSA

MODEL PODATAKA

MODEL PROCESA

ema rijeavanja problema

12

C++ programiranje za srednje kole prof.Smajo Meki

3.Algoritmi
3.1.Uvod u algoritam Priu o algoritmima zapoeti emo onako kako poinju sve klasine prie.Nekada davno ivio je u Bagdadu pisac, matematiar, astronom i geograf po imenu Muhammed ibn Musa al Khowarizmi .Vjerojatno nije niti sanjao tamo daleke 852. godine kada je pisao knjigu Kitab al jabr w'al-muqubala da e od toga nastati ak dva uzroka glavobolje uenicima deset-jedanaest vijekova nakon toga. Njegov al jabr je postala algebra. Isto tako pravila rjeavanja iz poetka prvenstveno matematiki problema su iskrivljavanjem imena al Khowarizmi nazivana algoritmi. No, tu grekama nije kraj. Prema korijenu rijei bilo bi pravilno umjesto algoritmi koristiti algorizmi. Ali kako jezik nije nauka nego skup dogovora, izgleda da je dogovoreno da najee greke postaju jezika pravila.Tako mi danas imamo algoritme, a oni su niz preciznih uputa koje nas korak po korak vode do rjeenja nekog problema.To su zapravo toliko precizne upute da za njihovo izvravanje nije potrebna inteligencija.Zato bi se mi bavili stvarima za koje ne treba nimalo pameti?Zato to izrada algoritma u programiranju prethodi samom pisanju programa. Pri pisanju programa prvo nam mora biti jasno to se zapravo od programa oekuje.Kao i kod rjeavanja zadataka u bilo kom podruju prvo moramo znati postaviti problem.Drugi korak je gruba skica rjeenja.Trei korak je izrada algoritma. Ako smo dobro napravili algoritam, tada pisanje programa nije nita drugo negoli prepisivanje algoritma u neki programski jezik.Kada smo to uinili dobili smo program, a program "tjera" raunar da radi ono to mi zapravo elimo.Neko je rekao da je raunar idiot velike brzine. To je ustvari bit prie o algoritmima. Mi put do rjeenja moramo toliko rascjepkati i detaljno napisati da bi ga mogao razumjeti i taj "idiot velike brzine".Drugim rijeima, upute moraju biti jednostavne i precizne tako da ih moe izvravati i maina. Pokuajte se sjetiti gdje ste zadnji put proitali neko detaljno uputstvo. Moda vam je i bilo u rukama,ali niste itali jer to ve znate napamet, kao npr.Dopuniti raun mobitela putem bona.Ili moda da probamo obrnuto. Da li ste se nedavno nali u situaciji da niste neto znali napraviti jer su upute bile toliko loe i nerazumljive ili uope niste imali upute? U svakodnevnom ivotu smo zapravo stalno u doticaju s algoritmima, a esto i postupamo po algoritmima da toga nismo niti svjesni. Znati "algoritamski" razmiljati dobro je bez obzira bavili se vi poslije programiranjem ili ne. Pojam algoritama (dijagram toka) je jedan od najstarijih i najvanijih pojomova u matematici. Teko je da se precizno definie algoritma, jer pripada grupi osnovnih pojmova kao to su skup ili taka. U poetku algoritmom se nazivaju samo pravila raunanja s brojevima, kasnije i pravila obavljanja ostalih zadataka u matematici, u XX vjeku, pojavom raunara, pojam se proiruje na informatiku, a zatim i na druga podruja. Precizan opis svih pravila i postupaka potrebnih za postizanje eljenog rezultata. Evo nekih definicija koje blie opisuju algoritam. Definicija 1. Algoritam je taan opte razumljiv propis koji definie proces transformacije poetnih podataka u traeni rezultat. Definicija 2. Algoritam je taan propis o tome koje operacije nad kojim brojevima i u kom redosljedu treba izvriti da bi se rjeili svi zadaci nekog zadatog tipa. C++ programiranje za srednje kole prof.Smajo Meki

Definicija 3.

13

Algoritam je precizan,ureeni i nedvosmisleni niz koraka koji u konanom vremenu vodi do rjeavanja problema ako problem ima rjeenje,odnosno u konanom vremenu kae da nema rjeenja ako problem nema rjeenja. Definicija 4. Algoritam je konani skup pravila koja daju redosljed operacija za rjeavanje specifinog problema. Najbitnije osobine algoritma su: Odreenost- je osobina algoritma da za iste poetne podatke daje uvjek iste rezultate. Razumljivost. -algoritam treba da bude razumljiv ovo je relativni pojam i zavisi od nivoa obrazovanja korisnika. Masovnost- je osobina algoritma da se mogu rjeavati svi zadaci istog tipa. Rezultativnost- je osobina algoritma da on mora da vodi ka rjeenju zadatka ako su poetni podaci iz skupa moguih podataka. Konanost- je osobina algoritma da se algoritam realizuje sa konano mnogo koraka. Pri tome ta konanost treba da je ostvarljiva, tj. da moe da se realizuje za neko razumno vrijeme.

Primjer algoritma Bilo koji problem se moe rijeiti izvravanjem serije akcija u odreenom redosljedu. Akcije koje e se izvriti i redosljed u kojem e se to odvijati nazivamo algoritam. Iskustvo pokazuje da je najtei dio rijeavanja programerskog problema na raunaru upravo razvijanje algoritma za rijeenje. Jednom kad je odreen ispravan algoritam, razvoj programa za sam alorgitam je poprilino jednostavan. Sljedei primjer pokazuje korektan i nekorektan sljed dogaaja za algoritam kojim elimo opisati pokretanje automobila:

KOREKTAN SLIJED: otkljuavanje automobila sjedanje u automobil paljenje motora otputanje rune konice pokretanje automobila zaustavljanje

NEKOREKTAN SLIJED:

3 .2 .D ijagra m toka (f lowc har t) Dijagram toka je sredstvo za vizualnu prezentaciju toka podataka, operacija koje se izvode, te slijeda (sekvenca) kojim se navedene operacije izvode u informacijskom sistemu. Crtanje dijagrama toka je jedna od faza rjeavanja problema i uvelike olakava pisanje programskog koda. Pri crtanju dijagrama toka potrebno je slijediti odreena upustva, te koristiti standardne simbole koje je propisao American National Standard Institute. Znaaj dijagrama toka

14

C++ programiranje za srednje kole prof.Smajo Meki

otkljuavanje automobila sjedanje u automobil paljenje motora pokretanje automobila zaustavljanje otputanje rune konice

Dijagram toka je reprezentacija kojom ilustrirate sekvencu operacija koje je potrebno izvriti kako bi se dolo do rjeenja problema. Dijagram toka se crta u ranoj fazi formuliranja kompjuterskog rjeenja. Dijagram toka olakava komunikaciju izmeu programera i poslovnih ljudi. Takoe,dijagram toka igra znaajnu ulogu u procesu programiranja jer olakava razumijevanje logike kompliciranih i opsenih problema. Jednom kad ste nacrtali dijagram toka postaje jednostavno napisati program u bilo kojem programskom jeziku. Vrlo esto je nemogue objasniti logiku programa bez dijagrama toka. Osim toga,dijagram toka je neizostavan dio dokumentacije bilo kojeg programa. Smjernice za crtanje dijagrama toka Za crtanje dijagrama toka koriste se standardni simboli. Neke od esto koritenih simbola moete pogledati u sljedeoj tabeli:

15

C++ programiranje za srednje kole prof.Smajo Meki

Za unos i ispis podataka vrlo esto se koristi paralelogram Pravila za crtanje dijagrama toka: Da bi ste nacrtali korektan dijagram toka, potrebno je napraviti popis svih zahtijeva.Dijagram toka treba biti pregledan i jednostavna za pratiti.Dijagram toka treba biti jednoznaan (ne smije kod osobe koja ga gleda izazivati vieznane konotacije). Uobiajen smjer toka je s lijeva na desno ili odozgo prema dolje.U dijagramu toka kad je u pitanju simbol za procesiranje moe postojati samo jedan izlaz Podataka C++ programiranje za srednje kole prof.Smajo Meki

Kad je u pitanju simbol odluke moe postojati samo jedan ulaz podataka, ali mogu postojati dva ili tri izlaza podataka (jedan za svaki mogui odgovor).

16

Terminalni simbol (start, kraj) takoder moe imati samo jedan ulazno, odnosno jedan izlazni tok podataka.

Ukoliko elite jasnije opisati podatke ili korake koristite simbol za napomene/komentare (annotation symbol).

Ogranienja Kompleksnost Ponekad je problem kompleksan, pa je i dijagram toka kojim ga pokuavate predstaviti kompleksan i nezgrapan. Alternative i odravanje( U sluaju potrebe za alternativnim rjeenjima vrlo esto je neophodno dijagram toka nacrtati ponovno (iz poetka).

3 .3 . Pravo linijska a lgor i tam ska s tru kt ura

17

C++ programiranje za srednje kole prof.Smajo Meki

Ukoliko je dijagram toka kompleksan bolje je koristiti simbole konektora kako bi ste reducirati broj linija toka. Izbjegavajte presijecanje (krianje) linija. Vodite rauna da vam dijagram toka ima logian poetak i kraj. Prednosti Prednosti dijagrama toka su: Komunikacija(Dijagram toka olakava komunikaciju svih koji su zainteresirani za rjeavanje problema). Efektivna analiza(Uz pomo dijagrama toka problem se moe efektivnije analizirati). Odgovarajua dokumentacija( Dijagram toka je dio obavezne programske dokumentacije, koja moe sluiti u razliite svrhe). Efikasno kodiranje( Korektan dijagram toka olakava pisanje programa (bez obzira u kojem programskom jeziku). Otklanjanje greaka( Dijagram toka olakava pronalaenje greaka). Efikasno odravanje programa( Olakava odravanje programa).

Iz osnovne kole sjeamo se da je brzina nekog tijela zapravo prijeeni put u jedinici vremena. Matematiki bismo to zapisali kao V = s / t, gdje je V brzina, s prijeeni put i t vrijeme. To je tako jednostavno da nam nije potrebna nikakva priprema i gruba skica rjeenja. Moemo odmah raditi algoritam.

Za vjebu: Pokuajmo prema ovom primjeru nacrtati dijagram toka za izraunavanje povrine pravougaonika, a zatim dijagram za izraunavanje obima pravougaonika. Evo jo jednog primjera za izraunavanje obima i povrinu kruga. Kako na tastaturi nemamo na raspolaganju grka slova, nau formulu za izraunavanje obima pisati emo kao O = 2 * r * Pi. Isto tako za sada jo ne znamo funkciju za kvadriranje pa emo formulu za povrinu kruga pisati ovako: P = r * r * Pi gdje je r * r zapravo r2. C++ programiranje za srednje kole prof.Smajo Meki

18

Za vjebu: Po uzoru na obim i povrinu kruga, pokuajte algoritme za izraunavanje obima i povrine pravougaonika spojiti tako da u jednom algoritmu bude i obim i povrina pravougaonika. 3 .4 . Gra nan je Na alost, u stvarnom ivotu zbivanja ne teku tako jednostavno kao to su to pravolinijski algoritmi. Ponekad treba stati, razmisliti, usporediti neke stvari i donijeti odluku kako dalje. Takovo mjesto u algoritmu zove se grananje. Simbol za grananje je romb. Obino se u gornji vrh upie upitnik i u sredini se postavi logiki uvjet. Grananje uvijek ima jedan ulaz i najmanje dva izlaza. Ako su samo dva izlaza tada je rije o jednostrukom grananju, a odgovori na postavljeni logiki uvjet mogu biti DA i NE, odnosno T i F (true i false). Ako je mogue vie odgovora tada je to viestruko grananje. C++ programiranje za srednje kole prof.Smajo Meki

Pr imjer 1 Sjetimo se zadataka iz prethodne lekcije za izraunvanje brzine ako su poznati put i vrijeme: V = s / t. Ako se na raunaru dogodi situacija da dijelimo s nulom program e nam izbaciti greku. Da bismo sprijeili "ispadanje" programa, prije izraunavanja brzine provjeriti emo da li je upisano vrijeme vee od 0.

19

Prepravite dijagram toka iz gornjeg primjera tako da ako upisano vrijeme t nije vee od nula da se na grani NE ispisuje poruka 'Vrijeme mora biti vee od nula' i tek tada odlazi na kraj. Pojedine znakove ili nizove znakova kao to je ova poruka u dijagramu toka piemo unutar navodnika koji ovisno o programskom jeziku koji emo poslije koristiti mogu biti jednostruki ili dvostruki. Pr im je r 2 Idemo rijeiti jo jedan zadatak. Prisjetimo se zadatka obima i povrine pravougaonika iz prethodnih vjebi koji emo jo malo proiriti. Preko tastature upisuju se stranice pravouganika a i b. Treba izraunati obim i povrinu pravougaonika te ispisati poruku o tome da li je upisani lik pravouganik ili kvadrat. C++ programiranje za srednje kole prof.Smajo Meki

20

Da objasnimo: Nakon to smo upisali stranice a i b, izraunali smo obim O i povrinu P pravougaonika. Dobivene rezultate moemo odmah ispisati.Kako emo utvrditi da li moda upisane stranice pripadaju kvadratu? Ako su stranice a i b jednake tada je to kvadrat. Ispisujemo poruke i odlazimo na kraj. Kraj.

Pr im je r 3 T reba up is at i c ijeli b roj a i isp is at i poruk u d a li je u p isan i b roj p aran ili n ep aran.

Obratite panju na konstrukciju ispisa. Pogledati emo lijevu granu koja se izvrava ako je odgovor na logiki uvjet NE. Imamo dio poruke u navodnicima 'Broj ' pa zatim odvojeno zarezom varijablu a i

21

C++ programiranje za srednje kole prof.Smajo Meki

nakon toga opet iza zareza drugi dio poruke u navodnicima 'je neparan.' Ako je upisan npr. broj 9 tada e naredba za ispis 'Broj ',a,' je neparan' rezultirati porukom koja izgleda kao reenica u komadu: Broj 9 je neparan. Pr im je r 4 Treba upisati dva broja a i b i ispisati poruku o tome koji je vei.

Stvar je zapravo vrlo jednostavna. Ali pokuajte sada zamisliti da neko upie dva ista broja, npr. 7 i 7. U uvjetu emo imati pitanje da li je 7 vee od 7. Odgovor je NE. Izvriti e se lijeva grana i kao rezultat dobiti emo poruku: Broj 7 je vei od broja 7. Ova poruka ba i nema logike i dokaz je da na raunar od milja zvani idiot velike brzine i ne razmilja ba puno. Zato ljudi koji rade na razvoju informacijskih sistema moraju predvidjeti puno vie situacija, pa i onih najekstremnijih koje bi se pri radu programa mogle dogoditi. Kau da dobra kontrola podataka pri unosu sprjeava ak 90% greaka koje bi se naknadno u radu programa mogle dogoditi. Zato emo mi rjeenje naeg zadatka malo promijeniti:

3 .5 . Pe tlje

22

C++ programiranje za srednje kole prof.Smajo Meki

Naslov ove lekcije govori da sve ovo to smo do sada radili nije dovoljno zapetljano, pa emo stvari jo malo dodatno zapetljati. Nekada su nastavnici imali obiaj nestane uenike kanjavati tako da su im zadali 100 puta napisati u biljenicu: "Neu nikada vie brbljati na asu informatike!". Zamislite da je nama neko dao takvu kaznu. Mi emo se probati izvui tako da to raunar odradi umjesto nas. Treba mu samo zadati da 100 puta ispie jednu te istu poruku. Nita jednostavnije. Evo rjeenja: Hm, ve nakon tree upute raunaru da ispie poruku sam odustao jer mi je dosadilo. Morate priznati da ovo rjeenje ba i nije neto s ime bi se mogli pohvaliti.

Pokuajmotoodraditina drugaiji nain:

Nakon to se i 100-ti puta izvre naredba grananja i naredbe ispod grananja i e postati 101. Tada je odgovor na pitanje u grananju da li je i vei od 100 konano DA i tada bi program trebao zavriti s radom. Dio programa, niz istih naredbi koje se ponavljaju dok je neki uvjet zadovoljen ili dok ne

23

C++ programiranje za srednje kole prof.Smajo Meki

postane zadovoljen, naziva se petlja. U naem se primjeru ispis poruke i poveanje varijable i za jedan ponavljaju dok i nije postao vei od 100. Varijabla i je u naem primjeru broja jer svakim prolaskom kroz petlju i postaje i vie 1. Neki ljudi tvrde da napredak moemo zahvaliti samo ljudskoj lijenosti. Naime, ljudi e svata izmisliti samo da ne moraju raditi. Tako je neko izmislio jo jednostavnije rjeenje za na primjer s ispisom 100 poruka.

Pravougaonik ispod simbola za poetak je naredba for koja je sama po sebi petlja. Broja i kao i uvjet ve su sadrani u naredbi pa ne moramo mi voditi brigu oko odbrojavanja. Taj red u algoritmu itali bismo kao: "Za i koji ide od 1 do 100 uini slijedee:". Broj ponavljanja u petlji za rjeenje odreenih problema se zna unaprijed, prije poetka ponavljanja, a za neke se ne zna unaprijed, ve ovisi o izvravanju niza naredbi koje se ponavljaju. Za sada emo se samo baviti petljama u kojima unaprijed znamo broj ponavljanja, dakle petljom for. Koliko vremena vam treba da saberete sve brojeve od 1 do 100? Prava sitnica. Za na zbir svih brojeva do 100 koristiti emo varijablu zbir koju na poetku algoritma moramo postaviti na vrijednost 0. Za i koji ide od 1 do 100 treba uiniti slijedee: Varijabli zbir dodati vrijednost varijable i koja je u naem primjeru broja. C++ programiranje za srednje kole prof.Smajo Meki

Svakim prolaskom kroz petlju i se poveava za 1 i njegova vrijednost pridodaje sadraju varijable zbir. U prvom prolazu kroz petlju zbir je 0, a i je 1, pa prema tome zbir postaje 1. U drugom prolazu zbir je 1, a i je 2. Zbir postaje 1+2, dakle sada je 3. I tako 100 puta. Idemo jo malo zapetljati neto to znamo raunati jo od petog osnovne, a to je prosjek ocjena. Prosjek je zbir svih ocjena podijeljen s brojem predmeta.

24

Varijablu zbir koristiti emo za zbir svih ocjena i moramo ju na poetku postaviti na vrijednost 0. Neka u prvom razredu imamo 15 predmeta. Varijablu i postavili smo na poetnu vrijednost 1. U prvom prolazu kroz petlju upisujemo prvu ocjenu iz imenika, a to je bosanski jezik. Ocjena se upisuje u varijablu ocjena. Sadraj varijable ocjena se dodaje u varijablu zbir.

U drugom prolazu upisujemo ocjenu iz drugog predmeta, u treem iz treeg i tako 15 puta. Po izlazu iz petlje izraunavamo prosjek i ispisujemo ga. Ovo je bilo prejednostavno da bi bilo stvarno. U stvarnom ivotu desiti e se da je neko npr. osloboen nastave tjelesnog i zdravstvenog odgoja pa ima 14 predmeta. Neko moda ima 16 predmeta jer je izabrao i fakultativnu nastavu. Isto tako u drugom, treem ili etvrtom razredu sigurno neete imati 15 predmeta. Ve smo napomenuli da se programi piu im openitije tako da bi se mogli primjenjivati za rjeavanje im vie slinih problema. Zato emo na algoritam prepraviti tako to emo umjesto 15 uvesti varijablu brpred koja e predstavljati na broj predmeta.

25

C++ programiranje za srednje kole prof.Smajo Meki

Nakon to smo varijablu zbir postavili na poetnu vrijednost 0 treba preko tastature unijeti broj predmeta koji se smjeta u varijablu brpred. Broja i u petlji sada broji od 1 do brpred pa je primjenjivo za sve uenike i razrede s razliitim brojem predmeta. Da bismo dobili prosjek treba po izlasku iz petlje zbir ocjena podijeliti s brojem predmeta brpred.

Za vjebu: Pokuajte po uzoru na prosjek ocjena za jednog uenika napraviti dijagram toka za izraunavanje prosjene ocjene razreda. Jo nekoliko primjera petlji Nakon postavljanja varijable zbir na poetnu vrijednost 0 treba u upisati poetni broj n i zavrni broj m od kojeg do kojeg elimo ispisati i sabrati neparne brojeve. C++ programiranje za srednje kole prof.Smajo Meki Broja u petlji for sada broji od n do m Da li je i neparan broj znati emo ako ga podijelimo s 2 koristei operator mod i dobijemo rezultat 1. Ako ostatak je 1 tada ispisujemo i i dodajemo njegovu vrijednost varijabli zbir.

to e se dogoditi ako neko upie za n vei broj nego za m? Prepravite gornji algoritam tako da izraunava i zbir neparnih i zbir parnih brojeva od n do m.

26

Uenici su na satu fizike nauili Ohmov zakon po kojem otpor u istosmjernom strujnom kola moete izraunati tako da podijelite napon sa jakou struje: R=U/I gdje je otpor R, napon U i jakost struje I. Naueno su odmah provjerili mjerei veliine u strujnom kolu, ako su mjerili napon i jakost mogli su po gornjoj formuli izraunati otpor, ako su mjerili otpor i napon mogli su izraunati jakost struje I = U / R, a ako su mjerili otpor i jakost struje mogli su izraunati napon U = I * R. Treba napraviti algoritam po kome je mogue za odreeni broj mjerenja na temelju dvije izmjerene veliine izraunati treu. Za broj mjerenja emo koristiti varijablu brmjer. Uvest emo jo jednu varijablu koju emo zvati izbor i dogovoriti emo se da u nju upiemo 1 ako elimo raunati otpor, 2 ako elimo raunati napon i 3 ako elimo raunati jakost struje. Ako upisani broj ne bude 1, 2 ili 3 ne treba poduzimati nita. Poto slovo I koristimo kao varijablu za jakost struje, u petlji for emo ovaj puta kao broja upotrijebiti slovo k.

Ovaj primjer moe se daleko elegantnije rijeiti viestrukim grananjem. Izrada algoritama zahtjeva puno vjebe. Algoritmi se ne mogu natrebati. Potrebno je rijeiti puno primjera, od jednostavnijih do sve sloenijih. Dijagram toka crtamo obinom olovkom s gumicom pri ruci. Stvari se rjeavaju u hodu, mijenjaju, popravljaju i prepravljaju. Uoavaju se stvari koje se mogu pojednostavniti. Prednost dijagrama toka je to je pregledan, lako se test primjerima moe "pjeice" provjeriti. Zanimljivo je i to da vie ljudi moe napraviti na isti zadatak vie razliitih algoritama i da su svi dobri. Sloeni algoritmi mogu se rastaviti na manje, tako rastavljeni rijeiti do detalja i onda prikazati kao rjeenje u

27

C++ programiranje za srednje kole prof.Smajo Meki

blokovima. Problemi se mogu lako analizirati, lako se uoavaju slinosti i razlike izmeu vie rjeenja i odabire najbolje. Moda nakon ovih vjebi vidite dijagrame toka i tamo gdje ih do sada niste uoavali - razliiti shematski prikazi nekih postupaka, hodogrami nekih aktivnosti... I na kraju to je bio cilj nae izrade algoritama - pisanje programa. Kada je jednom algoritam gotov pisanje programa u nekom programskom jeziku je prepisivanje simbola iz dijagrama toka u naredbe programskog jezika. Obino svaki simbol u dijagramu toka predstavlja jednu naredbu u programu. Dijagram toka bi trebao biti dio svake dobre programske dokumentacije. Uenicima je crtanje dijagrama toka ponekad nerazumljivo, a sve to je nerazumljivo je i dosadno. Oni bi najradije sjeli za raunar i odmah pisali program. Kod jednostavnih problema to i moemo napraviti. Ali kod sloenijih... Jednom sam sreo svog biveg uenika koji se u svom poslu intenzivno bavi programiranjem. alio mi se da nekad nekoliko sati provede za raunarom pokuavajui rijeiti neki problem, ali ne ide i gotovo. Pitao sam ga to tada uini. Odgovorio je: "Pa uzmem olovku i papir i nacrtam algoritam..."

4.Pseudo jezik
Pseudokod je neoficijelan jezik koji pomae programerima u razvijanju algoritama. Pseudokod nije programerski jezik. Njegova svrha je rijeiti program prije pisanja u programerskom jeziku kao to je C++. Pseudokod se sastoji jedino od izvrnih naredbi onih koje se izvravaju kada program pseudokoda pretvorimo u C++ i pokrenemo.

iz

Ne postoji ope prihvaena norma naina pisanja pseudo jezika ve svaki autor moe u naelu koristiti svoj nain pisanja. 4.1.Varijable Mjesto u memoriji rezervisano za pohranu podatka naziva se varijabla. Svaka varijabla ima ime koje ju jednoznano odreuje kako bi se razlikovala od ostalih varijabli. Ime varijable se u pseudo jeziku moe zadati proizvoljno, npr. x, a, TX, B_Pod, AmPe. Vrijednost varijable Varijabli se vrijednost pridruuje uz pomo operatora pridruivanja. Operator pridruivanja koji se koristi u ovoj verziji pseudo jezika je znak (:=). Tim se operatorom varijabli pridruuje ili u varijablu upisuje vrijednost.Npr. izraz x:=3 se moe itati "varijabli x se pridruuje broj 3". Kraj naredbe Algoritam zapisan pseudo jezikom sastoji se od niza naredbi. Svaka naredba ove verzija pseudo jezika zavrava znakom taka-zarez (;).

4.2.Operatori

28

C++ programiranje za srednje kole prof.Smajo Meki

Operatori su simboli koji predstavljaju (zamjenjuju) odreene funkcije. Operatori se mogu svrstati u grupe prema vrsti funkcije koju prestavljaju, npr.: aritmetiki operatori, logiki operatori, operatori usporeivanja (relacijski operatori).

Za ispravno zapisivanje algoritma pseudo jezikom izmeu ostalog treba poznavati i znaenje pojedinih operatora. Pri tom moe zbunjivati slinost izgleda operatora pseudo jezika i operatora kojima se koristimo u matematici (ponekad izgledaju isto a imaju razliita znaenja). Aritmetiki operatori Opis Sabiranje Oduzimanje Mnoenje Dijeljenje Cjelobrojno dijeljenje Ostatak cjelobrojnog dijeljenja Pseudo jezik + * / DIV MOD Pascal + * / DIV MOD C/C++ + * / / %

Operatori sabiranja, oduzimanja i mnoenja se u pseudo jeziku koriste na uobiajen nain. Kod poetnika zabunu mogu stvoriti tri razliita operatora dijeljenja. Osim operatora dijeljenja (/) koji kao rezultat vraa vrijednost kolinika u obliku realnog broja tu su i operatori DIV i MOD. Operator DIV vraa cjelobrojni dio dijeljenja dva cijela broja. Operator MOD vraa cjelobrojni ostatak dijeljenja dva cijela broja. Primjer upotrebe operatora dijeljenja: x:= 5; y:=2; a:=x/y; b:=x DIV y; c:=x MOD y; Rezultat e biti: a=2,5 ;b=2;c=1 (5:2=2 cijela i 1 ostatak). Logiki operatori Logiki podaci su podaci koji mogu poprimiti samo jednu od dvije mogue vrijednosti. To su na primjer true/false, da/ne, istina/la, 1/0. Varijabla u koju se pohranjuju podaci ove vrste moe poprimiti vrijednosti true (1) ili false (0). Za rad s logikim podacima, postoje logike funkcije. Logike se funkcije zapisuju logikim operatorima. Rezultat rada logikih operatora je podatak logikog tipa. C++ programiranje za srednje kole prof.Smajo Meki

29

Opis Logiki I Logiki ILI Logiki NE

Pseudo jezik I ILI NE

Pascal AND OR NOT

C/C++ && || !

Tablica stanja operatora I

Tablica stanja operatora ILI

Tablica stanja operatora NE

Primjer upotrebe logikih operatora:

Operatori poreenja (relacijski operatori) Dva se podatka mogu usporeivati. Ako je napisani izraz istinit, rezultat poreenja e biti 1 (true), a ako nije, rezultat e biti 0 (false). Usporeuje se upotrebom operatora poreenja.

30

C++ programiranje za srednje kole prof.Smajo Meki

Rezultati logikih operacija e biti: e=0 f=1 g=1.

Opis Manje Manje ili jednako Vee Vee ili jednako Jednako Razliito

Pseudo jezik < <= > >= = <>

Pascal < <= > >= = <>

C/C++ < <= > >= = !=

Primjer upotrebe operatora poreenja:

Rezultati usporedbe e biti: a=1 b=1 c=0 d=0. Kod poetnika zabunu moe stvoriti operator jednakosti (=). Operator jednakosti NE pridruuje vrijednost varijabli ve samo provjerava da li je vrijednost njegove lijeve i desne strane jednaka. Npr. Izraz x=3 se moe itati: "da li je vrijednost varijable x jednaka 3?". Tim izrazom se vrijednost varijable ne mijenja i ostaje kakva je bila i prije izraza. Operator jednakosti ne mijenja vrijednost varijable. Operator pridruivanja (:=) mijenja vrijednost varijable. Npr.: C++ programiranje za srednje kole prof.Smajo Meki

Rezultat na kraju e biti: x=3;a=0. Redoslijed izvravanja operatora Pri zapisivanju sloenih izraza pseudo jezikom vano je imati na umu redoslijed izvravanja operatora (prioritet).

Redosljed izraavanja

Operatori

31

1 2 3 4 5

() NE */ DIV MOD I + - ILI <,<=,>=,<>,=

1.Primjer redoslijeda izvravanja operatora:

Svi su operatori ravnopravni, izraz se izvrava s lijeva u desno ovim redoslijedom: 1. 2. 3. 4. 22 DIV 5 = 4 4 * 11 = 44 44 MOD 3 = 2 (ostatak dijeljenja 44/3) x=2

2.Primjer redoslijeda izvravanja operatora:

Zagrade ponitavaju prioritete operatora pa se izvrava ovim redoslijedom: 1. 2. 3. 4. 22 DIV 5 = 4 11 MOD 3= 2 4*2=8 x=8

3. Primjer redoslijeda izvravanja operatora:

S obzirom na prioritete, operacije se izvravaju ovim redoslijedom: 1. 55 MOD 6 = 1 2. 3 * 4 = 12 3. 6 / 3= 2 4. 12 + 2 - 1 = 13 5. x = 13

4.3.Funkcije

32

C++ programiranje za srednje kole prof.Smajo Meki

Izdvojeni nizovi naredbi koji ine logike cjeline a obavljaju tano utvrene zadatke nazivaju se funkcije. Mogue je stvoriti vlastite funkcije pa ih zatim koristiti u svom programu ili koristiti ve postojee i za upotrebu pripremljene funkcije. U ovoj verziji pseudo jezika od uenika se oekuje poznavanje nekoliko pripremljenih matematikih funkcija. Opis Apsolutna vrijednost realnog broja Drugi korijen realnog broja Zaokruivanje ralnog brojana najblii cijeli broj Najvei broj manji ili jednak od x Pseudo jezik Abs(x) Sqrt(x) Round(x) Pascal Abs(x) Sqrt(x) Round(x) C/C++ abs(x) sqrt(x) round(x)

Trunc(x)

Trunc(x)

ceil(x)

5.Kako zapoeti?

33

C++ programiranje za srednje kole prof.Smajo Meki

Da bismo napravili program koji treba da obavi neki zadatak, neophodna su nam dva specijalizirana programa: jedan koji koristimo da napiemo izvornu datoteku (editor), i drugi sa kojim dobijemo izvrnu datoteku (kompajler). Ova dva programa se najee kombiniraju u jedinstven paket - tzv. razvojno okruenje. Danas, najpoznatije C++ okruenje predstavlja Microsoftov proizvod Visual C++ .NET. Meutim, ovaj, kao i veina ovakvih programa, je komercijalan i nije dostupan svim korisnicima. Ipak, mogue je nai veliki broj besplatnih C++ okruenja. Jedno od takvih okruenja je i Dev-C++ . 5.1.MS Visual C++ Nakon pokretanja MS Visual C++ razvojnog okruenja otvorit e se prozor programa. Ovisno o podeenosti programa raspored i sadraj cjelina unutar prozora programa moe biti i drugaiji.

Slika 5.1. Novi projekt se pokree naredbom File/New.Nakon odabira naredbe File/New otvara se prozor New u kojem treba na kartici Projects odabrati vrstu projekta te zadati osnovne podatke za projekt. C++ programiranje za srednje kole prof.Smajo Meki

34

Slika 5.2. U popisu projekata treba birati Win32 Console Application. Projektu treba dati ime (engl. Project name) i mjesto pohrane (engl. Location). Nakon unosa potrebnih podataka otvara se prozor Win32 Console Application Step 1 of 1.

Slika5.3. Odabirom An empty project i klikom na dugmi Finish stvoren je i pohranjen novi projekt obiljeja prikazanih u prozoru New Project Information.

Slika5.4. Sada u stvorenom projektu (okviru za izradu programa) treba otvoriti novu datoteku izvornog kda. Potrebno je kliknuti na karticu FileView, a potom oznaiti mapu Source Files koja se nalazi pod nazivom projekta. Na kraju birati naredbu File/New.

35

C++ programiranje za srednje kole prof.Smajo Meki

Slika 5.5 Otvorit e se prozor New u kojem treba na kartici Files izabrati vrstu datoteke. Bira se vrsta datoteke C++ Source File.

Slika 5.6.

36

C++ programiranje za srednje kole prof.Smajo Meki

Na kraju treba zadati ime datoteci (engl. File name). Izvorni kd programa C++ sprema se u datoteku izabranog imena i nastavka cpp. 5.2.Programski paket Dev-C++ Najnoviju verziju programa mogue je nai na web stranici firme BloodshedSoftware (http://bloodshed.net/download.html). Instalacija Dev-C++ programa ni u emu se ne razlikuje od koritenja veine instalacionih datoteka u Windows okruenjima. Dovoljno je dvostrukim klikom pokrenuti instalacionu datoteku (npr. devcpp-4.9.9.2 setup.exe) i pratiti poruke na ekranu. Nakon zavretka ovog postupka, u traci sa alatima pojavljuje se ikona za pokretanje programa Dev-C++ . Korak po korak prvi program u Dev C++

Slika 5.7. Korak 1-pokretanje Dev C++

Slika 5.8. korak 2-kreiranje novog projekta

37

C++ programiranje za srednje kole prof.Smajo Meki

Slika 5.9.korak 3- biranje praznog projekta

Slika 5.10.korak 4 spremanje projekta

38

C++ programiranje za srednje kole prof.Smajo Meki

Slika 5.11.korak 5 mjesto za pisanje programskog koda

Slika 5.12. korak 6-pisanje programskog koda

39

C++ programiranje za srednje kole prof.Smajo Meki

Slika 5.13.korak7 proces kompajliranja

Slika 5.14. korak8-pokretanje izvrne datoteke Pitanja za utvrivanje:

40

C++ programiranje za srednje kole prof.Smajo Meki

1. 2. 3. 4.

Definii Algoritam? Kako se jo naziva proceduralno programiranje i zbog ega? Koje su najbitnije osobine algoritma? Nabroj nekoliko programskih paketa koji omoguavaju pisanje i kompajliranje programa napisanih u C++ ? 5. Programski jezik C++ pripada ........... jezicima. 6. ta je osnovna karakteristika proceduralnog programiranja? 7. ta je pseudo jezik?

6.Uvod u C++
C++ je vii programski jezik ope namjene. Ovo je kratka reenica sa dosta nerazumljivih ojmova.Prvi od njih je programski jezik. Ljudi u svakodnevnom ivotu koriste govorne jezike, i bilo bi idealno kada bi mogli na naem maternjem jeziku kazati raunaru da nam neto uradi, npr. Molim te nai mi rjeenja kvadratne jednaine x2 +5x+6=0!. To bi nam itekako olakalo ivot iz matematike, ali naalost stvari sa raunarima nisu jo uvijek tako jednostavne, iako bi jednog dana mogle biti upravo takve. Govorni jezici ne koriste se za komuniciranje sa raunarom jer su preobimni, dvosmisleni i neprecizni. Tako npr. na ulazu u jedan ribnjak stoji natpis Gostima zabranjeno hraniti ribe!. Svima je jasno da se misli na to da posjetioci ribnjaka ne smiju bacati hranu ribama, ali se reenica moe tumaiti i na nain da se ribe ne smiju hraniti sa gostima! Takva reenica je sigurno dvosmislena.Primjer nepreciznosti se moe vidjeti u reenici: Odi u prodavnicu i kupi mlijeko!. Na koju prodavnicu se misli? Koju masnou mlijeka? Od kojeg proizvoaa? Primjer preobimnosti jezika moemo nai u bilo kojem knjievnom djelu, gdje je ljepota izraavanja poeljna, ali u informatici je to nepotrebno ako nema u sebi nekih korisnih informacija.Dakle programski jezik je precizan i nedvosmislen jezik razvijen za komuniciranje i kontrolu nad raunarom.Kae se da je C++ jezik ope namjene, to znai da nije specijaliziran u npr. matematike ili neke druge svrhe. C++ je vii programski jezik, ali to nema nikakve veze sa visinom, jer jezici nemaju visinu, niti duinu.Ovo vii (eng. highlevel) stoji uz C++ jer postoje jezici i nieg nivoa (eng. lowlevel).Ako je jezik vieg nivoa to ne znai da je automatski bolji od jezika nieg nivoa. To znai samo vei nivo apstrakcije od mainskog jezika, koji je jedini jezik koji procesor razumije bez prevoenja. On se sastoji od nula i jedinica i moe se rei da je za ljudska bia gotovo nerazumljiv i neupotrebljiv. Vei nivo apstrakcije znai jednostavniji rad ali i manju kontrolu nad raunarom.

41

C++ programiranje za srednje kole prof.Smajo Meki

C++ je programski jezik za koji se slobodno moe rei da je C programski jezik sa dodatim klasama i svim ostalim osobinama modernih jezika. Dokaz za to je i prvo ime ovog jezika koje je glasilo C sa klasama! Tvorac C programskog jezika je Dennis Ritchie, koji je tad radio u AT&T Bell Laboratories. C je nastao da bi zamijenio jezik B(postojao je i jezik A, a poetkom 2007 je izdat i jezik D) iji tvorac je otac Unix operativnog sistema Ken Thompson i prvenstvena mu je namjena bila odravanje Unix operativnog sistema. C je udan jezik koji ima osobine i viih i niih programskih jezika, pa kao takav ima sve prednosti i mane takvih jezika. Da bi prevaziao mane i iskoristio prednosti C jezika, Bjarne Stroustrup zaposlenik AT&T Bell Laboratories je razvio C++ programski jezik. Da li je u tome uspio ili je samo jo doprinio zbrci oko u sutini vrlo snanog programskog jezika je rasprava koja se esto vodi u programerskim krugovima. 6.1. Proces kompajliranja Da bi se napisani program izvrio na raunaru(da bi ga koristili), potrebno ga je iz izvornog koda (programa) prevesti u oblik koji procesor razumije tj. mainski jezik. Prevedeni oblik se najee naziva izvrni ili objektni kod(program). Kada radite sa nekim programom na raunaru npr. sa Firefoxom radite sa objektnim programom. Objektni program se zna nazivati i kompajlirani program, jer se program iz izvornog oblika prevodi u objektni putem posebnih programa koji se nazivaju kompajleri ili prevodioci. Pored kompajlera, da bi pravili vlastite programe potrebni su nam jo dvije vrste programa: tekst editori i debuggeri. Tekst editor je program sa kojim piemo izvorni program, kao npr. Notepad ili Vim. Kako programe piu ljudi, a oni su po svojoj prirodi skloni grekama, esto su nam potrebni i programi koji nam pomau da takve greke otkrijemo i uklonimo. Takvi programi se nazivaju debuggeri, a naziv im potie od engleskog naziva bug za greku u programu, dok je proces uklanjanja greaka debugging. Dakle, za pisanje izvornog koda nam treba editor. Za prevoenje tog izvornog koda u izvrni kod nam treba kompajler, a da bi otkrili eventualne greke u svojim programima, esto nam zatrebaju debuggeri. Kako ovo znai da prilikom pisanja svoga programa trebamo koristiti tri razliite vrste programa, neko se dosjetio da ta tri programa ujedini u jedan program. Takvi programi se nazivaju integrirana razvojna okruenja ili IDE(Integrated Development Environment), a mi emo koristiti Blodshed DevC++ IDE.

42

C++ programiranje za srednje kole prof.Smajo Meki

Izvorni kod Kombinacijom naredbi programskog jezika nastaje izvorni kod (engl. source code). Izvorni je kod mogue pisati u bilo kojem programu za ureivanje teksta (engl. text editor). Danas se uglavnom programi za pisanje izvornog koda objedinjuju u cjelinu sa prevodiocem i povezivaem (integrirana razvojna okolina, IDE). Izvorni kod programa C++ sprema se u datoteku izvornog koda pod smislenim imenom i nastavkom *.cpp Izvrni oblik Programi se mogu izvriti na raunaru samo ako su u binarnom obliku. Takav se oblik programa naziva izvrni oblik (engl. executable). Izvorni se kod mora prevesti u izvrni. Prevodi se pomou programa koji se nazivaju prevodioc (engl. compiler) i poveziva (engl. linker). Program prevodioc prevodi izvorni kod iz vieg programskog jezika u mainski oblik te provjerava sintaksu napisanog izvornog koda. Ako pronae pogreke (engl. compile-time error), ispisuje poruke i upozorenja o njima. Otkrivene pogreke treba ispraviti pa ponovo pokrenuti program za prevoenje. Prevoenjem nastaje datoteka objektnog koda (engl. object code), nastavka *.obj. Objektni kod nije izvrni program i ne moe se direktno izvriti na raunaru. Objektni kod je meukorak do izvrnog koda i uz ostalo omoguava ukljuivanje gotovih dijelova programa iz drugih datoteka.

Biblioteke Datoteke koje sadravaju gotove dijelove programa nazivaju se biblioteke (engl. libraries). gotovi dijelovi programa mogu koristitit u drugim programima. Kada se koriste biblioteke potrebno uvijek iznova zapisivati radnje (funkcije) koje se esto koriste. Takve se radnje u ukljuuju iz postojeih biblioteka. Npr. moe postojati biblioteka formula za izraunavanje geometrijskih likova ije formule mogu koristiti drugi programi. Poveziva Program koji povezuje objektnu datoteku s bibliotekama i drugim potrebnim datotekama naziva se poveziva (engl. linker). Ako se pri povezivanju pojavi greka (engl. link-time error), bit e ispisana poruka o tome.Greku valja ispraviti pa ponovno pokrenuti prevoenje i povezivanje. Rezultat uspjenog povezivanja je izvrna datoteka (*.exe). U naelu,izvrnoj datoteci nisu potrebni nikakvi dodaci pa se moe izvravati i bez izvornog programa, objektnih datoteka, prevodioca, povezivaa itd. Takvi se vie nije program povrina

6.2.Rijei u C++ programskom jeziku

43

C++ programiranje za srednje kole prof.Smajo Meki

Programski jezici koriste imena kako bi se oznaile razliite cjeline koje ine program. Osim imena varijabli, ovdje spadaju i imena funkcija, tipova, te makroa. C++ postavlja sljedea pravila za pravilno kreiranje imena (ili identifikatora). Ime traba da se sastoji od jednog ili vie karaktera, od kojih bilo koji moe biti slovo (tj, slova engleske abecede a-z i A-Z), broj (0-9) i znak "_", priemu na prvom mjestu ne moe 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 ogranienje na broj karaktera u nekom identifikatoru. Meutim, veina implementacija ima ovo ogranienje, ali je ono toliko veliko da ne predstavlja nikakav problem (npr. i do 255 karaktera). Treba imati na umu da postoje odreene rijei u C++ koje su rezervisane, tako da identifikatori ne mogu uzimati njihova imena. Te rijei se nazivaju rezervisane ili kljune rijei i date su u tabeli: Tabela 1: Kljune (rezervisane) rijei u C++

6.3.Struktura programa //program koji ispisuje pozdravnu poruku komentar #include<iostream> // zaglavlje standardne biblioteke using namespace std; int main() // zaglavlje funkcije { cout<<Sretan pocetak; // naredba tijelo funkcije funkcija system(Pause); return 0; } Objanjenje Znak // oznaava komentar, kompajler potupuno ignorie sve od pojave znaka // pa do kraja reda,svrha komentara je objanjenje korisnicima koji pokuavaju razumjeti ta program radi,komentar je obino kratak,komentari su vrlo vani kod velikih programa gdje komentar treba da objasni o emu se radi u pojedinim dijelovima programa. #include <iostrem> prestavlja predprocesorsku direktivu kojom se oznaava da kompajler treba da oita tzv.heder datoteku u kojoj se nalazi definicije, deklaracije funkcija i objekata za unos i ispis sa standardnog ulaza odnosno izlaza. using namespace std;ovom linijom koda definiramo podruje za imenovanje objekata.Naravno poznato nam je da u jednom programu dva objekta ne mogu imati isto ime odnosno isti identifikator jer e doi do kolizije i program nee raditi. int main() je zaglavlje funkcije,svaki program u C++ mora imati najmanje jednu funkciju main glavna funkcija.Funkcija koja e se prva izvriti kada program pone sa radom.U programskim jezicima funkcija je potprogram koja vraa neki rezultat u navedenom primjeru funkcija int main vraa cijelobrojni rezultat . Nakon zaglavlja funkcije dolazi tijelo funkcije koje poinje otvorenom vitiastom zagradom {, a zavrava zatvorenom vitiastom zagradom }.Vitiaste zagrade koristimo kada imamo

44

C++ programiranje za srednje kole prof.Smajo Meki

skupinu naredbi koje ine jednu cjelinu.Tijelo funkcije sainjavaju naredbe svaka naredba zavrava taka-zarezom; Naredbe su niz instrukcija koje govore raunaru ta treba da radi. Cout je skraenica od consol out predstavlja objekat tzv. izlaznog toka podataka output stream koji je povezan sa standardnim ureajima za ispis tpino ekran. '<<' prestavlja znak redirekcije odnosno umetanja koji pojednostavljeno moemo itati kao alji Sretan pocetak na ekran to ustvari predstavlja niz znakova koje aljemo na ekran, takav niz znakova nazivamo string. System("PAUSE"); zaustavlja izvrenje programa, kako bismo mogli vidjeti rezultat njegovog rada. Bez ove linije program bi se nakon pokretanja izvrio, a konzola bi se zatvorila veoma brzo, tako da bismo imali osjeaj kao da program nije nita ni uradio. Return 0 znai da naa funkcija vraa cijelobrojnu vrijednost 0. } zatvrena vitasta zagrada zatvara tijelo funkcije. Primjer2; 1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 cout << " Sretan pocetak u C++ zeli Vam prof Smajo \n"; 6 system("PAUSE"); 7 return 0; 8 } Naredba u datom primjeru alje string1 " Sretan pocetak u C++ zeli Vam prof Smajo " na tok cout(output stream). Posljednji karakter u datom stringu (n) je karakter koji oznaava novi red .Za istu svrhu moe se koristiti i funkcija endl, odnosno: cout << " Sretan pocetak u C++ zeli Vam prof Smajo " << endl; Tok (stream) je objekat koji izvrava ulazne i izlazne naredbe. Tok cout je standardni izlazni tok (obino ekran) u C++ . Simbol << je izlazni operator (usmjeriva toka) kojem je lijevi operand izlazni tok, a desni izraz. Ovaj operator upuuje desni operand na lijevi. Dakle, u ovom sluaju string "Sretan pocetak u C++ zeli Vam prof Smajo /n" se alje na cout, tj. uzrokuje njegov ispis na ekranu i pomjeranje usljedei red.

Slika 6.1. Izgled programskog koda i izvrne datoteke Kompajliranje C++ programa obuhvata nekoliko koraka, koji su veinom nevidljivi za korisnika:

45

C++ programiranje za srednje kole prof.Smajo Meki

Prvi korak, C++ predprocesor ide kroz program i izvodi instrukcije koje su specificirane predprocesorskim direktivama (npr. #include). Rezultat ovoga je modificirani tekst programa koji vie ne sadri nikakve direktive. Drugi korak, C++ kompajler prevodi programski kod. Kompajler moe biti pravi C++ kompajler, koji pravi osnovni (asemblerski ili mainski) kod,ili samo prevodilac, koji kod prevodi u C jezik. U drugom sluaju, rezultujui C kod se zatim prevodi kroz C kompajler kako bi se napravio osnovni kod. U oba sluaja, rezultat moe biti nepotpun zbog toga to program poziva podprogramske biblioteke koje nisu definisane u samom programu. Trei korak, linker zavrava objektni kod njegovim povezivanjem sa objektnim kodom bilo kojeg modula biblioteka, koji program moe pozvati. Konaan rezultat je izvrna datoteka. 6.4.Varijable Varijabla je simboliko ime za memorijsku lokaciju u koju se mogu pohraniti podaci, koji se naknadno mogu pozvati. Varijable se koriste za uvanje vrijednosti podataka tako da se iste mogu koristiti u raznim proraunima u programu. Sve varijable imaju dvije vane osobine: Tip, koji se postavlja kada se varijabla definie (npr. cijeli broj, realni broj, karakter, ...). Kada se jednom definie, tip varijable u C++ se ne moe promijeniti. Vrijednost, koja se moe promijeniti davanjem nove vrijednosti varijabli. Vrsta vrijednosti koja se moe pridruiti nekoj varijabli zavisi od njenog tipa. Na primjer, cjelobrojna varijabla (int) moe uzeti samo vrijednosti cijelih brojeva (npr. -5, 13, ...). Kada se varijabla definie, njena vrijednost je nedefinisana sve dok joj se ne pridrui neka. Pridruivanje vrijednosti nekoj varijabli po prvi put naziva se inicijalizacija. Neophodno je da se svaka varijabla inicijalizira prije nego se koristi. C++ podrava dvije vrste inicijalizacije: (i) inicijalizaciju kopiranjem (eng. copy-initialisation) i (ii) direktna inicijalizacija (eng. directinitialisation). Inicijalizacija kopiranjem koristi znak jednakosti, =, dok se direktna inicijalizacija izvodi pomou malih zagrada, (), kao u sljedeim primjerima: int broj(10); // direktna inicijalizacija int broj = 10; // inicijalizacija kopiranjem U oba sluaja varijabla broj je inicijalizirana na vrijednost 10. Treba napomenuti da inicijalizacija ne predstavlja pridruivanje (iako se u inicijalizaciji kopiranjem koristi znak jednakosti), nego se deava onda kada se varijabla definie i kada joj se da poetna vrijednost. S druge strane, pridruivanje predstavlja ponitavanje trenutne vrijednosti varijable i zamjene novom. Takoer je mogue da se varijabla definie i inicijalizira u isto vrijeme,to je vrlo praktino. Naredni primjer pokazuje razlicite naine definisanja i inicijaliziranja varijabli. 1 #include <iostream> 2 using namespace std; 3 main() 4 { 5 int a,b,c; 6 float x = 4.32; 7 int e,f,g; 8 char ime; 9 e = 4; 10 f = g = 12; 11 ime = C 12 } Da objasnimo Linije 5, 7 i 8 pokazuju primjere definisanja varijabli a, b, c, zatim e, f, g i ime, respektivno. Varijable e, f i g su inicijalizirane linijama 9 i 10, a varijabla ime u liniji 11. Istovremeno definisanje i

46

C++ programiranje za srednje kole prof.Smajo Meki

inicijalizacija data je u liniji 6 za varijablu x. Na kraju, treba napomenuti da veina autora proces definisanja varijabli poistovjeuje sa procesom deklarisanja. Meutim, neki autori prave razliku izmeu ovih pojmova. Naime, zbog situacija u kojima se u vie datoteka jednog te istog programa pristupa istoj varijabli, C++ razlikuje pojmove definisanja i deklarisanja. Tako, definisanje varijable predstavlja alociranje prostora za nju, te moguu inicijalizaciju. U jednom programu moe biti samo jedna definicija varijable. S druge strane, deklaracija upoznaje program sa tipom i imenom varijable. Definicija je time i deklaracija. Deklarisanje se izvrava na taj nain da se ispred tipa doda kljuna rije extern. Sljedei primjer pokazuje razliku izmeu definisanja i deklarisanja neke varijable: extern int broj; int broj; // deklarise ali ne i definise broj // deklarise i definise broj

Osnovna razlika je u tome da se sa extern, odnosno procesom deklaracije,ne alocira prostor za datu varijablu, nego samo upuuje na to da je varijabla definisana negdje u programu. 6.5.Memorija Za pohranjivanje izvrnog koda kao i podataka sa kojima program manipulira,kompjuter ima na raspolaganju RAM memoriju (eng. Random AccessMemory). Pri tome, memorija se moe zamisliti kao neprekidan niz bita, od kojih svaki moe da pohrani binarni broj (0 ili 1). Memorija se obino dijeli na grupe od 8 uzastopnih bita (ovo predstavlja bajt). Bajtovi su uzastopno adresirani, tako da je svaki bajt jedinstveno predstavljen svojom adresom .C++ kompajler generie izvrni kod, koji mapira ulazne veliine na memorijske lokacije. Na primjer, definicija varijable int zarada = 500; navodi kompajler da alocira nekoliko bajta kako bi predstavio varijablu zarada.

Slika 2.5.1.Organizacija memorije u kompjuteru Taan broj bajta koji je alociran i metoda koja se koristi za binarnu reprezentaciju cijelog broja zavisi od specificnosti C++ implementacije. Pretpostavimo,na primjer, da se radi o 2 bajta. Kompajler koristi adresu prvog bajta na koju se alocira zarada kako bi oznaio varijablu. Prethodna jednakost uzrokuje da se vrijednost 500 pohrani u ova dva bajta koja su alocirana (Sl.2.5.2)

47

C++ programiranje za srednje kole prof.Smajo Meki

Slika 2.5.2: Reprezentacija cijelog broja u memoriji 6.6.Ulazno-izlazni tokovi

Treba napomenuti da je organizacija memorije i koritenje adresa koji se odnose na podatke veoma vano za programera, dok tana binarna reprezentacija podataka koje on koristi to nije.Da bi program bio koristan, mora komunicirati s ulazno/izlaznim ureajima (tastaturom, monitorom, diskom i sl.). Komunikacija s ulazno/izlaznim ureajima se u programu C++ ostvaruje ulazno-izlaznim tokovima (engl. input and output streams). Svaki program prima podatke posredstvom ulazno-izlaznih tokova i rezultat predaje okolini posredstvom ulazno-izlaznih tokova. S gledita programa sasvim je svejedno o kojem je ulaznom ili izlaznom ureaju rije pa se svi podaci u program unose i iz programa predaju okolini na isti nain.Ulazno-izlaznim tokovima se rukuje funkcijama biblioteka iostream. Biblioteka iostream iostream je biblioteka koja sadri niz ulazno-izlaznih funkcija koje omoguavaju rukovanje ulaznoizlaznim tokovima. Dvije funkcije koje su najee u upotrebi su cout i cin. Cin ulazni tok

Funkcija cin usmjerava podatke s tastature na ulazni tok. Podaci se u ulazni tok umeu operatorom unosa (>>). Primjena funkcije cin cin>>x; cin>>a>>b; cout<<34<<mogu je i ispis niza znakova; Program oekuje unos podataka s tastature koji e biti pohranjen u varijablu x. Program oekuje unos sa tastaturekoji e bit pohranjen u varijablu a i b Mogue je ulanavanje operatora unosa koji se izvodi s lijeva na desno. C++ programiranje za srednje kole prof.Smajo Meki

Posljedica funkcije unosa cin je prekid izvrenja programa sve dok se ne unese podatak i pritisne tipka Enter (program "eka" da korisnik upie podatak). Vie ulaznih podataka moe se upisati u istome redu, odvojeni prazninama (tek na kraju treba pritisnuti tipku Enter).

48

Cout izlazni tok Funkcija cout usmjerava podatke s izlaznog toka na ekrana monitora. Ispis podataka se ostvaruje operatorom ispisa (<<). Primjena funkcije cout cout<<17; cout<<Mogu je ispis znakova; Ispisat e broj 17 S desne strane operatora ispis moe biti bilo koji tip podataka.U primjeru e se ispisati tekst unutar navodnika. Mogue je ulanavanje operatora unosa koji se izvodi s lijeva na desno.Ispisat e se redom jedno iza drugog;15,vrijednost varijable a,i tekst naveden unutar navodnih znakova.

cout<<15<<a<<Mogu je i ispis niza znakova;

endl U prethodnom bi se primjeru svi podaci ispisali u istome redu. Ako korisnik eli pregledniji ispis, tj. nakon zavrenog ispisa jednog podatka pokaziva prebaciti na poetak sljedeeg reda treba koristiti konstantu endl (takoer pohranjenu u biblioteci iostream). Upotreba konstante endl cout<<34<<endl; cout<<a<<endl; cout<<Mogu je i ispis niza znakova<<endl; Cout<<34<<endl<<a<<endl<<Mogu je ispis niza znakova; U oba primjera rezultat(ispis) e biti isti: 34 a Mogu je ispis znakova C++ programiranje za srednje kole prof.Smajo Meki

6.7.Komentari Komentar je dio opisnog teksta koji objanjava neke aspekte programa. Kompajler u potpunosti ignorie komentare u programu, tako da je jedina svrha koju komentar ima, da pomogne onome koji ce itati program. C++ daje dvije mogunosti pisanja komentara: bilo ta napisano nakon //, pa do kraja date linije smatra se komentarom3, i bilo ta napisano izmeu /* i */ smatra se komentarom.

Sljedei primjer pokazuje upotrebu oba naina pisanja komentara. #include <iostream>

49

2 using namespace std; 3 4 /* Ovaj program racuna ukupnu platu radnika, 5 koja se zasniva na ukupnom broju radnih sati i satnici. */ 6 7 int main (void) 8{ 9 int radniDani = 22; // Broj radnih dana u mjesecu float radniSati = 7.5; // Broj radnih sati u danu 11 float satnica = 33.50; // Satnica 12 float plata; // Ukupna mjesecna plata 13 14 // Racunanje i ispis plate 15 16 plata = radniDani * radniSati * satnica; 17 cout << "Plata = " << plata << \n; 18 }

Prvi nain se moe koristiti za komentar jedne i samo jedne linije (ili dijela jedne linije), kao to je to demonstrirano u linijama 14 (cijeli red), te linijama 9-12 (dio reda). Drugim nainom se (koristei /* i */), pak, moe komentarisati tekst upisan u vie linija (linije 4-5). 6.8.Imena (identifikatori) Programski jezici koriste imena kako bi se oznaile razliite cjeline koje ine program. Osim imena varijabli, ovdje spadaju i imena funkcija, tipova, te makroa. C++ postavlja sljedea pravila za pravilno kreiranje imena (identifikatora): ime treba da se sastoji od jednog ili vie karaktera, od kojih bilo koji moe biti slovo (tj, slova engleske abecede a-z i A-Z), broj (0-9) i znak " ", pri emu na prvom mjestu ne moe da bude broj. velika i mala slova se razlikuju (zarada nije isto to i Zarada).C++ ne postavlja nikakvo ogranienje na broj karaktera u nekom identifikatoru. C++ programiranje za srednje kole prof.Smajo Meki

Meutim, veina implementacija ima ovo ogranienje, ali je ono toliko veliko da ne predstavlja nikakav problem (npr. i do 255 karaktera). Ipak, treba imati na umu da postoje odreene rijei u C++ koje su rezervisane, tako da identifikatori ne mogu uzimati njihova imena. Te rijei se nazivaju rezervisane ili kljune rijei i neke od njih su date u Tabela 1: Kljune (rezervisane) rijei u C++. Pored navedenih pravila o davanju imena varijablama, postoji i veliki broj prihvaenih konvencija, koje se uglavnom koriste radi lakeg praenja programa. Neke od vanijih su: imena varijabli se obino piu malim slovima

50

ime moe da ima i vie rijei, koje su obino razdvojene donjom crtom,ili su direktno povezane sa poetnim velikim slovom rijei koja se dodaje imenu. No, bez obzira na konvencije, opte je pravilo da se jedna odreena konvencija konstantno koristi. 6.9.Tipovi podataka2 6.9.1.Organizacija numerikih brojeva u raunarskoj memoriji Brojni sistemi Da bi shvatilli tipove podataka neophodne za uenje programskog jezika,potrebno je osvrnuti se na organizaciju numerikih podataka u raunarskoj memoriji. Prvi pojam koji je potrebno savladati je brojni sistem. Postavimo pitanje:ta predstavlja broj 342,i po emu se on razlikuje od brojeva 423 i 234 koji su sastavljeni od istih cifara? Poznato je da svaka cifra unutar broja ima odreenu "teinu" (ovisno o poziciji unutar broja) ,te moemo rei da je broj 342 skraeni zapis sljedeeg broja:

za davanje imena se obino koriste mnemonika imena, tj. imena koja poblie opisuju varijablu

Ako o razmislimo zato je baza 10, shvati emo da ovakav izbor nema posebnog argumenta. Jedini razlog je zapravo historijski zbog injenice da ovjek ima 10 prstiju i da je shvatio da za brojeve vee od deset ne moe vie raunati na prste,nego mora izmisliti neki nain zapisa veih brojeva. Brojni sistem s bazom 10 naziva se decimalni ili dekadski brojni sistem. Baza je mogla biti bilo koji broj,jer se lako moe dokazati da se pozitivan broj moe zapisati u obliku.

U digitalnim elektronskim sklopovima(u koje spadaju i raunari) brojni sistem sa bazom 10 se pokazao nepogodnim za praktinu realizaciju.Baza 2 je,s druge strane,bila mnogo "laka" za implementaciju; jer se dvije znamenke-0 i 1-mogu predstaviti kao "odsustvo" i prisustvo"neega(npr.ima struje-nema struje ). Ovaj brojni sistem od svega dvije znameke naziva se binarni. Pokuajmo predstaviti neki broj u binarnom brojnom sistemu(po bazi 2). npr.142=128+14=128+8+6=27 +23 +21 =(10001110)2 Dakle, 142 se u binarnom brojevnom sistemu pie kao 1001110.Gore opisana metoda pretvorbe brojeva iz dekadskog u binarni brojni sistem nije pogodna za pretvaranje veih brojeva.

Preuzeto i obraeno Diplomski rad Poreenje Pascala i C++ u nastavi Smajo Mekic

51

C++ programiranje za srednje kole prof.Smajo Meki

Standardna metoda za pretvaranje,zasniva se na uzastopnom dijeljenju broja sa 2 ispisivanjem ostataka, sve dok se ne doe do kolinika 0,ostaci dijeljenja,proitani redom odozdo na gore, predstavljaju traeni binarni broj. 142 71 35 17 8 4 2 1 0 0 1 1 1 0 0 0 1

U C++ su ugraeni prosti i sloeni tipovi podataka,ovdje emo objasniti proste tipove podataka. 6.9.2.Brojevi U C++ su ugraena dva osnovna tipa brojeva, i to: cijeli i realni brojevi. Cijeli brojevi Cijeli broj (engl. integer) se moe definisati pomou tipova short, int i long. Jedina razlika je u tome to int koristi vie ili barem isto bajta kao short, a long koristi vie ili barem isto bajta kao int . Ovo zavisi od kompjutera na kojem se radi.Konvencija je da cjelobrojne varijable uzimaju u obzir i pozitivne i negativne brojeve (tada se kae da su oni tipa signed). Meutim, u sluaju kada se koriste samo pozitivne vrijednosti, ukljuujui i 0, koriste se sa predznakom unsigned.Ovo vrijedi i za realne brojeve. Najee se pri definisanju cijelih brojeva koristi tip int, koji u kompjuteru obino zauzima 4 bajta (mada kod nekih starijih kompjutera zauzima 2 bajta). S obzirom da 4 bajta predstavlja 4*8 = 32 bita, i da prvi bit odreuje predznak broja, preostaje nam 31 bit da pohranimo vrijednost nekog broja. Na taj nain se tipom int mogu pohraniti svi brojevi vei od najmanjeg negativnog broja -231 = -2147483648 i manji od najveeg mogueg pozitivnog broja -231 1 = 2147483647 Treba napomenuti da se cjelobrojne veliine u izvornom kodu mogu prikazati u jednom od tri brojna sistema, i to: dekadskom, oktalnom i heksadecimalnom. Pri tome, naravno, dekadski brojni sistem je sistem brojeva od 0-9,oktalni 0-7, i heksadecimalni (0-9, A-F). U jeziku C++ oktalne vrijednosti se piu tako da se ispred prve cifre broja napie broj 0, nakon ega slijedi oktalni zapis broja, kao npr. int broj = 010; // broj 8 u dekadskom zapisu U sluaju heksadecimalnog zapisa u C++ , ispred broja se pie 0x ili 0X,tj. int broj = 0x0C; // broj 12 u dekadskom zapisu Ipak, bez obzira koji od prikaza koristimo pri pridruivanju neke vrijednosti,na ekranu se ispisuje broj u dekadskom brojnom sistemu. Tako u sljedeem primjeru za svaki sluaj ispis je jednak broju 32: int broj = 32; cout << broj; int broj = 040; cout << broj; // broj 32 u dekadskom zapisu // ispis 32 // broj 32 u oktalnom zapisu // ispis 32

52

C++ programiranje za srednje kole prof.Smajo Meki

int broj = 0x20; cout << broj;

// broj 32 u heksadecimalnom zapisu // ispis 32

Realni brojevi Da bismo operisali sa realnim, tj. decimalnim, brojevima moemo koristiti varijable tipa float i double. Tip double koristi vie bajta i time omoguuje vei opseg i veu tanost pri predstavljanju realnih brojeva. Naredni primjeri pokazuju upotrebu tipa float (analogno je za ostale tipove koji predstavljaju realne brojeve): float pi = 3.1415926; float brzinaSvjetlosti = 2.997925e8; float naboj = -1.6E-19; U prvom sluaju koristi se klasini nain prikaza broja sa decimalnim zarezom,dok je u drugom i treem sluaju koriteno nauno oznaavanje (eng.scientific). Pri tome, u naunom oznaavanju je mogue koristiti i malo i veliko slovo "e", ali ne smije biti nikakvih praznina unutar broja (izmeu cifri i slova e, te iza predznaka). U sluaju da nam tanost na sedam decimala nije dovoljna, koristimo brojeve sa dvostrukom tanou, tj. brojeve tipa double. U principu, za prikaz decimalnih brojeva najbolje je uvijek koristiti tip double, jer je brzina obavljanja operacija sa ovim tipovima na dananjim kompjuterima podjednako velika kao i sa tipom float. Ogranienja brojevnih tipova Kao to je pokazano u dijelu o cijelim brojevima, na osnovu veliine memorije koju neki brojevni tip zauzima, mogue je odrediti maksimalan i minimalan broj koji se sa njim moe prikazati. O tome kako se odreuje veliina memorije koju zauzima neki objekat ili tip. Ipak, koritenjem datoteka climits(Datoteka mora biti pozvana naredbom #include), za cjelobrojne, i cfloat, za decimalne brojeve, mogue je nai ove vrijednosti. Na primjer, konstante INT_MIN i INT_MAX daju najmanju i najveu vrijednost brojeva tipa int. Sline konstante postoje i za ostale tipove, a sljedei dio programa daje njihovu primjenu: cout cout cout cout cout cout << << << << << << "Najmanji int: " << INT_MIN << endl; "Najveci int: " << INT_MAX << endl; "Najmanji long: " << LONG_MIN << endl; "Najveci int: " << LONG_MAX << endl; "Najveci float: " << FLT_MAX << endl; "Najmanji double:" << DBL_MIN << endl;

Simbolike konstante Prethodni brojevni tipovi se koriste za definisanje varijabli koje mijenjaju svoju vrijednost u toku izvravanja programa. Meutim, u C++ je mogue definisatii konstante, tj. veliine koje ne treba da mijenjaju svoju vrijednost u toku izvrenja programa. Takve su na primjer, vrijednost brzina svjetlosti, naboj elektrona, itd.Osnovni razlog zbog koritenja simbolikih konstanti je osiguranje od promjene njihove vrijednosti. Naime, moe se desiti da u toku pisanja programa napiemo naredbu koja mijenja vrijednost konstante (npr. broja ) i na taj nain napravimo veliku greku u daljem proraunu. Kako bismo izbjegli ovakve probleme, na raspolaganju nam je kvalifikator const, koji nam govori da se radi o varijabli koja ne mijenja svoju vrijednost. Ovaj kvalifikator se koristi na taj nain da se postavlja ispred tipa varijable, kao u primjeru: const float pi = 3.1415926; Ako bismo pokuali promijeniti vrijednost varijable pi (na primjer sa pi = 2*pi;) kompajler bi prijavio greku. Drugi nain definisanja neke konstante je pomou predprocesorske naredbe #define, kao u: #define PI 3.1415926

53

C++ programiranje za srednje kole prof.Smajo Meki

Jedina razlika u koritenju ova dva pristupa je u tome to varijanta sa const omoguuje i simboliko lociranje pogreaka pri debagiranju, dok to nije mogue sa drugom varijantom. Takoer, bitno je napomenuti da se sve simbolike konstante moraju i inicijalizirati prilikom definisanja, tj. pogreno je napisati: const float pi; // greka!!! Logiki tipovi Logiki tipovi su vrlo kasno uvedeni u standardni jezik C++ . Prije nego se uveo tip za ovu vrstu podataka, bool (od engleske rijei boolean, po matematiaru Booleu), u ovu svrhu su se koristili cijeli brojevi 0 i 1 (mada se umjesto 1 mogao koristiti bilo koji broj razliit od 0). Osnovna karakteristika logikih tipova je da mogu imati dvije vrijednosti,i to: tano i netano (eng. true i false). Primjer definisanja logikih varijablije: bool jaSamUcenik = true; bool autoLeti = false; Prilikom manipulisanja sa logikim varijablama (ispis, aritmetike operacije,i sl.), oni se predstavljaju cjelobrojnim tipom int, i to: true se pretvara u 1,a false u 0. No, logikim varijablama se mogu pridruiti i aritmetiki tipovi,tako da se svim brojevima razliitim od nule pridruuje true, a jednakim nuli false. Karakteri (znakovi) Varijabla karakter (znak) se definie tipom char (od engleske rijei character -karakter, znak) i uglavnom se pie kao samo jedan znak upisan izmeu jednostrukih znaka navoda . Ona obuhvata jedan jedini bajt koji sadri kod datog karaktera. Ovaj broj je numerika vrijednost i zavisi od sistema kodiranja karaktera koji se koristi (to je zavisno od kompjutera). Najei sistem je ACSII (eng. American Standard Code for Information Interchange). Na primjer,karakter A ima ASCII kod 65, a karakter a 97. Kao i cijeli broj i karakter moe da bude signed i unsigned. Tako, signed karakter moe da sadri numerike vrijednosti izmeu -128 i 127, a unsigned 0do 255. Sljedei primjer pokazuje upotrebu tipa char za jednoznakovne varijable:

Pri pokretanju, ovaj program se nastavlja ako se unese bilo koji drugi karakter osim k ili K. Ako se, pak, unese k ili K, program se zaustavlja. Problem nastaje ako korisnik programa pritisne samo tipku ENTER. U tom sluaju objekat cin oekuje da se unese neka vrijednost, pa tek onda pritisne ENTER.

54

C++ programiranje za srednje kole prof.Smajo Meki

#include <iostream> 2 using namespace std; 3 main() 4{ 5 char ch; 6 do 7{ 8 cout << "Pritisnite K ili k za kraj, 9 a bilo koju tipku za nastavak \n"; 10 cin >> ch; 11 12 if (ch != K && ch != k) 13 cout << "Zelite nastaviti?\n"; 14 else 15 cout << "Kraj programa"; 16 }while (ch != K && ch != k); 17 }

Osim klasinih karaktera (slova i sl.), postoje i karakteri koji imaju posebnu namjenu (ne predstavljaju karaktere koji se ispisuju). Oni se predstavljaju pomou tzv. escape-sekvenci, kao npr: \n - novi red \t - novi tabulator \v - novi vertikalni tabulator \b - backspace \ - znak navoda (apostrof) \" - dvostruki znak navoda \\ - backslash (/) \a - zvuni signal Znakovne varijable se, ipak, najee koriste kao nizovi karaktera (eng. string)za ispis tekstova. Pitanja za utvrivanje: 1. Da li je mogue definisati vie varijabli jednom naredbom? Ako jeste, dati primjer. 2. Koja je razlika izmeu tipova podataka unsigned int i int? 3. Koja je uloga include direktive? 4. Koliko main funkcija moe biti u programu? 5. ta predstavlja varijabla? 6. ta radi kompajler? 7. ta radi linker? 8. ta radi predprocesor? 9.ta je od navedenog ispravna definicija varijable: a. int n=-100; b. unsigned int i =-100; c. signed int = 2.9; d. long m=2,p=4; 10.Koje od navedenih rijei predstavljaju pravilne nazive varijabli: a. identifier b. dva 15 c. ukupna-plata d. ukupna_plata e) default f) proc.program 11. Definii varijable koje predstavljaju sljedee veliine: a. visina neke osobe b. zarada neke osobe c. broj rijeci u rjeniku d. slovo u abecedi 12. Dati primjer starog (jedan red) i novog naina pisanja komentara. 13. Koju datoteku (header file) moramo pozvati u izvornoj datoteci da bi se koristile cout i cin? 14. Napisati naredbu koja dobiva numeriku vrijednost sa tastature i pridruuje je varijabli temp. 15. Kako se definiu brojevi u C++ ? 16. Kako se definiu znakovi u C++ ? 17. Kako se u C++ definiu logike varijable?

7.Operatori

55

C++ programiranje za srednje kole prof.Smajo Meki

C++ nudi operatore za izvravanje aritmetikih, relacijskih, logikih,bitovnih i uslovnih izraza. Takoer, tu su i veoma korisne "popratne pojave" (eng. side-effect) kao to su pridruivanje, inkrement i dekrement.

7.1.Aritmetiki operatori C++ nudi pet osnovnih operatora, koji su sumirani u Tabeli.

Osim ostatka pri dijeljenju (%) svi aritmetiki operatori prihvataju mijeanje cijelih i realnih brojeva. Openito, ako su oba operanda cijeli brojevi,i rezultat je cijeli broj. Meutim, ako je jedan od operanada realan, onda je i rezultat realan (na primjer, tipa double; Ovakav nain konverzije u C++ naziva se implicitna konverzija). Kada su oba operanda pri dijeljenju cijeli brojevi, rezultat je takoer cijeli broj (tzv. cjelobrojno dijeljenje). U tom sluaju rezultat se zaokruuje na donju vrijednost, tj.. 9/2 daje 4, a ne 4.5! -9/2 daje -5, a ne -4.5! ak i u sluaju kada je rezultat dijeljenja definisan kao realan broj, kao u sljedeem primjeru int cijena = 100; int volumen = 80; double jedinicnaCijena = cijena/volumen; // daje 1 rezultat dijeljenja je cjelobrojan, s obzirom da dijeljenje ima vei prioritet od pridruivanja. Cjelobrojno dijeljenje predstavlja jednu od najeih greki u programiranju, pa je neophodno upoznati naine na koje se moe zaobii. Ovo se moe ostvariti pomou tzv. eksplicitne konverzije, ili dodjele tipa (eng. cast). U tu svrhu se mogu koristiti sljedei operatori (eng. cast operators): static_cast,dynamic_cast, const_cast i reinterpret_cast, ali je za na sluaj vaan operator static_cast (koristi se u sluajevima kada se manjem aritmetikom tipu pridruuje vei; na primjer tipu int pridruuje tip double). Sljedei primjer pokazuje njegovu primjenu: int cijena = 100; int volumen = 80; double jedinicnaCijena = static_cast<double>(cijena)/volumen; //daje 1.25 Operator static_cast moe se koristiti i na varijabli volumen, ali i na obje varijable u koliniku. Prije nego se poeo koristiti ovaj C++ nain pisanja, u upotrebi je bio stari nain (eng. old-style cast), koji se daje ili u tzv. funkcijskom obliku (varijabla meu zagradama): double jedinicnaCijena = double(cijena)/volumen; // daje 1.25 ili u tzv. starom nainu pisanja u jeziku C (sa tipom meu zagradama): double jedinicnaCijena = (double)cijena/volumen; // daje 1.25

56

C++ programiranje za srednje kole prof.Smajo Meki

Ipak, stari nain pisanja se ne preporuuje u pisanju programa koji e se kompajlirati na C++ kompajlerima. Operator % daje ostatak pri dijeljenju dva cijela broja (oba operanda moraju biti cijeli brojevi!!!), npr. 13%3 daje 1. Prilikom koritenja aritmetikih operatora veoma vano mjesto zauzima pojam preljeva. Naime, u sluaju da zbir brojeva prelazi maksimalno dozvoljenu vrijednost, dobivena vrijednost moe biti negativna. Ovaj fenomen se lako moe pokazati na slici ako se za tip int pretpostavi da ima 2 bajta, tj. 16 bita (to znai da je maksimalan pozitivan broj jednak 215 = 32767).

Dakle, ukoliko neku varijablu koja ima vrijednost 32767 uveamo za samo 1, vrijednost koju dobivamo je -32768 (!!!), odnosno za jedan vea od najvee mogue u smjeru kazaljke na satu na slici. 7.2.Relacijski operatori C++ nudi est relacijskih operatora za raunanje brojnih veliina. Pri tome, treba zapamtiti da se operatori <= i >= mogu koristiti samo u tom obliku, a da =< i => ne znae nita u ovom kontekstu. Operandi nekog relacijskog operatora moraju biti brojevi. No, i karakteri su ispravni operandi poto predstavljaju brojnu vrijednost . Relacijski operatori se ne smiju korisiti za poreenje stringova, poto se u tom sluaju porede njihove adrese, a ne sadraj. U tom sluaju, rezultat je neodreen. Ipak, postoje funkcije koje mogu porediti i leksikografsku razliku dva stringa. C++ programiranje za srednje kole prof.Smajo Meki

57

7.3.Logiki operatori Za kombinovanje logikih izraza C++ nudi tri logika operatora. Slino relacijskim operatorima, rezultat pri koritenju logikih operatora je 0 (false) ili 1 (true).

Za razliku od logikog i i logikog ili operatora, koji su binarni operatori, logika negacija je unarni operator, tj. ima samo jedan operand kojem daje negaciju vrijednosti koju posjeduje. 7.4.Bitovni operatori C++ obezbijeuje est bitovnih (eng. bitwise) operatora koji se koriste za manipulisanje pojedinanim bitovima cjelobrojnih podataka. Bitovni operatori su definisani samo za cjelobrojne (int, long int) operand i tretiraju ih kao sekvence bita. Tako, binarna negacija ( - tilda) predstavlja unarni operator koji mijenja stanje bita operanda, tj. svi bitovi koji su jednaki 0 postavlja u 1, a sve bitove koji su jednaki 1 u 0. Binarno i uporeuje odgovarajue bitove svojih operanada i kao rezultat daje 1 ako su oba bita 1, a 0 u ostalim sluajevima. Binarno iskljuivo ili uporeuje odgovarajue bitove svojih operanada i kao rezultat daje 1 ako su oba bita razliita, a 0 u ostalim sluajevima.

58

C++ programiranje za srednje kole prof.Smajo Meki

Operatori pomaknuti lijevo i pomaknuti desno kao lijevi operand uzimaju sekvencu bitova, a kao desni neki cijeli broj n. Prvi operator daje kao rezultat sekvencu bita koja je jednaka lijevom operandu, ali koja je pomjerena n bitovnih pozicija ulijevo. Drugi operator ima istu funkciju, s tom razlikom to pomjera sekvencu bita za n pozicija udesno. 7.5.Inkrementalni i dekrementalni operatori Takozvani auto inkrementalni (++) i auto dekrementalni () operatori obezbijeuju prigodan nain za poveavanje, odnosno smanjivanje brojne varijable za 1. Upotreba ovih operatora je sumirana u Tabeli, pri emu se pretpostavlja da je int k = 5;

Kao to se vidi, oba operatora se mogu koristiti u prefiksnom i postfiksnom obliku. Razlika je velika, jer kada se operator koristi u prefiksnom obliku prvo se primjenjuje operator, a onda se u izrazu koristi rezultat. Kada se koristi u postfiksnom obliku, prvo se rauna izraz, a onda se primjenjuje operator. Oba operatora se mogu primijeniti kako na cjelobrojne, tako i na realne brojeve, iako se ova karakteristika veoma rijetko koristi na realnim brojevima. 7.6.Operatori pridruivanja Operator pridruivanja (=) se koristi za pohranjivanje vrijednosti na neku memorijsku lokaciju (koja je obino pridruena nekoj varijabli). Lijevi operand operatora treba biti neka vrijednost, npr. lijevaVrijednost, dok desni operand moe biti proizvoljni izraz. Desni operand se izrauna i pridrui lijevoj strani. Pri tome lijevaVrijednost predstavlja bilo ta to zauzima neku memorijsku lokaciju na koju se moe pohraniti neka veliina; moe biti varijabla, te zasnovana na pointerima i referencama. Operator pridruivanja moe imati mnogo varijanti, koje se dobivaju njegovim kombinovanjem sa aritmetikim operatorima (mogua je kombinacija i sa bitovnim operatorima). C++ programiranje za srednje kole prof.Smajo Meki

Kako operator pridruivanja sam po sebi predstavlja izraz ija se vrijednost pohranjuje u lijevi operand, on se moe koristiti kao desni operand za narednu operaciju pridruivanja, odnosno moe se napisati:

59

int m, n, p; m = n = p = 5; // isto kao: m = (n = (p = 100)); m =(n= p = 100) + 2; // isto kao: m = (n = (p = 5)) + 2; ili m = 100; m += n = p = 5; // isto kao: m = m + (n = p = 5);}

7.7.Operator razdvajanja (zarez-operator) Operator razdvajanja, ili zarez-operator (eng. comma operator) koristimo kada mnogostruke izraze elimo kombinovati u jedan izraz. Ovaj operator ima dva operanda, pri emu prvo izraunava lijevi operand, a zatim desni, pa tek nakon toga vraa vrijednost posljednjeg kao konaan rezultat. Na primjer: int m, n, min; int mBroji =0, nBroji=0; ...... min = (m < n ? mBroji++, m : nBroji++, n); U ovom primjeru, kada je m < n, izraunava se mBroji++, a zatim se vrijednost m pohranjuje u min. U suprotnom, izraunava se nBroji++, a zatim se vrijednost n pohranjuje u min. 7.8.typedef imena Kljuna rije typedef omoguava definisanje novih imena (sinonima) za postojee tipove podataka. Opta formula ima oblik: typedef tip novo_ime_tipa; Dakle, typedef definicija poinje kljunom rijei typedef, nakon ega se ispisuje tip podatka i identifikator. Pri tome, identifikator ne uvodi novi tip podatka, nego samo sinonim (nadimak) za postojei tip. Ovaj identifikator se moe koristiti bilo gdje u programu u kojem bi se mogao koristiti i sam tip. Na primjer, sljedei primjer pokazuje koritenje sinonima prirodni, za prirodne, tj. nenegativne cijele brojeve. typedef unsigned int prirodni; Ukoliko bismo eljeli definisati prirodni broj N koritenjem imena prirodni, piemo: prirodni N; Treba napomenuti da se u posljednjem primjeru identifikator prirodni moe koristiti kao tip u nekoj drugoj typedef deklaraciji. Inae, typedef imena se koriste kako bi se smanjila kompleksnost ispisivanja pojedinih tipova, kao to su kompleksne deklaracije imenika, pointera na funkcije, te pointera na funkcijske lanove klasa. 7.9.sizeof operator Sizeof operator slui za raunanje veliine bilo kojeg podatka ili tipa. To je unarni operator, koji za operand moe imati tip (npr. int, char, . . . ) ili izraz, a kao rezultat daje broj bajtova koji operand zauzima u memoriji raunara. Ovaj rezultat je u potpunosti zavisan od raunara na kojem se radi. Naredni primjer ilustruje koritenje ovog operatora za raunanje veliine osnovnih tipova podataka. #include <iostream> 2 using namespace std; 3 4 int main (void) 5{

60

C++ programiranje za srednje kole prof.Smajo Meki

6 cout << "char size = " << sizeof(char) << " bytes\n"; 7 cout << "short size = " << sizeof(short) << " bytes\n"; 8 cout << "int size = " << sizeof(int) << " bytes\n"; 9 cout << "long size = " << sizeof(long) << " bytes\n"; 10 cout << "float size = " << sizeof(float) << " bytes\n"; 11 cout << "double size =" << sizeof(double) << " bytes\n"; 12 cout << "HELLO size = " << sizeof("HELLO") << " bytes\n"; 13 system("pause"); 14 } 7.10.Hijerarhija operatora Slino pravilima u matematici o redoslijedu izvoenja pojedinih raunskih operacija,i redoslijed koritenja pojedinih operatora u nekom izrazu u C++ je veoma bitan. Stoga se operatori dijele na razliite hijerarhijske nivoe, pri emu operatori na viim nivoima imaju prednost nad onim koji su nie. daje prikaz hijerarhije nekih od operatora operatora u C++ , od onih sa najvecim prema onim sa najmanjim prioritetom. Pri tome su operatori sa istim prioritetom smjeteni u isti blok (odvojen horizontalnim linijama).

Na primjer, u izrazu

61

C++ programiranje za srednje kole prof.Smajo Meki

a=b+c*d; prvo se rauna c*d, jer znak mnoenja * ima vei prioritet od znaka sabiranja + i znaka pridruivanja =. Rezultat mnoenja se zatim dodaje varijabli b, jer operacija sabiranja ima vei prioritet od operacije pridruivanja. Ovakav nain definisanja hijerarhije je neophodan, jer se pojedini operatori koriste za vie namjena. Takav primjer je znak plus, +, koji se moe koristiti kao binarni operator za sabiranje, unarni operator za promjenu znaka nekog broja, ali i kao operator za uveavanje (postfiks i prefiks inkrement). Ako, na primjer, elimo sabrati dva broja, pri emu je drugi broj prethodno uvean za jedan, imamo izraz: c=a+ ++b; No, moe se desiti da umjesto prethodnog izraza napiemo: c=a+++b; to bi, imajui na umu hijerarhiju operatora, kompajler razumio kao: c=a++ +b; U ovom sluaju, prvo se izvrava sabiranje brojeva a i b, a zatim se broj a povea za jedan, to naravno nismo eljeli uraditi. Treba napomenuti da u sluaju dvoumljenja oko prioriteta operatora, najbolje je koristiti zagrade, i na taj nain zaobii ugraenu hijerarhiju. Tako bi ranije primjere mogli napisati u obliku: a=b+(c*d); odnosno c=a+(++b); Pitanja za utvrivanje: 1. Koji od logikih operatora su unarni, a koji su binarni? 2. ta radi inkrement operator? 3. ta radi dekrement operator? 4. Objasni ta radi sljedea naredba: cout >> --broj! 5.Dodati zagrade sljedeim izrazima tako da se pokae kojim redom se izraunavaju pojedini operatori: a) (n <= p + q && n >= p - q || n == 0) b) (++n * q / ++p - q) c) (n | p & q p 2 + q) d) (p < q ? n < p ? q * n - 2 : q / n + 1 : q - n) 6. ta e biti vrijednost sljedeih varijabli nakon inicijalizacije: a) double d = 2 * int(3.14); b) long k = 3.14 - 3; c) char c = a + 2; d) char c = p + A - a; 7. Tano ili netano: u naredbi pridruivanja, vrijednost sa lijeve strane od znaka jednako je uvijek jednako vrijednosti na desnoj strani. 8. Tano ili netano: potpuno je normalno koristiti razliite tipove podataka u istom aritmetikom izrazu. 9. Objasniti pojam preljeva? 10. Napisati naredbu koja pomou operatora pridruivanja poveava vrijednost varijable temp za 23. Napisati istu naredbu bez operatora pridruivanja. 11. Relacijski operator; a) Pridruuje jedan operator drugom b) Daje Boolean rezultat c) Poredi dva operanda d) Logiki kombinuje dva operanda 12. Napisati izraz koji koristi relacijski operator koji ima vrijednost true ako varijabla var1 nije jednaka varijabli var2. 13. Operatori && i ||: a) Porede dvije numerike vrijednosti

62

C++ programiranje za srednje kole prof.Smajo Meki

b) Kombinuju dvije numerike vrijednosti c) Porede dvije Boolean vrijednosti d) Kombinuju dvije Boolean vrijednosti 14. Provjeriti ta je rezultat sljedee upotrebe uslovnog operatora, ako je m=5.1, n=7.2: int min = (m < n ? m++ : n++);

8.Naredbe
Ovim naslovom opisat emo razne oblike C++ naredbi koje slue za pisanje programa. Kao i veina ostalih programskih jezika, C++ nudi razliite vrste naredbi koje se koriste u razliite svrhe. Tako se deklaracione naredbe koriste za definisanje varijabli, naredbe pridruivanja za jednostavne proraune, itd. 8.1.Jednostavne i sloene naredbe3 Jednostavna naredba je svaka naredba koja zavrava taka-zarezom (;). Definicije varijabli i izrazi koji zavravaju sa taka-zarezom su samo neki od primjera, kao u sljedeim sluajevima: int i; // deklaraciona naredba ++i; // naredba sa popratnom pojavom double d = 10.5; // deklaraciona naredba d + 5; // beskorisna naredba Najjednostavniji oblik naredbe je linija koja sadri samo taka-zarez, tzv.null-naredba. No, i ovakva naredba ponekad ima smisla. Mnogostruke naredbe se mogu kombinovati u sloene naredbe kada se grupiu izmeu 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) omoguuju da se mnogostruka naredba postavi tamo gdje bi inae mogla da se postavi samo jedna, b) omoguuju da se u program uvede podruje definisanosti varijable (eng. scope). Podruje varijable predstavlja dio programa unutar kojeg varijabla ostaje definisana. Izvan tog podruja ona to vie nije.

Preuzeto i obraeno by Uvod u programiranja u C++ -predavanja na FIT Mostar;

63

C++ programiranje za srednje kole prof.Smajo Meki

8.2.Naredba if Ponekad je poeljno da se izvri odreena naredba koja zavisi od ispunjenja nekog uslova. Upravo tu mogunost prua if naredba, iji je opti oblik: if (izraz) naredba; Prvo se izvrava izraz, i ako je rezultat razliit od nule izvrava se naredba. U suprotnom, nita se ne deava.

1 #include <iostream> 2 using namespace std; 3 4 main() 5{ 6 int x; 7 cout << "Unesite neki broj"; 8 cin >> x; 9 if (x % 2 == 0) 10 cout << "Broj je paran" << endl; 11 else 12 cout << "Broj je neparan" << endl; 13 system(Pauase);return 0; }

64

C++ programiranje za srednje kole prof.Smajo Meki

Uvjet je logiki izraz, zapisuje se unutar para okruglih zagrada. Na kraju naredbe if ne stavlja se znak taka zarez ; Primjer 1 Ako elimo provjeriti da li je pri dijeljenju djelilac razliit od nule i izvriti dijeljenje, upotreba naredbe if ima oblik: if (djelilac != 0) Kolicnik=djelitelj/djelilac; U sluaju da elimo izvriti vie naredbi koje ovise o nekom istom uslovu,koristimo sloenu naredbu, tj. sve naredbe stavljamo izmeu velikih zagrada. Varijanta if naredbe koja omoguuje da se specificiraju dvije alternativne naredbe, jedna koja se izvrava kada je uslov ispunjen i druga kada nije, naziva se if-else naredba i ima oblik: if (izraz) naredba1; else naredba2; Ovdje se najprije izvrava izraz, i ako je rezultat razliit od nule, izvrava se naredba1. U suprotnom, izvrava se naredba2, to pokazuje i primjer provjere da li je broj paran ili ne:

Pored prethodno navedenih varijanti, postoji i ugnijedena if naredba, u kojoj se javlja vie od dvije alternative. Primjer takve varijante je, recimo, izraunavanje cijene telefonskog rauna: if (vrijemePoziva > 7 && vrijemePoziva < 19) { if (duzinaPoziva <= 60) cijena = duzinaPoziva * tarifa1; else cijena = 60 * tarifa + (duzinaPoziva - 60) * tarifa2; } else cijena = osnovnaCijena; Kao to se vidi unutar prve if naredbe, koja provjerava uslov da li je poziv izvren u periodu 7.00-19.00 sati, nalazi se jo jedna if naredba. Ova naredba ima za cilj da provjerava duinu poziva, i na osnovu toga formira cijenu istog. U sluaju da je poziv izvren izvan perioda 7.00-19.00, cijena se formira na osnovu osnovne cijene poziva. Primjer 2 Treba unijeti cijeli broj razliit od 0 pa provjeriti da li je negativan ili pozitivan. U oba sluaja ispisati apsolutnu vrijednost broja.

Ako je (a<0) izvrit e se prvi blok naredbi. Ako uvjet nije zadovoljen, prvi blok naredbi se preskae i izvoenje se programa nastavlja od prve naredbe iza bloka, a to je provjera drugog uvjeta (a>0). Ako nije ispunjan niti drugi uvjet (za a=0), drugi blok naredbi se preskae i izvoenje se nastavlja od naredbe return 0. Naredba if else Za dvostruko uvjetno grananje koristi se naredba if - else.

65

C++ programiranje za srednje kole prof.Smajo Meki

Ako je vrijednost uvjeta logika istina izvodi se prvi blok. Nakon njegova zavretka izvoenje se nastavlja od prve naredbe iza drugog bloka. Ako je vrijednost uvjeta logika neistina, preskae se prvi blok i izvodi se drugi blok (iza naredbe else). Nakon njegova zavretka izvoenje se nastavlja od prve naredbe iza drugog bloka. Primjer3. Primjer je rijeen uz pomo if else naredbe. Ako je (a<0) izvrit e se prvi blok naredbi. Ako je (a>0), preskae se prvi blok i izvodi se drugi blok naredbi.

to ako korisnik ne proita uputu paljivo, pa unese broj 0? Rezultat nee biti ispravan:

66

C++ programiranje za srednje kole prof.Smajo Meki

Uneseni broj treba provjeriti. Ako je unesena 0, korisnika valja upozoriti, a potom korisnik mora unijeti novi broj koji je razliit od 0. Da bi to bilo mogue, potrebna je naredba koja omoguava nastavak odvijanja programa od odabrane naredbe. Naredba goto Naredba goto omoguava nastavak odvijanja programa od odabrane naredbe. Naredba na koju se eli skoiti, od koje se eli nastaviti odvijanje programa, moe biti bilo gdje u programu. Opi oblik naredbe: goto oznaka_naredbe; Naredbu od koje se eli nastaviti odvijanje programa treba oznaiti oznakom iza koje dolazi znak dvotake. oznaka_naredbe:naredba; goto oznaka_naredbe;

estom upotrebom naredbe goto teko je slijediti tok odvijanja programa to oteava otkrivanje pogreaka. Naredbu goto stoga treba izbjegavati i nastojati zadatak rjeiti na drugi nain, pomou petlji koje e biti objanjene kasnije. Nredba if-else if-else

67

C++ programiranje za srednje kole prof.Smajo Meki

Za viestruko uvjetno grananje koristi se naredba if else if - else.Broj pustavljenih uvjeta nije ogranien.

Ako je vrijednost prvog uvjeta logika istina, izvodi se prvi blok naredbi. Nakon njegova zavretka izvoenje se nastavlja od prve naredbe iza zadnjeg bloka naredbi. Ako je vrijednost prvog uvjeta logika neistina, provjerava se drugi uvjet. Ako je on logika istina, izvodi se drugi blok naredbi, a potom prva naredba iza zadnjeg bloka naredbi. Ako je vrijednost drugog uvjeta logika neistina, provjerava se trei uvjet, i td. Provjere se tako redom nastavljaju sve do naredbe else. Ako do tada niti jedan od uvjeta nije imao vrijednost logike istine, izvrit e se zadnji blok naredbi koji se nalazi iza naredbe else.

Primjer4

68

C++ programiranje za srednje kole prof.Smajo Meki

Treba upisati prirodni broj pa provjeriti da li je vei ili manji od 100, te da li je paran ili neparan.

Viestrukim uvjetnim grananjem provjerava se da li je broj vei, manji ili jednak 100. Dvostrukim uvjetnim grananjem (neovisno o tome da li je broj vei ili manji od 100) provjerava se parnost broja. Parnost se provjerava operatorom modulo (ostatak dijeljenja s 2 se usporeuje s 0).

8.3.Naredba switch Naredba switch-case omoguava jednostruko grananje koje ovisi o vrijednosti postavljenog uvjeta. Za razliku od viestrukog grananja naredbom if u kojoj su uvjeti logiki izrazi, u naredbi switch-case uvjet je cjelobrojan izraz ili cjelobrojna varijabla.Grananje swich-case.

69

C++ programiranje za srednje kole prof.Smajo Meki

Prvo se rauna izraz (switch tag), a zatim se rezultat poredi sa svakom od numerikih konstanti (labele), po redu kako se javljaju, dok se ne poklopi sa jednom od komponenti. Nakon toga se izvravaju naredbe koje slijede. Izvravanje se izvodi sve dok se ne naie na naredbu break ili dok se ne izvre sve naknadne naredbe. Posljednji sluaj (default) moe, a i ne mora da se koristi, i pokree se ako nijedna od prethodnih konstanti nije zadovoljena. Koritenje ove naredbe dat je u sljedeem primjeru, koji odreuje opseg osvojenih bodova na ispitu na osnovu dobijene ocjene.

70

C++ programiranje za srednje kole prof.Smajo Meki

Opti oblik switch naredbe je: switch (izraz) { case konstanta_1: naredbe; break; ... case konstanta_n: naredbe; break; default: naredbe; }

#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; system(Pause);return 0; } } Primjer 5 Treba izraunati ukupni otpor za otpore R1 i R2, ovisno o tome da li su spojeni serijski ili paralelno. Za odabir serijskog spoja korisnik upisuje 1, a za paralelnog 2. Valja nainiti dvije grane (serijski spoj-1, paralelni-2). Ovisno o tome to korisnik upie (broj 1 ili broj 2) izvrit e se jedna od dvije grane. U sluaju da korisnik unese vrijednost koja nije 1 ili 2, ispisat e se upozorenje. C++ programiranje za srednje kole prof.Smajo Meki

71

Rezultat programskog koda.

Ako se ne upie broj 1 ili 2 ispisat e se poruka o greci.

8.4.Naredba for

72

C++ programiranje za srednje kole prof.Smajo Meki

For petlja se najee koristi ako se dijelovi programa trebaju ponoviti unaprijed poznati broj puta. Svaka for petlja ima svoju kontrolnu varijablu.Njena se vrijednost svakim prolaskom kroz petlju mijenja ovisno o vrijednosti prirasta. Kontrolnu varijablu petlje potrebno je prije ulaska u petlju deklarirati. U petlji se najprije zadaje vrijednost poetnog stanja kontrolne varijable petlje (poetno stanje). Po zadavanju poetnog stanja kontrolne varijable petlje zapisuje se uvjet. Rezultat uvjeta je podatak tipa bool (0 ili 1).Blok naredbi se izvrava sve dok je vrijednost uvjeta jednaka logikoj istini (1). Kad vrijednost uvjeta postane neistina (0) petlja se prekida. Naredba for (for petlja) je slina naredbi while, ali ima dvije dodatne komponente: (i) izraz koji se izraunava samo jednom prije nekog prorauna koji se ponavlja, i (ii) izraz koji se izraunava jednom na kraju svake iteracije. Opti oblik naredbe for je: for (izraz1; izraz2; izraz3) naredba; Prvo se izraunava izraz1. Svakim prolaskom kroz petlju se izraunava izraz2. Ako je rezultat razliit od nule izraunava se izraz3. U suprotnom petlja se zaustavlja. Oblik while petlje koja je ekvivalentna do petlji je: izraz1; while (izraz2) { naredba; izraz3; } Naredba for se najee koristi u situacijama kada se neka varijabla poveava ili smanjuje za neku veliinu u svakoj iteraciji, odnosno kada je broj iteracija unaprijed poznat. Sljedei primjer rauna zbir svih brojeva od 1 do n: sum = 0; for (int i = 1; i <= n; ++i) sum += i; Prvo se vrijednost zbira inicijalizira na vrijednost nula (sum=0;). Prvi izraz u petlji for predstavlja poetnu vrijednost brojaa i, koja je jednaka 1. Nakon toga, provjerava se uslov i <= n. Ako je uslov ispunjen, izraunava se naredba. U ovom sluaju, radi se o jednostavnoj naredbi (sum += i;), tako da nema potrebe za koritenjem velikih zagrada. Nakon izvrenja naredbe, izraunavase trei izraz, ++i, i postupak nastavlja sve dok se ne ispuni uslov i <= n. Treba naglasiti da se umjesto prefiks inkrementa, kao trei izraz mogao staviti i postfiks inkrement (i++). Bilo koja od komponenti u petlji moe biti prazna. Na primjer, ako se uklone prvi i trei izraz, onda je do petlja for (; i != 0;) bilo-sta; ekvivalentna sa while petljom . while (i != 0) bilo-sta; Uklanjanje svih izraza u petlji daje beskonanu petlju: for (;;) // beskonana petlja bilo-sta; Poto petlje predstavljaju naredbe, mogu se pojaviti unutar drugih petlji (tzv. ugnijedene petlje). Klasini primjer je koritenje dvostruke petlje pri ispisu tablice mnoenja brojeva do 10: for (int i = 1; i <= 10; ++i){ for (int j = 1; j <= 10; ++j) cout << setw(5)<< i*j; cout << endl;

73

C++ programiranje za srednje kole prof.Smajo Meki

} U liniji sa ispisom (cout << setw(5)<< i*j;) koriten je operator za manipulisanje setw(), koji se koristi za formatirano ispisivanje. Naime, brojka unutar zagrada (u gornjem primjeru to je broj 5) predstavlja najmanji prostor predvien za ispis podataka u izlaznom toku. Primjer 1: Ispii prvih 20 prirodnih brojeva, svaki u svom redu. Na kraju ispii i vrijednost varijable i nakon izvoenja petlje. Rjeenje:

Primjer 2: Ispii parne brojeve od 20 do 450. Rjeenje:

74

C++ programiranje za srednje kole prof.Smajo Meki

Primjer 3: Ispii sve prirodne brojeve izmeu 1 i N, koji su djeljivi sa 3. Rjeenje:

75

C++ programiranje za srednje kole prof.Smajo Meki

8.5.Naredba while Naredba while (naziva se i while petlja) omoguuje ponavljanje neke naredbe sve dok je ispunjen neki uslov. Opti oblik ove naredbe je: while (izraz) naredba; Prvo se izraunava izraz (naziva se i uslov petlje). Ako je rezultat razliit od nule tada se izvrava naredba (naziva se i tijelo petlje) i cijeli proces se ponavlja. U suprotnom, proces se zaustavlja. Na primjer, ako elimo izraunati zbir svih brojeva od 1 do n, upotreba while naredbe ima oblik: i = 1; sum = 0; while (i <= n) sum += i++; \\ili {sum = sum + i; i = i + 1;} Tijelo petlje while moe biti prazno, tj. sa null-naredbom, ali to nije uobiajeno. Ipak, sljedei primjer, problem nalaenja najveeg neparnog faktora nekog broja, pokazuje i jedan takav sluaj. while (n % 2 == 0 && n /= 2) Ovdje uslov petlje izvrava sve neophodne kalkulacije, tako da nema potrebe za tijelom. Primjer:Za niz od 5 razliitih brojeva ispii zbir.

76

C++ programiranje za srednje kole prof.Smajo Meki

8.6.Naredba do Naredba do (naziva se i do petlja) je slina naredbi while, osim to se prvo izvrava tijelo petlje, a zatim se provjerava uslov. Opti oblik naredbe je: do naredba; while (izraz); Prvo se izvrava naredba, a zatim provjerava izraz. Ako je izraz razliit od nule cijeli proces se ponavlja. U suprotnom, petlja se zaustavlja. Naredba do se manje koristi nego while petlja. Obino se koristi kada se tijelo petlje mora izvriti najmanje jedanput bez obzira na ispunjenje uslova. Takav primjer je, recimo, ponovljeno unoenje nekog broja u primjeru izraunavanja njegovog kvadrata sve dok se ne unese broj 0: do { cin >> n; cout << "Kvadrat broja " << n << " je" << n * n << "\n"; } while (n != 0); Za razliku od while petlje, do petlja se nikada ne koristi sa praznim tijelom prvenstveno zbog jasnoe. Primjer:Za niz prirodnih brojeva od 1-N ispii sumu (zbir) neparnih.

77

C++ programiranje za srednje kole prof.Smajo Meki

78

C++ programiranje za srednje kole prof.Smajo Meki

Pitanja za utvrivanje: 1. Koja od petlji (for, while, do) se izvrava barem jednom? 2. Koja od petlji je najbolji izbor kada je broj iteracija poznat? 3. Napii naredbe za sljedee: a) provjera da li je broj neparan, b) provjera da li je broj neparan i negativan, c) dati apsolutnu vrijednost nekog broja. 4. Pretpostavljajui da je n = 20, ta e biti rezultat sljedeeg koda: if (n >= 0) if (n < 10) cout << "n je malo\n"; else cout << "n je negativno\n"; 5. Opii svrhu tri naredbe unutar for petlje. 6. Tano ili netano: inkrementalni izraz unutar for petlje moe smanjiti varijablu petlje. 7. Blok nekog koda je odvojen ..... 8. Koliko puta se izvrava tijelo do petlje? 9. Dati sintaksu naredbe switch!

9.Funkcije
Funkcije obezbijeuju prikladan nain pakovanja nekog numerikog "recepta", koji se moe koristiti koliko god je to puta potrebno, i predstavljaju okosnicu tehnike proceduralnog programiranja. Na primjer Ja u vam dati jedan broj. Vi trebate tom broju dodati 2 i proizvod pomnoiti sa datim brojem . Sline instrukcije moete dati i kompjuteru izraene na nekom programskom jeziku. Tada oekujete da broj x unesete, da maina izrauna x + 2, zatim (x + 2) * x. Za dati ulaz x maina e proizvesti jedinstven izlaz broj ((x + 2) * x). U matematici, proces koji, za dati ulaz (odreenog tipa), proizvodi jedinstven izlaz naziva se funkcija. Efekt procesa obrade na raunaru moe se posmatrati kao evaluacija funkcija. Zato su funkcije najvanija matematika tema u oblasti kompjuterske obrade. 9.1.Definicija Definicija funkcije se sastoji od dva glavna dijela: 1.zaglavlja ili interfejsa, i 2.tijela funkcije. Interfejs definie kako se funkcija moe koristiti. On se sastoji od tri dijela: Imena. Ovo je, u stvari, jedinstveni identifikator funkcije. Parametara (ili potpisa). Ovo je niz od nula ili vie identifikatora nekog tipa koji se koriste za prosljeivanje vrijednosti u i iz funkcije. Tipa. Ovo specificira tip vrijednosti koji funkcija vraa. Funkcija koja ne vraa nijednu vrijednost bi trebala da ima tip void. Tijelo funkcije sadri raunske korake (naredbe) koji ine samu funkciju.Koritenje funkcije se izvodi njenim pozivanjem. Poziv funkcije se sastoji od imena funkcije, praenim zagradama za pozivanje (). Unutar ovih zagrada se pojavljuje nula ili vie argumenata koji se odvajaju zarezom. Broj argumenata treba odgovarati broju parametara funkcije. Svaki argument je izraz iji tip treba odgovarati tipu odgovarajueg parametra u interfejsu funkcije. Kada se izvrava poziv funkcije, prvo se raunaju argumenti i njihove rezultujue vrijednosti se pridruuju odgovarajuim parametrima. Nakon toga se izvrava tijelo funkcije. Na kraju, funkcija vraa vrijednost poziva (ako isti postoji). Sljedei primjer ilustrativno pokazuje definiciju jednostavne funkcije koja izraunava vrijednost stepena cijelog broja na neki cijeli broj.

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 definie interfejs funkcije. Ona poinje tipom funkcije koji se vraa;u ovom sluaju radi se o cjelobrojnoj vrijednosti, int . Nakon toga je dato ime funkcije, Stepen, a zatim lista njenih parametara. Funkcija Stepen ima dva parametra (baza i eksponent) koji su tipa int. Pri tome, uzeto je da varijabla eksponent ima samo pozitivne vrijednosti (unsigned int), jer je i funkcija Stepen cjelobrojnog tipa int1. Sintaksa parametara je slina sintaksi definisanja varijabli, tj. nakon tipa daje se ime parametra, osim to se parametri ne odvajaju zarezom, kao u:

79

C++ programiranje za srednje kole prof.Smajo Meki

int Stepen (int baza, eksponent) // Ovo je pogreno! Zagrada { u liniji 2 predstavlja poetak tijela funkcije. U liniji 3 definisana je lokalna varijablu rezultat. Stepen varijable baza na varijablu eksponent pomou for petlje se rauna u linijama 4 i 5. Rezultat se pohranjuje u varijablu rezultat (linija 5). U liniji 6 vraa se vrijednost rezultat kao rezultat funkcije. Zagrada } u liniji 7 predstavlja kraj tijela funkcije. Naredni primjer pokazuje kako se funkcija poziva (bez definicije funkcije). Posljedica poziva funkcije je da se vrijednosti argumenata 2 i 8 pridruuju parametrima baza i eksponent, respektivno, a zatim se rauna tijelo funkcije. 1 #include <iostream> 2 using namespace std; 3 4 main(void){ 5 cout << "2 ^ 8= " << Stepen(2,8) << \n; 6} Kada se program pokrene daje sljedei izlaz: 2 ^ 8 = 256 Definisanje gore pomenute funkcije moe se izvriti na vie naina, kao to emo pokazati u narednim primjerima. Primjer 1. 1 #include <iostream> 2 using namespace std; 3 4 double Stepen (int baza, int eksponent) 5{ 6 double rezultat = 1; 7 8 for (int i = 0; i < eksponent; ++i) 9 rezultat *= baza; 10 return rezultat; 11 } 12 13 main () 14 { 15 int a,b; 16 cout << "Unesi bazu:"; 17 cin >> a; 18 cout << "\nUnesi eksponent:"; 19 cin >> b; 20 cout << a<<"^" <<b<<" = " << Stepen(a,b) << \n; 21 system("PAUSE"); 22 } Vidi se da je funkcija Stepen definisana prije glavnog programa (sve funkcije,koje se koriste u nekom programu, moraju se definisati prije glavnog programa, dakle prije funkcije main). U ovom sluaju, funkcija ima tip double, tako da moe da "pokrije" vie mogunosti (vee rezultate, decimalne brojeve kao rezultat). Poziv funkcije, linija 20, vri se pomou Stepen(a,b), pri emu tipovi oba argumenta a i b, odgovaraju tipovima parametara funkcije baza i eksponent, respektivno. Primjer 2. Treba napomenuti da se definicija funkcije sastoji od njenog prototipa, tako da je za definisanje dovoljno ispisati samo njen prototip. Na taj nain, kompletna definicija funkcije se moe dati kasnije,

80

C++ programiranje za srednje kole prof.Smajo Meki

kao to je pokazano u narednom primjeru. Takoer je mogue izostaviti nazive parametara u definiciji, ali to nije preporuljivo.

Dakle, funkcija je definisana u liniji 4, koristei njen potpis. Vano je napomenuti da je u ovom sluaju neophodno staviti taka-zarez (;) nakon definisanja, jer linija 4 predstavlja naredbu. Sjetimo se da se nakon definisanja funkcije ne stavlja taka-zarez nakon zagrade }, koja zatvara tijelo funkcije. itava definicija funkcije data je linijama 22-29. Primjer 3. Radi preglednosti veoma je korisno sakupiti sve funkcije u posebne datoteke, i umjesto njihovog definisanja u sklopu izvrne datoteke, treba samo proitati tu datoteku. Na primjer, ako je definicija funkcije Stepen data u datoteci StepenInt.h,tj. \\ sadrzaj datoteke StepenInt.h int Stepen (int baza, int eksponent) { int rezultat = 1; for (int i = 0; i < eksponent; ++i) rezultat *= baza;

81

C++ programiranje za srednje kole prof.Smajo Meki

1 #include <iostream> 2 using namespace std; 3 4 double Stepen (int baza, int eksponent); 5 // deklarisanje funkcije 6 7 /* moguce je funkciju daklarisati i na sljedeci nain 8 double Stepen (int, int); 9 */ 10 11 main () 12 { 13 int a,b; 14 cout << "Unesi bazu:"; 15 cin >> a; 16 cout << "\nUnesi eksponent:"; 17 cin >> b; 18 cout << a<<"^" <<b<<" = " << Stepen(a,b) << \n; 19 system("PAUSE"); 20 } 21 22 double Stepen (int baza, int eksponent) 23 { 24 double rezultat = 1; 25 26 for (int i = 0; i < eksponent; ++i) 27 rezultat *= baza; 28 return rezultat; 29 }

return rezultat; } onda prethodni program ima oblik:

#include <iostream> #include StepenInt.h using namespace std; main () { int a,b; 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 izvrna datoteka. U suprotnom, treba dati tanu lokaciju iste (eng. path). 9.2.Parametri i argumenti C++ podrava 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 nee promijeniti vrijednosti argumenata. Na primjer, u programu: #include <iostream> using namespace std; void Funkcija (int broj) { broj = 0; cout << "broj = " << broj << \n; } int main () { int x = 10; Funkcija(x); cout << "x = " << x << \n; system("PAUSE"); return 0; } 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 broj u funkciji mijenja vrijednost na 0, to nece utjecati na varijablu x. Program e dati sljedei izlaz: broj = 0; x = 10; Za razliku od parametra po vrijednosti, parametar po referenci prima argumentkoji 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 & (ampersand) ispred varijable koja je parametar u interfejsu funkcije, tj. u prethodnom primjeru interfejs funkcije. Funkcija ima oblik: void Funkcija (int &broj)

82

C++ programiranje za srednje kole prof.Smajo Meki

Mogue je simbol & staviti i iza tipa varijable broj, kao u void Funkcija (int& broj),i na programeru je da odabere nain koji mu vie odgovara. U principu, vano se uvijek drati istog pravila, ako ni zbog cega drugog onda zbog preglednosti programa. U kontekstu pozivanja funkcija, a na osnovu prethodno iznesenog, razlikujemo dvije vrste pridruivanja: pridruivanje prema vrijednosti i pridruivanje prema referenci. U praksi (u pogledu funkcija) se mnogo vie koristi pridruivanje prema vrijednosti. 9.3.Globalne i lokalne varijable Za sve to se definie izvan programskog podruja (scope) se kae da ima globalni karakter. Tako, sve funkcije koje smo do sada koristili predstavljaju globalne funkcije. No, i varijable se mogu definisati u globalnom podruju, tj.izvan svih funkcija koje se koriste u programu, ukljuujui i funkciju main. 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. Poto su globalni entiteti "vidljivi" na svim programskim nivoima, oni moraju biti jedinstveni na nivou programa. To znai da se globalne varijable ili funkcije na globalnom podruju ne mogu definisati vie nego jedanput, iako se ime funkcije moe definisati vie puta sve dok su im parametri (njen potpis) jedinstveni . Globalni entiteti su openito pristupani bilo gdje u programu.Svaki blok u programu definie lokalno podruje. Na taj nain, tijelo funkcije predstavlja lokalno podruje. Parametri funkcije imaju isto podruje kao i tijelo funkcije. Varijable koje su definisane unutar lokalnog podruja su vidljive samo u tom podruju. Lokalno podruje moe da bude ugnijedeno, pri cemu unutranje podruje ponitava vanjsko. Na primjer: int xyz; void Funkc (int xyz) Funkc { if (xyz > 0) { double xyz; } } // xyz je globalna varijabla // xyz je lokalna varijabla // u tijelu funkcije // xyz je lokalna varijabla u ovom bloku //...

imamo tri razliita podruja, od kojih svaki ima razliitu varijablu xyz.Openito, ivotni vijek varijable je ogranien na podruje iste. Tako, na primjer, globalne varijable traju svo vrijeme izvrenja programa, dok se lokalne varijable kreiraju kada se ue u njihovo podruje, a unitavaju kada se iz njega izae. Memorijski prostor za lokalne varijable je rezervisan prije izvrenja programa, dok je memorijski prostor za lokalne varijable alociran "u hodu" u toku izvrenja programa. Poto lokalno podruje ponitava globalno, to lokalne varijable sa istim imenom kao globalne varijable onemoguavaju pristup globalnim varijablama unutar lokalnog podruja. Na primjer, u int greska; \\globalna varijabla void Greska (int greska) { \\lokalna varijabla //... } globalna varijabla greka je, kao to se i oekuje, nepristupana unutar funkcije. Greska, poto je ponitena lokalnim parametrom greka.Ovaj problem se moe prevazii koritenjem unarnog operatora podruja (unary scope operator), koji globalni entitet uzima kao argument, kao u primjeru

83

C++ programiranje za srednje kole prof.Smajo Meki

int greska; void Greska (int greska) { //... if (::greska != 0) // odnosi se na globalnu varijablu // greska //... } 9.4.Rekurzivne funkcije Za funkciju koja poziva samu sebe kaemo da je rekurzivna. Rekurzija je opta programska metoda koja se primjenjuje na probleme koji se definiu u odnosu na same sebe. Na primjer, problem raunanja 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, tj. n!=n(n-1)! Posljednji dio definicije jasno pokazuje da je faktorijel definisan u odnosu na samog sebe, te se stoga moe 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 koristei iteracije. Naime, treba imati u vidu da u sluaju 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 rjeenje. No, u nekim sluajevima elegantno i jednostavno rekurzivno rjeenje moe da bude bolja opcija. U sluaju faktorijela, na primjer, iterativna opcija je bolja, pa bi funkcija imala oblik: int Faktorijel (unsigned int n) { int rezultat = 1; while (n > 0) rezultat *= n--; return rezultat; }

Pitanja za utvrivanje: 1. Da li funkcija moe imati vie od jednog argumenta? 2. Da li funkcija mora imati return vrijednost? 3. Da li funkcija moe imati vie od jedne return vrijednosti? 4. Da li je mogue da funkcija nema ni argumente ni return vrijednost? 5. Da li funkcija moe imati i argumente i return vrijednosti? 6. Nakon imena funkcije slijedi ..... 7. Tijelo funkcije je odvojeno .... 8. Skup naredbi koji obavlja radnje neke funkcije predstavlja ..... funkcije. 9. Opis funkcije dat jednom naredbom, koja zapoinje definiciju funkcije, naziva se .... 10. Tano ili netano: kada se argumenti funkcije prenose po vrijednosti,funkcija radi sa originalnim argumentima iz programa koji poziva funkciju. 11. Varijabla definisana unutar bloka je vidljiva: a) od take definisanja nadalje u programu, b) od take definisanja nadalje u funkciji, c) od take definisanja nadalje u bloku, d) u cijeloj funkciji.

84

C++ programiranje za srednje kole prof.Smajo Meki

12. ta znai kada se koriste prazne zagrade () u definiciji funkcije? 13. Koliko vrijednosti se moe vratiti iz funkcije? 14. Tano ili netano: kada funkcija vraa vrijednost, cijeli poziv funkcije se moe pojaviti na desnoj strani znaka jednakosti i pridruiti drugoj varijabli. 15. Gdje se specificira tip vrijednosti koji se vraa nekom funkcijom? 16. Kada se argument prenosi po referenci: a) kreira se varijabla u funkciji da pohrani vrijednost argumenta, b) funkcija ne moe pristupiti vrijednosti argumenta, c) kreira se privremena varijabla u programu koji poziva funkciju da pohrani vrijednost argumenta, d) funkcija pristupa originalnoj vrijednosti argumenta u programu koji je poziva.

10.Polja (Arrays)ili nizovi


10.1.Jednodimenzionalni niz
Polje se sastoji od niza objekata (nazivaju se i elementi polja), koji su istog tipa i zauzimaju neprekidan memorijski prostor. Openito, samo polje ima simboliko ime, a ne njegovi elementi. Svaki element je identificiran njegovim indeksom, koji pokazuje poloaj nekog elementa u polju. Broj elemenata u polju naziva se dimenzija polja.Dimenzija polja je fiksirana i prethodno odreena, i ne moe se promijeniti u toku izvrenja programa. Polja su pogodna za predstavljanje podataka koji se sastoje od mnogo slinih, individualnih objekata. Primjeri za to su lista imena, tabela gradova i njihovih sezonskih temperatura, i slino. Tipovi poput int, double i sl.dozvoljavaju predstavljanje samo pojedinanih vrijednosti. esto pri rjeavanju problema iz stvarnog svijeta trebamo predstaviti skupinu vrijednosti koje su sve istog tipa, na primjer: Prosjene koliine padavina za svaki mjesec Ocjene svih uenika u razredu Stanje prodaje za svaki dan u sedmici, itd U jeziku C++ takve skupine vrijednosti predstavljamo pomou nizova.Niz je struktura podataka koja omoguava pohranu niza vrijednosti. Vrijednosti su pohranjene u kontinuirani blok memorije. Nizovi omoguavaju brz (random access) pristup pojedinim elementima. Kao i varijable, niz moramo deklarirati prije nego ga upotrijebimo. Sintaksa deklaracije niza izgleda ovako: tip ime_niza [broj_elemenata]; tip moe biti bilo koji validni tip podatka u C++(npr. int, float...) ime niza je bilo koji validan identifikator u C++ u uglatim zagradama[] se nalazi broj elemenata niza tj. veliina niza (obavezno neka konstantna vrijednost). Na primjer: int rezultati [9]; niz rezultati koji se sastoji od 5 elemenata tipa int moemo grafiki predstaviti ovako:

85

C++ programiranje za srednje kole prof.Smajo Meki

Svaki element niza je varijabla , odreena svojim indeksom. Bilo koja operacija koja se moe vriti nad varijablama obinog tipa, moe se vriti i nad individualnim elementima niza. Indeks se navodi nakon imena niza, u uglatim zagradama: Na primjer: rezultati [5]= 21; cout<<rezultati [5]; 10.2.Deklaracija nizova4 Prilikom deklaracije nizova, unutar uglastih zagrada mora se nalaziti neto ija je vrijednost konstantna, poput broja ili konstante deklarirane sa const. Tako, ako je n varijabla,deklaracija poput double prosjek[n]; nije dozvoljena, dok je ista deklaracija dozvoljena u sluaju da je n konstanta. S druge strane, kada pristupamo elementima niza, indeks u zagradi moe biti proizvoljan cjelobrojni aritmetiki izraz, tako da je uz pretpostavku da je n cjelobrojna varijabla, sljedei izraz potpuno legalan: prosjek [2*n-3] = 13.7; Nizovi su sloeni tipovi (non-scalar types) podataka. Kod nizova iskljuivo pristupamo pojedinanim elementima, a nikad nizu kao cjelini. Ne moemo jednom naredbom ispisati itav niz na ekran, niti jednom naredbom unijeti cijeli niz sa tastature. Indeksi niza koji ima n elemenata se kreu od 0 do n-1. Procesiranje bilo kojeg polja obino ukljuuje koritenje petlje, koja ide kroz polje od elementa do elementa. Sljedei primjer pokazuje funkciju koja rauna srednju vrijednost elemenata nekog polja od tri cjelobrojna elementa: 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; } 10.3.Inicijalizacija niza Kad deklariramo niz lokalno (npr u funkciji), kao i kod obinih varijabli, elementi niza nemaju nikakvu precizno odreenu vrijednost sve dok se eksplicitno ne izvri dodjela, bilo pomou operatora dodjele =, bilo pomou unosa sa tastature. Meutim, kod globalno deklariranih nizova lanovi niza se automatski inicijaliziraju nulama. U oba sluaja ( i lokalno i globalno) pri deklaraciji niza imamo mogunost dodijeliti inicijalne vrijednsti svakom elementu niza.
Na primjer:

int rezultat [9] = { 16, 2, 77, 40, 1207, 18, 103, 22, 49 }; Jo jedan primjer u kojem se dimenzija polja moe izostaviti je kada je neko polje parametar u nekoj funkciji. Na primjer, funkcija Srednja se moe napisati na bolji nain, ako se postavi da dimenzija polja nije fiksirana na neku konstantnu vrijednost, nego se doda 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; }

Preuzeto i prilagoeno by Motik, B. and ribar, J. Demistificirani C++. Element, Zagreb, 2. izdanje edition, 2001.

86

C++ programiranje za srednje kole prof.Smajo Meki

Vidi se da se pomou definicije int broj[] omoguava vea fleksibilnost dimenzije polja, pa je kompletan program u tom sluaju:

Sljedei program predstavlja primjer pomou kojeg se unosi, sortira i ispisuje neki niz. Pri tome, sortiranje je izvedeno od najveeg prema najmanjem elementu niza. 1#include <iostream> 2 using namespace std; 3 int main () 4{ 5 // DEFINISANJE 6 int x[10]; 7 int y[10]; 8 int i, j, n; 9 // UNOSENJE 10 cout << "Unesite broj clanova polja (<10): "; 11 cin >> n; 12 for (i = 0; i < n; i++) 13 { 14 cout << "Unesite clan br. " << i << ": "; 15 cin >> x[i]; 16 y[i] = x[i]; 17 } 18 // SORTIRANJE 19 for (i = 0; i < n-1; i++) C++ programiranje za srednje kole prof.Smajo Meki

87

20 21 22 23 24 25 26 27 28 29 30 31 32

{ 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; } }

U ovom primjeru je za zamjenu vrijednosti varijabli koritena funkcija swap (linija 23), mada programer sam moe definisati slinu funkciju. Kao to je ranije reeno, za pohranjivanje testova se koriste znakovna polja (eng. string). To su, u stvari, polja iji elementi imaju tip char. Prilikom inicijalizacije ovakvih polja, sadraj se stavlja izmeu znaka dvostrukih navoda . Na primjer: "char str[] = "VOZDRA"; definie varijablu str kao niz od sedam (7) karaktera: est slova i jedan prazan karakter (nullkarakter). Zavrni prazan karakter postavlja kompajler. Zarazliku od toga, char str[] = {V, O, Z, D, R, A}; definie varijablu str kao niz od 6 elemenata. Treba naglasiti da prethodni primjer nije ispravan, jer svaki pravilno inicijalizirani niz karaktera mora obavezno da zavri null-karakterom. Takoer, ovakav nain inicijaliziranja je neefikasan u odnosu na prvi. Osim ovakvog predstavljanja rijei, tj. znakovnih polja, u C++ je ugraen i tip string, koji manipulie sa znakovnim poljima. S obzirom da se radi o specijalnoj klasi u C++ , to pripada objektnoorijentisanoj paradigmi, ovdje o tome nee biti rijei.

Broj elemenata navednih u vitiastim zagradama mora biti jednak broju elemenata koje smo naveli u uglatim zagradama. C++ dozvoljava i sljedee: ukoliko pri inicijalizaciji ostavite uglate zagrade prazne kompjaler e pretpostaviti da je veliina niza jednaka broju vrijednosti navedenih u vitiastim zagradama. int rezultat [ ] = { 16, 2, 77, 40, 1207, 18, 103, 22, 49 }; Kao i kod ostalih varijabli, vrijednosti elemenata polja se mogu inicijalizirati.U tu svrhu koriste se zagrade {}, izmeu kojih se specificira lista poetnih vrijednosti elemenata polja koje su odvojene zarezom. Na primjer, int broj[3] = {5, 10, 15}; definie polje broj, i inicijalizira tri elementa ovog polja na vrijednosti 5, 10, 15, respektivno. Ovo je tzv. eksplicitno inicijaliziranje. Kada je broj vrijednosti u inicijalizatoru manji od dimenzije polja, ostali elementi su inicijalizirani na nulu, kao u sluaju: int broj[3] = {5, 10}; // broj[2] je inicijaliziran na 0

88

C++ programiranje za srednje kole prof.Smajo Meki

Kada se koristi potpuni inicijalizator (broj poetnih vrijednosti odgovara dimenziji polja), dimenzija polja postaje suvina i moe se izostaviti, tj. broj elemenata je implicitan u inicijalizatoru implicitna inicijalizacija. U ovom sluaju inicijalizacija polja broj se moe izvriti i na sljedei nain: int broj[] = {5, 10, 15}; // dimenzija nije potrebna 10.4.Pristup elementima niza Mogue je pristupiti bilo kojem pojedinanom elementu niza (kao bilo kojoj obinoj varijabli) jednostavnim navoenjem imena niza i indeksa eljenog elementa: ime [indeks]

89

C++ programiranje za srednje kole prof.Smajo Meki

Na primjer, ako elite pohraniti vrijednost 75 kao trei elment niza billy moete napisati sljedee: rezultati[2] = 77; a ako elite dodijeliti vrijednost treeg elementa niza varijabli a, moete pisati: a = rezultati[2]; Primjeujete da je trei elment niza rezultati specificiran sa rezultati[2]. Zato indeks treeg elementa ima vrijednost 2? Prvi element niza ima vrijednost indeksa . Dakle, polje ili niz je najjednostavnija struktura podataka . Niz je uredeni skup koji sadi odreeni broj elemenata istoga tipa T. S nizom se moe manipulisati kao sa cjelinom, ali se takoer moe i pristupati pojedinim njegovim elementima. Nekom se elementu niza pristupa navoenjem njegovoga indeksa; pritom vrijeme pristupa ne ovisi o vrijednosti indeksa. U jezicima C i C++ za pristup i_tom elementu niza a piemo a[i]. Vano je upamtiti da prvi element niza koji sadri n elemenata ima indeks 0, a posljednji indeks n-1. Elementi niza se u memoriji raunala pohranjuju u n uzastopno smjetenih varijabli odreenoga tipa T. U znanstvenim i tehnikim primjenama esto se pojavljuju velike koliine podataka (naprimjer rezultata raznih mjerenja) koje treba srediti i klasificirati. Najee su to nizovi podataka istog tipa (realni ili cijeli brojevi), pa su nizovi prikladne strukture za njihov prikaz. Vidjeli smo osnovne karakteristike jednodimenzionalnog niza. Sada emo objasniti osnovne elemente upotrebe niza kao parametra funkcije: Navedimo nekoliko primjera: 1. Trebamo nai element niza koji ima maksimalnu vrijednost 2. Neka se bitna svojstva niza statistikih podataka mogu izraziti pomou nekoliko statistikih parametara: a) za dani se niz podataka n-1

90

C++ programiranje za srednje kole prof.Smajo Meki

Za izraunavanje emo koristiti funkcije: 1. za lan niza sa maksimalnom vridjenou funkciju double max(double x[], int velicina) 2. a) za izraunavanje aritmetike sredine napisati emo funkciju koju emo nazvati double: double mean(double x[], int velicina). Navedemo li, pri pozivu funkcije, kao argument naziv neke varijable, njezina se vrijednost pridruuje parametru funkcija (barata sa kopijom vanjske varijable). Znamo da se takvo prenoenje argumenta u funkciju naziva poziv po vrijednosti. Medutim ako bi tako radili sa nizom kao parametrom funkcije trebali bi u funkciju iskopirati vrijednosti svih njegovih elemenata (kopiranje u novi privremeni niz) to bi nepotrebno produljilo vrijeme izvoenja programa i gubitak memorijskoga prostora. Radi toga niz u funkciju prenosimo referencom ali ne kristimo operator adrese & kao kod varijabli. U C i C++ programskom jeziku ime niza sadrava adresu prvog (sa indeksom 0) lana. Dakle, parametri funkcije su ime niza i veliina niza. Funkcija za zadatak 1 je: int max(int x[], int velicina) { int imax=0; for (int i=1; i<velicina; i++) if (x[i]>x[imax]) imax=i; return(imax); } Poziv funkcije iz glavnog programa bie imax(x, velicina), s time da je int n poznat (definiran kao konstanta).

91

C++ programiranje za srednje kole prof.Smajo Meki

10.5.Multidimenzionalna polja(nizovi)

Polje moe da ima i vie nego jednu dimenziju (dvije, tri, i vie). Ipak, organizacija polja u memoriji je ista kao i prije, tj. neprekidna sekvenca elemenata,pa je percepcija programera neto drugacija od one koja se namee na prvi pogled (kao multidimenzionalna). Na primjer, pretpostavimo da je srednja vrijednost temperatura po godinjim dobima za tri bosanskohercegovaka grada data tabelom:

Ovo se moe predstaviti dvodimenzionalnim poljem cijelih brojeva: int godDobTemp[3][4]; Ovo je u memoriji predstavljeno kao neprekidan niz od 12 elemenata tipa int . Programer, meutim, moe to zamisliti kao tri reda od po 4 elementa u svakom,kao na slici.

Kao i kod jednodimenzionalnih polja (nizova), i ovdje se elementima pristupa preko indeksa. No, neophodan je dodatni indeks za svaku dimenziju. Na primjer, srednja temperatura u Zenici u toku ljeta, data je elementom godDobTemp[2][1]. Inicijalizacija polja se moe obaviti pomocu ugnijedenog inicijalizatora, kao u: int godDobTemp[3][4] = { {10, 20, 10, 1}, {13, 21, 12, 3}, {14, 23, 11, 4} }; C++ programiranje za srednje kole prof.Smajo Meki Poto se ovo dvodimenzionalno polje mapira kao jednodimenzionalni niz od 12 elemenata, mogue je koristiti i sljedei nain: int godDobTemp[3][4] = { 10, 20, 10, 1, 13, 21, 12, 3, 14, 23, 11, 4 }; Ipak, bolja opcija je koritenje ugnijedenog inicijalizatora, poto ne samo da je pregledniji, nego daje i dodatne mogunosti. Na primjer, ako je samo prvi element svakog reda razliit od nule, a ostali su jednaki nuli, moemo koristiti: int godDobTemp[3][4] = {{26}, {24}, {28}};

Takoer je mogue izostaviti prvu dimenziju (implicitna inicijalizacija), kao u:


int godDobTemp[][4] = {

92

{10, 20, 10, 1}, {13, 21, 12, 3}, {14, 23, 11, 4} }; Procesiranje multidimenzionalnih polja je slino jednodimenzionalnim, s tim da se moraju koristiti ugnijedene petlje. Sljedei primjer pokazuje pronalaenje maksimalnog elementa u dvodimenzionalnom polju iz prethodnih primjera.

Primjer 1: Unesi N lanova niza X pomou for petlje te ih zatim ispii na ekranu raunara, takoer petljom for

93

C++ programiranje za srednje kole prof.Smajo Meki

#include <iostream> using namespace std; const int redovi = 3; const int kolone = 4; int godDobTemp[redovi][kolone] = { {72, 20, 10, 11}, {13, 21, 66, 3}, {14, 56, 11, 4} }; int najTemp (int temp[redovi][kolone]) { int najveca = temp[0][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 << najTemp(godDobTemp) << "\n"; system("PAUSE"); } Napomena: Treba paziti kako se inicijalizira vrijednost kontrolne varijable najvea u prethodnom primjeru; pravilno je postaviti na prvi lan polja,umjesto pretpostaviti neku konanu vrijednost (na primjer 0).

#include <cstdlib> #include <iostream> using namespace std; int main() { int i,N; int X[10]; /*deklaracija niza od 10 cijelih brojeva*/ cout<<"Zadaj 0<N<10 = "; /*broj N mora biti manji od 10 jer je deklariran niz od maksimalno 10 lanova*/ cin >>N; for (i=0;i<N;i++) /*upis lanova niza*/ { cin>>X[i]; /*upis i-tog lana niza*/ } for (i=0;i<N;i++) { cout << X[i]; cout <<endl; } system ("PAUSE"); return 0; } /*ispis lanova niza for petljom*/ /*ispis i- tog lana niza*/ /*ispis praznog retka (end line)*/

Pitanja za utvrivanje 1. Da li neko polje moe sadravati i cijele brojeve, realne brojeve i karaktere? 2. Koji je indeks prvog elementa u nizu? 3. Koji je indeks posljednjeg elementa u nizu? 4. Koja je razlika izmeu inicijalizacije i pridruivanja? 5. Koja su dva naina inicijalizacije polja? C++ programiranje za srednje kole prof.Smajo Meki

11.Pointeri(Pokazivai)
11.1.Osnovno o pointerima5
5

Preuzeto i obraeno by Osnove programiranja u C++ -Aleksandar Kara;

94

Pointeri (pokazivai) predstavljaju adresu neke memorijske lokacije i omoguuju indirektni nain pristupa podacima u memoriji. Pointer varijabla se definie pokazivanjem na podatak odreenog tipa. Na primjer, int *ptr1; // pointer cijelog broja char *prt2; // pointer karaktera Vrijednost pointera varijable je adresa na koju pokazuje. Na primjer, ako se uzme da je: int num; moemo pisati: ptr1 = &num; Simbol & (ampersand, znak i) je adresni operator; on uzima varijablu kao argument i vraa memorijsku adresu te varijable. Efekt prethodnog pridruivanja je da je adresa varijable num pridruena pointeru ptr1. Na taj nain, kaemo da ptr1 pokazuje na num. Dijagramski prikaz ovog pridruivanja datje na slici

Uzimajui da ptr1 pokazuje na num. Izraz:


*ptr1 dereferencira ptr1 da bi se dobilo ono na ta on pokazuje, pa je time ekvivalentan num. Simbol * je operator dereferenciranja; on uzima pointer kao argument i vraa sadraj memorijske lokacije na koju pokazuje. Openito, tip pointera mora odgovarati tipu podatka na koji taj pointer pokazuje. Meutim, pointer tipa void odgovara bilo kojem tipu. Ovo je veoma korisno pri definisanju pointera koji mogu pokazivati na podatke razliitih tipova, ili one podatke kojima tip u poetku nije poznat. Pointer se moe konvertovati (pomou cast) u neki drugi tip. Na primjer, ptr2 = (char*) ptr1; konvertuje ptr1 u pointer karaktera prije nego se pridrui pointeru ptr2. Bez obzira na tip, pointeru se moe pridruiti vrijednost 0. Ovakav pointer se naziva null-pointer. Nullpointer se koristi za inicijalizaciju pointera, i za obiljeavanje kraja struktura sa podacima koji se zasnivaju na pointerima (na primjer, linkovane liste i sl.). 11.2.Dinamika memorija Pored programskog stoga (eng. stack ), koji se koristi za pohranjivanje globalnih varijabli, te blokova stogova za pozivanje funkcija, na raspolaganju je i drugi vid memorije, koji se naziva hrpa (eng. heap). Ova memorija se koristi za dinamiko alociranje memorijskih blokova u toku izvrenja programa. Zbog toga se ova memorija esto naziva i dinamika memorija. S druge strane, programski stog se esto naziva statika memorija. Za alociranje i dealociranje memorijskih blokova u hrpi (jo se naziva i javna memorija) koriste se dva operatora. Operator new kao argument uzima tip i alocira memorijski prostor za objekat tog tipa. On vraa pointer na alocirani prostor. Na primjer, int *ptr = new int; char *str = new char[10]; alociraju prostor za jedan cijeli broj i prostor koji je dovoljno velik da pohrani niz od deset karaktera, respektivno. Memorija koja se alocira iz hrpe ne ispunjava ista pravila podruja definisanosti (eng. scope rules) kao normalne varijable. Na primjer, kada funkcija Funkcija

95

C++ programiranje za srednje kole prof.Smajo Meki

void Funkcija (void) { char *str = new char[10]; //... } vraa vrijednost, lokalna varijabla str je unitena, ali memorijski prostor koji pokazuje na str nije. Ovo posljednje ostaje alocirano sve dok ga programer eksplicitno ne oslobodi. Operator delete se koristi za oslobaanje memorijskog prostora koji se alocira pomou new. On uzima pointer kao argument i oslobaa memorijski prostor na koji taj pointer pokazuje. Na primjer, delete ptr; // brie neki objekat delete [] str; // brie niz objekata Ukoliko bi se na niz podataka, koristio prvi pristup, oslobaa se prostor samo jednog elementa niza, tako da je u sluaju nizova uvijek neophodno dodati zagrade [ ], koje treba da to i pokau. Ako se operator delete treba primijeniti na pointer koji pokazuje ni na ta drugo no dinamiki alocirani objekat (na primjer varijabla u stogu), moe doi do ozbiljne greke (tipa runtime). S druge strane, potpuno je bezazleno primijeniti ovaj operator na null-pointer. Dinamiki objekti su veoma korisni za kreiranje podataka koji traju due od poziva funkcija koje ih kreiraju. Sljedei primjer pokazuje jedan takav sluaj, gdje se koristi funkcija koja uzima string parametar i vraa kopiju stringa. 1 2 3 4 5 6 7 #include <string> char* CopyOf (const char *str) { char *copy = new char[strlen(str) + 1]; strcpy(copy, str); return copy; }

11.3.Pointeri i polja Pointeri i polja su u jeziku C++ povezani. Naime, lanovima polja se pristupa preko pointera. Tako na primjer, naredbom int cijeliBroj[10]; definiemo jednodimenzionalno polje cijelih brojeva tipa int sa deset lanova.Ime varijable cijeliBroj ima smisao pointera na prvi elemenat polja cijeliBroj[0]. Prilikom pristupa elementima polja, kompajler vrijednost indeksa dodaje pointeru na prvi elemenat, tako da se naredba int broj = cijeliBroj[3]; prevodi kao int broj = *(cijeliBroj+3);

96

C++ programiranje za srednje kole prof.Smajo Meki

U linija 1, kao to je ve poznato, poziva se standardna biblioteka string koja definie mnotvo funkcija za manipulisanje sa stringovima. Funkcija strlen (definisana u string), u liniji 4, daje broj karaktera njenog argumenta (koji je tipa string) do posljednjeg null-karaktera, koji nije uzet u obzir. Kako nullkarakter nije ukljuen u brojanje, treba dodati jo jedan karakter i alocirati niz karaktera te velicine (sa tim brojem karaktera). Funkcija strcpy, koja je takoer definisana u string, kopira drugi argument na prvi, karakter po karakter, ukljuujui i posljednji null-karakter. Zbog ogranienih memorijskih resursa, uvijek postoji mogunost da se dinamika memorija "potroi" u toku izvrenja programa, naroito ako se alocira veliki prostor, ali se i ne oslobodi. U sluaju da operator new ne moe da alocira prostor potrebne veliine, vratie vrijednost nula. Na programeru je da sebavi ovakvim problemima. Jedna od osnovnih karakteristika jezika C++ , rad sa iznimkama, daje praktian primjer ta i kako raditi sa ovim problemima.

Posljednja naredba se moe shvatiti kao: uzmi adresu prvog elementa polja,poveaj je za 3, pogledaj ta se nalazi na toj adresi, te pridrui tu vrijednost varijabli broj. Dakle, ako imamo definisano polje int cijeliBroj[] = {1,2,3}; onda imamo sljedea znaenja: cout << cijeliBroj << endl; // adresa pocetnog elementa cout << *cijeliBroj << endl; // vrijednost pocetnog elementa polja cout << &(cijeliBroj[1]) << endl; // adresa elementa cijeliBroj[1] cout << (cijeliBroj + 1) << endl; // adresa elementa cijeliBroj[1] Stoga se elementima polja moe pristupati i preko pointera i preko indeksa, i na programeru je koji e pristup koristiti. Ipak, treba naglasiti da se definicijom int cijeliBroj[10]; ne stvara pointer na varijablu cijeliBroj koji pokazuje na polje, nego je cijeliBroj samo sinonim za pointer na prvi elemenat polja. Vrlo slina diskusija se moe primijeniti i na viedimenzionalna polja, s obzirom da su u memoriji raunara ista predstavljena jednodimenzionalnim poljima. 11.4.Aritmetika sa pointerima U C++ je mogue neku cjelobrojnu vrijednost dodati i oduzeti od pointera.Programeri esto koriste ovu mogunost, koja se jo naziva i aritmetika sa pointerima. Ova aritmetika, pak, nije ista kao ona sa cjelobrojnim vrijednostima, jer rezultat zavisi od veliine objekta na koji se pokazuje. Na primjer, pretpostavimo da je int predstavljen sa 4 bajta. Ako se uzme da je char *str = "VOZDRA"; int broj[] = {10, 20, 30, 40}; int *ptr =&broj[0]; str++ e "napredovati" str za jedan karakter char, tj. za jedan bajt, tako da pokazuje na drugi karakter niza karaktera "VOZDRA", dok e ptr++ "napredovati"ptr za jedan int, tj. 4 bajta, tako da pokazuje na drugi elemenat niza. C++ programiranje za srednje kole prof.Smajo Meki

Na osnovu prethodno reenog slijedi da se elementi niza "VOZDRA" mogu predstaviti i sa *str, *(str+1), *(str+2), itd.. Na slian nain, elementi niza broj se mogu predstaviti sa *ptr, *(ptr+1), *(ptr+2) i *(ptr+3). Jo jedan vid aritmetike sa pointerima koji je dozvoljen u C++ je oduzimanje pointera istog tipa. Na primjer, int *ptr1 = &broj[1]; int *ptr2 = &broj[3]; int n = ptr2 - ptr1; // n postaje 2 Aritmetika sa pointerima je veoma korisna kada se pristupa elementima nekog niza. Sljedei primjer pokazuje funkciju za kopiranje rijei slinu funkciji strcpy.

97

1 2 3 4 5

void CopyString (char *dest, char *src) { while (*dest++ = *src++) ; }

U liniji 3, uslov petlje pridruuje sadraj src sadraju dest, a zatim inkrementalno povecava oba pointera. Ovaj uslov postaje jednak nuli kada je posljednji null-karakter pointera src kopiran u dest. Pokazuje se da je varijabla koja predstavlja niz, kao to je to sluaj sa broj sama po sebi adresa prvog elementa niza koji predstavlja. Stoga se elementima varijable broj moe pristupiti i preko aritmetike sa pointerima na broj, tj. broj[i] je ekvivalentno *(broj+i). Razlika izmeu broj i ptr je u tome to je broj konstanta, tako da ne moe pokazivati ni na ta, dok je ptr varijabla i moe se iskoristiti da pokazuje na bilo koji drugi cijeli broj.Sljedei primjer pokazuje kako funkcija najTemp, koja je pokazana u prethodnom poglavlju moe da se pobolja koritenjem aritmetike sa pointerima. 1 int najTemp (const int *temp, const int redovi, 2 const int kolone) 3{ 4 int najveca = 0; 5 for (int i = 0; i < redovi; ++i) 6 for (int j = 0; j < kolone; ++j) 7 if (*(temp + i * kolone + j) > najveca) 8 najveca = *(temp + i * kolone + j); 9 return najveca; 10 } U ovom sluaju, umjesto da se na funkciju prenosi niz (linija 1), prenosi se int pointer i dva dodatna parametra koja specificiraju dimenzije niza. Na ovaj nain, funkcija nije ograniena na niz odreene duine. Izraz *(temp+i * kolone+ j) u liniji 8, je ekvivalentan izrazu temp[i][j] koji je koriten u prethodnom poglavlju. Funkcija najTemp se moe dalje pojednostaviti, ako se temp tretira kao jednodimenzionalni niz od redovi*kolone cijelih brojeva. Ovo je pokazano u sljedeem primjeru. 1 int najTemp (const int *temp, const int redovi, 2 const int kolone) 3{ 4 int najveca = 0; 5 for (int i = 0; i < redovi * kolone; ++i) 6 if (*(temp + i) > najveca) 7 najveca = *(temp + i); 8 return najveca; 9} 11.5.Funkcijski pointeri6 Pored svega do sada reenog o pointerima, mogue je uzeti i adresu funkcije i pohraniti je kao pointer funkcije. Tada se pointer moe koristiti da indirektno pozove funkciju. Na primjer, int (*Uporedi)(const char*, const char*);

Preuzeto i obraeno by Osnove programiranja u C++ -Aleksandar Kara;

98

C++ programiranje za srednje kole prof.Smajo Meki

definie pointer funkciju koja se naziva Uporedi koja moe zadrati adresu bilo koje funkcije koja kao argumente uzima dva konstantna pointera tipa char i vraa cjelobrojnu vrijednost. Takva je, na primjer, funkcija strcmp, koja slui za uporeivanje stringova. Na taj nain imamo: Uporedi = &strcmp; // funkcija Uporedi pokazuje na strcmp // funkciju Operator & nije neophodan i moe se izostaviti: Uporedi = strcmp; // funkcija Uporedi pokazuje na strcmp // funkciju Kao alternativa, mogue je definisati i inicijalizirati pointer odjednom, kao int (*Uporedi)(const char*, const char*) = strcmp; Kada se adresa funkcije pridruuje pointeru funkcije, dva tipa se moraju poklapati. Prethodna definicija je ispravna jer se prototip funkcije strcmp poklapa int strcmp(const char*, const char*); Sa definicijom funkcije Uporedi datom prethodno, strcmp se moe koristiti direktno, ili indirektno preko Uporedi. Sljedea tri poziva su ekvivalentna: strcmp("Suljo","Mujo"); // direktni poziv (*Uporedi)("Suljo","Mujo"); // indirektni poziv Uporedi("Suljo","Mujo"); // indirektni poziv (skraceno) est sluaj koritenja pointer funkcije je da se prenese kao argument nekoj drugoj funkciji; obino zbog toga to posljednja trai razliite oblike prve u razliitim okolnostima. Dobar primjer je binarna pretraivaka funkcija koja pretrauje kroz ureeni niz stringova. Ova funkcija moe koristiti funkciju uporeivanja (kao to je strcmp) radi uporeivanja stringa koji se trai i niza stringova. No, ovo ne mora da bude prigodno za sve sluajeve. Na primjer,strcmp razlikuje mala i velika slova. Ako bismo eljeli da izvrimo pretraivanje bez razlikovanja malih i velikih slova, onda bismo trebali koristiti drugu funkciju za uporeivanje. Kao to je pokazano u sljedeem primjeru, postavljajui funkciju uporeivanja kao parametar funkcije pretraivanja, imamo mogunost da ih postavimo nezavisno jednu od druge. 1 int BinTrazi (char *podatak, char *tabela[], int n, 2 int (*Uporedi)(const char*, const char*)) 3{ 4 int dole = 0; 5 int gore = n - 1; 6 int sred, cmp; 7 while (dole <= gore) { 8 sred = (dole + gore) / 2; 9 if ((cmp = Uporedi(podatak,tabela[sred])) == 0) 10 return sred; // return item index 11 else if (cmp < 0) 12 gore = sred - 1; // pretrazi donji dio 13 else 14 dole = sred + 1; // pretrazi gornji dio 15 } 16 return -1; // nije pronadjeno 17 } C++ programiranje za srednje kole prof.Smajo Meki

99

Linije 1 i 2 predstavljaju potpis funkcije BinTrazi, koja predstavlja poznati algoritam za traenje kroz sortiranu listu podataka. Lista traenja je, u ovom sluaju, tabela koja predstavlja polje stringova sa dimenzijom n. Podatak koji se trai je pod imenom podatak. Linija 2 predstavlja pointer funkciju koja treba da se koristi za uporeivanje podatka podatak sa elementima polja. Algoritam za pretraivanje zapoinje u liniji 7 koristei while petlju, i u svakom koraku opseg pretraivanja polovi. Postupak se zaustavlja kada se granice opsega, oznaene sa dole i gore, poklope, ili dok se podatak ne nae. Podatak se poredi sa srednjim elementom polja (linija 9), i ako se sa njim poklapa, vraa se indeks istog (linija 10). Ako je, pak, podatak manji od srednjeg podatka, pretraivanje se ograniava na donju polovinu polja (linija 11-12). U suprotnom, pretraivanje se ograniava na gornju polovinu polja (linija 13-14). U sluaju da nije pronaen podatak koji se poklapa sa traenim, funkcija vraa vrijednost 1. Sljedei primjer pokazuje kako se funkcija BinTrazi moe pozvati sa strcmp,koji se prenosi kao funkcija za uporeivanje. char *gradovi[] = {"Doboj","Kakanj","Sarajevo","Zenica"} cout << BinTrazi("Zenica", gradovi, 4, strcmp) << endl; Rezultat posljednje naredbe bio bi, naravno, 3.

12.Datoteke
Ovo poglavlje pokazuje kako se podaci dobiveni pokretanjem nekog programa mogu sauvati (pohraniti) na neku datoteku. S obzirom da uvanje podataka nema svrhu ako tim podacima ne moemo da pristupamo, bie objanjeno i kako proitati podatke sa neke datoteke. Datoteka, pri tome, predstavlja skup podataka koji su snimljeni na neku formu trajne memorije (hard disk, CD-ROM, floppy disk, itd.). Datoteci se pristupa preko njenog imena (filename), u ijem sastavu se obino nalazi ekstenzija (dio imena iza take), koja oznaava tip podataka u datoteci (npr. .doc za Microsoft Word, .xls Microsoft Excel, .cpp za C++ izvornu datoteku, itd.).

100

C++ programiranje za srednje kole prof.Smajo Meki

Pitanja za utvrivanje 1. ta su pointeri ili pokazivai? 2. Koja je razlika u definisanju cjelobrojne varijable i cjelobrojne pointer varijable? 3. Koje je znaenje tipa podatka u definiciji pointera? 4. ta je to null-pointer? 5. Koji operator se koristi da bi se pointer pridruio adresi neke druge varijable ili konstante? 6. Da li pointer moe pokazivati na razliitu memorijsku lokaciju u razliitim vremenskim periodima u programu? 7. Da li na istu memorijsku lokaciju moe da pokazuje vie od jednog pointera? 8. ta je rezultat inkrementiranja pointer varijable? 9. ta je to dinamika memorija? 10. Koja je veza pointera i polja? 11. ta predstavljaju aritmetike operacije sa pointerima? 12. Objasni pojam funkcijskih pointera?

U osnovi, postoje dvije vrste datoteka: tekstualne i binarne. Tekstualne datoteke sadre tekst, dok binarne mogu sadravati i kompleksnije vrste podataka, kao to su slike, izvrni programi, baze podataka, itd. Tekstualnim datotekama je neto jednostavnije pristupiti, pisati podatke u njih, te itati sa njih. Upravo to je i razlog zbog ega ce se primjeri u ovom poglavlju odnositi samo na njih. 12.1.Standardna biblioteka fstream U ranijim poglavljima koristili smo standardnu biblioteku iostream (io se odnosi na input/output), koja pored ostalog, daje mogunost ispisivanja na standardni izlaz (ekran, monitor) pomou cout, te itanje sa standardnog upisa (tastatura) pomou cin. Meutim, ova datoteka nam ne omoguava da podatke trajno sauvamo. U tu svrhu se koristi standardna biblioteka fstream (f se odnosi na datoteku, tj. file), koja omoguava pisanje na i itanje sa datoteka. Ovo se postie pozivanjem sadraja datoteke fstream sa: #include <fstream> Biblioteka fstream definie tri nova tipa podataka: ofstream. Ovaj tip podataka predstavlja tok 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 moe se koristiti za itanje datoteka. ifstream. Ovaj tip podataka predstavlja tok 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 moe se koristiti za kreiranje datoteka i pisanje na njih. fstream. Ovaj tip podataka predstavlja openito tok za datoteke, ima karakteristike i ofstream i ifstream objekata. Pomou ovog tipa, datoteke se mogu kreirati, moe se pisati na njih ali i itati sa njih. "ivotni" ciklus pristupa datotekama Kada program pristupa datotekama, bez obzira da li ih ita, ili na njih pie,ili ini oboje, on prolazi kroz sljedee korake: Datoteka prvo mora da se otvori. Ovo otvara put u komunikaciji izmeu datoteke i objekta toka u programu (fstream, ifstream, ofstream), koji se koristi u pristupu datoteci. Nakon otvaranja, program ita sa datoteke, pie na nju, ili ini oboje. Na kraju, program zatvara datoteku. Ovo je bitan korak, poto odravanje komunikacije izmeu datoteke i objekta toka zahtijeva resurse, tako da zatvaranje datoteke oslobaa ove resurse kada vie nisu potrebni. Uz to,postoji mogunost da se kasnije u programu ne moe pristupiti datoteci ako prethodno nije zatvorena. 12.2.Otvaranje datoteka Bez obzira da li se sadraj datoteke treba proitati ili se na datoteku trebaju ispisati neki podaci, datoteka prvo treba da se otvori. Naredna poglavlja pokazuju kako se to obavlja. Otvaranje datoteke za pisanje Datoteke za pisanje se mogu otvoriti pomou fstream i ofstream objekata na dva naina: (i) pomou metode open, ili (ii) pomou konstruktora (constructor1). Otvaranje pomou funkcije open Ovaj nain otvaranja datoteke postiemo na sljedei nain: 1 ofstream izlaz; 2 izlaz.open("ucenici.txt"); Prvom linijom je kreiran objekat izlaz tipa ofstream, dok se u drugoj liniji kreira datoteka ucenici.txt. Kao to se vidi, argument funkcije open je ime i lokacija datoteke koja se treba otvoriti. Meutim,

101

C++ programiranje za srednje kole prof.Smajo Meki

mogue je dodati i drugi argument zavisno od toga da li je funkcija open lan objekta fstream ili ofstream, ili se eli neki drugi modul od onog koji se daje . Datoteka u koju elimo pisati podatke ne mora postojati. U sluaju da ne postoji, ona e se automatski kreirati pod imenom i na lokaciji koju smo upisali. Lokacija se moe dati kao relativna (relative path) ili apsolutna (absolute path). Pri tome, relativni put predstavlja lokaciju u odnosu na lokaciju programa, tj.direktorij u kojem se nalazi izvorna datoteka. Za razliku od relativnog puta, apsolutni put predstavlja lokaciju koja zapoinje slovom drajva, sadravajui sve direktorije i poddirektorije, dok se ne doe do datoteke. Na primjer, ako je datoteka ucenici.txt u direktoriju Srednja, a ovaj je poddirektorij direktorija Mssbusovaca, a sve se nalazi na tvrdom disku sa slovom C, onda bi se datoteka otvorila na sljedei nain: ofstream izlaz; izlaz.open("C:\\MFZE\\Busovaca\\ucenici.txt"); Vidimo da se u tom sluaju koriste po dva znaka n, jer samo jedan izmeu navodnika predstavlja escape-sekvencu. 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 sljedeem primjeru: ofstream izlaz; char imeDatoteke[80]; cout << "Unesite ime datoteke: "; cin >> imeDatoteke; izlaz.open(imeDatoteke); Vano je zapamtiti da je koritenje relativnog puta bolja opcija, jer se moe desiti da neki direktorij u apsolutnom putu ne postoji, naroito ako se program koristi na nekom drugom kompjuteru (sa drugaijim rasporedom direktorija). Koritenje drugog argumenta u funkciji open definie modul u kojem se datoteka treba otvoriti. Neke od opcija (tzv. file mode flag), koje se mogu koristiti date su u Tabeli:

Ako, na primjer, elimo da konstantno dodajemo neke podatke u datoteku log, koristimo opciju ios::app, tj. ofstream izlaz; izlaz.open("log", ios::app); Kada za otvaranje datoteke koristimo ofstream objekat, onda ne moramo koristiti dodatne argumente, ali treba zapamtiti da u tom sluaju moemo samo upisivati informaciju na datoteku, ali ne i itati sa nje.

102

C++ programiranje za srednje kole prof.Smajo Meki

Meutim, ako se za otvaranje datoteke za pisanje koristi fstream objekat, treba dodati jo jedan argument, tj. opcija za pisanje ios::out. U ovom sluaju imamo: fstream izlaz; izlaz.open("ucenici.txt", ios::out); Otvaranje pomou konstruktor Konstruktori su funkcije koje se automatski pozivaju kada se pokuava kreirati primjerak (eng. instance) nekog objekta (primjerak je prema objektu isto to i varijabla prema tipu podatka). Oni mogu biti optereeni (eng. overloaded), tako da isti objekat moe imati konstruktor sa nijednim, jednim, dva, ili vie argumenata. U prethodnim primjerima (npr. fstream izlaz;) koritene su naredbe sa konstruktorima bez argumenata. Naredni primjeri pokazuju upotrebu konstruktora sa jednim i dva argumenta, respektivno: ofstream izlaz("ucenici.txt"); fstream izlaz("ucenicii.txt",ios::out); Prvi sluaj zamijenjuje izraz: ofstream izlaz; izlaz.open("ucenici.txt"); a drugi fstream izlaz; izlaz.open("ucenici.txt", ios::out); Primjena konstruktora, u stvari, omoguava definisanje i inicijalizaciju primjerka nekog objekta. Kao i u sluaju definisanja (deklarisanja) i inicijalizacije varijabli, koritenje jednog od naina otvaranja datoteke zavisi od samog programa i naih potreba.

Otvaranje datoteka za itanje i pisanje Kao to je ranije reeno, objekat fstream se moe koristiti za otvaranje datoteka i za pisanje i za itanje. U tu svrhu koristi se sljedea sintaksa: fstream izlazUlaz; izlazUlaz.open("ucenici.txt", ios::in | ios::out); ili pomou konstruktora:

103

C++ programiranje za srednje kole prof.Smajo Meki

Otvaranje datoteka za itanje Sve to je reeno u prethodnom poglavlju moe se primijeniti i na otvaranje datoteka za itanje. Jedina razlika je to se, uz koritenje objekta fstream, umjesto objekta ofstream koristi ifstream objekat. Uz to, datoteka sa koje se ita mora postojati, jer se pokretanjem jednog od prethodnih objekata datoteka ne kreira. Analogno diskusiji o otvaranju datoteka za pisanje, otvaranje datoteke za itanje se moe otvoriti na jedan od sljedeih naina: 1) pomou ifstream objekta ifstream ulaz; ulaz.open("ucenici.txt"); 2) pomou fstream objekta fstream ulaz; ulaz.open("ucenici.txt", ios::in); //obavezno dodati argument ios::in 3) pomou konstruktora ifstream ulaz("ucenici.txt"); fstream ulaz("ucenici.txt", ios::in);

fstream izlazUlaz("ucenici.txt", ios::in | ios::out); U oba primjera koriten je bitovni operator i, |, Provjera da li je datoteka otvorena. Prije nego ponemo itati podatke sa neke datoteke, korisno je znati da li ona uopte postoji. Provjera se moe izvriti na dva naina. Ako se datoteka ne moe otvoriti za itanje, onda je: (i) vrijednost ifstream objekta jednaka NULL (nula), (ii) vrijednost funkcije fail objekta ifstream je true(1). Sljedei primjer ilustruje koritenje oba naina. #include <fstream> #include <iostream> using namespace std; int main (){ ifstream ulaz; ulaz.open("ucenici.txt"); cout << "(ulaz) = " << ulaz << endl; cout << "(ulaz.fail()) = " << ulaz.fail() << endl; return 0; } Ako datoteka ucenici.txt ne postoji nakon izvrenja programa dobijamo: (ulaz) = 0 (ulaz.fail()) = 1 U sluaju da postoji, izlaz je, na primjer: (ulaz) = 0x22fed4 (ulaz.fail()) = 0 pri emu 0x22fed4 predstavlja memorijsku lokaciju (adresu) ifstream varijable ulaz.

104

C++ programiranje za srednje kole prof.Smajo Meki

12.3.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 ogranienje na broj otvorenih datoteka sa kojima se ne "manipulie". Zatvranje datoteka se vri pomou funkcije close. Sljedei primjeri pokazuju njenu upotrebu pri zatvaranju datoteka za pisanje i itanje: ofstream izlaz; izlaz.open("ucenici.txt"); // skup naredbi outfile.close();

105

C++ programiranje za srednje kole prof.Smajo Meki

Za razliku od ifstream objekta, ofstream objekat koji pokuava 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 sluaju je korisno provjeriti da li datoteka postoji. Naime, ako datoteka postoji, ali ima osobinu read-only2, dobiemo negativan odgovor o njenom postojanju (vrijednost iostream objekta je NULL, a funkcije fail je true, tj. 1).

ifstream ulaz; ulaz.open("ucenici.txt"); // skup naredbi ulaz.close(); 12.4.Pisanje na datoteke Pisanje podataka na datoteku se izvodi pomou operatora za ispisivanje (<<), kao to je to bio sluaj sa ispisivanjem na ekran (cout<<). Jedina razlika je utome to se ovdje koristi fstream ili ofstrem objekat, a ne cout objekat. Sljedei program pokazuje primjer upisivanja podataka na datoteku ucenici.txt: 1 #include <fstream> 2 #include <iostream> 3 using namespace std; 4 5 int main (){ 6 char podaci[80]; 7 ofstream izlaz; 8 izlaz.open("ucenici.txt"); 9 cout << "Zapisivanje u datoteku" << endl; 10 cout << "=======================" << endl; 11 cout << "Upisite razred: "; 12 cin.getline(podaci, 80); 13 izlaz << podaci << endl; 14 cout << "Unesite broj ucenika: "; 15 cin >> podaci; 16 cin.ignore(); 17 izlaz << podaci << endl; 18 izlaz.close(); 19 return 0; 20 } C++ programiranje za srednje kole prof.Smajo Meki

106

U ovom primjeru upis teksta sa tastature je obavljen pomou funkcijskog lana objekta cin getline() (linija 12), koji kao prvi argument uzima znakovni niz, a kao drugi duinu istog. Ovim se tekst koji je upisan preko tastature,pridruuje varijabli podaci, koja je data kao niz od 80 elemenata. U liniji 16 koritena je funkcija ignore() (i ovo je funkcijski lan klase iostream), koja u ovom obliku (bez argumenata) ima za cilj da proita sljedei karakter pri upisu, ali ga ne pridrui nijednoj varijabli. To je zbog toga to nema potrebe za pridruivanjem karaktera, koji oznaava novu liniju, koji je ostao pri itanju u ulaznom meuspremniku (eng. input buffer) nekoj varijabli. Upotrebom drugog argumenta pri otvaranju datoteke za pisanje (ios::app) moemo dodavati sadraj na postojeu datoteku kao to to pokazuje sljedei primjer. U ovom primjeru zapisivanje se prekida nakon unosa znakova ***.

#include <iostream>

107

C++ programiranje za srednje kole prof.Smajo Meki

#include <string> #include <fstream> using namespace std; int main () { char x[100]; 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(); } 12.5.itanje sa datoteka Analogno prethodnom poglavlju, itanje podataka sa datoteka obavlja se pomou operatora za itanje (>>) kao to je to sluaj sa ispisivanjem sa tastature (cin>>). Sljedei primjer nadopunjava onaj iz prethodnog dijela, tj. nakon to korisnik upie informacije na datoteku, program ita iste podatke sa datoteke i ispisuje ih na ekran. 1 #include <fstream> 2 #include <iostream> 3 using namespace std; 4 5 int main (){ 6 char podaci[100]; 7 ofstream izlaz; 8 izlaz.open("ucenici.txt"); 9 cout << "Upisivanje u datoteku" << endl; 10 cout << "=====================" << endl; 11 cout << "Unesite razred: "; 12 getline(cin,podaci); 13 izlaz << podaci << endl; 14 cout << "Unesite broj ucenika: "; 15 cin >> podaci; 16 cin.ignore(); 17 izlaz << podaci << endl; 18 izlaz.close(); 19 20 ifstream ulaz; 21 cout << "Citanje sa datoteke" << endl; 22 cout << "===================" << endl; 23 ulaz.open("ucenici.txt"); 24 getline(ulaz,podaci); 25 cout << podaci << endl; 26 getline(ulaz,podaci); 27 cout << podaci << endl; 28 ulaz.close(); 29 return 0;

108

C++ programiranje za srednje kole prof.Smajo Meki

30 } Slino primjeru iz prethodnog dijela, podaci se unose pomou funkcije getline (linija 13) sa neto drugaijom sintaksom. Ovdje pomenuta funkcija (definisana je kao funkcija, a ne funkcijski lan) ima dva argumenta: prvi tipa iostream (cin), a drugi varijabla podaci. Na slian nain se pomou iste funkcije podaci itaju sa datoteke (linije 23 i 25), pri emu je prvi lan objekat ulaz tipa ifstream. Prethodni primjer se moe napisati i na programerski adekvatniji nain 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 (){ char podaci[100]; bool status; ofstream izlaz; status = upisiDatoteku(izlaz, "ucenici.txt"); if (!status) { cout << "Datoteka za ispisivanje se ne moze otvoriti\n"; cout << "Program se zavrsava\n"; system("PAUSE"); return 0; } else { cout << "Pisanje u datoteku" << endl; cout << "==================" << endl; cout << "Upisite razred: "; getline(cin, podaci); izlaz << podaci<< endl; cout << "Unesite broj ucenika: "; cin >> podaci; cin.ignore(); izlaz << podaci<< endl; izlaz.close(); } ifstream ulaz; status = citajDatoteku(ulaz, "ucenici.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;

109

C++ programiranje za srednje kole prof.Smajo Meki

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; }

Iz ovog primjera se vidi da se ifstream i ofstream objekti u funkcijama upisiDatoteku i citajDatoteku prosljeuju po referenci, iako nije dna od ovih funkcija ne mijenja sadraj datoteke. Razlog lei u injenici da unutranje stanje objekta toka moe promijeniti koritenjem open funkcije, iako se sadraj ne mijenja. Sukcesivno itanje esto puta je potrebno proitati sve podatke sa neke datoteke, pri emu unaprijed ne poznajemo konaan broj informacija (na primjer, proizvoljan broj vrijednosti neke varijable). U tu svrhu se koristi funkcija eof (od engleske rijei end of file), koja je tana ukoliko se proe posljednja linija u kojoj postoji neka informacija. Sljedei primjer pokazuje upotrebu ove funkcije u problemu itanja nizova karaktera (rijei). #include <iostream> #include <fstream> using namespace std; int main () { char podaci[80]; ifstream saDat; saDat.open("podaci.txt"); while(!saDat.eof()) { saDat >> podaci; cout << podaci << endl; } saDat.close(); system("PAUSE");

110

C++ programiranje za srednje kole prof.Smajo Meki

} Linije petlja while, omoguavaju sukcesivno itanje podataka sa datoteke podaci.txt. Kada se doe do posljednje linije sa nekom informacijom, funkcija eof vraa vrijednost true i automatski se izlazi iz petlje. Na analogan nain se mogu itati podaci rasporeeni u kolone. Pitanja za utvrivanje 1. Nabrojati formate datoteka u kojima se mogu pohraniti podaci! 2. Koja standardna datoteka treba da se pozove kada program pie na datoteku ili ita sa nje? 3. Koji od tri objekta iostream, ifstream, fstream, moe sluiti i za upis i za ispis na datoteke? 4. U emu se sutina zatvaranja datoteke? 5. ta je konstruktor? 6. Da li se stream objekti trebaju proslijediti po vrijednosti ili referenci, i zato?

13.Zbirka Zadataka
13.1.Zadaci pravolinijska struktura Zadatak 1 Potrebno je izraunati srednju vrijednost po volji izabrana etiri realna broja. Ispis neka bude oblika: Unesi cetiri realna broja: Srednja vrijednost brojeva ...., ...., .... i .... je ...... Zadatak 2 Potrebno je unijeti cijeli broj, a zatim mu unarnim operatorom promijeniti predznak. Ispis neka bude oblika: Unesi broj: Kada se broju .... promijeni predznak, on postaje .... Zadatak 3 Potrebno je unijeti broj i pridruiti ga varijabli A. Sadraj varijable prvo treba uveati za 5, pa umanjiti za 8, na kraju pomnoiti s 3. Zadatak rijeiti upotrebom operatora obnavljajueg pridruivanja. Ispis neka bude oblika: Upisi zeljeni broj: Sadrzaj varijable A se uvecava za 5. Sada A iznosi: .... Od trenutnog sadrzaja varijable A se oduzima 8. Sada A iznosi: .... Trenutni sadrzaj varijable A se mnozi s 3. Sada A iznosi: .... Zadatak 4 Zadatak je primjer svoenja rezultata na zajedniki tip s operandima. Treba izraunati kolicnik dvaju cijelih brojeva i spremiti ga u realnu varijablu. Ispis neka bude oblika: Unesi prvi broj: Unesi drugi broj: Kolicnik iznosi: .... Zadatak 5 Zadatak je primjer svoenja operanada na zajedniki tip. Treba izraunati kolicnik dva broja od kojih je jedan cijeli, a drugi realan. Rezultat spremiti u cjelobrojnu varijablu kolicnikt. Ispis neka bude oblika: Unesi prvi broj: Unesi drugi broj: Vrijednost izraza a/b= ....

111

C++ programiranje za srednje kole prof.Smajo Meki

Zadatak 12 Na izvor napona U su prikljuena tri serijski spojena otpornika: R1, R2 i R3. Potrebno je izraunati ukupni otpor R,snagu struje I i pojedine padove napona na otporima: U1, U2 i U3. Ispis neka bude oblika: U (V)= R1 (om)= R2 (om)= R3 (om)=

112

C++ programiranje za srednje kole prof.Smajo Meki

Sadrzaj varijable kolicnik iznosi: .... Zadatak 6 Treba unijeti godinu roenja neke osobe i tekuu godinu. Raunaju se godine starosti osobe. Ispis neka bude oblika: Upisi godinu svog rodjenja: Koja je godina sada? Sada imas .... godina. Zadatak 7 Treba izraunati otpor bakrene ice ako je zadana duzina u metrima i poluprecnik u milimetrima. Ispis neka bude oblika: Upisi poluprecnik zice (u mm): Upisi duzinu zice (u m): Bakrena zica duzine ... m i presjeka ... mm2 ima otpor ... oma. Zadatak 8 Tijelu mase m kilograma promijeni se za t sekundi brzina s v1 na v2 m/s. Treba izraunati silu koja je djelovala na tijelo. Ispis neka bude oblika: Upisi masu tijela (u kg): Upisi vrijeme (u s): Upisi pocetnu brzinu (u m/s): Upisi konacnu brzinu (u m/s): Na tijelo je djelovala sila od ... N. Zadatak 9 Treba unijeti vrijeme u sekundama a zatim izraunati koliko je to sati, minuta i sekundi. Ispis neka bude oblika: Upisi vrijeme u sekundama: ... sekundi je ... sati, ... minuta i ... sekundi. Zadatak 10 Tijelo mase m kilograma pada s visine h metara brzinom v m/s. Kolika je ukupna energija tijela. Ispis neka bude oblika: Upisi masu tijela (u kg): Upisi visinu (u m): Upisi brzinu (u m/s): Tijelo ima ... J kineticke energije i ... J potencijalne energije, sto daje ukupnu energiju od ... J. Zadatak 11 Treba unijeti trocifreni broj a zatim ispisati vrijednost cifre desetice. Ispis neka bude oblika: Upisi trocifreni broj: U trocifrenom broju ... na mjestu desetice je cifra ...

Zadatak 17 Treba izraunati koliko bi vremena bilo potrebno zvuku da pree razmak izmeu dva mjesta ako taj isti razmak svjetlost pree za t sekundi. Ispis neka bude oblika: Upisi vrijeme (u sek): Svjetlost pree razmak izmedju dva mjesta za ... s, a zvuk je sporiji pa mu za isti razmak treba ... s. 13.2.Zadaci struktura grananja Zadatak 1 Treba unijeti cijeli broj pa provjeriti da li je >=0. Ako nije, treba izraunati apsolutnu vrijednost unesenog broja. Potom treba provjeriti da li je broj paran. Ako je paran treba izraunati i ispisati njegovu treu potenciju, a ako nije treba ispisati: Broj je neparan.

113

C++ programiranje za srednje kole prof.Smajo Meki

Ukupni otpor R iznosi ... oma. Snaga struje I iznosi ... A. Pad napona U1 je ... V. Pad napona U2 je ... V. Pad napona U3 je ... V. Zadatak 13 Jedan voz kree iz mjesta A prema mjestu B brzinom v1 km/h, a drugi, istodobno, u obrnutom smjeru brzinom v2 km/h. Mjesta A i B su meusobno udaljena s kilometara. Izraunati udaljenost od mjesta A na kome e se vlakovi susresti i trenutak kad e se to dogoditi. Ispis neka bude oblika: Upisi brzinu prvog voza (u km/h): Upisi brzinu drugog voz (u km/h): Upisi udaljenost izmedju dva mjesta (u km): Susret ce se dogoditi nakon .... km. Preostali dio puta je .... km (vrijedi za prvi voz, za drugi su iznosi obrnuti). Vozovi ce se susresti nakon .... sati. Zadatak 14 Na stolici mase Ms kilograma sjedi ovjek mase Mc kilograma. Koliki je pritisak na tlo ako stolica ima etiri noge. Presjek svake od noga je kvadrat sa stranicama X centimetara. Ispis neka bude oblika: Upisi masu stolice u kg: Upisi masu covjeka u kg: Unesi vrijednost stranice kvadrata u cm: Pritisak kojim covjek mase ... kg, koji sjedi na stolici mase ... kg, djeluje na tlo je ... paskala. Zadatak 15 Poluprenik Zemlje je 6370 km. Za koje e vrijeme avion obletjeti Zemlju ako leti na visini od h kilometara brzinom v km/h. Ispis neka bude oblika: Upisi visinu na kojoj leti avion (u km): Upisi brzinu kojom leti avion (u km/h): Avion koji leti brzinom ... km/s, na visini od ... km obletjet ce Zemlju za ... sati. Zadatak 16 Treba izraunati snagu P koju mora imati elektrino kuhalo koje za t minuta moe vodu mase m grama zagrijati od temperature temp1 do temperature temp2 (temperatura je izraena u C). Ispis neka bude oblika: Upisi vrijeme (u min): Upisi masu vode (u gr): Upisi pocetnu temperaturu (u C): Upisi konacnu temperaturu (u C): Elektricno kuhalo koje za ... min moze ... grama vode zagrijati sa ...C na ...C ima snagu od ... vata.

Unesi broj : Broj ... je paran, a njegova treca potencija iznosi ... ili Broj ... je neparan. Zadatak 2 Treba unijeti dva realna broja pa izraunati i ispisati njihov cjelobrojni kolicnik i ostatak dijeljenja. Potrebno je nainiti i provjeru. Ako je djelitelj 0 treba ispisati odgovarajuu poruku. Ispis neka bude oblika: Upisi djeljenik : Upisi djelitelj : ... / ... = ... cijelih i ... ostatka. Provjera: ... * ... + ... = ... ili Ne moze se dijeliti sa 0. Zadatak 3 Treba unijeti koeficijente kvadratne jednaine, pa zavisno o njihovim vrijednostima izraunati i ispisati rjeenja. Vano je provjeriti vrijednost koeficijenta a, ako je a=0, jednaine nije kvadratna. Treba provjeriti predznak diskriminante jer on odreuje hoe li rjeenja kvadratne jednaine bit realni ili kompleksni brojevi. Ispis neka bude oblika: Upisi koeficijent a: Upisi koeficijent b: Upisi koeficijent c: Rjesenja su realni brojevi: x1=... i x2=... ili Rjesenja su kompleksni brojevi: z1=...+...i, z2=...-...i ili Ako je koeficijent a=0, jednaina nije kvadratna. C++ programiranje za srednje kole prof.Smajo Meki

Zadatak 4 U pravougli je trouglu poznat ugao alfa (izraen u stepenima) i kateta a (u cm).Treba izraunati vrijednost hipotenuze c.

Unesi vrijednost ugla alfa u stepenima:

114

Unesi vrijednost katete a: Ako je vrijednost ugla alfa ... stepeni, a vrijednost katete a= ... cm, hipotenuza ima vrijednost c= ... cm. Zadatak 5 amac vozi brzinom vc okomito na tok rijeke koja tee brzinom vr. Kojom se brzinom krece amac u odnosu na obalu? Za koji ugao e amac skrenuti sa svoje putanje?

Unesi brzinu camca u m/s: Unesi brzinu rijeke u m/s: Ako je brzina rijeke ... m/s a brzina camca ... m/s, camac se u odnosu na obalu krece brzinom ... m/s. Camac je skrenuo sa svoje putanje za ... stepeni. Zadatak 6 Treba unijeti tri realna broja zatim pronai i ispisati najmanji. Ispis neka bude oblika: Upisi prvi broj : Upisi drugi broj : Upisi treci broj: Ako se upisu brojevi: ..., ... i ... najmanji od njih je ... Zadatak 7 Treba unijeti tri realna broja zatim ih ispisati od najmanjeg ka najveem. Ispis neka bude oblika: Upisi prvi broj: Upisi drugi broj: Upisi treci broj: Brojevi: ..., ... i ... poredani od najmanjeg ka najvecem: ..., ..., ... Zadatak 8 Treba izraunati jainu struje, napon ili otpor, prema odabiru korisnika. Za raunanje jaine struje treba birati 1, za napon 2, a za otpor 3. Ovisno o tome to se eli raunati treba unijeti odgovarajue podatke. Ispis neka bude oblika: Ohmov zakon Za raunanje jaine struje upii 1, za raunanje napona upii 2, a za otpor 3: NPR: U (V)=... R (om)=... Ako je napon ... V, a otpor ... oma, jaina struje iznosi ... ampera Zadatak 9 Program na osnovu unesenog rednog broja mjeseca ispisuje koliko taj mjesec ima dana. U sluaju unosa broja koji nije iz raspona od 1 do 12 treba ispisati upozorenje. Ispis neka bude oblika: Upisi redni broj mjeseca: ... . mjesec ima 31 dan. ili ... . mjesec ima 30 dana. ili

115

C++ programiranje za srednje kole prof.Smajo Meki

2. mjesec ima 28 dana (ili 29 ako je godina prestupna). Zadatak 10 Program na osnovu unesenih vrijednosti stranica trougla rauna obim ili povrinu, po elji korisnika. Za rezultat obima upisuje se 1, a za povrinu 2. Za rezultat obima upisi 1, a za rezultat povrsine 2: a= b= c= Obim trougla je O= .... ili Povrsina trougla je P= ... Zadatak 11 Program na osnovu unesenog maksimalnog broja bodova koji se moe ostvariti na testu oblikuje bodovnu skalu, a zatim na temelju osvojenog broja bodova na testu, ispisuje odgovarajuu ocjenu. Upisi maksimalni broj bodova na testu: Odlican od 89% do 100%: - bodova. Vrlo dobar od 77% do 88%: - bodova. Dobar od 64% do 76%: - bodova. Dovoljan od 51% do 63%: - bodova. Nedovoljan za manje od 50%: i manje bodova. Upisi osvojeni broj bodova na testu: : bodova je %, ocjena je Zadatak 12 Treba unijeti prirodni broj pa ga rastaviti na proste faktore. Ispis neka bude oblika: Upisi broj veci od 0: ... = 1 * ... * ... * ... * ...

Zadaci struktura petlje Zadatak 1 Potrebno je ispisati brojeve iz raspona od M do N (raspon bira korisnik). Ispis neka bude oblika: Ispis pocinje od broja: Ispis zavrsava brojem: Ispis brojeva od ... do ...: ... ... ... ... Zadatak 2 Treba ispisati tablicu mnoenja odabranog broja sa brojevima od 1 do 10. Broj bira korisnik. Ispis neka bude oblika: Upisi broj sa kojim zelis mnoziti: ... * 1 = ... ... * 2 = ... ...

116

C++ programiranje za srednje kole prof.Smajo Meki

... ... ... * 10 = ... Zadatak 3 Potrebno je ispisati prvih N neparnih brojeva. Ispis neka bude oblika: Upisi zeljeni broj neparnih brojeva: Prvih ... neparnih brojeva su: ... ... ... .... Zadatak 4 Potrebno je sabrati prvih 100 prirodnih brojeva. Ispis neka bude oblika: Zbir prvih 100 prirodnih brojeva je ... Zadatak 5 Treba prebrojiti koliko brojeva unutar raspona od M do N ima cifru jedinice vrijednosti 9. Ispis neka bude oblika: Raspon pocinje od broja: Raspon zavrsava brojem: U rasponu od ... do... ima ... brojeva sa cifrom jedinice vrijednosti 9. Zadatak 6 Treba provjeriti djeljivost brojeva iz odabranog raspona od M do N sa zadanim brojem B. Ispis neka bude oblika: Pocetna vrijednost raspona: Zavrsna vrijednost raspona: Provjerava se djeljivost s brojem: Brojevi djeljivi sa ... iz raspona od ... do ... su: ... ... ... ... ... Zadatak 7 Potrebno je sabrati sve prirodne trocifrene brojeve. Ispis neka bude oblika: Zbir svih prirodnih trocifrenih brojeva je .... Zadatak 8 Potrebno je sabrati N odabranih cijelih brojeva. Ispis neka bude oblika: Upisi koliko brojeva zelis sabirati: Upisi broj: Upisi broj: ....... ....... Zbir unesenih brojeva je ... Zadatak 9 Potrebno je sabrati N lanova niza : (1 + 1/2 + 1/3 + 1/4 + 1/5 +....+ 1/N). Ispis neka bude oblika: Upisi zeljeni broj clanova niza: Zbir ... clanova ovog niza iznosi ... . Zadatak 10 Potrebno je ispisati i sabrati sve prirodne brojeve djeljive s 3 iz raspona od 1 do N. Ispis neka bude oblika: Upisi zavrsnu vrijednost raspona: U intervalu od 1 do ... brojevi djeljivi sa 3 su: .... ... ... Zbir brojeva djeljivih s 3 iz intervala od 1 do... je ... Zadatak 11

117

C++ programiranje za srednje kole prof.Smajo Meki

Potrebno je prebrojiti i sabrati sve parne prirodne brojeve iz raspona od 1 do N . Ispis neka bude oblika: Upisi gornju granicu raspona: U intervalu od 1 do ... ima ... brojeva djeljivih sa 2. Njihov zbir je ... . Zadatak 12 Potrebno je provjeriti da li je odabrani prirodni broj prost (prost broj je djeljiv samo sa 1 i sa samim sobom). Ispis neka bude oblika: Upisi prirodni broj: ... je/nije prost. Zadatak 13 Potrebno je provjeriti da li je odabrani prirodni broj savren (broj je savren ako je jednak zbiru svih svojih djelitelja, osim njega samog). Ispis neka bude oblika: Upisi prirodni broj: Broj ... je/nije savrsen. Zadatak 14 Potrebno je ispisati sve savrene prirodne brojeve iz raspona od 1 do 3000. Ispis neka bude oblika: Savrseni brojevi iz zadanog raspona su ... ... .... ... Zadatak 15 Potrebno je ispisati sve etverocifrene brojeve iji je proizvod cifara 100. Ispis neka bude oblika: Brojevi ciji je proizvod cifara 100 su:... ... ... ... Zadatak 16 Potrebno je ispisati sve trocifrenee brojeve koji su djeljivi sa 7, a zadnja im je cifra 7. Ispis neka bude oblika: Brojevi koji zadovoljavaju uslov su: ... ... ... ... Zadatak 17 Potrebno je ispisati dekadske ASCII vrijednosti (od 32 do 255) i njihove odgovarajue znakove.Da bi ispis bio u pravilnim stupcima, koristi manipulator setw.

Zadatak 18 Potrebno je ispisati tekst "***" u obliku slova V, kao na slici (koristiti manipulator setw(int): Zadatak 19 Treba unijeti N realnih brojeva pa izraunati njihovu srednju vrijednost. Unos brojeva traje sve dok korisnik ne upie 0. Primjer rijeiti do-while petljom. Ispis neka bude oblika: Nakon posljednjeg broja unesi nulu. Unesi broj: Unesi broj: ... Uneseno je ... brojeva. Srednja vrijednost je .... Zadatak 20 Potrebno je unesenom prirodnom broju ispisati vrijednosti pojedinih cifara poevi od cifre najmanje teinske vrijednosti, jednu ispod druge. Ispis neka bude oblika: Upisi prirodni broj: Njegove cifre su: ...

118

C++ programiranje za srednje kole prof.Smajo Meki

... ... Zadatak 21 Potrebno je unesenom prirodnom broju sabrati vrijednosti njegovih cifara. Ispis neka bude oblika: Upisi prirodni broj: Zbir cifara broja ... je ... . Zadatak 22 Korisnik unosi prirodne brojeve. Nakon posljednjeg broja unosi 0. Program ispisuje najvei uneseni broj. Ispis neka bude oblika: Upisi prirodni broj: Upisi prirodni broj: ... Najveci broj je ... Zadatak 23 Program rauna ukupni otpor N otpora spojenih u paralelu. Nakon posljednje vrijednosti otpora unosi se 0. Ispis neka bude oblika: Upisi vrijednost otpora u omima: Upisi vrijednost otpora u omima: ... Ukupni otpor ... otpora spojenih u paralelu je ... oma. Zadatak 24 Program rauna srednju ocjenu uspjeha uenika. Nakon posljednje ocjene treba unijeti 0. U sluaju da je bilo koja od ocjena 1, ispisuje se poruka: Negativan uspjeh. Ako se unese vrijednost koja nije iz raspona od 1-5, ispisat e se poruka: Pogrean unos. Ispis neka bude oblika: Srednja ocjena uspjeha je ...

Zadatak 25 Potrebno je ispisati N lanova Fibonaccijevog niza. Fibonaccijev niz je niz u kome su prva dva lana jednaka jedan, a svaki sljedei lan je zbir prethodna dva lana niza (1, 1, 2, 3, 5, 8, 13, 21, 34, ......). Ispis neka bude oblika: Upisi koliko clanova niza zelis: lanovi niza: 1, 1, ..., ..., ..., ..... Zadatak 26 Potrebno je izraunati najveu zajedniku mjeru dva prirodna broja. Najvea zajednika mjera dva broja je najvei prirodni broj kojim su djeljiva oba broja. Ispis neka bude oblika: Unesi prvi broj: Unesi drugi broj: Najveca mjera brojeva ... i ... je ... Zadatak 27 Potrebno je unijeti odabrani broj cifara poevi od cifre najvee teinske vrijednosti, pa od njih sastaviti i ispisati prirodni broj. Unos cifara se prekida kada se unese broj manji od 0 ili vei od 9. Ispis neka bude oblika: Upisi cifru: Upisi cifru:

119

C++ programiranje za srednje kole prof.Smajo Meki

Upisi cifru: ... Broj sastavljen od zadanih cifara je ...

14.Rjeenja
Pravolinijska struktura Rjeenje1 #include<iostream> using namespace std; int main() { float a,b,c,d,srvr; cout<<"Unesi cetiri realna broja"<<endl; cin>>a>>b>>c>>d; srvr=(a+b+c+d)/4; cout<<endl<<"Srednja vrijednost brojeva:"; cout<<endl<<a<<", "<<b<<", "<<c<<" i "<<d<<" je "<<srvr<<endl; system("PAUSE");return 0; } Pravolinijska struktura Rjeenje 2 #include<iostream> using namespace std; int main()

120

C++ programiranje za srednje kole prof.Smajo Meki

{ int a; cout<<"Unesi broj:"; cin>>a; cout<<endl<<"Kada se broju "<<a<<" promijeni predznak, on postaje "<<-a<<endl; system("PAUSE"); return 0; } Pravolinijska struktura - Rjeenje3 #include<iostream> using namespace std; int main() { float A; cout<<"Upisi zeljeni broj:"; cin>>A; cout<<"Sadrzaj varijable A se uvecava za 5. Sada A iznosi: "<<(A+=5)<<endl; cout<<"Od trenutnog sadrzaja varijable A se oduzima 8. Sada A iznosi: "<<(A-=8)<<endl; cout<<"Trenutni sadrzaj varijable A se mnozi sa 3.Sada A iznosi: "<<(A*=3)<<endl; system("PAUSE"); return 0;} Pravolinijska struktura - Rjeenje4 #include<iostream> using namespace std; int main() { int a,b; float kolicnik; cout<<"Unesi prvi broj:"; cin>>a; cout<<"unesi drugi broj:"; cin>>b; kolicnik=a/b; cout<<"kolicnik iznosi:"<<kolicnik<<endl; system("PAUSE");return 0; } Pravolinijska struktura - Rjeenje5 #include<iostream> using namespace std; int main() { int a,kolicnik; float b;

121

C++ programiranje za srednje kole prof.Smajo Meki

cout<<"Unesi prvi broj:"; cin>>a; cout<<"unesi drugi broj:"; cin>>b; kolicnik=a/b; cout<<"Vrijednost izraza a/b= "<<a/b<<endl; cout<<"Sadrzaj varijable kolicnik iznosi:"<<kolicnik<<endl; system("PAUSE");return 0; } Pravolinijska struktura - Rjeenje6 #include<iostream> using namespace std; int main() { int god,god1,god2; cout<<"Upisi godinu svog rodjenja: "; cin>>god1; cout<<"Koja je godina sada? "; cin>>god2; god=god2-god1; cout<<endl<<"Sada imas "<<god<<" godina."<<endl; system("PAUSE"); return 0; } Pravolinijska struktura - Rjeenje7 #include<iostream> using namespace std; int main() { float precnik,l,r,s,otpor; const double PI=3.14; const double ro=0.0175; cout<<"Upisi precnik zice (u mm):"; cin>>precnik; cout<<endl<<"Upisi duzinu zice (u m):"; cin>>l; r=precnik/2; s=r*r*PI; otpor=ro*l/s; cout<<endl<<"Bakrena zica duzine "<<l<<" m i presjeka " <<s<<" mm2 ima otpor"; cout<<otpor<<" oma."<<endl; system("PAUSE");return 0; }

122

C++ programiranje za srednje kole prof.Smajo Meki

Pravolinijska struktura - Rjeenje8 #include<iostream> using namespace std; int main() { float m,t,v1,v2,a,F; cout<<"Upisi masu tijela (u kg):"; cin>>m; cout<<"Upisi vrijeme (u s):"; cin>>t; cout<<"Upisi pocetnu brzinu (u m/s):"; cin>>v1; cout<<"Upisi konacnu brzinu (u m/s):"; cin>>v2; a=(v2-v1)/t; F=m*a; cout<<endl<<"Na tijelo je djelovala sila od "<<F<<" N."<<endl; system("PAUSE");return 0; } Pravolinijska struktura - Rjeenje9 #include<iostream> using namespace std; int main() { int s, sek, min, sat, ostatak; cout<<"Upisi vrijeme u sekundama:"; cin>>s; sat=s/3600; ostatak=s%3600; min=ostatak/60; sek=ostatak%60; cout<<s<<" sekundi je "<<sat<<" sati, "<<min<<" minuta i "<<sek<<" sekundi."<<endl; system("PAUSE"); return 0; }

123

C++ programiranje za srednje kole prof.Smajo Meki

Pravolinijska struktura - Zadatak10 #include<iostream> using namespace std; int main() { const double g=9.81; float m,h,v,Ep,Ek,Euk; cout<<"Upisi masu tijela (u kg):"; cin>>m; cout<<"Upisi visinu (u m):"; cin>>h; cout<<"Upisi brzinu (u m/s):"; cin>>v; Ep=m*g*h; Ek=m*v*v/2; Euk=Ep+Ek; cout<<endl<<"Tijelo ima "<<Ek<<" J kineticke energije i "<<Ep; cout<<" J potencijalne energije,sto daje ukupnu energiju od "<<Euk <<" J."<<endl; return 0; } Pravolinijska struktura - Rjeenje12 #include<iostream> using namespace std; int main() { float U,R1,R2,R3,R,I; cout<<"U (V)= "; cin>>U; cout<<endl<<"R1 (om)= "; cin>>R1; cout<<endl<<"R2 (om)= "; cin>>R2; cout<<endl<<"R3 (om)= "; cin>>R3; R=R1+R2+R3; I=U/R; cout<<endl<<"Ukupni otpor R iznosi "<<R<<" oma."<<endl; cout<<endl<<"Jakost struje I iznosi "<<I<<" A."<<endl; cout<<endl<<"Pad napona U1 je "<<I*R1<<" V."<<endl; cout<<"Pad napona U2 je "<<I*R2<<"V."<<endl; cout<<"Pad napona U3 je "<<I*R3<<"V."<<endl; return 0; } Pravolinijska struktura - Rjeenje13

124

C++ programiranje za srednje kole prof.Smajo Meki

#include<iostream> using namespace std; int main() { float v1, v2, udaljenost; float put1, put2, vrijeme; cout<<"Upisi brzinu prvog voza (u km/h):"; cin>>v1; cout<<"Upisi brzinu drugog voza (u km/h):"; cin>>v2; cout<<"Upisi udaljenost izmedju dva mjesta (u km):"; cin>>udaljenost; //put1/brzina1=put2/brzina2 //udaljenost=put1+put2 put1=udaljenost*v1/(v1+v2); put2=udaljenost-put1; vrijeme=put1/v1; cout<<"Susret ce se dogoditi nakon "<<put1; cout<<" km. Preostali dio puta je "<<put2; cout<<" km (vrijedi za prvi voz, za drugi su iznosi obrnuti)."<<endl; cout<<"Vozovi ce se susresti nakon "<<vrijeme<<" sati."<<endl; system("PAUSE");return 0;} Pravolinijska struktura - Rjeenje14 #include<iostream> using namespace std; int main() { float Mc,Ms,Gs,Gc,X,F,S,s1,p; const double g=9.81; cout<<"Upisi masu stolice u kg:"; cin>>Ms; cout<<"Upisi masu covjeka u kg:"; cin>>Mc; cout<<"Unesi iznos stranice kvadrata u cm:"; cin>>X; Gs=Ms*g; Gc=Mc*g; //ukupna sila koja djeluje na pod F=Gs+Gc; //povrsina presjeka jedne noge stolice s1=X*X; //ukupna povrsina na koju djeluje sila S=4*s1; S=S/10000; //pretvaranje cm2 u m2 p=F/S; //pritisak u paskalima cout<<"Pritisak kojim covjek mase "<<Mc<<" kg, koji sjedi na stolici mase "<<Ms; cout<<" kg, djeluje na pod je "<<p<<"paskala"; system("PAUSE");return 0; }

125

C++ programiranje za srednje kole prof.Smajo Meki

Pravolinijska struktura - Rjeenje15 #include<iostream> using namespace std; int main() { float h,v, Ruk,O,vrijeme; const double R=6370; //konstanta je izrazena u km const double PI=3.14; cout<<"Upisi visinu na kojoj leti avion (u km):"; cin>>h; cout<<"Upisi brzinu kojom leti avion(u km/h):"; cin>>v; //Zbir poluprecnika zemlje i visine Ruk=R+h; //Racunanje puta (obim kruga) O=2*Ruk*PI; //t=s/v, jednoliko gibanje vrijeme=O/v; cout<<"Avion koji leti brzinom "<<v<<"km/h, na visini od "<<h; cout<<" km obletjet ce Zemlju za"<<vrijeme<<" sati."<<endl; system("PAUSE");return 0; }

126

C++ programiranje za srednje kole prof.Smajo Meki

Pravolinijska struktura - Rjeenje16 #include<iostream> using namespace std; int main() { float tmin,m,temp1,temp2,ts,DT,M,Q,P; const double c=4186; //konstanta je izrazena u J/(kg*K) cout<<"Upisi vrijeme (u min):"; cin>>tmin; cout<<"Upisi masu vode (u gr):"; cin>>m; cout<<"Upisi pocetnu temperaturu (u C):"; cin>>temp1; cout<<"Upisi konacnu temperaturu (u C):"; cin>>temp2; DT=temp2-temp1; //vrijeme treba pretvoriti u sekunde ts=tmin*60; //masu treba pretvoriti u kg M=m/1000; //racuna se toplotna energija Q=M*c*DT; //racuna se snaga P=Q/ts; cout<<"Elektricno kuhalo koje za "<<tmin<<" min moze "<<m; cout<<" grama vode zagrijati sa "<<temp1<<"stepeni C na "<<temp2; cout<<"stepeni C ima snagu od "<<P<<" vata."<<endl; system("PAUSE");return 0; }

127

C++ programiranje za srednje kole prof.Smajo Meki

Pravolinijska struktura - Rjeenje17 #include<iostream> using namespace std; int main() { float t,s,tz; const double c=3e+8; const double v=340; cout<<"Upisi vrijeme (u sek):"; cin>>t; //racunanje puta s=c*t; tz=s/v; cout<<"Svjetlost prevali razmak izmedju dva mjesta za "<<t; cout<<" s, a zvuk je sporiji pa mu za isti razmak treba "<<tz<<" sekundi."<<endl; system("PAUSE"); return 0; } Struktura grananja - Rjeenje1

#include <iostream> #include <cmath> using namespace std; int main () { int i,rez; cout<<"Unesi broj:"; cin>>i; if (i<0) { i=abs(i); } if (i%2==0) { rez=pow(i,3); cout<<"Broj "<<i<<" je paran, a njegova treca potencija iznosi"<<rez<<endl; } else { cout<<"Broj "<<i<<" je neparan."<<endl; } system("PAUSE"); return 0; } Struktura grananja - Rjeenje2 #include<iostream> #include<cmath > using namespace std; int main() { float a,b,ost,rez; cout<<"Upisi djeljenik:"; cin>>a; cout<<"Upisi djelitelj:"; cin>>b; if (b==0) cout<<"Ne moze se dijeliti sa 0. "; else { rez=a/b; rez=floor(rez); ost=fmod(a,b); cout<<endl<<a<<"/"<<b<<"="<<rez<<" cijelih i " <<ost<<" ostatka."; cout<<endl<<"Provjera: "<<rez<<"*"<<b<<"+"<<ost <<"="<<rez*b+ost<<endl; } system("PAUSE");

128

C++ programiranje za srednje kole prof.Smajo Meki

return 0; } Struktura grananja - Rjeeenje3 #include<iostream> #include<cmath> using namespace std; int main() { float a,b,c,x1,x2,pom1,xR,xi; cout<<"Upisi koeficijent a:"; cin>>a; cout<<"Upisi koeficijent b:"; cin>>b; cout<<"Upisi koeficijent c:"; cin>>c; if (a!=0) { pom1=b*b-4*a*c; if (pom1>=0) { x1=(-b+sqrt(pom1))/(2*a); x2=(-b-sqrt(pom1))/(2*a); cout<<"Rjesenja su realni brojevi x1= "<<x1<<" i x2="<<x2<<endl; } else { xR=-b/(2*a); xi=sqrt(-pom1)/(2*a); cout<<"Rjesenja su kompleksni brojevi:"; cout<<endl<<"z1="<<xR<<"+"<<xi<<"i, z2= "<<xR<<""<<xi<<"i"<<endl; } } else { cout<<"Ako je koeficijent a=0,jednadzba nije kvadratna"<<endl; } system("PAUSE"); return 0; }

Struktura grananja - Rjeenje4 #include<iostream>

129

C++ programiranje za srednje kole prof.Smajo Meki

#include<cmath> using namespace std; int main() { float ugaoalfa,a,c,ugaoalfa1; const float PI=3.14; cout<<"Unesi vrijednost ugla alfa u stepenima: "; cin>>ugaoalfa; cout<<"Unesi vrijednost katete a: "; cin>>a; ugaoalfa1=ugaoalfa*PI/180; c=a/sin(ugaoalfa1); cout<<endl<<"Ako je vrijednost ugla alfa " <<ugaoalfa; cout<<" stepeni, a vrijednost katete a="<<a; cout<<" cm, hipotenuza ima vrijednost c="<<c<<" cm."<<endl; system("PAUSE");return 0; } Struktura grananja - Rjeenje5 #include<iostream> #include<cmath> using namespace std; int main() { float vc,vr,v,ugao; const double PI=3.14159265; cout<<"Unesi brzinu camca u m/s: "; cin>>vc; cout<<"Unesi brzinu rijeke u m/s: "; cin>>vr; v=sqrt(pow(vc,2)+pow(vr,2)); ugao=atan(vr/vc); ugao=ugao*180/PI; cout<<endl<<"Ako je brzina rijeke "<<vr<<" m/s, a brzina camca "<<vc; cout<<" m/s camac se u odnosu na obalu giba brzinom "<<v<<" m/s."<<endl;
C++ programiranje za srednje kole prof.Smajo Meki

130

cout<<endl<<"Camac je skrenuo sa svoje putanje za "<<ugao<<" Stepeni."<<endl; system("PAUSE"); return 0; } Struktura grananja - Rjeenje6 #include<iostream> using namespace std; int main() { float a,b,c,min; cout<<"Upisi prvi broj:"; cin>>a; cout<<"Upisi drugi broj:"; cin>>b; cout<<"Upisi treci broj:"; cin>>c; min=a; if (b<min) { min=b; } if (c<min) { } cout<<"Ako se upisu brojevi: "<<a<<", " <<b<<" i "<<c<<" najmanji od njih je "<<min; system("PAUSE"); return 0; }
C++ programiranje za srednje kole prof.Smajo Meki

min=c;

Struktura grananja Rjeenje 7 #include<iostream> using namespace std; int main() {

131

float a,b,c,min,mid,max; cout<<"Upisi prvi broj:"; cin>>a; cout<<"Upisi drugi broj:"; cin>>b; cout<<"Upisi treci broj:"; cin>>c; min=a; if (b<min) { min=b; } if (c<min) { min=c; } max=a; if (b>max) { max=b; } if (c>max) { max=c; } mid=a; if ((b!=max)&&(b!=min)) { mid=b; } if ((c!=max)&&(c!=min)) { mid=c; } cout<<"Brojevi: "<<a<<", "<<b<<" i "<<c<<" poredani od najmanjeg ka najvecem:"; cout<<endl<<min<<", "<<mid<<", "<<max<<endl;
C++ programiranje za srednje kole prof.Smajo Meki

132

system("PAUSE");return 0; } Struktura grananja - Rjeenje8 #include <iostream> using namespace std; int main () { cout<<"Omov zakon"<<endl; cout<<"Za racunanje jacine struje upisi 1, za racunanje napona upisi 2, a za otpor 3: "; int i; float U,I,R; cin>>i; switch (i) { case 1: cout<<"U (V)="; cin>>U; cout<<"R (om)="; cin>>R; I=U/R; cout<<"Ako je napon "<<U<<" V, a otpor "<<R<<" oma, jacina struje iznosi "; cout<<I<<" A."<<endl; break; case 2: cout<<"I (A)="; cin>>I; cout<<"R (om)="; cin>>R; U=I*R; cout<<"Ako je jacina struje "<<I<<" A, a otpor "<<R<<" oma, napon iznosi "; cout<<U<<" V."<<endl; break; case 3:
C++ programiranje za srednje kole prof.Smajo Meki

133

cout<<"U (V)="; cin>>U; cout<<"I (A)="; cin>>I; R=U/I; cout<<"Ako je napon "<<U<<" V, a jacina struje iznosi "; cout<<I<<" A, otpor iznosi "<<R<<" oma."<<endl; break; default: cout<<"Pogresan unos. Treba upisati 1, 2 ili 3."; } system("PAUSE");return 0; } Struktura grananja - Rjeenje9 #include<iostream> using namespace std; int main() { int i; cout<<" Program na osnovu unesenog rednog broja mjeseca ispisuje"; cout<<" koliko taj mjesec ima dana"<<endl; cout<<"Upisi redni broj mjeseca: "; switch (i) { case 4: case 6: case 9: case 11: cout<<i<<". mjesec ima 30 dana."<<endl; break; case 1: case 3: case 5: case 7:
C++ programiranje za srednje kole prof.Smajo Meki

cin>>i;

134

case 8: case 10: case 12: cout<<i<<". mjesec ima 31 dan."<<endl; break; case 2: cout<<i<<". mjesec ima 28 dana (ili 29 ako je godina prestupna)."; break; default: cout<<"Pogresan unos."; cout<<" Redni broj mjeseca moze biti iz raspona od 1 do 12."; } system("PAUSE"); return 0; } Struktura grananja - Rjeenje10 #include<iostream> #include<cmath> using namespace std; int main() {
C++ programiranje za srednje kole prof.Smajo Meki

cout<<"Program na osnovu unesenih vrijednosti stranica trougla racuna "; cout<<" obim ili povrsinu, ovisno o zelji korisnika"<<endl; float a,b,c,o,p,p1,pov; int i; cout<<"Za racunanje obima upisi 1, a za povrsinu 2:"; cin>>i; cout<<"a = "; cin>>a; cout<<"b = "; cin>>b; cout<<"c = "; cin>>c; if((a<=0)||(b<=0)||(c<=0))

135

{ cout<<"Vrijednost stranice trougla ne moze biti <=0 " <<endl; goto kraj; } if((a+b<=c)||(b+c<=a)||(c+a<=b)) { cout<<" Unesene vrijednosti nisu stranice trougla." <<endl; goto kraj; } switch(i) { case 1: o=a+b+c; cout<<"Obim trougla je O= "<<o<<endl; break; case 2: cout<<"Povrsina se racuna po Heronovoj formuli"; p=(a+b+c)/2; p1=p*((p-a)*(p-b)*(p-c)); pov=sqrt(p1); cout<<" Povrsina trougla je P= "<<pov<<endl; break; cout<<" Pogresan unos. Valja unijeti 1 ili 2! " <<endl; } system("PAUSE"); kraj:return 0; } Struktura grananja - Rjeenje11 #include<iostream> #include<iomanip> #include<cmath> using namespace std; int main()
C++ programiranje za srednje kole prof.Smajo Meki

default:

136

{ float p,i,b, po; cout<<"Program na osnovu osvojenog broja bodova na testu, ispisuje "; cout<<" odgovarajucu ocjenu."<<endl; upis:cout<<"Upisi maksimalni broj bodova na testu: "; cin>>i; if (i<=0) goto upis; p=i/100; cout<<endl<<setw(35)<<"Odlican od 89% do 100%: "; cout<<floor(89*p)<<" - "<<i<<" bodova."<<endl; cout<<setw(35)<<"Vrlo dobar od 77% do 88%: "; cout<<floor(77*p)<<" - "<<floor(88*p)<<" bodova."<<endl; cout<<setw(35)<<"Dobar od 64% do 76%: "; cout<<floor(64*p) <<" - "<<floor(76*p)<<" bodova."<<endl; cout<<setw(35)<<"Dovoljan od 51% do 63%: "; cout<<floor(51*p)<<" - "<<floor(63*p)<<" bodova."<<endl; cout<<setw(35)<<"Nedovoljan za manje od 50%: "; cout<<floor(50*p)<<" i manje bodova."<<endl; upis2:cout<<endl<<endl<<"Upisi osvojeni broj bodova na testu: "; cin>>b; if (b<0 || b>i) { goto upis2; } po=b/p; if (po>=0 && po<=50) cout<<b<<" bodova je "<<po<<" %, ocjena nedovoljan." <<endl; else if (po<=63) cout<<b<<" bodova je "<<po<<" %, ocjena
C++ programiranje za srednje kole prof.Smajo Meki

cout<<"Neispravan unos, ponovi.";

137

dovoljan." <<endl; else if (po<=76) cout<<b<<" bodova je "<<po<<" %, ocjena dobar." <<endl; else if (po<=88) cout<<b<<" bodova je "<<po<<" %, ocjena vrlo dobar. " <<endl; else cout<<b<<" bodova je "<<po<<" %, ocjena odlican. " <<endl; system("PAUSE"); return 0; }

Struktura grananja - Rjeenje12 #include<iostream> #include <iostream> using namespace std; int main() { int br, prbr; cout<<"Rastavljanje broja na proste faktore"; unos:cout<<"Upisi broj veci od 0:"; cin>>br; if(br<=0) { cout<<"Treba unijeti broj veci od 0" <<endl; goto unos; } else { prbr=2; cout<<br<<" = 1"; dj2:if(br==1)
C++ programiranje za srednje kole prof.Smajo Meki

138

{ goto kraj; } else { dj1:if(br%prbr==0) { cout<<" * "<<prbr; br=br/prbr; goto dj2; } else { prbr=prbr+1; goto dj1; } } } kraj:cout<<endl; system("PAUSE"); return 0; }

#include<iostream> using namespace std; int main() { int brojac,m,n; cout<<"ispis pocinje od broja:"; cin>>m; cout<<"ispis zavrsava brojem:";

139

C++ programiranje za srednje kole prof.Smajo Meki

Struktura petlje - Rjeenje1

cin>>n; for (brojac=m;brojac<=n;brojac++) { cout<<brojac<<" "; } cout<<endl; system("PAUSE"); return 0; } Struktura petlje - Rjeenje2 #include<iostream> using namespace std; int main() { int b, brojac; cout<<"Upisi broj sa kojim zelis mnoziti:"; cin>>b; for (brojac=1;brojac<=10;brojac++) cout<<b<<" * "<<brojac<<" = "<<b*brojac<<endl; } Struktura petlje - Rjeenje3 #include<iostream> #include<cmath> using namespace std; int main() { float a,b,c,x1,x2,pom1,xR,xi; cout<<"Upisi koeficijent a:"; cin>>a; cout<<"Upisi koeficijent b:"; cin>>b; cout<<"Upisi koeficijent c:"; cin>>c; if (a!=0) { pom1=b*b-4*a*c; if (pom1>=0) { x1=(-b+sqrt(pom1))/(2*a); system("PAUSE"); return 0;

140

C++ programiranje za srednje kole prof.Smajo Meki

x2=(-b-sqrt(pom1))/(2*a); cout<<"Rjesenja su realni brojevi x1= "<<x1<<" i x2="<<x2<<endl; } else { xR=-b/(2*a); xi=sqrt(-pom1)/(2*a); cout<<"Rjesenja su kompleksni brojevi:"; cout<<endl<<"z1="<<xR<<"+"<<xi<<"i, z2= "<<xR<<"-"<<xi<<"i"<<endl; } } else { cout<<"Ako je koeficijent a=0,jednadzba nije kvadratna"<<endl; } system("PAUSE"); return 0;} Struktura petlje - Rjeenje4 #include<iostream> using namespace std; int main() { int brojac,zbrir; zbir=0; cout<<"Zbir prvih 100 prirodnih brojeva je:";
C++ programiranje za srednje kole prof.Smajo Meki

for (brojac=1;brojac<=100;brojac++) { zbir=zbir+brojac; } cout<<zbir<<endl; system(Pause); return 0; }

141

Struktura petlje - Rjeenje5 #include<iostream> #include<cmath> using namespace std; int main() { float vc,vr,v,ugao; const double PI=3.14159265; cout<<"Unesi brzinu camca u m/s: "; cin>>vc; cout<<"Unesi brzinu rijeke u m/s: "; cin>>vr; v=sqrt(pow(vc,2)+pow(vr,2)); ugao=atan(vr/vc); ugao=ugao*180/PI; cout<<endl<<"Ako je brzina rijeke "<<vr<<" m/s, a brzina camca "<<vc; cout<<" m/s camac se u odnosu na obalu kree brzinom "<<v<<" m/s."<<endl; cout<<endl<<"Camac je skrenuo sa svoje putanje za "<<ugao<<" stepeni."<<endl; system("PAUSE"); return 0; } Struktura petlje - Rjeenje6 #include<iostream> using namespace std; int main() { int brojac,m,n,b; cout<<"Pocetna vrijednost raspona:"; cin>>m; cout<<"Zavrsna vrijednost rapona:"; cin>>n; cout<<"Provjerava se djeljivost sa brojem:"; cin>>b; cout<<"Brojevi djeljivi sa "<<b<<" iz raspona od "<<m; cout<<" do "<<n<<" su:"<<endl; for (brojac=m;brojac<=n;brojac++) { if(brojac%b==0) cout<<brojac<<" "; } cout<<endl; system("PAUSE");

142

C++ programiranje za srednje kole prof.Smajo Meki

return 0; }

Struktura petlje - Rjeenje7 #include<iostream> using namespace std; int main() { int brojac,zbir; cout<<"Program sabira sve prirodne trocifrene brojeve."<<endl; zbir=0; for(brojac=100;brojac<=999;brojac++) { zbir=zbir+brojac; } cout<<"Zbir svih prirodnih trocifreni brojeva je "<<zbir<<endl; system("PAUSE"); return 0; } Struktura petlje - Rjeenje8 #include<iostream> using namespace std; int main() { int broj,brojac,zbir,N; zbir=0; cout<<"Upisi koliko brojeva zelis sabirati: "; cin>>N; for (brojac=1;brojac<=N;brojac++) { cout<<"Upisi broj: "; cin>>broj; zbir=zbir+broj; } cout<<"Zbir unesenih brojeva je "<<zbir<<endl; system("PAUSE"); return 0; } Struktura petlje - Rjeenje9 #include <iostream> using namespace std; int main() { float zbir,brojac,N;

143

C++ programiranje za srednje kole prof.Smajo Meki

cout<<endl<<"Upisi zeljeni broj clanova niza: "; cin>>N; zbir=0; for(brojac=1;brojac<=N;brojac++) { zbir=zbir+1/brojac; } cout<<"Zbir "<<N<<" clanova ovog niza iznosi " <<zbir <<endl; system("PAUSE"); return 0; } Struktura petlje - Rjeenje10 #include<iostream> using namespace std; int main() { int N,zbir,brojac; cout<<"Upisi zavrsnu vrijednost raspona:"; cin>>N; zbir=0; cout<<"U intervalu od 1 do "<<N<<" brojevi djeljivi sa 3 su: " <<endl; for(brojac=1;brojac<=N;brojac++) { if(brojac%3==0) { zbir=zbir+brojac; cout<<brojac<<" "; } } cout<<"Zbir brojeva djeljivih sa 3 iz \ intervala od 1 do "<<N<<" je"<<zbir; system("PAUSE"); return 0; }

Struktura petlje - Rjeenje11 #include<iostream> using namespace std; int main() { int broj,brojac,N; broj=0; cout<<"Upisi gornju granicu raspona: "; cin>>N; for(brojac=1;brojac<=N;brojac++) { if(brojac%2==0) broj=broj+1;

144

C++ programiranje za srednje kole prof.Smajo Meki

} cout<<"U intervalu od 1 do "<<N<<" ima "<<broj<<" parnih brojeva "<<endl; system("PAUSE");return 0; } Struktura petlje - Rjeenje12 #include<iostream> using namespace std; int main() { int brojac,N; cout<<"Upisi prirodni broj: "; cin>>N; for (brojac=2;brojac<=(N-1);brojac++) { if(N%brojac==0) { cout<<"Broj "<<N<<" nije prost."<<endl; goto kraj; } } cout<<"Broj "<<N<<" je prost."<<endl; kraj:return 0; }

Struktura petlje - Rjeenje13 #include<iostream> using namespace std; int main() { int brojac,zbir,N; cout<<"Upisi prirodni broj: "; cin>>N; zbir=0; for (brojac=1;brojac<=(N-1);brojac++) { if(N%brojac==0) { zbir=zbir+brojac; } } if(zbir==N) cout<<"Broj "<<N<<" je savrsen."<<endl; else cout<<"Broj "<<N<<" nije savrsen."<<endl; system("PAUSE"); return 0;

145

C++ programiranje za srednje kole prof.Smajo Meki

} Struktura petlje - Rjeenje14 #include<iostream> using namespace std; int main() { int br,brojac,zbir; cout<<"Savrseni brojevi su: "; for(br=1;br<=3000;br++) { zbir=0; for (brojac=1;brojac<=(br-1);brojac++) { if(br%brojac==0) zbir=zbir+brojac; } if(zbir==br) cout<<br<<" "; } system("PAUSE"); return 0; }

Struktura petlje - Rjeenje16 #include<iostream>

146

C++ programiranje za srednje kole prof.Smajo Meki

Struktura petlje - Zadatak15 #include<iostream> using namespace std; int main() { int i,pom,j,d,s,t; cout<<"Brojevi ciji je proizvod cifara 100 su: "; for(i=1000;i<=9999;i++) { pom=i; j=pom%10; d=(pom/10)%10; s=(pom/100)%10; t=(pom/1000)%10; if(j*d*s*t==100) cout<<endl<<i; } system("PAUSE"); return 0; }

using namespace std; int main() { int i; cout<<"Brojevi koji zadovoljavaju uslov su: "; for(i=100;i<=999;i++) { if((i%10==7)&&(i%7==0)) { cout<<endl<<i; } } system("PAUSE"); return 0; }

Struktura petlje - Rjeenje18 #include<iostream> #include<iomanip> using namespace std; int main() { int i,s,p; s=10; p=40; for(i=1;i<=10;i++) {

147

C++ programiranje za srednje kole prof.Smajo Meki

Struktura petlje - Rjeenje17 #include<iostream> #include<iomanip> using namespace std; int main() { int znak,red,stupac; znak=32; for(red=1;red<=45;red++) { for(stupac=1;stupac<=5;stupac++) { cout<<setw(10)<<znak<<" = "<<char(znak); znak=znak+1; } cout<<endl; } system("PAUSE"); return 0; }

cout<<setw(s)<<"***"<<setw(p)<<"***"<<endl; s=s+2; p=p-4; } system("PAUSE"); return 0; }

Struktura petlje - Rjeenje19 #include<iostream> using namespace std; int main() { int br,b; cout<<"Upisi prirodni broj: "; cin>>b; br=0; do { b=b/10; br=br+1; } while(b>0); cout<<"Broj cifara: "<<br<<endl; system("PAUSE"); return 0; } Struktura petlje - Rjeenje20 #include<iostream> using namespace std; int main() { int b,i; upis:cout<<"Upisi prirodni broj: "; cin>>b; if (b<=0) goto upis; while(b>0) { i=b%10; cout<<endl<<i; b=b/10; } cout<<endl; system("PAUSE"); return 0; }

148

C++ programiranje za srednje kole prof.Smajo Meki

Struktura petlje - Rjeenje21

#include<iostream> using namespace std; int main() { int b,i,s,br; s=0; cout<<"Upisi prirodni broj: "; upis:cin>>b; if(b<0) { cout<<"Upisi prirodni broj"<<endl; goto upis; } br=b; while(b>0) { i=b%10; s=s+i; b=b/10; } cout<<"Zbir cifara broja "<<br<<" je "<<s<<endl; system("PAUSE"); return 0; } Struktura petlje - Rjeenje22 #include<iostream> using namespace std; int main() { int b,max; upis:cout<<endl<<"Upisi prirodni broj: "; cin>>b; if (b<=0) goto upis; max=b; while(b>0) { if(b>max) { max=b; } cout<<"Upisi prirodni broj: ";

149

C++ programiranje za srednje kole prof.Smajo Meki

cin>>b; } cout<<endl<<"Najveci broj je: "<<max<<endl; system("PAUSE"); return 0; } Struktura petlje - Rjeenje23 #include<iostream> using namespace std; int main() { float R,br,Ruk1,Ruk; cout<<"Nakon posljednje vrijednosti otpora unijeti 0" <<endl; br=0; Ruk1=0; upis:cout<<"Upisi vrijednost otpora u omima: "; cin>>R; if(R<0) { cout<<"Vrijednost otpora mora biti >0."<<endl; goto upis; } while(R>0) { br=br+1; Ruk1=Ruk1+1/R; cout<<"Upisi vrijednost otpora u omima: "; cin>>R; } Ruk=1/Ruk1; cout<<"Ukupni otpor "<<br<<" otpora spojenih u paralelu je "<<Ruk<<" oma."; system("PAUSE"); return 0; } Struktura petlje - Rjeenje24 #include<iostream> using namespace std; int main() { cout<<"Program racuna srednju ocjenu uspjeha ucenika."<<endl; cout<<"Nakon posljednje ocjene unosi se 0."<<endl; float b,suma,br; suma=0;

150

C++ programiranje za srednje kole prof.Smajo Meki

br=0; do { cout<<"Unesi ocjenu: "; cin>>b; if(b==1) { cout<<"Negativan uspjeh."<<endl; goto kraj; } else if(b<0) { cout<<"Pogresan unos."<<endl; goto kraj; } else { suma=suma+b; br=br+1; } } while(b>0); br=br-1; cout<<"Srednja ocjena uspjeha je " <<suma/br<<endl; system("PAUSE"); kraj:return 0; } Struktura petlje - Rjeenje25 #include<iostream> using namespace std; int main() { int prvi,drugi,treci,brojac,N; cout<<"Program ispisuje N clanova Fibonaccijevog niza."<<endl; prvi=1; drugi=1; upis:cout<<"Upisi koliko clanova niza zelis: "; cin>>N; if(N<2) { cout<<"Broj clanova niza mora biti veci ili jednak 2"<<endl; goto upis; } cout<<prvi<<" "<<drugi; for(brojac=3;brojac<=N;brojac++) {

151

C++ programiranje za srednje kole prof.Smajo Meki

treci=prvi+drugi; cout<<" "<<treci; prvi=drugi; drugi=treci; } cout<<endl; system("PAUSE"); return 0; } Struktura petlje - Rjeenje26 #include<iostream> using namespace std; int main() { int A,B,manji,br,mjera; unos:cout<<"Unesi prvi broj: "; cin>>A; cout<<"Unesi drugi broj:"; cin>>B; if((A<=0)||(B<=0)) { cout<<"Treba unijeti brojeve vece od 0"<<endl; goto unos; } mjera=1; if(A<B) { manji=A; } manji=B; for(br=2;br<=manji;br++) { if((A%br==0)&&(B%br==0)) mjera=br; } cout<<"Najveca mjera brojeva "<<A<<" i "<<B<<" je "<<mjera<<endl; system("PAUSE"); return 0; }

Struktura petlje - Rjeenje27 #include<iostream> using namespace std; int main() { cout<<"Program na osnovu unesenih cifara Sastavlja i ispisuje prirodni broj."; < int ci,br;

152

C++ programiranje za srednje kole prof.Smajo Meki

br=0; cout<<endl<<"Upisi cifru: "; cin>>ci; while((ci>=0)&&(ci<=9)) { br=br*10+ci; cout<<"Upisi cifru: "; cin>>ci; } cout<<"Broj sastavljen od zadanih cifara je " <<br<<endl; system("PAUSE"); return 0; }

LITERATURA Efikasno programiranje na jeziku C++/Praktini primjeri/-Andrew Koenig,Barbara E.Moo, Predavanja sa FIT-a Mostar/Uvod u programiranje/Programiranje 1 i 2, Osnove programiranja u C++ -Aleksandar Kara; Uvod u programiranje dr.Senad Rahimi; C++ za apsolutene poetnike Motik, B. and ribar, J. Demistificirani C++. Element, Zagreb, 2. izdanje edition, 2001. Stroustrup, B. The C++ Programming Language. Addison-Wesley, 3.izdanje edition, 2000. Hekmat, S. C++ Programming. Pragmatix Software Pty. Ltd., 2005.

153

C++ programiranje za srednje kole prof.Smajo Meki

Das könnte Ihnen auch gefallen