SADRŽAJ
1. Općenito o programima i programskim jezicima 1.1. Ljudi i računari...................................................................................................................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
5 .Kako započeti? 5 . 1.M S Vis ual C++.. .... ... ... ... .... ... ... ... .... ... ... ... . ... ... ... ... .... ... ... ... .... .. . ... ... . ... .3 4 5.2.Programski paket DEV C++..............................................................................................37 Pitanja za utvrĎivanje ......................................................................................................41
6.Uvod u C++ 6.1 Proces kompajliranja. .......................................................................................................42 6.2. Riječi u C++ programskom jeziku ......................................................................................44 6.3.Struktura programa...........................................................................................................45 6.4. Varijable .........................................................................................................................47 6.5. Memorija ........................................................................................................................48 6.6. Ulazno/izlazni usmjerivači toka ..........................................................................................49 6.7. Komentari .....................................................................................................................50
C++ programiranje za srednje škole prof.Smajo Mekić
4.1.Varijable..........................................................................................................................28 4.2. Operatori........................................................................................................................29 4.3.Funkcije...........................................................................................................................33
2
6.8. Imena (identifikatori) .......................................................................................................51 6.9. Tipovi podataka ...............................................................................................................52 Pitanja za utvrĎivanje .............................................................................................................55
7.Operatori 7.1 Aritmetički operatori .......................................................................................................56 7.2 Relacijski operatori .....................................................................................................58 7.3 Logički operatori .............................................................................................................59 7.4 Bitovni operatori .............................................................................................................59 7.5 Inkrementalni i dekrementalni operatori .............................................................................59 7.6 Operatori pridruţivanja .....................................................................................................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 utvrĎivanje ............................................................................................................63
8.Naredbe 8.1 Jednostavne i sloţene 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 utvrĎivanje .............................................................................................................81
9.1. Definicija ........................................................................................................................81 9.2. Parametri i argumenti ......................................................................................................84 9.3. Globalne i lokalne varijable ...............................................................................................85 9.4 Rekurzivne funkcije ..........................................................................................................86 Pitanja za utvrĎivanje ..........................................................................................................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 utvrĎivanje ........................................................................................................96
C++ programiranje za srednje škole prof.Smajo Mekić
9. Funkcije
3
11. Pointeri 11.1. Osnovno o pointerima ....................................................................................................97 11.2. Dinamička memorija ......................................................................................................97 11.3. Pointeri i polja ...............................................................................................................99 11.4. Aritmetika sa pointerima .................................................................................................99 11.5. Funkcijski pointeri ........................................................................................................101 Pitanja za utvrĎivanje ........................................................................................................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
13.Zbirka zadataka
113
14.Rješenja
123
Literatura
157
C++ programiranje za srednje škole prof.Smajo Mekić
Pitanja za utvrĎivanje ........................................................................................................113
4
Kratka biografija autora Dipl.prof.Informatike Smajo(Irfana)Mekić- zv.Smayson- roĎen 01.01.1972.u G.Bukovici Travnik; Srednju tehničku školu završio u Zenici,Nastavnički fakultet završio na Univerzitetu „Đemal Bijedić“ u Mostaru,nastavio studij na Panevropskom Univerzitetu „Apeiron“ na FIT-u(Fakultet Informacionih Tehnologija) u Banjaluci smjer nastavnička informatiku gdje dobiva zvanje Diplomirani profesor Informatike,Specijalistički studio završio na istom fakultetu,a Diplomski/Specijalistički rad na temu „PoreĎenje Pascala i C++ u nastavnom procesu“ odbranio pred akademikom dr.Zoran.Ţ.Avramović dipl.ing.elektrotehnike. Oţenjen, otac četiri sina,trenutno nastanjen na Kalibunaru-Travnik, uposlen u Mješovitim srednjim školama Busovača i Vitez.
Autor ove knjige je pokušao 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 uraĎene uz poštovanje pedagoških nastavni principa.Cilj ove knjige je lakše shvatanje predviĎenog gradiva ,postupno rješavanja 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. ,takoĎer je u pripremi muldimedijalni DVD koji prati ovu knjigu. UraĎeni materijal moţe biti od koristi za sve one koji ţele da načine prve korake u programiranju u programskom jeziku C++.Knjiga predstavlja radnu verziju i podloţna je izmjenama,dopunama te se kao takva koristi interno i nije planirana komercijalizacija i umnoţavanje.Zbirka riješenih zadataka ima za cilj da motiviše učenike za rad analizu,sintezu,da pokušaju da urade rješenja na drugi način. Autor je naveo korištene izvore za ovaj projekat,izvore nekih od tema je naveo kroz footnote, tako da je u potpunosti zaštitio autorska prava navedene literature. Autor zahvaljuje menadţmentima Mješovite srednje škole Busovača, direktoru Admiru Hodţiću i menadţmentu Mješovite srednje škole Vitez direktor Hrustić Seadu na razumjevanju i podršci za ovaj projekat. Neke ideje,sugestije i primjedbe koje su ugraĎene u ovu knjigu predloţili su moji dragi prijatelji; Dipl.prof. informatike Almin Halilović, Prof.informatike i matematike Junuz Junuzović, Dipl.ing.mašinstva prof.Šabanović Latif, Prof.Haskić Selvedin.
C++ programiranje za srednje škole prof.Smajo Mekić
Rječ autora
5
1.Općenito o programima i programskim jezicima S programiranjem se danas susrećete posvuda - bilo da programirate snimanje na videorekarderu, koristite mašinu za pranje veša, vozite neki noviji automobil, koristite mobitel ili jednostavno programirate na računaru. Zahvaljujući programiranju svijet je danas podesiv i prilagodljiv.I zato je dobro znati programirati. U ovom kratkom pregledu nećemo odmah uskočiti 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
R ačun ari ok o n as Danas se računar nalazi u svakom novijem automobilu,u svakom mobitelu, čak i u najobičnijem televizoru ili videorekorderu. Svi ti ureĎaji u sebi sadrţe računar koji ima je potrebno naloţiti što da rade. Tako će se televizor sam isključiti nakon nekog vremena,ako mu vi tako zadate, videorekorder će u 20:15 snimiti utakmicu na drugom programu u trajanju od 120 minuta, mašina za pranje rublja će uključiti program za pranje osjetljivog rublja,a automobil će upotrijebiti neki od ugraĎenih sistema za sprječavanje zanošenja na cesti. Spomenimo i obične lične računare. Oni su sposobnI obavljati mnogo kompliciraniji skup radnji nego računari ugraĎenI u npr. kućanske ureĎaje. Unatoč tome, svi računari imaju jednu zajedničku činjenicu - ne mogu samostalno zaključivati i donositi odluke. Zato im programer treba reći šta da rade. Programer to čini koristeći poseban programski jezik i posebne naredbe pomoću kojih komunicira s računarom i opisuje mu što i kako treba raditi .Računarski program je skup naredbi koji govori računaru na koji način da obavi određeni zadatak. Tekst programa koji je čitljiv programeru i korisniku zove se izvorni kod programa, dok je izvršna verzija programa binarna, i moţe je čitati i izvoditi samo računar. Programski jezik je skup leksičkih, sintaksnih i semantičkih pravila koja uobličuju 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.Općenito postoji više 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 takoĎer razlikuju po namjeni, načinu izvršavanja, strukturiranosti i proceduralnosti.1 1 .2 .Pod je l a pro gram sk ih jez i ka
1
Preuzeto i obrađeno iz knjige Informatika i računarstvo
C++ programiranje za srednje škole prof.Smajo Mekić
Prosječni računar baš i nije pametna naprava . Ono nema mogućnost samostalnog odlučivanja, zaključivanja , nema ono po čemu se ljudi razlikuju od svih ostalih - pamet i iskustvo.Da bismo natjerali računar da radi ono što mi ţelimo, moramo ga tome naučiti. Budući da računari ne znaju samostalno misliti , programeri moraju u njih ugraditi upustva koji im govore što trebaju raditi.U situaciji sličnoj programerovoj nalazi se roditelj kada svoje dijete ţeli naučiti jesti kašikom.Dijete je u ovom slučaju, slično kao i računar , "prazna ploča" - treba ga nučiti i najsitnijim detaljima. Dijete prvo mora podići kašiku (ali da ne prospe njen sadrţaj), prinijeti je ustima, paziti da u kašici juha nije prevruća , otvoriti usta, staviti kašiku u usta (a ne pored usta), progutati sadrţaj kašike (ali ne i kašiku). Zapravo, ovo uopće nije jednostavan postupak.Tako je i s računarima. Njih takoĎer treba naučiti da rade ono što bismo mi ţeljeli. No ovdje je problem malo veći nego s djetetom jer računari komuniciraju na razne načine - koriste, tj. razumiju različite računarske jezike.
6
Pod je la pr ogram sk i h jez ika po namje ni : Programski jezici za numeričke probleme Programski jezici za poslovne probleme Programski jezici temeljeni na listama i nizovima Višenamjenski jezici (u ovu skupinu spadaju .NET jezici) Pod je la po na či nu i zvoĎe n ja :
Imperativni – postiţu funkcionalnost pridruţivanjem vrijednosti i njihovim ispitivanjem, te skokovima (Ada, C, FORTRAN, Pascal) Funkcionalni jezici – ne postoji pridruţivanje, temelje se na funkcijama i listama (Lisp, ML, LOGO) Ciljno orijentirani jezici – temelje se na izvršavanju upita, dok način na koji se on izvršava 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 mašinskom jeziku, tj. kodovima naredbi koje izvodi direktno sam procesor. Programi su napisani u binarnim kodovima, i vrlo su nečitljivi. Kasnije su dodani simbolični nazivi naredbama, no skokovi su bili izvedeni prema hardverskim adresama koje su zadane brojem.
C++ programiranje za srednje škole prof.Smajo Mekić
Primjer programa u mašinskom kodu:
7
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 niţih nivoa da bi se mogli izvoditi, i često jedna naredba jezika ovog nivoa predstavlja mnogo naredbi jezika niţeg nivoa. Uneseno je razrješivanje izraza i prevodioc vrši niz analiza koje olakšavaju pisanje programa i ispravljanja grešaka. U ovu grupu pripadaju jezici C, Pascal i drugi. Primjer jezika pisanog u jeziku treće generaci:
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 računar razumije. Za prevoĎenje jezika višeg nivoa jezike niţeg nivoa koriste se programi zvani p revod ioci ili comp il er i . D rug u ge ne rac i ju programskih jezika predstavljaju simbolički programski jezici ili Assembli. Od jezika prve generacije razlikuje se u tome što su uvedena simbolička imena adresa (labeli) i jednostavniji pristup adresiranjima putem mnemoničkih kodova pojedinih naredbi. Mnenonik ili mnemonički kod je simbolički prikaz binarne naredbe, npr. Naredba 001011 predstavlja se mnemonikom MOV. Primjer programa pisanog u jeziku druge generacije:
8
Jezici če tvr te g enera c i je temelje se uglavnom na objektno orijentiranoj paradigmi, te raznim generatorima koda i korisničkim interfejsom. Ovi jezici su obično kombinacija raznih alata, tako da je većina 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.
Jezici p e te ge ne raci je su uglavnom usko specijalizirani jezici koji često kreiraju cijele aplikacije potpuno automatski putem raznih Wizarda i slično. Razvoj ovakvih jezika je u početnoj fazi.
2. Programski pristup
C++ programiranje za srednje škole prof.Smajo Mekić
Primjer aplikacije u jeziku 4. generacije:
9
2 .1 . O proced ura ln om p r og rami ran ju
Slika 2.1: Dva pristupa u dekompoziranju problema
C++ programiranje za srednje škole prof.Smajo Mekić
Za bilo koji problem vjerovatno postoji jednako puno načina da se isti analizira i riješi . Tako se sa programerskog aspekta, na primjer, problem moţe podijeliti (dekompozirati) algoritamski ili proceduralno, tj. u odnosu na sekvencu ili proceduru dogaĎaja koji se moraju desiti. Alternativno, problem se moţe riješiti pomoću "objektno-orijentisanog"pristupa, posmatrajući razne cjeline koje utjeću jedne na druge i uzimajući u obzir njihovo meĎusobno djelovanje. Ova dva pristupa u dekompoziranju problema– algoritamski i objektno-orijentisani – su dva pristupa koji programeri najčešće koriste. Pristupi su figurativno prikazani na Sl.2.1. Algoritamski pristup počinje opštim zadatkom koji treba izvršiti (kao što je "omogućiti korisniku da izvrši opšte bankarske funkcije"), zatim dijeli opšti zadatak na naredne nivoe specificiranijih podzadataka (kao što je "proces podizanja novca", te "proces stavljanja depozita"), te na dalje nivoe još specifičnijih zadataka (kao što su "upitaj korisnika na vrijednost depozita" ili "verifikuj unesenu vrijednost kao vaţeću").
10
Kada se zadatak prikaţe u obliku dijagrama, najopštiji zadatak je obićno na vrhu, a najspecifićniji 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 opšte stanje u razvijanju softvera. Pošto su novi pristupi omogućili strukturni pristup programiranju (u odnosu na haotični "hack and run" pristup, koji su koristili neki programeri), moţe se naići i na podatak da se algoritamski ili proceduralni pristup programiranju zove "strukturno programiranje". S obzirom da ovaj pristup počinje na vrhu (opšti zadatak koji treba izvršiti) i dijeli najviši zadatak na naredne nivoe specifičnijih podzadataka prema dnu,ovaj pristup se ponekad naziva i "top-down" pristup. Neki autori ga zovu i proceduralni pristup, imajući u vidu da se algoritamski pristup fokusira na procedure koje izvršavaju zadatak. Dakle, ovaj pristup dizajniranju softvera ima različite 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,počinjući sa vrha (najopštija funkcija), i idući prema dnu ka najspecifičnijim funkcijama. Mnogi programeri i danas koriste ovaj pristup, a još uvijek je koristan za izradu kvalitetnih softvera , naročito 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 izvoĎenju nekog programa. Uglavnom se sastoji od jednostavnog niza naredbi gdje je izvedeno grananje putem goto ili slične naredbe. Ne postoje pozivi metoda i funkcija. Ovi jezici su zastarjeli i nedovoljno razvijeni za današnje potrebe.
Modularno programiranje
C++ programiranje za srednje škole prof.Smajo Mekić
Slika 2.2: Algoritamska dekompozicija problema
11
Modularno programiranje omogućava fragmentaciju koda na module koji mogu biti pisani u različitim datotekama, i tako pojednostavljuje programe i povećava njihovu čitljivost. Unesen je pojam dijeljenja koda izmeĎu aplikacija. 2 .2 .O snove faze razvo ja prog rami ran ja Analiza problema Postavljanje modela Izrada algoritma Izrada dijagrama toka Kodiranje programa Prevođenje programa Testiranje programa Dokumentiranje programa Eksploatacija programa Svrha programa je rješavanje problema, najčešći način rješavanja je pomoću tri modela model podataka model procesa i model resursa. Model podataka sadrţi definiciju podataka (nazive, vrste, dimenzije, ograničenja vrijednosti...) te strukture podataka (nizovi, skupovi, datoteke, tablice...). Model procesa moţe biti prikazan različitim tehnikama (dijagram toka, dijagram strukture procesa, dijagrami akcija....), ali svi oni, na svoj način, prikazuju slijed odvijanja procesa. Model resursa sadrţi definiciju računarskih resursa i njihovih svojstva (operativni sistem, vrsta programskog prevodioca, svojstva jedinica računara...) koje su potrebne da bi program uredno radio.
MODEL PODATAKA
Šema riješavanja problema
MODEL PROCESA
C++ programiranje za srednje škole prof.Smajo Mekić
MODEL RESURSA
12
3.Algoritmi 3.1.Uvod u algoritam
Pojam algoritama (dijagram toka) je jedan od najstarijih i najvaţnijih pojomova u matematici. Teško je da se precizno definiše algoritma, jer pripada grupi osnovnih pojmova kao što su skup ili tačka. U početku algoritmom se nazivaju samo pravila računanja s brojevima, kasnije i pravila obavljanja ostalih zadataka u matematici, u XX vjeku, pojavom računara, pojam se proširuje na informatiku, a zatim i na druga područja. Precizan opis svih pravila i postupaka potrebnih za postizanje ţeljenog rezultata. Evo nekih definicija koje bliţe opisuju algoritam. Definicija 1. Algoritam je tačan opšte razumljiv propis koji definiše proces transformacije početnih podataka u traţeni rezultat. Definicija 2. Algoritam je tačan propis o tome koje operacije nad kojim brojevima i u kom redosljedu treba izvršiti da bi se rješili svi zadaci nekog zadatog tipa.
Definicija 3.
C++ programiranje za srednje škole prof.Smajo Mekić
Priču o algoritmima započeti ćemo onako kako počinju sve klasične priče.Nekada davno ţivio je u Bagdadu pisac, matematičar, 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 učenicima deset-jedanaest vijekova nakon toga. Njegov al jabr je postala algebra. Isto tako pravila rješavanja iz početka prvenstveno matematički problema su iskrivljavanjem imena al Khowarizmi nazivana algoritmi. No, tu greškama nije kraj. Prema korijenu riječi bilo bi pravilno umjesto algoritmi koristiti algorizmi. Ali kako jezik nije nauka nego skup dogovora, izgleda da je dogovoreno da najčešće greške postaju jezička pravila.Tako mi danas imamo algoritme, a oni su niz preciznih uputa koje nas korak po korak vode do rješenja nekog problema.To su zapravo toliko precizne upute da za njihovo izvršavanje nije potrebna inteligencija.Zašto 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 očekuje.Kao i kod rješavanja zadataka u bilo kom području prvo moramo znati postaviti problem.Drugi korak je gruba skica rješenja.Treći korak je izrada algoritma. Ako smo dobro napravili algoritam, tada pisanje programa nije ništa drugo negoli prepisivanje algoritma u neki programski jezik.Kada smo to učinili dobili smo program, a program "tjera" računar da radi ono što mi zapravo ţelimo.Neko je rekao da je računar idiot velike brzine. To je ustvari bit priče o algoritmima. Mi put do rješenja moramo toliko rascjepkati i detaljno napisati da bi ga mogao razumjeti i taj "idiot velike brzine".Drugim riječima, upute moraju biti jednostavne i precizne tako da ih moţe izvršavati i mašina. Pokušajte se sjetiti gdje ste zadnji put pročitali neko detaljno uputstvo. Moţda vam je i bilo u rukama,ali niste čitali jer to već znate napamet, kao npr.Dopuniti račun mobitela putem bona.Ili moţda da probamo obrnuto. Da li ste se nedavno našli u situaciji da niste nešto znali napraviti jer su upute bile toliko loše i nerazumljive ili uopće 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" razmišljati dobro je bez obzira bavili se vi poslije programiranjem ili ne.
13
Algoritam je precizan,ureĎeni i nedvosmisleni niz koraka koji u konačnom vremenu vodi do rješavanja problema ako problem ima rješenje,odnosno u konačnom vremenu kaţe da nema rješenja ako problem nema rješenja. Definicija 4. Algoritam je konačni skup pravila koja daju redosljed operacija za rješavanje specifičnog problema. Najbitnije osobine algoritma su: Određenost- je osobina algoritma da za iste početne 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 rješavati svi zadaci istog tipa. Rezultativnost- je osobina algoritma da on mora da vodi ka rješenju zadatka ako su početni podaci iz skupa mogućih podataka. Konačnost- je osobina algoritma da se algoritam realizuje sa konačno mnogo koraka. Pri tome ta konačnost treba da je ostvarljiva, tj. da moţe da se realizuje za neko razumno vrijeme.
Primjer algoritma Bilo koji problem se moţe riješiti izvršavanjem serije akcija u odreĎenom redosljedu. Akcije koje će se izvršiti i redosljed u kojem će se to odvijati nazivamo algoritam. Iskustvo pokazuje da je najteţi dio riješavanja programerskog problema na računaru upravo razvijanje algoritma za riješenje. Jednom kad je odreĎen ispravan algoritam, razvoj programa za sam alorgitam je poprilično jednostavan. Sljedeći primjer pokazuje korektan i nekorektan sljed dogaĎaja za algoritam kojim ţelimo opisati pokretanje automobila:
√ otključavanje automobila √ sjedanje u automobil √ paljenje motora √ otpuštanje ručne kočnice √ pokretanje automobila √ zaustavljanje
NEKOREKTAN SLIJED:
otključavanje automobila sjedanje u automobil paljenje motora pokretanje automobila zaustavljanje otpuštanje ručne kočnice
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 rješavanja problema i uvelike olakšava pisanje programskog koda. Pri crtanju dijagrama toka potrebno je slijediti odreĎena upustva, te koristiti standardne simbole koje je propisao American National Standard Institute. Značaj dijagrama toka
C++ programiranje za srednje škole prof.Smajo Mekić
KOREKTAN SLIJED:
14
C++ programiranje za srednje škole prof.Smajo Mekić
Dijagram toka je reprezentacija kojom ilustrirate sekvencu operacija koje je potrebno izvršiti kako bi se došlo do rješenja problema. Dijagram toka se crta u ranoj fazi formuliranja kompjuterskog rješenja. Dijagram toka olakšava komunikaciju izmeĎu programera i poslovnih ljudi. TakoĎe,dijagram toka igra značajnu ulogu u procesu programiranja jer olakšava razumijevanje logike kompliciranih i opseţnih problema. Jednom kad ste nacrtali dijagram toka postaje jednostavno napisati program u bilo kojem programskom jeziku. Vrlo često je nemoguće 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 korištenih simbola moţete pogledati u sljedećoj tabeli:
15
Za unos i ispis podataka vrlo često se koristi paralelogram
Kad je u pitanju simbol odluke moţe postojati samo jedan ulaz podataka, ali mogu postojati dva ili tri izlaza podataka (jedan za svaki mogući odgovor).
C++ programiranje za srednje škole prof.Smajo Mekić
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 jednoznačan (ne smije kod osobe koja ga gleda izazivati višeznačne konotacije). Uobičajen smjer toka je s lijeva na desno ili odozgo prema dolje.U dijagramu toka kad je u pitanju simbol za procesiranje moţe postojati samo jedan izlaz Podataka
16
Terminalni simbol (start, kraj) takoder moţe imati samo jedan ulazno, odnosno jedan izlazni tok podataka.
Ukoliko je dijagram toka kompleksan bolje je koristiti simbole konektora kako bi ste reducirati broj linija toka. Izbjegavajte presijecanje (kriţanje) linija. Vodite računa da vam dijagram toka ima logičan početak i kraj. Prednosti Prednosti dijagrama toka su: • Komunikacija(Dijagram toka olakšava komunikaciju svih koji su zainteresirani za rješavanje problema). • Efektivna analiza(Uz pomoć dijagrama toka problem se moţe efektivnije analizirati). • Odgovarajuća dokumentacija( Dijagram toka je dio obavezne programske dokumentacije, koja moţe sluţiti u različite svrhe). • Efikasno kodiranje( Korektan dijagram toka olakšava pisanje programa (bez obzira u kojem programskom jeziku). • Otklanjanje grešaka( Dijagram toka olakšava pronalaţenje grešaka). • Efikasno održavanje programa( Olakšava odrţavanje programa). Ograničenja • Kompleksnost Ponekad je problem kompleksan, pa je i dijagram toka kojim ga pokušavate predstaviti kompleksan i „nezgrapan“. • Alternative i održavanje( U slučaju potrebe za alternativnim rješenjima vrlo često je neophodno dijagram toka nacrtati ponovno (iz početka).
3 .3 . Pravo linijska a lgor i tam ska s tru kt ura
C++ programiranje za srednje škole prof.Smajo Mekić
Ukoliko ţelite jasnije opisati podatke ili korake koristite simbol za napomene/komentare (annotation symbol).
17
Iz osnovne škole sjećamo se da je brzina nekog tijela zapravo prijeĎeni put u jedinici vremena. Matematički bismo to zapisali kao V = s / t, gdje je V brzina, s prijeĎeni put i t vrijeme. To je tako jednostavno da nam nije potrebna nikakva priprema i gruba skica rješenja. Moţemo odmah raditi algoritam.
Za vježbu: Pokušajmo prema ovom primjeru nacrtati dijagram toka za izračunavanje površine pravougaonika, a zatim dijagram za izračunavanje obima pravougaonika. Evo još jednog primjera za izračunavanje obima i površinu kruga. Kako na tastaturi nemamo na raspolaganju grčka slova, našu formulu za izračunavanje obima pisati ćemo kao
Isto tako za sada još ne znamo funkciju za kvadriranje pa ćemo formulu za površinu kruga pisati ovako: P = r * r * Pi gdje je r * r zapravo r2.
C++ programiranje za srednje škole prof.Smajo Mekić
O = 2 * r * Pi.
18
Za vježbu: Po uzoru na obim i površinu kruga, pokušajte algoritme za izračunavanje obima i površine pravougaonika spojiti tako da u jednom algoritmu bude i obim i površina pravougaonika. 3 .4 . Gra nan je
Simbol za grananje je romb. Obično se u gornji vrh upiše upitnik i u sredini se postavi logički 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 logički uvjet mogu biti DA i NE, odnosno T i F (true i false). Ako je moguće više odgovora tada je to višestruko grananje.
Pr imjer 1 Sjetimo se zadataka iz prethodne lekcije za izračunvanje brzine ako su poznati put i vrijeme: V = s / t. Ako se na računaru dogodi situacija da dijelimo s nulom program će nam izbaciti grešku. Da bismo spriječili "ispadanje" programa, prije izračunavanja brzine provjeriti ćemo da li je upisano vrijeme veće od 0.
C++ programiranje za srednje škole prof.Smajo Mekić
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.
19
Prepravite dijagram toka iz gornjeg primjera tako da ako upisano vrijeme t nije veće od nula da se na grani NE ispisuje poruka 'Vrijeme mora biti veće od nula' i tek tada odlazi na kraj. Pojedine znakove ili nizove znakova kao što je ova poruka u dijagramu toka pišemo unutar navodnika koji ovisno o programskom jeziku koji ćemo poslije koristiti mogu biti jednostruki ili dvostruki.
C++ programiranje za srednje škole prof.Smajo Mekić
Pr im je r 2 Idemo riješiti još jedan zadatak. Prisjetimo se zadatka obima i površine pravougaonika iz prethodnih vjeţbi koji ćemo još malo proširiti. Preko tastature upisuju se stranice pravouganika a i b. Treba izračunati obim i površinu pravougaonika te ispisati poruku o tome da li je upisani lik pravouganik ili kvadrat.
20
Da objasnimo: Nakon što smo upisali stranice a i b, izračunali smo obim O i površinu P pravougaonika. Dobivene rezultate moţemo odmah ispisati.Kako ćemo utvrditi da li moţda 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
Obratite paţnju na konstrukciju ispisa. Pogledati ćemo lijevu granu koja se izvršava ako je odgovor na logički uvjet NE. Imamo dio poruke u navodnicima 'Broj ' pa zatim odvojeno zarezom varijablu a i
C++ programiranje za srednje škole prof.Smajo Mekić
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.
21
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 rečenica 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 veći.
3 .5 . Pe tlje
C++ programiranje za srednje škole prof.Smajo Mekić
Stvar je zapravo vrlo jednostavna. Ali pokušajte sada zamisliti da neko upiše dva ista broja, npr. 7 i 7. U uvjetu ćemo imati pitanje da li je 7 veće od 7. Odgovor je NE. Izvršiti će se lijeva grana i kao rezultat dobiti ćemo poruku: Broj 7 je veći od broja 7. Ova poruka baš i nema logike i dokaz je da naš računar od milja zvani „idiot“ velike brzine i ne razmišlja baš puno. Zato ljudi koji rade na razvoju informacijskih sistema moraju predvidjeti puno više situacija, pa i onih najekstremnijih koje bi se pri radu programa mogle dogoditi. Kaţu da dobra kontrola podataka pri unosu sprječava čak 90% grešaka koje bi se naknadno u radu programa mogle dogoditi. Zato ćemo mi rješenje našeg zadatka malo promijeniti:
22
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 običaj nestašne učenike kaţnjavati tako da su im zadali 100 puta napisati u biljeţnicu: "Neću nikada više brbljati na času informatike!". Zamislite da je nama neko dao takvu kaznu. Mi ćemo se probati izvući tako da to računar odradi umjesto nas. Treba mu samo zadati da 100 puta ispiše jednu te istu poruku. Ništa jednostavnije. Evo rješenja: Hm, već nakon treće upute računaru da ispiše poruku sam odustao jer mi je dosadilo. Morate priznati da ovo rješenje baš i nije nešto s čime bi se mogli pohvaliti.
Nakon što se i 100-ti puta izvrše naredba grananja i naredbe ispod grananja i će postati 101. Tada je odgovor na pitanje u grananju da li je i veći od 100 konačno DA i tada bi program trebao završiti s radom. Dio programa, niz istih naredbi koje se ponavljaju dok je neki uvjet zadovoljen ili dok ne
C++ programiranje za srednje škole prof.Smajo Mekić
Pokušajmotoodraditina drugačiji način:
23
postane zadovoljen, naziva se petlja. U našem se primjeru ispis poruke i povećanje varijable i za jedan ponavljaju dok i nije postao veći od 100. Varijabla i je u našem primjeru brojač jer svakim prolaskom kroz petlju i postaje i više 1. Neki ljudi tvrde da napredak moţemo zahvaliti samo ljudskoj lijenosti. Naime, ljudi će svašta izmisliti samo da ne moraju raditi. Tako je neko izmislio još jednostavnije rješenje za naš primjer s ispisom 100 poruka.
Pravougaonik ispod simbola za početak je naredba for koja je sama po sebi petlja. Brojač i kao i uvjet već su sadrţani 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 učini slijedeće:". Broj ponavljanja u petlji za rješenje odreĎenih problema se zna unaprijed, prije početka ponavljanja, a za neke se ne zna unaprijed, već ovisi o izvršavanju 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 početku algoritma moramo postaviti na vrijednost 0.
Varijabli zbir dodati vrijednost varijable i koja je u našem primjeru brojač.
Svakim prolaskom kroz petlju i se povećava za 1 i njegova vrijednost pridodaje sadrţaju 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 nešto što znamo računati još od petog osnovne, a to je prosjek ocjena. Prosjek je zbir svih ocjena podijeljen s brojem predmeta.
C++ programiranje za srednje škole prof.Smajo Mekić
Za i koji ide od 1 do 100 treba učiniti slijedeće:
24
Varijablu zbir koristiti ćemo za zbir svih ocjena i moramo ju na početku postaviti na vrijednost 0. Neka u prvom razredu imamo 15 predmeta. Varijablu i postavili smo na početnu vrijednost 1. U prvom prolazu kroz petlju upisujemo prvu ocjenu iz imenika, a to je bosanski jezik. Ocjena se upisuje u varijablu ocjena. Sadrţaj varijable ocjena se dodaje u varijablu zbir.
C++ programiranje za srednje škole prof.Smajo Mekić
U drugom prolazu upisujemo ocjenu iz drugog predmeta, u trećem iz trećeg i tako 15 puta. Po izlazu iz petlje izračunavamo prosjek i ispisujemo ga. Ovo je bilo prejednostavno da bi bilo stvarno. U stvarnom ţivotu desiti će se da je neko npr. osloboĎen nastave tjelesnog i zdravstvenog odgoja pa ima 14 predmeta. Neko moţda ima 16 predmeta jer je izabrao i fakultativnu nastavu. Isto tako u drugom, trećem ili četvrtom razredu sigurno nećete imati 15 predmeta. Već smo napomenuli da se programi pišu čim općenitije tako da bi se mogli primjenjivati za rješavanje čim više sličnih problema. Zato ćemo naš algoritam prepraviti tako što ćemo umjesto 15 uvesti varijablu brpred koja će predstavljati naš broj predmeta.
25
Nakon što smo varijablu zbir postavili na početnu vrijednost 0 treba preko tastature unijeti broj predmeta koji se smješta u varijablu brpred. Brojač i u petlji sada broji od 1 do brpred pa je primjenjivo za sve učenike i razrede s različitim brojem predmeta. Da bismo dobili prosjek treba po izlasku iz petlje zbir ocjena podijeliti s brojem predmeta brpred.
Za vježbu: Pokušajte po uzoru na prosjek ocjena za jednog učenika napraviti dijagram toka za izračunavanje prosječne ocjene razreda. Još nekoliko primjera petlji
Brojač u petlji for sada broji od n do m Da li je i neparan broj znati ćemo ako ga podijelimo s 2 koristeći 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 upiše za n veći broj nego za m? Prepravite gornji algoritam tako da izračunava i zbir neparnih i zbir parnih brojeva od n do m.
C++ programiranje za srednje škole prof.Smajo Mekić
Nakon postavljanja varijable zbir na početnu vrijednost 0 treba u upisati početni broj n i završni broj m od kojeg do kojeg ţelimo ispisati i sabrati neparne brojeve.
26
Ovaj primjer moţe se daleko elegantnije riješiti višestrukim grananjem. Izrada algoritama zahtjeva puno vjeţbe. Algoritmi se ne mogu naštrebati. Potrebno je riješiti puno primjera, od jednostavnijih do sve sloţenijih. Dijagram toka crtamo običnom olovkom s gumicom pri ruci. Stvari se rješavaju u hodu, mijenjaju, popravljaju i prepravljaju. Uočavaju se stvari koje se mogu pojednostavniti. Prednost dijagrama toka je što je pregledan, lako se test primjerima moţe "pješice" provjeriti. Zanimljivo je i to da više ljudi moţe napraviti na isti zadatak više različitih algoritama i da su svi dobri. Sloţeni algoritmi mogu se rastaviti na manje, tako rastavljeni riješiti do detalja i onda prikazati kao rješenje u
C++ programiranje za srednje škole prof.Smajo Mekić
Učenici su na satu fizike naučili Ohmov zakon po kojem otpor u istosmjernom strujnom kola moţete izračunati tako da podijelite napon sa jakošću struje: R=U/I gdje je otpor R, napon U i jakost struje I. Naučeno su odmah provjerili mjereći veličine u strujnom kolu, ako su mjerili napon i jakost mogli su po gornjoj formuli izračunati otpor, ako su mjerili otpor i napon mogli su izračunati jakost struje I = U / R, a ako su mjerili otpor i jakost struje mogli su izračunati napon U = I * R. Treba napraviti algoritam po kome je moguće za odreĎeni broj mjerenja na temelju dvije izmjerene veličine izračunati treću. Za broj mjerenja ćemo koristiti varijablu brmjer. Uvest ćemo još jednu varijablu koju ćemo zvati izbor i dogovoriti ćemo se da u nju upišemo 1 ako ţelimo računati otpor, 2 ako ţelimo računati napon i 3 ako ţelimo računati jakost struje. Ako upisani broj ne bude 1, 2 ili 3 ne treba poduzimati ništa. Pošto slovo I koristimo kao varijablu za jakost struje, u petlji for ćemo ovaj puta kao brojač upotrijebiti slovo k.
27
blokovima. Problemi se mogu lako analizirati, lako se uočavaju sličnosti i razlike izmeĎu više rješenja i odabire najbolje. Moţda nakon ovih vjeţbi vidite dijagrame toka i tamo gdje ih do sada niste uočavali - različiti shematski prikazi nekih postupaka, hodogrami nekih aktivnosti... I na kraju što je bio cilj naše 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. Obično svaki simbol u dijagramu toka predstavlja jednu naredbu u programu. Dijagram toka bi trebao biti dio svake dobre programske dokumentacije. Učenicima je crtanje dijagrama toka ponekad nerazumljivo, a sve što je nerazumljivo je i dosadno. Oni bi najradije sjeli za računar i odmah pisali program. Kod jednostavnih problema to i moţemo napraviti. Ali kod sloţenijih... Jednom sam sreo svog bivšeg učenika koji se u svom poslu intenzivno bavi programiranjem. Ţalio mi se da nekad nekoliko sati provede za računarom pokušavajući riješiti neki problem, ali ne ide i gotovo. Pitao sam ga što tada učini. Odgovorio je: "Pa uzmem olovku i papir i nacrtam algoritam..."
4.Pseudo jezik Pseudokod je neoficijelan jezik koji pomaţe programerima u razvijanju algoritama. Pseudokod nije programerski jezik. Njegova svrha je riješiti program prije pisanja u programerskom jeziku kao što je C++. Pseudokod se sastoji jedino od izvršnih naredbi – onih koje se izvršavaju kada program pseudokoda pretvorimo u C++ i pokrenemo.
iz
Ne postoji opće prihvaćena norma načina pisanja pseudo jezika već svaki autor moţe u načelu koristiti svoj način pisanja.
Mjesto u memoriji rezervisano za pohranu podatka naziva se varijabla. Svaka varijabla ima ime koje ju jednoznačno odreĎuje kako bi se razlikovala od ostalih varijabli. Ime varijable se u pseudo jeziku moţe zadati proizvoljno, npr. x, a, TX, B_Pod, AmPe. Vrijednost varijable Varijabli se vrijednost pridruţuje uz pomoć operatora pridruţivanja. Operator pridruţivanja koji se koristi u ovoj verziji pseudo jezika je znak (:=). Tim se operatorom varijabli pridruţuje ili u varijablu upisuje vrijednost.Npr. izraz x:=3 se može čitati "varijabli x se pridružuje broj 3". Kraj naredbe Algoritam zapisan pseudo jezikom sastoji se od niza naredbi. Svaka naredba ove verzija pseudo jezika završava znakom tačka-zarez (;).
4.2.Operatori
C++ programiranje za srednje škole prof.Smajo Mekić
4.1.Varijable
28
Operatori su simboli koji predstavljaju (zamjenjuju) odreĎene funkcije. Operatori se mogu svrstati u grupe prema vrsti funkcije koju prestavljaju, npr.:
aritmetički operatori,
logički operatori,
operatori usporeĎivanja (relacijski operatori).
Za ispravno zapisivanje algoritma pseudo jezikom izmeĎu ostalog treba poznavati i značenje pojedinih operatora. Pri tom moţe zbunjivati sličnost izgleda operatora pseudo jezika i operatora kojima se koristimo u matematici (ponekad izgledaju isto a imaju različita značenja). Aritmetički operatori Opis
Pseudo jezik
Pascal
C/C++
Sabiranje
+
+
+
Oduzimanje
-
-
-
Množenje
*
*
*
Dijeljenje
/
/
/
Cjelobrojno dijeljenje
DIV
DIV
/
Ostatak cjelobrojnog dijeljenja
MOD
MOD
%
Operatori sabiranja, oduzimanja i mnoţenja se u pseudo jeziku koriste na uobičajen način. Kod početnika zabunu mogu stvoriti tri različita operatora dijeljenja. Osim operatora dijeljenja (/) koji kao rezultat vraća vrijednost količnika u obliku realnog broja tu su i operatori DIV i MOD. Operator DIV vraća cjelobrojni dio dijeljenja dva cijela broja. Operator MOD vraća cjelobrojni ostatak dijeljenja dva cijela broja.
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). Logički operatori Logički podaci su podaci koji mogu poprimiti samo jednu od dvije moguće vrijednosti. To su na primjer true/false, da/ne, istina/laţ, 1/0. Varijabla u koju se pohranjuju podaci ove vrste moţe poprimiti vrijednosti true (1) ili false (0). Za rad s logičkim podacima, postoje logičke funkcije. Logičke se funkcije zapisuju logičkim operatorima. Rezultat rada logičkih operatora je podatak logičkog tipa.
C++ programiranje za srednje škole prof.Smajo Mekić
Primjer upotrebe operatora dijeljenja:
29
Opis
Pseudo jezik
Pascal
C/C++
Logički I
I
AND
&&
Logički ILI
ILI
OR
||
Logički NE
NE
NOT
!
Tablica stanja operatora
Tablica stanja operatora
I
ILI
Tablica stanja operatora NE
Rezultati logičkih operacija će biti: e=0 f=1 g=1.
Operatori poreĎenja (relacijski operatori) Dva se podatka mogu usporeĎivati. Ako je napisani izraz istinit, rezultat poreĎenja će biti 1 (true), a ako nije, rezultat će biti 0 (false). UsporeĎuje se upotrebom operatora poreĎenja.
C++ programiranje za srednje škole prof.Smajo Mekić
Primjer upotrebe logičkih operatora:
30
Opis
Pseudo jezik
Pascal
C/C++
Manje
<
<
<
Manje ili jednako
<=
<=
<=
Veće
>
>
>
Veće ili jednako
>=
>=
>=
Jednako
=
=
=
Različito
<>
<>
!=
Primjer upotrebe operatora poreĎenja:
Rezultati usporedbe će biti: a=1 b=1 c=0
Operator pridruţivanja (:=) mijenja vrijednost varijable. Npr.:
Rezultat na kraju će biti: x=3;a=0. Redoslijed izvršavanja operatora Pri zapisivanju sloţenih izraza pseudo jezikom vaţno je imati na umu redoslijed izvršavanja operatora (prioritet).
Redosljed izražavanja
Operatori
C++ programiranje za srednje škole prof.Smajo Mekić
d=0. Kod početnika zabunu moţe stvoriti operator jednakosti (=). Operator jednakosti NE pridruţuje vrijednost varijabli već samo provjerava da li je vrijednost njegove lijeve i desne strane jednaka. Npr. Izraz x=3 se moţe č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.
31
1
()
2
NE
3
*/ DIV MOD I
4
+ - ILI
5
<,<=,>=,<>,=
1.Primjer redoslijeda izvršavanja operatora:
Svi su operatori ravnopravni, izraz se izvršava 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 izvršavanja operatora:
1. 2. 3. 4.
22 DIV 5 = 4 11 MOD 3= 2 4*2=8 x=8
3. Primjer redoslijeda izvršavanja operatora:
S obzirom na prioritete, operacije se izvršavaju 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
C++ programiranje za srednje škole prof.Smajo Mekić
Zagrade poništavaju prioritete operatora pa se izvršava ovim redoslijedom:
32
Opis
Pseudo jezik
Pascal
C/C++
Apsolutna vrijednost realnog broja
Abs(x)
Abs(x)
abs(x)
Drugi korijen realnog broja
Sqrt(x)
Sqrt(x)
sqrt(x)
Zaokruživanje ralnog brojana najbliži cijeli broj
Round(x)
Round(x)
round(x)
Najveći broj manji ili jednak od x
Trunc(x)
Trunc(x)
ceil(x)
5.Kako započeti?
C++ programiranje za srednje škole prof.Smajo Mekić
Izdvojeni nizovi naredbi koji čine logičke cjeline a obavljaju tačno utvrĎene zadatke nazivaju se funkcije. Moguće je stvoriti vlastite funkcije pa ih zatim koristiti u svom programu ili koristiti već postojeće i za upotrebu pripremljene funkcije. U ovoj verziji pseudo jezika od učenika se očekuje poznavanje nekoliko pripremljenih matematičkih funkcija.
33
Da bismo napravili program koji treba da obavi neki zadatak, neophodna su nam dva specijalizirana programa: jedan koji koristimo da napišemo izvornu datoteku (editor), i drugi sa kojim dobijemo izvršnu datoteku (kompajler). Ova dva programa se najčešće kombiniraju u jedinstven paket - tzv. razvojno okruţenje. Danas, najpoznatije C++ okruţenje predstavlja Microsoftov proizvod Visual C++ .NET. MeĎutim, ovaj, kao i većina ovakvih programa, je komercijalan i nije dostupan svim korisnicima. Ipak, moguće je naći veliki broj besplatnih C++ okruţenja. Jedno od takvih okruţenja je i Dev-C++ . 5.1.MS Visual C++ Nakon pokretanja MS Visual C++ razvojnog okruţenja otvorit će se prozor programa. Ovisno o podešenosti programa raspored i sadrţaj cjelina unutar prozora programa moţe biti i drugačiji.
C++ programiranje za srednje škole prof.Smajo Mekić
Slika 5.1. Novi projekt se pokreće 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.
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.
Slika5.4. Sada u stvorenom projektu (okviru za izradu programa) treba otvoriti novu datoteku izvornog kôda. Potrebno je kliknuti na karticu FileView, a potom označiti mapu Source Files koja se nalazi pod nazivom projekta. Na kraju birati naredbu File/New.
C++ programiranje za srednje škole prof.Smajo Mekić
Odabirom An empty project i klikom na dugmić Finish stvoren je i pohranjen novi projekt obiljeţja prikazanih u prozoru New Project Information.
35
Slika 5.5
Slika 5.6.
C++ programiranje za srednje škole prof.Smajo Mekić
Otvorit će se prozor New u kojem treba na kartici Files izabrati vrstu datoteke. Bira se vrsta datoteke C++ Source File.
36
Na kraju treba zadati ime datoteci (engl. File name). Izvorni kôd programa C++ sprema se u datoteku izabranog imena i nastavka cpp. 5.2.Programski paket Dev-C++ Najnoviju verziju programa moguće je naći na web stranici firme BloodshedSoftware (http://bloodshed.net/download.html). Instalacija Dev-C++ programa ni u čemu se ne razlikuje od korištenja većine instalacionih datoteka u Windows okruţenjima. Dovoljno je dvostrukim klikom pokrenuti instalacionu datoteku (npr. devcpp-4.9.9.2 setup.exe) i pratiti poruke na ekranu. Nakon završetka ovog postupka, u traci sa alatima pojavljuje se ikona za pokretanje programa Dev-C++ . Korak po korak” prvi program u Dev C++”
Slika 5.8. korak 2-kreiranje novog projekta
C++ programiranje za srednje škole prof.Smajo Mekić
Slika 5.7. Korak 1-pokretanje Dev C++
37
Slika 5.10.korak 4 spremanje projekta
C++ programiranje za srednje škole prof.Smajo Mekić
Slika 5.9.korak 3- biranje praznog projekta
38
Slika 5.12. korak 6-pisanje programskog koda
C++ programiranje za srednje škole prof.Smajo Mekić
Slika 5.11.korak 5 mjesto za pisanje programskog koda
39
Slika 5.14. korak8-pokretanje izvršne datoteke Pitanja za utvrđivanje:
C++ programiranje za srednje škole prof.Smajo Mekić
Slika 5.13.korak7 proces kompajliranja
40
1. 2. 3. 4.
Definiši Algoritam? Kako se još naziva proceduralno programiranje i zbog čega? Koje su najbitnije osobine algoritma? Nabroj nekoliko programskih paketa koji omogućavaju 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?
C++ je viši programski jezik opće namjene. Ovo je kratka rečenica 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 našem maternjem jeziku kazati računaru da nam nešto uradi, npr. “Molim te naĎi mi rješenja kvadratne jednačine x2 +5x+6=0!”. To bi nam itekako olakšalo ţivot iz matematike, ali naţalost stvari sa računarima nisu još uvijek tako jednostavne, iako bi jednog dana mogle biti upravo takve. Govorni jezici ne koriste se za komuniciranje sa računarom 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 rečenica moţe tumačiti i na način da se ribe ne smiju hraniti sa gostima! Takva rečenica je sigurno dvosmislena.Primjer nepreciznosti se moţe vidjeti u rečenici: “Odi u prodavnicu i kupi mlijeko!”. Na koju prodavnicu se misli? Koju masnoću mlijeka? Od kojeg proizvoĎača? Primjer preobimnosti jezika moţemo naći u bilo kojem knjiţevnom djelu, gdje je ljepota izraţavanja poţeljna, 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 računarom.Kaţe se da je C++ jezik opće namjene, što znači da nije specijaliziran u npr. matematičke ili neke druge svrhe. C++ je viši programski jezik, ali to nema nikakve veze sa visinom, jer jezici nemaju visinu, niti duţinu.Ovo viši (eng. highlevel) stoji uz C++ jer postoje jezici i niţeg nivoa (eng. lowlevel).Ako je jezik višeg nivoa to ne znači da je automatski bolji od jezika niţeg nivoa. To znači samo veći nivo apstrakcije od mašinskog jezika, koji je jedini jezik koji procesor razumije bez prevoĎenja. On se sastoji od nula i jedinica i moţe se reći da je za ljudska bića gotovo nerazumljiv i neupotrebljiv. Veći nivo apstrakcije znači jednostavniji rad ali i manju kontrolu nad računarom.
C++ programiranje za srednje škole prof.Smajo Mekić
6.Uvod u C++
41
C++ je programski jezik za koji se slobodno moţe reći 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 početkom 2007 je izdat i jezik D) čiji tvorac je otac Unix operativnog sistema Ken Thompson i prvenstvena mu je namjena bila odrţavanje Unix operativnog sistema. C je čudan jezik koji ima osobine i viših i niţih programskih jezika, pa kao takav ima sve prednosti i mane takvih jezika. Da bi prevazišao 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 suštini vrlo snaţnog programskog jezika je rasprava koja se često vodi u programerskim krugovima. 6.1. Proces kompajliranja
C++ programiranje za srednje škole prof.Smajo Mekić
Da bi se napisani program izvršio na računaru(da bi ga koristili), potrebno ga je iz izvornog koda (programa) prevesti u oblik koji procesor razumije tj. mašinski jezik. Prevedeni oblik se najčešće naziva izvršni ili objektni kod(program). Kada radite sa nekim programom na računaru 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 pišemo izvorni program, kao npr. Notepad ili Vim. Kako programe pišu ljudi, a oni su po svojoj prirodi skloni greškama, često su nam potrebni i programi koji nam pomaţu da takve greške otkrijemo i uklonimo. Takvi programi se nazivaju debuggeri, a naziv im potiče od engleskog naziva bug za grešku u programu, dok je proces uklanjanja grešaka debugging. Dakle, za pisanje izvornog koda nam treba editor. Za prevoĎenje tog izvornog koda u izvršni kod nam treba kompajler, a da bi otkrili eventualne greške u svojim programima, često nam zatrebaju debuggeri. Kako ovo znači da prilikom pisanja svoga programa trebamo koristiti tri različite vrste programa, neko se dosjetio da ta tri programa “ujedini u jedan program”. Takvi programi se nazivaju integrirana razvojna okruţenja ili IDE(Integrated Development Environment), a mi ćemo koristiti Blodshed DevC++ IDE.
42
Izvorni kod Kombinacijom naredbi programskog jezika nastaje izvorni kod (engl. source code). Izvorni je kod moguće pisati u bilo kojem programu za ureĎivanje teksta (engl. text editor). Danas se uglavnom programi za pisanje izvornog koda objedinjuju u cjelinu sa prevodiocem i povezivačem (integrirana razvojna okolina, IDE). Izvorni kod programa C++ sprema se u datoteku izvornog koda pod smislenim imenom i nastavkom *.cpp Izvršni oblik Programi se mogu izvršiti na računaru samo ako su u binarnom obliku. Takav se oblik programa naziva izvršni oblik (engl. executable). Izvorni se kod mora prevesti u izvršni. Prevodi se pomoću programa koji se nazivaju prevodioc (engl. compiler) i povezivač (engl. linker). Program prevodioc prevodi izvorni kod iz višeg programskog jezika u mašinski oblik te provjerava sintaksu napisanog izvornog koda. Ako pronaĎe pogreške (engl. compile-time error), ispisuje poruke i upozorenja o njima. Otkrivene pogreške treba ispraviti pa ponovo pokrenuti program za prevoĎenje. PrevoĎenjem nastaje datoteka objektnog koda (engl. object code), nastavka *.obj. Objektni kod nije izvršni program i ne moţe se direktno izvršiti na računaru. Objektni kod je meĎukorak do izvršnog koda i uz ostalo omogućava uključivanje gotovih dijelova programa iz drugih datoteka.
Datoteke koje sadrţavaju 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 uključuju iz postojećih biblioteka. Npr. moţe postojati biblioteka formula za izračunavanje 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 greška (engl. link-time error), bit će ispisana poruka o tome.Grešku valja ispraviti pa ponovno pokrenuti prevoĎenje i povezivanje. Rezultat uspješnog povezivanja je izvršna datoteka (*.exe). U načelu,izvršnoj datoteci nisu potrebni nikakvi dodaci pa se moţe izvršavati i bez izvornog programa, objektnih datoteka, prevodioca, povezivača itd.
6.2.Riječi u C++ programskom jeziku
Takvi se više nije program površina
C++ programiranje za srednje škole prof.Smajo Mekić
Biblioteke
43
Programski jezici koriste imena kako bi se označile različite cjeline koje čine program. Osim imena varijabli, ovdje spadaju i imena funkcija, tipova, te makroa. C++ postavlja sljedeća pravila za pravilno kreiranje imena (ili identifikatora). Ime traba da se sastoji od jednog ili više karaktera, od kojih bilo koji moţe biti slovo (tj, slova engleske abecede a-z i A-Z), broj (0-9) i znak "_", pričemu na prvom mjestu ne moţe da bude broj. Uz to, velika i mala slova se razlikuju, tako da se, na primjer, varijable zarada i Zarada razlikuju. C++ ne postavlja nikakvo ograničenje na broj karaktera u nekom identifikatoru. MeĎutim, večina implementacija ima ovo ograničenje, ali je ono toliko veliko da ne predstavlja nikakav problem (npr. i do 255 karaktera). Treba imati na umu da postoje odreĎene riječi u C++ koje su rezervisane, tako da identifikatori ne mogu uzimati njihova imena. Te riječi se nazivaju rezervisane ili ključne riječi i date su u tabeli: Tabela 1: Ključne (rezervisane) riječi u C++
//program koji ispisuje pozdravnu poruku komentar #include
// zaglavlje standardne biblioteke using namespace std; int main() // zaglavlje funkcije { cout<<“Sretan pocetak“; // naredba tijelo funkcije funkcija system(„Pause“); return 0; } Objašnjenje Znak // označava komentar, kompajler potupuno ignoriše sve od pojave znaka // pa do kraja reda,svrha komentara je objašnjenje korisnicima koji pokušavaju razumjeti šta program radi,komentar je obično kratak,komentari su vrlo vaţni kod velikih programa gdje komentar treba da objasni o čemu se radi u pojedinim dijelovima programa. #include prestavlja predprocesorsku direktivu kojom se označava da kompajler treba da očita 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 područje za imenovanje objekata.Naravno poznato nam je da u jednom programu dva objekta ne mogu imati isto ime odnosno isti identifikator jer će doći do kolizije i program neće raditi. int main() je zaglavlje funkcije,svaki program u C++ mora imati najmanje jednu funkciju main glavna funkcija.Funkcija koja če se prva izvršiti kada program počne sa radom.U programskim jezicima funkcija je potprogram koja vraća neki rezultat u navedenom primjeru funkcija int main vraća cijelobrojni rezultat . Nakon zaglavlja funkcije dolazi tijelo funkcije koje počinje otvorenom vitičastom zagradom {, a završava zatvorenom vitičastom zagradom }.Vitičaste zagrade koristimo kada imamo
C++ programiranje za srednje škole prof.Smajo Mekić
6.3.Struktura programa
44
skupinu naredbi koje čine jednu cjelinu.Tijelo funkcije sačinjavaju naredbe svaka naredba završava tačka-zarezom; Naredbe su niz instrukcija koje govore računaru šta treba da radi. Cout je skračenica od consol out predstavlja objekat tzv. izlaznog toka podataka output stream koji je povezan sa standardnim ureĎajima za ispis tpično ekran. '<<' prestavlja znak redirekcije odnosno umetanja koji pojednostavljeno moţemo čitati kao šalji Sretan pocetak na ekran― to ustvari predstavlja niz znakova koje šaljemo na ekran, takav niz znakova nazivamo string. System("PAUSE"); zaustavlja izvršenje programa, kako bismo mogli vidjeti rezultat njegovog rada. Bez ove linije program bi se nakon pokretanja izvršio, a konzola bi se zatvorila veoma brzo, tako da bismo imali osjećaj kao da program nije ništa ni uradio. Return 0 znači da naša funkcija vraća cijelobrojnu vrijednost 0. } zatvrena vitčasta zagrada zatvara tijelo funkcije. Primjer2; 1 #include 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 }
Slika 6.1. Izgled programskog koda i izvršne datoteke Kompajliranje C++ programa obuhvata nekoliko koraka, koji su večinom nevidljivi za korisnika:
C++ programiranje za srednje škole prof.Smajo Mekić
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 označava novi red .Za istu svrhu moţe se koristiti i funkcija endl, odnosno: cout << " Sretan pocetak u C++ zeli Vam prof Smajo " << endl; Tok (stream) je objekat koji izvršava ulazne i izlazne naredbe. Tok cout je standardni izlazni tok (obićno ekran) u C++ . Simbol << je izlazni operator (usmjerivač toka) kojem je lijevi operand izlazni tok, a desni izraz. Ovaj operator upućuje desni operand na lijevi. Dakle, u ovom slučaju string "Sretan pocetak u C++ zeli Vam prof Smajo /n" se šalje na cout, tj. uzrokuje njegov ispis na ekranu i pomjeranje usljedeći red.
45
Prvi korak, C++ predprocesor ide kroz program i izvodi instrukcije koje su specificirane predprocesorskim direktivama (npr. #include). Rezultat ovoga je modificirani tekst programa koji više ne sadrži nikakve direktive. Drugi korak, C++ kompajler prevodi programski kod. Kompajler može biti pravi C++ kompajler, koji pravi osnovni (asemblerski ili mašinski) kod,ili samo prevodilac, koji kod prevodi u C jezik. U drugom slučaju, rezultujući C kod se zatim prevodi kroz C kompajler kako bi se napravio osnovni kod. U oba slučaja, rezultat može biti nepotpun zbog toga što program poziva podprogramske biblioteke koje nisu definisane u samom programu. Treći korak, linker završava objektni kod njegovim povezivanjem sa objektnim kodom bilo kojeg modula biblioteka, koji program može pozvati. Konačan rezultat je izvršna datoteka. 6.4.Varijable Varijabla je simboličko 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 proračunima u programu. Sve varijable imaju dvije važne osobine: Tip, koji se postavlja kada se varijabla definiše (npr. cijeli broj, realni broj, karakter, ...). Kada se jednom definiše, tip varijable u C++ se ne moţe promijeniti. Vrijednost, koja se moţe promijeniti davanjem nove vrijednosti varijabli. Vrsta vrijednosti koja se može pridružiti nekoj varijabli zavisi od njenog tipa. Na primjer, cjelobrojna varijabla (int) može uzeti samo vrijednosti cijelih brojeva (npr. -5, 13, ...). Kada se varijabla definiše, njena vrijednost je nedefinisana sve dok joj se ne pridruži neka. Pridruživanje vrijednosti nekoj varijabli po prvi put naziva se inicijalizacija. Neophodno je da se svaka varijabla inicijalizira prije nego se koristi. C++ podržava 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 pomoću malih zagrada, (), kao u sljedećim primjerima:
U oba slučaja varijabla broj je inicijalizirana na vrijednost 10. Treba napomenuti da inicijalizacija ne predstavlja pridruživanje (iako se u inicijalizaciji kopiranjem koristi znak jednakosti), nego se dešava onda kada se varijabla definiše i kada joj se da početna vrijednost. S druge strane, pridruživanje predstavlja poništavanje trenutne vrijednosti varijable i zamjene novom. Također je moguće da se varijabla definiše i inicijalizira u isto vrijeme,što je vrlo praktično. Naredni primjer pokazuje razlicite načine definisanja i inicijaliziranja varijabli. 1 #include 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
C++ programiranje za srednje škole prof.Smajo Mekić
int broj(10); // direktna inicijalizacija int broj = 10; // inicijalizacija kopiranjem
46
inicijalizacija data je u liniji 6 za varijablu x. Na kraju, treba napomenuti da većina autora proces definisanja varijabli poistovječuje sa procesom deklarisanja. MeĎutim, neki autori prave razliku izmeĎu ovih pojmova. Naime, zbog situacija u kojima se u više datoteka jednog te istog programa pristupa istoj varijabli, C++ razlikuje pojmove definisanja i deklarisanja. Tako, definisanje varijable predstavlja alociranje prostora za nju, te moguću inicijalizaciju. U jednom programu moţe biti samo jedna definicija varijable. S druge strane, deklaracija ’upoznaje’ program sa tipom i imenom varijable. Definicija je time i deklaracija. Deklarisanje se izvršava na taj način da se ispred tipa doda ključna riječ extern. Sljedeći primjer pokazuje razliku izmeĎu definisanja i deklarisanja neke varijable: extern int broj;
// deklarise ali ne i definise broj
int 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 upućuje na to da je varijabla definisana negdje u programu. 6.5.Memorija Za pohranjivanje izvršnog koda kao i podataka sa kojima program manipulira,kompjuter ima na raspolaganju RAM memoriju (eng. Random AccessMemory). Pri tome, memorija se moţe zamisliti kao neprekidan niz bita, od kojih svaki moţe da pohrani binarni broj (0 ili 1). Memorija se obično 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 generiše izvršni kod, koji mapira ulazne veličine na memorijske lokacije. Na primjer, definicija varijable int zarada = 500;
Slika 2.5.1.Organizacija memorije u kompjuteru Tačan 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 označio varijablu. Prethodna jednakost uzrokuje da se vrijednost 500 pohrani u ova dva bajta koja su alocirana (Sl.2.5.2)
C++ programiranje za srednje škole prof.Smajo Mekić
navodi kompajler da alocira nekoliko bajta kako bi predstavio varijablu zarada.
47
Slika 2.5.2: Reprezentacija cijelog broja u memoriji 6.6.Ulazno-izlazni tokovi
Treba napomenuti da je organizacija memorije i korištenje adresa koji se odnose na podatke veoma vaţno za programera, dok tačna binarna reprezentacija podataka koje on koristi to nije.Da bi program bio koristan, mora komunicirati s ulazno/izlaznim ureĎajima (tastaturom, monitorom, diskom i sl.). Komunikacija s ulazno/izlaznim ureĎajima 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 gledišta programa sasvim je svejedno o kojem je ulaznom ili izlaznom ureĎaju riječ pa se svi podaci u program unose i iz programa predaju okolini na isti način.Ulazno-izlaznim tokovima se rukuje funkcijama biblioteka iostream. Biblioteka iostream iostream je biblioteka koja sadrţi niz ulazno-izlaznih funkcija koje omogućavaju rukovanje ulaznoizlaznim tokovima. Dvije funkcije koje su najčešće u upotrebi su cout i cin. Cin ulazni tok
Primjena funkcije cin cin>>x;
Program očekuje unos podataka s tastature koji će biti pohranjen u varijablu x.
cin>>a>>b;
Program očekuje unos sa tastaturekoji će bit pohranjen u varijablu a i b
cout<<34<<“moguć je i ispis niza znakova“;
Moguće je ulančavanje operatora unosa koji se izvodi s lijeva na desno.
Posljedica funkcije unosa cin je prekid izvršenja programa sve dok se ne unese podatak i pritisne tipka Enter (program "čeka" da korisnik upiše podatak). Više ulaznih podataka moţe se upisati u istome redu, odvojeni prazninama (tek na kraju treba pritisnuti tipku Enter).
C++ programiranje za srednje škole prof.Smajo Mekić
Funkcija cin usmjerava podatke s tastature na ulazni tok. Podaci se u ulazni tok umeću operatorom unosa (>>).
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;
Ispisat će broj 17
cout<<“Moguć je ispis znakova“;
S desne strane operatora ispis može biti bilo koji tip podataka.U primjeru će se ispisati tekst unutar navodnika.
cout<<15<
Moguće je ulančavanje 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.
endl U prethodnom bi se primjeru svi podaci ispisali u istome redu. Ako korisnik ţeli pregledniji ispis, tj. nakon završenog ispisa jednog podatka pokazivač prebaciti na početak sljedećeg reda treba koristiti konstantu endl (takoĎer pohranjenu u biblioteci iostream). Upotreba konstante endl cout<<34<
a Moguć je ispis znakova
6.7.Komentari Komentar je dio opisnog teksta koji objašnjava neke aspekte programa. Kompajler u potpunosti ignoriše komentare u programu, tako da je jedina svrha koju komentar ima, da pomogne onome koji ce čitati program. C++ daje dvije mogućnosti pisanja komentara:
bilo šta napisano nakon //, pa do kraja date linije smatra se komentarom3, i bilo šta napisano izmeĎu /* i */ smatra se komentarom.
Sljedeći primjer pokazuje upotrebu oba načina pisanja komentara. #include
C++ programiranje za srednje škole prof.Smajo Mekić
34
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 način se moţe 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 načinom se (koristeći /* i */), pak, moţe komentarisati tekst upisan u više linija (linije 4-5).
Programski jezici koriste imena kako bi se označile različite cjeline koje čine program. Osim imena varijabli, ovdje spadaju i imena funkcija, tipova, te makroa. C++ postavlja sljedeća pravila za pravilno kreiranje imena (identifikatora):
ime treba da se sastoji od jednog ili više karaktera, od kojih bilo koji moţe biti slovo (tj, slova engleske abecede a-z i A-Z), broj (0-9) i znak " ", pri čemu na prvom mjestu ne moţe da bude broj. velika i mala slova se razlikuju (zarada nije isto što i Zarada).C++ ne postavlja nikakvo ograničenje na broj karaktera u nekom identifikatoru.
MeĎutim, većina implementacija ima ovo ograničenje, ali je ono toliko veliko da ne predstavlja nikakav problem (npr. i do 255 karaktera). Ipak, treba imati na umu da postoje odreĎene riječi u C++ koje su rezervisane, tako da identifikatori ne mogu uzimati njihova imena. Te riječi se nazivaju rezervisane ili ključne rijeći i neke od njih su date u Tabela 1: Ključne (rezervisane) riječi u C++. Pored navedenih pravila o davanju imena varijablama, postoji i veliki broj prihvačenih konvencija, koje se uglavnom koriste radi lakšeg pračenja programa. Neke od vaţnijih su: imena varijabli se obično pišu malim slovima
C++ programiranje za srednje škole prof.Smajo Mekić
6.8.Imena (identifikatori)
50
za davanje imena se obično koriste mnemonička imena, tj. imena koja pobliţe opisuju varijablu
ime moţe da ima i više riječi, koje su obično razdvojene donjom crtom,ili su direktno povezane sa početnim velikim slovom riječi koja se dodaje imenu. No, bez obzira na konvencije, opšte je pravilo da se jedna odreĎena konvencija konstantno koristi.
6.9.Tipovi podataka2 6.9.1.Organizacija numeričkih brojeva u računarskoj memoriji Brojni sistemi Da bi shvatilli tipove podataka neophodne za učenje programskog jezika,potrebno je osvrnuti se na organizaciju numeričkih podataka u računarskoj 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 odreĎenu "teţinu" (ovisno o poziciji unutar broja) ,te moţemo reći da je broj 342 skraćeni zapis sljedećeg broja:
Ako o razmislimo zašto 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 veće od deset ne moţe više računati na prste,nego mora izmisliti neki način zapisa većih brojeva. Brojni sistem s bazom 10 naziva se decimalni ili dekadski brojni sistem.
U digitalnim elektronskim sklopovima(u koje spadaju i računari) brojni sistem sa bazom 10 se pokazao nepogodnim za praktičnu realizaciju.Baza 2 je,s druge strane,bila mnogo "lakša" za implementaciju; jer se dvije znamenke-0 i 1-mogu predstaviti kao "odsustvo" i prisustvo"nečega(npr.ima struje-nema struje ). Ovaj brojni sistem od svega dvije znameke naziva se binarni. Pokušajmo 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 piše kao 1001110.Gore opisana metoda pretvorbe brojeva iz dekadskog u binarni brojni sistem nije pogodna za pretvaranje većih brojeva.
2
C++ programiranje za srednje škole prof.Smajo Mekić
Baza je mogla biti bilo koji broj,jer se lako moţe dokazati da se pozitivan broj moţe zapisati u obliku.
Preuzeto i obrađeno Diplomski rad“ Poređenje Pascala i C++ u nastavi Smajo Mekic“
51
Standardna metoda za pretvaranje,zasniva se na uzastopnom dijeljenju broja sa 2 ispisivanjem ostataka, sve dok se ne doĎe do količnika 0,ostaci dijeljenja,pročitani redom odozdo na gore, predstavljaju traţeni binarni broj. 142
0
71
1
35
1
17
1
8
0
4
0
2 1
0 1
0
U C++ su ugraĎena dva osnovna tipa brojeva, i to: cijeli i realni brojevi. Cijeli brojevi Cijeli broj (engl. integer) se moţe definisati pomoću tipova short, int i long. Jedina razlika je u tome što int koristi više ili barem isto bajta kao short, a long koristi više 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 kaţe da su oni tipa signed). MeĎutim, u slučaju kada se koriste samo pozitivne vrijednosti, uključujući i 0, koriste se sa predznakom unsigned.Ovo vrijedi i za realne brojeve. Najčešće se pri definisanju cijelih brojeva koristi tip int, koji u kompjuteru obično 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 odreĎuje predznak broja, preostaje nam 31 bit da pohranimo vrijednost nekog broja. Na taj način se tipom int mogu pohraniti svi brojevi veći od najmanjeg negativnog broja -231 = -2147483648 i manji od največeg mogućeg pozitivnog broja -231 ¡ 1 = 2147483647 Treba napomenuti da se cjelobrojne veličine 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 pišu tako da se ispred prve cifre broja napiše broj 0, nakon čega slijedi oktalni zapis broja, kao npr. int broj = 010; // broj 8 u dekadskom zapisu U slučaju heksadecimalnog zapisa u C++ , ispred broja se piše 0x ili 0X,tj. int broj = 0x0C; // broj 12 u dekadskom zapisu Ipak, bez obzira koji od prikaza koristimo pri pridruţivanju neke vrijednosti,na ekranu se ispisuje broj u dekadskom brojnom sistemu. Tako u sljedećem primjeru za svaki slučaj 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
C++ programiranje za srednje škole prof.Smajo Mekić
U C++ su ugraĎeni prosti i sloţeni tipovi podataka,ovdje ćemo objasniti proste tipove podataka. 6.9.2.Brojevi
52
int broj = 0x20; cout << broj;
// broj 32 u heksadecimalnom zapisu // ispis 32
Realni brojevi Da bismo operisali sa realnim, tj. decimalnim, brojevima moţemo koristiti varijable tipa float i double. Tip double koristi više bajta i time omogućuje veći opseg i veću tačnost 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 slučaju koristi se klasični način prikaza broja sa decimalnim zarezom,dok je u drugom i trećem slučaju korišteno naučno označavanje (eng.scientific). Pri tome, u naučnom označavanju je moguće koristiti i malo i veliko slovo "e", ali ne smije biti nikakvih praznina unutar broja (izmeĎu cifri i slova e, te iza predznaka). U slučaju da nam tačnost na sedam decimala nije dovoljna, koristimo brojeve sa dvostrukom tačnošću, 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 današnjim kompjuterima podjednako velika kao i sa tipom float. Ograničenja brojevnih tipova
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;
Simboličke konstante Prethodni brojevni tipovi se koriste za definisanje varijabli koje mijenjaju svoju vrijednost u toku izvršavanja programa. MeĎutim, u C++ je moguće definisatii konstante, tj. veličine koje ne treba da mijenjaju svoju vrijednost u toku izvršenja programa. Takve su na primjer, vrijednost π brzina svjetlosti, naboj elektrona, itd.Osnovni razlog zbog korištenja simboličkih konstanti je osiguranje od promjene njihove vrijednosti. Naime, moţe se desiti da u toku pisanja programa napišemo naredbu koja mijenja vrijednost konstante (npr. broja π) i na taj način napravimo veliku grešku u daljem proračunu. 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 način da se postavlja ispred tipa varijable, kao u primjeru: const float pi = 3.1415926; Ako bismo pokušali promijeniti vrijednost varijable pi (na primjer sa pi = 2*pi;) kompajler bi prijavio grešku. Drugi način definisanja neke konstante je pomoću predprocesorske naredbe #define, kao u: #define PI 3.1415926
C++ programiranje za srednje škole prof.Smajo Mekić
Kao što je pokazano u dijelu o cijelim brojevima, na osnovu veličine memorije koju neki brojevni tip zauzima, moguće je odrediti maksimalan i minimalan broj koji se sa njim moţe prikazati. O tome kako se odreĎuje veličina memorije koju zauzima neki objekat ili tip. Ipak, korištenjem datoteka climits(Datoteka mora biti pozvana naredbom #include), za cjelobrojne, i cfloat, za decimalne brojeve, moguće je naći ove vrijednosti. Na primjer, konstante INT_MIN i INT_MAX daju najmanju i najveću vrijednost brojeva tipa int. Slične konstante postoje i za ostale tipove, a sljedeći dio programa daje njihovu primjenu:
53
Jedina razlika u korištenju ova dva pristupa je u tome što varijanta sa const omogućuje i simboličko lociranje pogrešaka pri debagiranju, dok to nije moguće sa drugom varijantom. TakoĎer, bitno je napomenuti da se sve simboličke konstante moraju i inicijalizirati prilikom definisanja, tj. pogrešno je napisati: const float pi; // greška!!! Logički tipovi Logički tipovi su vrlo kasno uvedeni u standardni jezik C++ . Prije nego se uveo tip za ovu vrstu podataka, bool (od engleske riječi boolean, po matematičaru Booleu), u ovu svrhu su se koristili cijeli brojevi 0 i 1 (mada se umjesto 1 mogao koristiti bilo koji broj različit od 0). Osnovna karakteristika logičkih tipova je da mogu imati dvije vrijednosti,i to: tačno i netačno (eng. true i false). Primjer definisanja logičkih varijablije: bool jaSamUcenik = true; bool autoLeti = false; Prilikom manipulisanja sa logičkim varijablama (ispis, aritmetičke operacije,i sl.), oni se predstavljaju cjelobrojnim tipom int, i to: true se pretvara u 1,a false u 0. No, logičkim varijablama se mogu pridružiti i aritmetički tipovi,tako da se svim brojevima različitim od nule pridružuje true, a jednakim nuli false. Karakteri (znakovi)
#include 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 } 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 slučaju objekat cin očekuje da se unese neka vrijednost, pa tek onda pritisne ENTER.
C++ programiranje za srednje škole prof.Smajo Mekić
Varijabla karakter (znak) se definiše tipom char (od engleske riječi character -karakter, znak) i uglavnom se piše kao samo jedan znak upisan izmeĎu jednostrukih znaka navoda ’. Ona obuhvata jedan jedini bajt koji sadrţi kod datog karaktera. Ovaj broj je numerička vrijednost i zavisi od sistema kodiranja karaktera koji se koristi (to je zavisno od kompjutera). Najčešći 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 moţe da bude signed i unsigned. Tako, signed karakter moţe da sadrţi numeričke vrijednosti izmeĎu -128 i 127, a unsigned 0do 255. Sljedeći primjer pokazuje upotrebu tipa char za jednoznakovne varijable:
54
Pitanja za utvrĎivanje: 1. Da li je moguće definisati više varijabli jednom naredbom? Ako jeste, dati primjer. 2. Koja je razlika između tipova podataka unsigned int i int? 3. Koja je uloga include direktive? 4. Koliko main funkcija može 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 riječi predstavljaju pravilne nazive varijabli: a. identifier b. dva 15 c. ukupna-plata d. ukupna_plata e) default f) proc.program 11. Definiši varijable koje predstavljaju sljedeće veličine: a. visina neke osobe b. zarada neke osobe c. broj rijeci u rječniku d. slovo u abecedi 12. Dati primjer starog (jedan red) i novog načina pisanja komentara. 13. Koju datoteku (header file) moramo pozvati u izvornoj datoteci da bi se koristile cout i cin? 14. Napisati naredbu koja dobiva numeričku vrijednost sa tastature i pridružuje je varijabli temp. 15. Kako se definišu brojevi u C++ ? 16. Kako se definišu znakovi u C++ ? 17. Kako se u C++ definišu logičke varijable?
7.Operatori
C++ programiranje za srednje škole prof.Smajo Mekić
Osim klasičnih karaktera (slova i sl.), postoje i karakteri koji imaju posebnu namjenu (ne predstavljaju karaktere koji se ispisuju). Oni se predstavljaju pomoću 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 - zvučni signal Znakovne varijable se, ipak, najčešće koriste kao nizovi karaktera (eng. string)za ispis tekstova.
55
C++ nudi operatore za izvršavanje aritmetičkih, relacijskih, logičkih,bitovnih i uslovnih izraza. TakoĎer, tu su i veoma korisne "popratne pojave" (eng. side-effect) kao što su pridruţivanje, inkrement i dekrement.
7.1.Aritmetički operatori C++ nudi pet osnovnih operatora, koji su sumirani u Tabeli.
Osim ostatka pri dijeljenju (%) svi aritmetički operatori prihvataju miješanje cijelih i realnih brojeva. Općenito, ako su oba operanda cijeli brojevi,i rezultat je cijeli broj. MeĎutim, ako je jedan od operanada realan, onda je i rezultat realan (na primjer, tipa double; Ovakav način konverzije u C++ naziva se implicitna konverzija). Kada su oba operanda pri dijeljenju cijeli brojevi, rezultat je takoĎer cijeli broj (tzv. cjelobrojno dijeljenje). U tom slučaju rezultat se zaokruţuje na donju vrijednost, tj.. 9/2 daje 4, a ne 4.5! -9/2 daje -5, a ne -4.5! Čak i u slučaju kada je rezultat dijeljenja definisan kao realan broj, kao u sljedećem primjeru int cijena = 100; int volumen = 80;
rezultat dijeljenja je cjelobrojan, s obzirom da dijeljenje ima veći prioritet od pridruţivanja. Cjelobrojno dijeljenje predstavlja jednu od najčešćih greški u programiranju, pa je neophodno upoznati načine na koje se moţe zaobići. Ovo se moţe ostvariti pomoću tzv. eksplicitne konverzije, ili dodjele tipa (eng. cast). U tu svrhu se mogu koristiti sljedeći operatori (eng. cast operators): static_cast,dynamic_cast, const_cast i reinterpret_cast, ali je za naš slučaj vaţan operator static_cast (koristi se u slučajevima kada se manjem aritmetičkom tipu pridruţuje veći; na primjer tipu int pridruţuje tip double). Sljedeći primjer pokazuje njegovu primjenu: int cijena = 100; int volumen = 80; double jedinicnaCijena = static_cast(cijena)/volumen; //daje 1.25 Operator static_cast moţe se koristiti i na varijabli volumen, ali i na obje varijable u količniku. Prije nego se počeo koristiti ovaj C++ način pisanja, u upotrebi je bio stari način (eng. old-style cast), koji se daje ili u tzv. funkcijskom obliku (varijabla meĎu zagradama): double jedinicnaCijena = double(cijena)/volumen; // daje 1.25 ili u tzv. starom načinu pisanja u jeziku C (sa tipom meu zagradama): double jedinicnaCijena = (double)cijena/volumen; // daje 1.25
C++ programiranje za srednje škole prof.Smajo Mekić
double jedinicnaCijena = cijena/volumen; // daje 1
56
Ipak, stari način pisanja se ne preporučuje 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 korištenja aritmetičkih operatora veoma vaţno mjesto zauzima pojam preljeva. Naime, u slučaju da zbir brojeva prelazi maksimalno dozvoljenu vrijednost, dobivena vrijednost moţe biti negativna. Ovaj fenomen se lako moţe pokazati na slici ako se za tip int pretpostavi da ima 2 bajta, tj. 16 bita (to znači da je maksimalan pozitivan broj jednak 215 = 32767).
7.2.Relacijski operatori C++ nudi šest relacijskih operatora za računanje brojnih veličina. Pri tome, treba zapamtiti da se operatori <= i >= mogu koristiti samo u tom obliku, a da =< i => ne znače ništa u ovom kontekstu. Operandi nekog relacijskog operatora moraju biti brojevi. No, i karakteri su ispravni operandi pošto predstavljaju brojnu vrijednost . Relacijski operatori se ne smiju korisiti za poreĎenje stringova, pošto se u tom slučaju porede njihove adrese, a ne sadrţaj. U tom slučaju, rezultat je neodreĎen. Ipak, postoje funkcije koje mogu porediti i leksikografsku razliku dva stringa.
C++ programiranje za srednje škole prof.Smajo Mekić
Dakle, ukoliko neku varijablu koja ima vrijednost 32767 uvečamo za samo 1, vrijednost koju dobivamo je -32768 (!!!), odnosno za jedan veća od najveće moguće u smjeru kazaljke na satu na slici.
57
7.3.Logički operatori Za kombinovanje logičkih izraza C++ nudi tri logička operatora. Slično relacijskim operatorima, rezultat pri korištenju logičkih operatora je 0 (false) ili 1 (true).
Za razliku od logičkog i i logičkog ili operatora, koji su binarni operatori, logička negacija je unarni operator, tj. ima samo jedan operand kojem daje negaciju vrijednosti koju posjeduje.
C++ obezbijeĎuje šest bitovnih (eng. bitwise) operatora koji se koriste za manipulisanje pojedinačnim 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 uporeĎuje odgovarajuće bitove svojih operanada i kao rezultat daje 1 ako su oba bita 1, a 0 u ostalim slučajevima. Binarno isključivo ili uporeĎuje odgovarajuće bitove svojih operanada i kao rezultat daje 1 ako su oba bita različita, a 0 u ostalim slučajevima.
C++ programiranje za srednje škole prof.Smajo Mekić
7.4.Bitovni operatori
58
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 obezbijeĎuju prigodan način za povečavanje, 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 računa 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 pridruživanja
Kako operator pridruţivanja sam po sebi predstavlja izraz čija se vrijednost pohranjuje u lijevi operand, on se moţe koristiti kao desni operand za narednu operaciju pridruţivanja, odnosno moţe se napisati:
C++ programiranje za srednje škole prof.Smajo Mekić
Operator pridruţivanja (=) se koristi za pohranjivanje vrijednosti na neku memorijsku lokaciju (koja je obično pridruţena nekoj varijabli). Lijevi operand operatora treba biti neka vrijednost, npr. lijevaVrijednost, dok desni operand moţe biti proizvoljni izraz. Desni operand se izračuna i pridruţi lijevoj strani. Pri tome lijevaVrijednost predstavlja bilo šta što zauzima neku memorijsku lokaciju na koju se moţe pohraniti neka veličina; moţe biti varijabla, te zasnovana na pointerima i referencama. Operator pridruţivanja moţe imati mnogo varijanti, koje se dobivaju njegovim kombinovanjem sa aritmetičkim operatorima (moguća je kombinacija i sa bitovnim operatorima).
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 izračunava lijevi operand, a zatim desni, pa tek nakon toga vraća vrijednost posljednjeg kao konačan 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, izračunava se mBroji++, a zatim se vrijednost m pohranjuje u min. U suprotnom, izračunava se nBroji++, a zatim se vrijednost n pohranjuje u min. 7.8.typedef imena
Dakle, typedef definicija počinje ključnom riječi typedef, nakon čega se ispisuje tip podatka i identifikator. Pri tome, identifikator ne uvodi novi tip podatka, nego samo sinonim (nadimak) za postojeći tip. Ovaj identifikator se moţe koristiti bilo gdje u programu u kojem bi se mogao koristiti i sam tip. Na primjer, sljedeći primjer pokazuje korištenje sinonima prirodni, za prirodne, tj. nenegativne cijele brojeve. typedef unsigned int prirodni; Ukoliko bismo ţeljeli definisati prirodni broj N korištenjem imena prirodni, pišemo: prirodni N; Treba napomenuti da se u posljednjem primjeru identifikator prirodni moţe koristiti kao tip u nekoj drugoj typedef deklaraciji. Inače, 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 sluţi za računanje veličine bilo kojeg podatka ili tipa. To je unarni operator, koji za operand moţe imati tip (npr. int, char, . . . ) ili izraz, a kao rezultat daje broj bajtova koji operand zauzima u memoriji računara. Ovaj rezultat je u potpunosti zavisan od računara na kojem se radi. Naredni primjer ilustruje korištenje ovog operatora za računanje veličine osnovnih tipova podataka. #include 2 using namespace std; 3 4 int main (void) 5{
C++ programiranje za srednje škole prof.Smajo Mekić
Ključna riječ typedef omogućava definisanje novih imena (sinonima) za postojeće tipove podataka. Opšta formula ima oblik: typedef tip novo_ime_tipa;
60
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
Na primjer, u izrazu
C++ programiranje za srednje škole prof.Smajo Mekić
Slično pravilima u matematici o redoslijedu izvoĎenja pojedinih računskih operacija,i redoslijed korištenja pojedinih operatora u nekom izrazu u C++ je veoma bitan. Stoga se operatori dijele na različite hijerarhijske nivoe, pri čemu operatori na višim nivoima imaju prednost nad onim koji su niţe. 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 smješteni u isti blok (odvojen horizontalnim linijama).
61
Pitanja za utvrđivanje: 1. Koji od logičkih operatora su unarni, a koji su binarni? 2. Šta radi inkrement operator? 3. Šta radi dekrement operator? 4. Objasni šta radi sljedeća naredba: cout >> --broj! 5.Dodati zagrade sljedećim izrazima tako da se pokaže kojim redom se izračunavaju 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 sljedećih 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. Tačno ili netačno: u naredbi pridruživanja, vrijednost sa lijeve strane od znaka jednako je uvijek jednako vrijednosti na desnoj strani. 8. Tačno ili netačno: potpuno je normalno koristiti različite tipove podataka u istom aritmetičkom izrazu. 9. Objasniti pojam preljeva? 10. Napisati naredbu koja pomoću operatora pridruživanja povećava vrijednost varijable temp za 23. Napisati istu naredbu bez operatora pridruživanja. 11. Relacijski operator; a) Pridružuje jedan operator drugom b) Daje Boolean rezultat c) Poredi dva operanda d) Logički 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 numeričke vrijednosti
C++ programiranje za srednje škole prof.Smajo Mekić
a=b+c*d; prvo se računa c*d, jer znak mnoţenja * ima veći prioritet od znaka sabiranja + i znaka pridruţivanja =. Rezultat mnoţenja se zatim dodaje varijabli b, jer operacija sabiranja ima veći prioritet od operacije pridruţivanja. Ovakav način definisanja hijerarhije je neophodan, jer se pojedini operatori koriste za više namjena. Takav primjer je znak plus, +, koji se moţe koristiti kao binarni operator za sabiranje, unarni operator za promjenu znaka nekog broja, ali i kao operator za uvečavanje (postfiks i prefiks inkrement). Ako, na primjer, ţelimo sabrati dva broja, pri čemu je drugi broj prethodno uvećan za jedan, imamo izraz: c=a+ ++b; No, moţe se desiti da umjesto prethodnog izraza napišemo: c=a+++b; što bi, imajući na umu hijerarhiju operatora, kompajler razumio kao: c=a++ +b; U ovom slučaju, prvo se izvršava sabiranje brojeva a i b, a zatim se broj a poveća za jedan, što naravno nismo ţeljeli uraditi. Treba napomenuti da u slučaju dvoumljenja oko prioriteta operatora, najbolje je koristiti zagrade, i na taj način zaobići ugraĎenu hijerarhiju. Tako bi ranije primjere mogli napisati u obliku: a=b+(c*d); odnosno c=a+(++b);
62
b) Kombinuju dvije numeričke vrijednosti c) Porede dvije Boolean vrijednosti d) Kombinuju dvije Boolean vrijednosti 14. Provjeriti šta je rezultat sljedeće 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 sluţe za pisanje programa. Kao i večina ostalih programskih jezika, C++ nudi različite vrste naredbi koje se koriste u različite svrhe. Tako se deklaracione naredbe koriste za definisanje varijabli, naredbe pridruţivanja za jednostavne proračune, itd. 8.1.Jednostavne i složene naredbe3
{ int min, i = 10, j = 20; min = (i < j ? i : j); cout << min << ’\n’; } Ovakve naredbe su korisne iz dva razloga: a) omogućuju da se mnogostruka naredba postavi tamo gdje bi inače mogla da se postavi samo jedna, b) omogućuju da se u program uvede područje definisanosti varijable (eng. scope). Područje varijable predstavlja dio programa unutar kojeg varijabla ostaje definisana. Izvan tog područja ona to više nije.
3
C++ programiranje za srednje škole prof.Smajo Mekić
Jednostavna naredba je svaka naredba koja završava tačka-zarezom (;). Definicije varijabli i izrazi koji završavaju sa tačka-zarezom su samo neki od primjera, kao u sljedećim slučajevima: 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 sadrţi samo tačka-zarez, tzv.null-naredba. No, i ovakva naredba ponekad ima smisla. Mnogostruke naredbe se mogu kombinovati u sloţene naredbe kada se grupišu izmeĎu velikih zagrada ({}), kao na primjer:
Preuzeto i obrađeno by Uvod u programiranja u C++ -predavanja na FIT Mostar;
63
8.2.Naredba if
Uvjet je logički izraz, zapisuje se unutar para okruglih zagrada. Na kraju naredbe if ne stavlja se znak tačka zarez ; Primjer 1 Ako ţelimo provjeriti da li je pri dijeljenju djelilac različit od nule i izvršiti dijeljenje, upotreba naredbe if ima oblik: if (djelilac != 0) Kolicnik=djelitelj/djelilac; U slučaju da ţelimo izvršiti više naredbi koje ovise o nekom istom uslovu,koristimo sloţenu naredbu, tj. sve naredbe stavljamo izmeĎu velikih zagrada. Varijanta if naredbe koja omogućuje da se specificiraju dvije alternativne naredbe, jedna koja se izvršava kada je uslov ispunjen i druga kada nije, naziva se if-else naredba i ima oblik: if (izraz) naredba1; else naredba2; Ovdje se najprije izvršava izraz, i ako je rezultat različit od nule, izvršava se naredba1. U suprotnom, izvršava se naredba2, što pokazuje i primjer provjere da li je broj paran ili ne: 1 #include 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; }
C++ programiranje za srednje škole prof.Smajo Mekić
Ponekad je poţeljno da se izvrši odreĎena naredba koja zavisi od ispunjenja nekog uslova. Upravo tu mogućnost pruţa if naredba, čiji je opšti oblik: if (izraz) naredba; Prvo se izvršava izraz, i ako je rezultat različit od nule izvršava se naredba. U suprotnom, ništa se ne dešava.
64
Ako je (a<0) izvršit će se prvi blok naredbi. Ako uvjet nije zadovoljen, prvi blok naredbi se preskače i izvoĎenje 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 preskače i izvoĎenje se nastavlja od naredbe return 0. Naredba if else Za dvostruko uvjetno grananje koristi se naredba if - else.
C++ programiranje za srednje škole prof.Smajo Mekić
Pored prethodno navedenih varijanti, postoji i ugnijeţdena if naredba, u kojoj se javlja više od dvije alternative. Primjer takve varijante je, recimo, izračunavanje cijene telefonskog računa: 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 izvršen u periodu 7.00-19.00 sati, nalazi se još jedna if naredba. Ova naredba ima za cilj da provjerava duţinu poziva, i na osnovu toga formira cijenu istog. U slučaju da je poziv izvršen izvan perioda 7.00-19.00, cijena se formira na osnovu osnovne cijene poziva. Primjer 2 Treba unijeti cijeli broj različit od 0 pa provjeriti da li je negativan ili pozitivan. U oba slučaja ispisati apsolutnu vrijednost broja.
65
Što ako korisnik ne pročita uputu paţljivo, pa unese broj 0? Rezultat neće biti ispravan:
C++ programiranje za srednje škole prof.Smajo Mekić
Ako je vrijednost uvjeta logička istina izvodi se prvi blok. Nakon njegova završetka izvoĎenje se nastavlja od prve naredbe iza drugog bloka. Ako je vrijednost uvjeta logička neistina, preskače se prvi blok i izvodi se drugi blok (iza naredbe else). Nakon njegova završetka izvoĎenje se nastavlja od prve naredbe iza drugog bloka. Primjer3. Primjer je riješen uz pomoć if – else naredbe. Ako je (a<0) izvršit će se prvi blok naredbi. Ako je (a>0), preskače se prvi blok i izvodi se drugi blok naredbi.
66
Uneseni broj treba provjeriti. Ako je unesena 0, korisnika valja upozoriti, a potom korisnik mora unijeti novi broj koji je različit od 0. Da bi to bilo moguće, potrebna je naredba koja omogućava nastavak odvijanja programa od odabrane naredbe. Naredba goto Naredba goto omogućava nastavak odvijanja programa od odabrane naredbe. Naredba na koju se ţeli skočiti, od koje se ţeli nastaviti odvijanje programa, moţe biti bilo gdje u programu. Opći oblik naredbe: goto oznaka_naredbe;
Čestom upotrebom naredbe goto teško je slijediti tok odvijanja programa što oteţava otkrivanje pogrešaka. Naredbu goto stoga treba izbjegavati i nastojati zadatak rješiti na drugi način, pomoću petlji koje će biti objašnjene kasnije. Nredba if-else if-else
C++ programiranje za srednje škole prof.Smajo Mekić
Naredbu od koje se ţeli nastaviti odvijanje programa treba označiti oznakom iza koje dolazi znak dvotačke. oznaka_naredbe:naredba; …… …… goto oznaka_naredbe; ¸
67
Za višestruko uvjetno grananje koristi se naredba if – else if - else.Broj pustavljenih uvjeta nije ograničen.
Primjer4
C++ programiranje za srednje škole prof.Smajo Mekić
Ako je vrijednost prvog uvjeta logička istina, izvodi se prvi blok naredbi. Nakon njegova završetka izvoĎenje se nastavlja od prve naredbe iza zadnjeg bloka naredbi. Ako je vrijednost prvog uvjeta logička neistina, provjerava se drugi uvjet. Ako je on logička istina, izvodi se drugi blok naredbi, a potom prva naredba iza zadnjeg bloka naredbi. Ako je vrijednost drugog uvjeta logička neistina, provjerava se treći uvjet, i td. Provjere se tako redom nastavljaju sve do naredbe else. Ako do tada niti jedan od uvjeta nije imao vrijednost logičke istine, izvršit će se zadnji blok naredbi koji se nalazi iza naredbe else.
68
Treba upisati prirodni broj pa provjeriti da li je veći ili manji od 100, te da li je paran ili neparan.
8.3.Naredba switch Naredba switch-case omogućava jednostruko grananje koje ovisi o vrijednosti postavljenog uvjeta. Za razliku od višestrukog grananja naredbom if u kojoj su uvjeti logički izrazi, u naredbi switch-case uvjet je cjelobrojan izraz ili cjelobrojna varijabla.Grananje swich-case.
C++ programiranje za srednje škole prof.Smajo Mekić
Višestrukim uvjetnim grananjem provjerava se da li je broj veći, manji ili jednak 100. Dvostrukim uvjetnim grananjem (neovisno o tome da li je broj veći ili manji od 100) provjerava se parnost broja. Parnost se provjerava operatorom modulo (ostatak dijeljenja s 2 se usporeĎuje s 0).
69
Prvo se računa izraz (switch tag), a zatim se rezultat poredi sa svakom od numeričkih konstanti (labele), po redu kako se javljaju, dok se ne poklopi sa jednom od komponenti. Nakon toga se izvršavaju naredbe koje slijede. Izvršavanje se izvodi sve dok se ne naiĎe na naredbu break ili dok se ne izvrše sve naknadne naredbe. Posljednji slučaj (default) moţe, a i ne mora da se koristi, i pokreće se ako nijedna od prethodnih konstanti nije zadovoljena. Korištenje ove naredbe dat je u sljedećem primjeru, koji odreĎuje opseg osvojenih bodova na ispitu na osnovu dobijene ocjene.
C++ programiranje za srednje škole prof.Smajo Mekić
Opšti oblik switch naredbe je: switch (izraz) { case konstanta_1: naredbe; break; ... case konstanta_n: naredbe; break; default: naredbe; }
70
#include 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; } }
C++ programiranje za srednje škole prof.Smajo Mekić
Primjer 5 Treba izračunati 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 načiniti dvije grane (serijski spoj-1, paralelni-2). Ovisno o tome što korisnik upiše (broj 1 ili broj 2) izvršit će se jedna od dvije grane. U slučaju da korisnik unese vrijednost koja nije 1 ili 2, ispisat će se upozorenje.
71
Ako se ne upiše broj 1 ili 2 ispisat će se poruka o grešci.
8.4.Naredba for
C++ programiranje za srednje škole prof.Smajo Mekić
Rezultat programskog koda.
72
For petlja se najčešće 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 početnog stanja kontrolne varijable petlje (početno stanje). Po zadavanju početnog stanja kontrolne varijable petlje zapisuje se uvjet. Rezultat uvjeta je podatak tipa bool (0 ili 1).Blok naredbi se izvršava sve dok je vrijednost uvjeta jednaka logičkoj istini (1). Kad vrijednost uvjeta postane neistina (0) petlja se prekida. Naredba for (for petlja) je slična naredbi while, ali ima dvije dodatne komponente: (i) izraz koji se izračunava samo jednom prije nekog proračuna koji se ponavlja, i (ii) izraz koji se izračunava jednom na kraju svake iteracije. Opšti oblik naredbe for je: for (izraz1; izraz2; izraz3) naredba; Prvo se izračunava izraz1. Svakim prolaskom kroz petlju se izračunava izraz2. Ako je rezultat različit od nule izračunava se izraz3. U suprotnom petlja se zaustavlja. Oblik while petlje koja je ekvivalentna do petlji je: izraz1; while (izraz2) { naredba; izraz3; } Naredba for se najčešće koristi u situacijama kada se neka varijabla povečava ili smanjuje za neku veličinu u svakoj iteraciji, odnosno kada je broj iteracija unaprijed poznat. Sljedeći primjer računa zbir svih brojeva od 1 do n:
Prvo se vrijednost zbira inicijalizira na vrijednost nula (sum=0;). Prvi izraz u petlji for predstavlja početnu vrijednost brojača i, koja je jednaka 1. Nakon toga, provjerava se uslov i <= n. Ako je uslov ispunjen, izračunava se naredba. U ovom slučaju, radi se o jednostavnoj naredbi (sum += i;), tako da nema potrebe za korištenjem velikih zagrada. Nakon izvršenja naredbe, izračunavase treći izraz, ++i, i postupak nastavlja sve dok se ne ispuni uslov i <= n. Treba naglasiti da se umjesto prefiks inkrementa, kao treći izraz mogao staviti i postfiks inkrement (i++). Bilo koja od komponenti u petlji moţe biti prazna. Na primjer, ako se uklone prvi i treći 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 beskonačnu petlju: for (;;) // beskonačna petlja bilo-sta; Pošto petlje predstavljaju naredbe, mogu se pojaviti unutar drugih petlji (tzv. ugnijeţdene petlje). Klasični primjer je korištenje dvostruke petlje pri ispisu tablice mnoţenja brojeva do 10: for (int i = 1; i <= 10; ++i){ for (int j = 1; j <= 10; ++j) cout << setw(5)<< i*j; cout << endl;
C++ programiranje za srednje škole prof.Smajo Mekić
sum = 0; for (int i = 1; i <= n; ++i) sum += i;
73
} U liniji sa ispisom (cout << setw(5)<< i*j;) korišten 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 predviĎen za ispis podataka u izlaznom toku. Primjer 1: Ispiši prvih 20 prirodnih brojeva, svaki u svom redu. Na kraju ispiši i vrijednost varijable i nakon izvoĎenja petlje.
Primjer 2: Ispiši parne brojeve od 20 do 450. Rješenje:
C++ programiranje za srednje škole prof.Smajo Mekić
Rješenje:
74
Rješenje:
C++ programiranje za srednje škole prof.Smajo Mekić
Primjer 3: Ispiši sve prirodne brojeve izmeĎu 1 i N, koji su djeljivi sa 3.
75
Naredba while (naziva se i while petlja) omogućuje ponavljanje neke naredbe sve dok je ispunjen neki uslov. Opšti oblik ove naredbe je: while (izraz) naredba; Prvo se izračunava izraz (naziva se i uslov petlje). Ako je rezultat različit od nule tada se izvršava naredba (naziva se i tijelo petlje) i cijeli proces se ponavlja. U suprotnom, proces se zaustavlja. Na primjer, ako ţelimo izračunati 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 moţe biti prazno, tj. sa null-naredbom, ali to nije uobičajeno. Ipak, sljedeći primjer, problem nalaţenja največeg neparnog faktora nekog broja, pokazuje i jedan takav slučaj. while (n % 2 == 0 && n /= 2) Ovdje uslov petlje izvršava sve neophodne kalkulacije, tako da nema potrebe za tijelom. Primjer:Za niz od 5 različitih brojeva ispiši zbir.
C++ programiranje za srednje škole prof.Smajo Mekić
8.5.Naredba while
76
Naredba do (naziva se i do petlja) je slična naredbi while, osim što se prvo izvršava tijelo petlje, a zatim se provjerava uslov. Opšti oblik naredbe je: do naredba; while (izraz); Prvo se izvršava naredba, a zatim provjerava izraz. Ako je izraz različit od nule cijeli proces se ponavlja. U suprotnom, petlja se zaustavlja. Naredba do se manje koristi nego while petlja. Obično se koristi kada se tijelo petlje mora izvršiti najmanje jedanput bez obzira na ispunjenje uslova. Takav primjer je, recimo, ponovljeno unošenje nekog broja u primjeru izračunavanja 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 jasnoće. Primjer:Za niz prirodnih brojeva od 1-N ispiši sumu (zbir) neparnih.
C++ programiranje za srednje škole prof.Smajo Mekić
8.6.Naredba do
77
C++ programiranje za srednje škole prof.Smajo Mekić
Pitanja za utvrĎivanje: 1. Koja od petlji (for, while, do) se izvršava barem jednom? 2. Koja od petlji je najbolji izbor kada je broj iteracija poznat? 3. Napiši naredbe za sljedeće: a) provjera da li je broj neparan, b) provjera da li je broj neparan i negativan, c) dati apsolutnu vrijednost nekog broja. 4. Pretpostavljajući da je n = 20, šta će biti rezultat sljedećeg koda: if (n >= 0) if (n < 10) cout << "n je malo\n"; else cout << "n je negativno\n"; 5. Opiši svrhu tri naredbe unutar for petlje. 6. Tačno ili netačno: inkrementalni izraz unutar for petlje moţe smanjiti varijablu petlje. 7. Blok nekog koda je odvojen ..... 8. Koliko puta se izvršava tijelo do petlje? 9. Dati sintaksu naredbe switch!
78
9.Funkcije
Definicija funkcije se sastoji od dva glavna dijela: 1.zaglavlja ili interfejsa, i 2.tijela funkcije. Interfejs definiše kako se funkcija moţe koristiti. On se sastoji od tri dijela: Imena. Ovo je, u stvari, jedinstveni identifikator funkcije. Parametara (ili potpisa). Ovo je niz od nula ili više identifikatora nekog tipa koji se koriste za prosljeĎivanje vrijednosti u i iz funkcije. Tipa. Ovo specificira tip vrijednosti koji funkcija vraća. Funkcija koja ne vraća nijednu vrijednost bi trebala da ima tip void. Tijelo funkcije sadrţi računske korake (naredbe) koji čine samu funkciju.Korištenje funkcije se izvodi njenim pozivanjem. Poziv funkcije se sastoji od imena funkcije, pračenim zagradama za pozivanje (). Unutar ovih zagrada se pojavljuje nula ili više argumenata koji se odvajaju zarezom. Broj argumenata treba odgovarati broju parametara funkcije. Svaki argument je izraz čiji tip treba odgovarati tipu odgovarajućeg parametra u interfejsu funkcije. Kada se izvršava poziv funkcije, prvo se računaju argumenti i njihove rezultujuće vrijednosti se pridruţuju odgovarajućim parametrima. Nakon toga se izvršava tijelo funkcije. Na kraju, funkcija vraća vrijednost poziva (ako isti postoji). Sljedeći primjer ilustrativno pokazuje definiciju jednostavne funkcije koja izračunava 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 definiše interfejs funkcije. Ona počinje tipom funkcije koji se vraća;u ovom slučaju 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 slična sintaksi definisanja varijabli, tj. nakon tipa daje se ime parametra, osim što se parametri ne odvajaju zarezom, kao u:
C++ programiranje za srednje škole prof.Smajo Mekić
Funkcije obezbijeĎuju prikladan način pakovanja nekog numeričkog "recepta", koji se moţe 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 pomnoţiti sa datim brojem» . Slične instrukcije moţete dati i kompjuteru izraţene na nekom programskom jeziku. Tada očekujete da broj x unesete, da mašina izračuna x + 2, zatim (x + 2) * x. Za dati ulaz x mašina će proizvesti jedinstven izlaz broj ((x + 2) * x). U matematici, proces koji, za dati ulaz (odreĎenog tipa), proizvodi jedinstven izlaz naziva se funkcija. Efekt procesa obrade na računaru moţe se posmatrati kao evaluacija funkcija. Zato su funkcije najvaţnija matematička tema u oblasti kompjuterske obrade. 9.1.Definicija
79
int Stepen (int baza, eksponent) // Ovo je pogrešno!
Kada se program pokrene daje sljedeći izlaz: 2 ^ 8 = 256 Definisanje gore pomenute funkcije moţe se izvršiti na više načina, kao što ćemo pokazati u narednim primjerima. Primjer 1. 1 #include 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<<"^" <
C++ programiranje za srednje škole prof.Smajo Mekić
Zagrada { u liniji 2 predstavlja početak tijela funkcije. U liniji 3 definisana je lokalna varijablu rezultat. Stepen varijable baza na varijablu eksponent pomoću for petlje se računa u linijama 4 i 5. Rezultat se pohranjuje u varijablu rezultat (linija 5). U liniji 6 vraća se vrijednost rezultat kao rezultat funkcije. Zagrada } u liniji 7 predstavlja kraj tijela funkcije. Naredni primjer pokazuje kako se funkcija poziva (bez definicije funkcije). Posljedica poziva funkcije je da se vrijednosti argumenata 2 i 8 pridruţuju parametrima baza i eksponent, respektivno, a zatim se računa tijelo funkcije. 1 #include 2 using namespace std; 3 4 main(void){ 5 cout << "2 ^ 8= " << Stepen(2,8) << ’\n’; 6}
80
1 #include 2 using namespace std; 3 4 double Stepen (int baza, int eksponent); 5 // deklarisanje funkcije 6 7 /* moguce je funkciju daklarisati i na sljedeci način 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<<"^" <
C++ programiranje za srednje škole prof.Smajo Mekić
kao što je pokazano u narednom primjeru. TakoĎer je moguće izostaviti nazive parametara u definiciji, ali to nije preporučljivo.
81
return rezultat; } onda prethodni program ima oblik:
#include #include “StepenInt.h” using namespace std; main () { int a,b; cout << "Unesi bazu:"; cin >> a; cout << "\nUnesi eksponent:"; cin >> b; cout << a<<"^" <
C++ podrţava dva oblika parametara: vrijednost i referencu. Parametar po vrijednosti prima kopiju vrijednosti argumenata koja im se prenosi. Kao posljedica toga, ako funkcija napravi bilo kakvu promjenu na parametrima, ovo neće promijeniti vrijednosti argumenata. Na primjer, u programu: #include 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 sljedeći 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)
C++ programiranje za srednje škole prof.Smajo Mekić
9.2.Parametri i argumenti
82
Moguće je simbol & staviti i iza tipa varijable broj, kao u void Funkcija (int& broj),i na programeru je da odabere način koji mu više odgovara. U principu, vaţno se uvijek drţati istog pravila, ako ni zbog cega drugog onda zbog preglednosti programa. U kontekstu pozivanja funkcija, a na osnovu prethodno iznesenog, razlikujemo dvije vrste pridruţivanja: pridruţivanje prema vrijednosti i pridruţivanje prema referenci. U praksi (u pogledu funkcija) se mnogo više koristi pridruţivanje prema vrijednosti. 9.3.Globalne i lokalne varijable Za sve što se definiše izvan programskog područja (scope) se kaţe da ima globalni karakter. Tako, sve funkcije koje smo do sada koristili predstavljaju globalne funkcije. No, i varijable se mogu definisati u globalnom području, tj.izvan svih funkcija koje se koriste u programu, uključujući 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. Pošto su globalni entiteti "vidljivi" na svim programskim nivoima, oni moraju biti jedinstveni na nivou programa. To znači da se globalne varijable ili funkcije na globalnom području ne mogu definisati više nego jedanput, iako se ime funkcije moţe definisati više puta sve dok su im parametri (njen potpis) jedinstveni . Globalni entiteti su općenito pristupačni bilo gdje u programu.Svaki blok u programu definiše lokalno područje. Na taj način, tijelo funkcije predstavlja lokalno područje. Parametri funkcije imaju isto područje kao i tijelo funkcije. Varijable koje su definisane unutar lokalnog područja su vidljive samo u tom području. Lokalno područje moţe da bude ugnijeţdeno, pri cemu unutrašnje područje poništava vanjsko. Na primjer:
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 različita područja, od kojih svaki ima različitu varijablu xyz.Općenito, ţivotni vijek varijable je ograničen na područje iste. Tako, na primjer, globalne varijable traju svo vrijeme izvršenja programa, dok se lokalne varijable kreiraju kada se uĎe u njihovo područje, a uništavaju kada se iz njega izaĎe. Memorijski prostor za lokalne varijable je rezervisan prije izvršenja programa, dok je memorijski prostor za lokalne varijable alociran "u hodu" u toku izvršenja programa. Pošto lokalno područje poništava globalno, to lokalne varijable sa istim imenom kao globalne varijable onemogućavaju pristup globalnim varijablama unutar lokalnog područja. Na primjer, u int greska; \\globalna varijabla void Greska (int greska) { \\lokalna varijabla //... } globalna varijabla greška je, kao što se i očekuje, nepristupačna unutar funkcije. Greska, pošto je poništena lokalnim parametrom greška.Ovaj problem se moţe prevazići korištenjem unarnog operatora područja (unary scope operator), koji globalni entitet uzima kao argument, kao u primjeru
C++ programiranje za srednje škole prof.Smajo Mekić
int xyz; void Funkc (int xyz)
83
int greska; void Greska (int greska) { //... if (::greska != 0) // odnosi se na globalnu varijablu // greska //... } 9.4.Rekurzivne funkcije
Pitanja za utvrĎivanje: 1. Da li funkcija moţe imati više od jednog argumenta? 2. Da li funkcija mora imati return vrijednost? 3. Da li funkcija moţe imati više od jedne return vrijednosti? 4. Da li je moguće da funkcija nema ni argumente ni return vrijednost? 5. Da li funkcija moţe 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 započinje definiciju funkcije, naziva se .... 10. Tačno ili netačno: 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 tačke definisanja nadalje u programu, b) od tačke definisanja nadalje u funkciji, c) od tačke definisanja nadalje u bloku, d) u cijeloj funkciji.
C++ programiranje za srednje škole prof.Smajo Mekić
Za funkciju koja poziva samu sebe kaţemo da je rekurzivna. Rekurzija je opšta programska metoda koja se primjenjuje na probleme koji se definišu u odnosu na same sebe. Na primjer, problem računanja faktorijela je primjer rekurzivne funkcije. Faktorijel je definisan sa: Faktorijel od 0 je 1. Faktorijel pozitivnog broja n je n puta faktorijel od n-1, tj. n!=n(n-1)! Posljednji dio definicije jasno pokazuje da je faktorijel definisan u odnosu na samog sebe, te se stoga moţe predstaviti rekurzivnom funkcijom, npr. int Faktorijel (unsigned int n) { return n == 0 ? 1 : n * Faktorijel(n-1); } U principu, sve rekurzivne funkcije se mogu napisati koristeći iteracije. Naime, treba imati u vidu da u slučaju velikog broja poziva funkcija (u primjeru faktorijela je to veliki broj n), dolazi do zauzimanja velikog memorijskog prostora (tzv. runtime stack ), pa je upotreba iteracija bolje rješenje. No, u nekim slučajevima elegantno i jednostavno rekurzivno rješenje moţe da bude bolja opcija. U slučaju faktorijela, 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; }
84
12. Šta znači kada se koriste prazne zagrade () u definiciji funkcije? 13. Koliko vrijednosti se moţe vratiti iz funkcije? 14. Tačno ili netačno: kada funkcija vraća vrijednost, cijeli poziv funkcije se moţe pojaviti na desnoj strani znaka jednakosti i pridruţiti drugoj varijabli. 15. Gdje se specificira tip vrijednosti koji se vraća nekom funkcijom? 16. Kada se argument prenosi po referenci: a) kreira se varijabla u funkciji da pohrani vrijednost argumenta, b) funkcija ne moţe 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
Polje se sastoji od niza objekata (nazivaju se i elementi polja), koji su istog tipa i zauzimaju neprekidan memorijski prostor. Općenito, samo polje ima simboličko ime, a ne njegovi elementi. Svaki element je identificiran njegovim indeksom, koji pokazuje poloţaj nekog elementa u polju. Broj elemenata u polju naziva se dimenzija polja.Dimenzija polja je fiksirana i prethodno odreĎena, i ne moţe se promijeniti u toku izvršenja programa. Polja su pogodna za predstavljanje podataka koji se sastoje od mnogo sličnih, individualnih objekata. Primjeri za to su lista imena, tabela gradova i njihovih sezonskih temperatura, i slično. Tipovi poput „int“, „double“ i sl.dozvoljavaju predstavljanje samo pojedinačnih vrijednosti. Često pri rješavanju problema iz stvarnog svijeta trebamo predstaviti skupinu vrijednosti koje su sve istog tipa, na primjer: Prosječne količine padavina za svaki mjesec Ocjene svih učenika u razredu Stanje prodaje za svaki dan u sedmici, itd U jeziku C++ takve skupine vrijednosti predstavljamo pomoću nizova.Niz je struktura podataka koja omogućava pohranu niza vrijednosti. Vrijednosti su pohranjene u kontinuirani blok memorije. Nizovi omogućavaju 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 moţe 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. veličina niza (obavezno neka konstantna vrijednost). Na primjer: int rezultati [9]; niz rezultati koji se sastoji od 5 elemenata tipa int moţemo grafički predstaviti ovako:
C++ programiranje za srednje škole prof.Smajo Mekić
10.1.Jednodimenzionalni niz
85
Svaki element niza je varijabla , odreĎena svojim indeksom. Bilo koja operacija koja se moţe vršiti nad varijablama običnog tipa, moţe se vršiti i nad individualnim elementima niza. Indeks se navodi nakon imena niza, u uglatim zagradama: Na primjer: rezultati [5]= 21; cout<
Kad deklariramo niz lokalno (npr u funkciji), kao i kod običnih varijabli, elementi niza nemaju nikakvu precizno odreĎenu vrijednost sve dok se eksplicitno ne izvrši dodjela, bilo pomoću operatora dodjele „=“, bilo pomoću unosa sa tastature. MeĎutim, kod globalno deklariranih nizova članovi niza se automatski inicijaliziraju nulama. U oba slučaja ( i lokalno i globalno) pri deklaraciji niza imamo mogućnost 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 moţe izostaviti je kada je neko polje parametar u nekoj funkciji. Na primjer, funkcija Srednja se moţe napisati na bolji način, 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; }
4
Preuzeto i prilagođeno by Motik, B. and Šribar, J. Demistificirani C++. Element, Zagreb, 2. izdanje edition, 2001.
C++ programiranje za srednje škole prof.Smajo Mekić
10.3.Inicijalizacija niza
86
Vidi se da se pomoću definicije int broj[] omogućava veća fleksibilnost dimenzije polja, pa je kompletan program u tom slučaju:
1#include 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ć
Sljedeći program predstavlja primjer pomoću kojeg se unosi, sortira i ispisuje neki niz. Pri tome, sortiranje je izvedeno od najvećeg prema najmanjem elementu niza.
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 korištena funkcija swap (linija 23), mada programer sam moţe definisati sličnu funkciju. Kao što je ranije rečeno, za pohranjivanje testova se koriste znakovna polja (eng. string). To su, u stvari, polja čiji elementi imaju tip char. Prilikom inicijalizacije ovakvih polja, sadrţaj se stavlja izmeĎu znaka dvostrukih navoda . Na primjer:
Broj elemenata navednih u vitičastim zagradama mora biti jednak broju elemenata koje smo naveli u uglatim zagradama. C++ dozvoljava i sljedeće: ukoliko pri inicijalizaciji ostavite uglate zagrade prazne kompjaler će pretpostaviti da je veličina niza jednaka broju vrijednosti navedenih u vitičastim 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 {}, izmeĎu kojih se specificira lista početnih vrijednosti elemenata polja koje su odvojene zarezom. Na primjer, int broj[3] = {5, 10, 15}; definiše 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 slučaju: int broj[3] = {5, 10}; // broj[2] je inicijaliziran na 0
C++ programiranje za srednje škole prof.Smajo Mekić
"char str[] = "VOZDRA"; definiše varijablu str kao niz od sedam (7) karaktera: šest slova i jedan prazan karakter (nullkarakter). Završni prazan karakter postavlja kompajler. Zarazliku od toga, char str[] = {’V’, ’O’, ’Z’, ’D’, ’R’, ’A’}; definiše varijablu str kao niz od 6 elemenata. Treba naglasiti da prethodni primjer nije ispravan, jer svaki pravilno inicijalizirani niz karaktera mora obavezno da završi null-karakterom. TakoĎer, ovakav način inicijaliziranja je neefikasan u odnosu na prvi. Osim ovakvog predstavljanja riječi, tj. znakovnih polja, u C++ je ugraĎen i tip string, koji manipuliše sa znakovnim poljima. S obzirom da se radi o specijalnoj klasi u C++ , što pripada objektnoorijentisanoj paradigmi, ovdje o tome neće biti riječi.
88
Kada se koristi potpuni inicijalizator (broj početnih vrijednosti odgovara dimenziji polja), dimenzija polja postaje suvišna i moţe se izostaviti, tj. broj elemenata je implicitan u inicijalizatoru – implicitna inicijalizacija. U ovom slučaju inicijalizacija polja broj se moţe izvršiti i na sljedeći način: int broj[] = {5, 10, 15}; // dimenzija nije potrebna 10.4.Pristup elementima niza
Na primjer, ako ţelite pohraniti vrijednost 75 kao treći elment niza billy moţete napisati sljedeće: rezultati[2] = 77; a ako ţelite dodijeliti vrijednost trećeg elementa niza varijabli a, moţete pisati: a = rezultati[2]; Primjećujete da je treći elment niza rezultati specificiran sa rezultati[2]. Zašto indeks trećeg elementa ima vrijednost 2? Prvi element niza ima vrijednost indeksa . Dakle, polje ili niz je najjednostavnija struktura podataka . Niz je uredeni skup koji sadţi odreĎeni broj elemenata istoga tipa T. S nizom se moţe manipulisati kao sa cjelinom, ali se takoĎer moţe i pristupati pojedinim njegovim elementima. Nekom se elementu niza pristupa navoĎenjem njegovoga indeksa; pritom vrijeme pristupa ne ovisi o vrijednosti indeksa. U jezicima C i C++ za pristup i_tom elementu niza a pišemo a[i]. Vaţno je upamtiti da prvi element niza koji sadrţi n elemenata ima indeks 0, a posljednji indeks n-1. Elementi niza se u memoriji računala pohranjuju u n uzastopno smještenih varijabli odreñenoga tipa T. U znanstvenim i tehničkim primjenama često se pojavljuju velike količine podataka (naprimjer rezultata raznih mjerenja) koje treba srediti i klasificirati. Najčešće 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 naći element niza koji ima maksimalnu vrijednost 2. Neka se bitna svojstva niza statističkih podataka mogu izraziti pomoću nekoliko statističkih parametara: a) za dani se niz podataka n-1
C++ programiranje za srednje škole prof.Smajo Mekić
Moguće je pristupiti bilo kojem pojedinačnom elementu niza (kao bilo kojoj običnoj varijabli) jednostavnim navoĎenjem imena niza i indeksa ţeljenog elementa: ime [indeks]
89
C++ programiranje za srednje škole prof.Smajo Mekić
Za izračunavanje ćemo koristiti funkcije: 1. za član niza sa maksimalnom vridjenošću funkciju double max(double x[], int velicina) 2. a) za izračunavanje aritmetičke 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 pridruţuje parametru funkcija (barata sa kopijom vanjske varijable). Znamo da se takvo prenošenje 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 izvoñenja 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 „sadrţava“ adresu prvog (sa indeksom 0) člana. Dakle, parametri funkcije su ime niza i veličina niza. Funkcija za zadatak 1 je: int max(int x[], int velicina) { int imax=0; for (int i=1; ix[imax]) imax=i; return(imax); } Poziv funkcije iz glavnog programa biće imax(x, velicina), s time da je int n poznat (definiran kao konstanta).
90
C++ programiranje za srednje škole prof.Smajo Mekić
10.5.Multidimenzionalna polja(nizovi)
91
Polje moţe da ima i više nego jednu dimenziju (dvije, tri, i više). Ipak, organizacija polja u memoriji je ista kao i prije, tj. neprekidna sekvenca elemenata,pa je percepcija programera nešto drugacija od one koja se nameće na prvi pogled (kao multidimenzionalna). Na primjer, pretpostavimo da je srednja vrijednost temperatura po godišnjim dobima za tri bosanskohercegovačka grada data tabelom:
Ovo se moţe predstaviti dvodimenzionalnim poljem cijelih brojeva: int godDobTemp[3][4]; Ovo je u memoriji predstavljeno kao neprekidan niz od 12 elemenata tipa int . Programer, meĎutim, moţe 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 moţe obaviti pomocu ugnijeţdenog inicijalizatora, kao u:
Pošto se ovo dvodimenzionalno polje mapira kao jednodimenzionalni niz od 12 elemenata, moguće je koristiti i sljedeći način: int godDobTemp[3][4] = { 10, 20, 10, 1, 13, 21, 12, 3, 14, 23, 11, 4 }; Ipak, bolja opcija je korištenje ugnijeţdenog inicijalizatora, pošto ne samo da je pregledniji, nego daje i dodatne mogućnosti. Na primjer, ako je samo prvi element svakog reda različit od nule, a ostali su jednaki nuli, moţemo koristiti: int godDobTemp[3][4] = {{26}, {24}, {28}};
Također je moguće izostaviti prvu dimenziju (implicitna inicijalizacija), kao u: int godDobTemp[][4] = {
C++ programiranje za srednje škole prof.Smajo Mekić
int godDobTemp[3][4] = { {10, 20, 10, 1}, {13, 21, 12, 3}, {14, 23, 11, 4} };
92
{10, 20, 10, 1}, {13, 21, 12, 3}, {14, 23, 11, 4} };
#include 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 najveća u prethodnom primjeru; pravilno je postaviti na prvi član polja,umjesto pretpostaviti neku konačnu vrijednost (na primjer 0).
Primjer 1: Unesi N članova niza X pomoću for petlje te ih zatim ispiši na ekranu računara, takoĎer petljom for
C++ programiranje za srednje škole prof.Smajo Mekić
Procesiranje multidimenzionalnih polja je slično jednodimenzionalnim, s tim da se moraju koristiti ugnijeţdene petlje. Sljedeći primjer pokazuje pronalaţenje maksimalnog elementa u dvodimenzionalnom polju iz prethodnih primjera.
93
#include #include using namespace std; int main() { int i,N; int X[10]; /*deklaracija niza od 10 cijelih brojeva*/ cout<<"Zadaj 0>N; for (i=0;i>X[i]; /*upis i-tog člana niza*/ } for (i=0;i
/*ispis članova niza for petljom*/ /*ispis i- tog člana niza*/ /*ispis praznog retka (end line)*/
11.Pointeri(Pokazivači) 11.1.Osnovno o pointerima5 5
Preuzeto i obrađeno by Osnove programiranja u C++ -Aleksandar Karač;
C++ programiranje za srednje škole prof.Smajo Mekić
Pitanja za utvrĎivanje 1. Da li neko polje moţe sadrţavati 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 izmeĎu inicijalizacije i pridruţivanja? 5. Koja su dva načina inicijalizacije polja?
94
Pointeri (pokazivači) predstavljaju adresu neke memorijske lokacije i omogućuju indirektni način pristupa podacima u memoriji. Pointer varijabla se definiše pokazivanjem na podatak odreĎenog 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; možemo pisati: ptr1 = # Simbol & (ampersand, znak i) je adresni operator; on uzima varijablu kao argument i vraća memorijsku adresu te varijable. Efekt prethodnog pridruţivanja je da je adresa varijable num pridruţena pointeru ptr1. Na taj način, kaţemo da ptr1 pokazuje na num. Dijagramski prikaz ovog pridruţivanja datje na slici
Uzimajući da ptr1 pokazuje na num. Izraz: 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 vraća sadrţaj memorijske lokacije na koju pokazuje. Općenito, tip pointera mora odgovarati tipu podatka na koji taj pointer pokazuje. MeĎutim, pointer tipa void odgovara bilo kojem tipu. Ovo je veoma korisno pri definisanju pointera koji mogu pokazivati na podatke različitih tipova, ili one podatke kojima tip u početku nije poznat. Pointer se moţe konvertovati (pomoću cast) u neki drugi tip. Na primjer, ptr2 = (char*) ptr1; konvertuje ptr1 u pointer karaktera prije nego se pridruţi pointeru ptr2. Bez obzira na tip, pointeru se moţe pridruţiti vrijednost 0. Ovakav pointer se naziva null-pointer. Nullpointer se koristi za inicijalizaciju pointera, i za obiljeţavanje kraja struktura sa podacima koji se zasnivaju na pointerima (na primjer, linkovane liste i sl.). 11.2.Dinamička 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 dinamičko alociranje memorijskih blokova u toku izvršenja programa. Zbog toga se ova memorija često naziva i dinamička memorija. S druge strane, programski stog se često naziva statička 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 vraća 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 područja definisanosti (eng. scope rules) kao normalne varijable. Na primjer, kada funkcija Funkcija
C++ programiranje za srednje škole prof.Smajo Mekić
*ptr1
95
void Funkcija (void) { char *str = new char[10]; //... } vraća vrijednost, lokalna varijabla str je uništena, ali memorijski prostor koji pokazuje na str nije. Ovo posljednje ostaje alocirano sve dok ga programer eksplicitno ne oslobodi. Operator delete se koristi za oslobaĎanje memorijskog prostora koji se alocira pomoću new. On uzima pointer kao argument i oslobaĎa memorijski prostor na koji taj pointer pokazuje. Na primjer, delete ptr; // briše neki objekat delete [] str; // briše niz objekata Ukoliko bi se na niz podataka, koristio prvi pristup, oslobaĎa se prostor samo jednog elementa niza, tako da je u slučaju nizova uvijek neophodno dodati zagrade [ ], koje treba da to i pokaţu. Ako se operator delete treba primijeniti na pointer koji pokazuje ni na šta drugo no dinamički alocirani objekat (na primjer varijabla u stogu), moţe doći do ozbiljne greške (tipa runtime). S druge strane, potpuno je bezazleno primijeniti ovaj operator na null-pointer. Dinamički objekti su veoma korisni za kreiranje podataka koji traju duţe od poziva funkcija koje ih kreiraju. Sljedeći primjer pokazuje jedan takav slučaj, gdje se koristi funkcija koja uzima string parametar i vraća kopiju stringa. #include char* CopyOf (const char *str) { char *copy = new char[strlen(str) + 1]; strcpy(copy, str); return copy; }
U linija 1, kao što je već poznato, poziva se standardna biblioteka string koja definiše mnoštvo 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 uključen u brojanje, treba dodati još jedan karakter i alocirati niz karaktera te velicine (sa tim brojem karaktera). Funkcija strcpy, koja je takoĎer definisana u string, kopira drugi argument na prvi, karakter po karakter, uključujući i posljednji null-karakter. Zbog ograničenih memorijskih resursa, uvijek postoji mogućnost da se dinamička memorija "potroši" u toku izvršenja programa, naročito ako se alocira veliki prostor, ali se i ne oslobodi. U slučaju da operator new ne moţe da alocira prostor potrebne veličine, vratiće vrijednost nula. Na programeru je da sebavi ovakvim problemima. Jedna od osnovnih karakteristika jezika C++ , rad sa iznimkama, daje praktičan primjer šta i kako raditi sa ovim problemima. 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]; definišemo 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);
C++ programiranje za srednje škole prof.Smajo Mekić
1 2 3 4 5 6 7
96
Posljednja naredba se moţe shvatiti kao: uzmi adresu prvog elementa polja,povečaj je za 3, pogledaj šta se nalazi na toj adresi, te pridruţi tu vrijednost varijabli broj. Dakle, ako imamo definisano polje int cijeliBroj[] = {1,2,3}; onda imamo sljedeća značenja: 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 moţe 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 slična diskusija se moţe primijeniti i na višedimenzionalna polja, s obzirom da su u memoriji računara ista predstavljena jednodimenzionalnim poljima. 11.4.Aritmetika sa pointerima
Na osnovu prethodno rečenog slijedi da se elementi niza "VOZDRA" mogu predstaviti i sa *str, *(str+1), *(str+2), itd.. Na sličan način, 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. Sljedeći primjer pokazuje funkciju za kopiranje riječi sličnu funkciji strcpy.
C++ programiranje za srednje škole prof.Smajo Mekić
U C++ je moguće neku cjelobrojnu vrijednost dodati i oduzeti od pointera.Programeri često koriste ovu mogućnost, koja se još naziva i aritmetika sa pointerima. Ova aritmetika, pak, nije ista kao ona sa cjelobrojnim vrijednostima, jer rezultat zavisi od veličine 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.
97
1 2 3 4 5
void CopyString (char *dest, char *src) { while (*dest++ = *src++) ; }
U ovom slučaju, umjesto da se na funkciju prenosi niz (linija 1), prenosi se int pointer i dva dodatna parametra koja specificiraju dimenzije niza. Na ovaj način, funkcija nije ograničena na niz odreĎene duţine. Izraz *(temp+i * kolone+ j) u liniji 8, je ekvivalentan izrazu temp[i][j] koji je korišten u prethodnom poglavlju. Funkcija najTemp se moţe dalje pojednostaviti, ako se temp tretira kao jednodimenzionalni niz od redovi*kolone cijelih brojeva. Ovo je pokazano u sljedećem 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 rečenog o pointerima, moguće je uzeti i adresu funkcije i pohraniti je kao pointer funkcije. Tada se pointer moţe koristiti da indirektno pozove funkciju. Na primjer, int (*Uporedi)(const char*, const char*);
6
Preuzeto i obrađeno by Osnove programiranja u C++ -Aleksandar Karač;
C++ programiranje za srednje škole prof.Smajo Mekić
U liniji 3, uslov petlje pridruţuje sadrţaj src sadrţaju 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 slučaj sa broj sama po sebi adresa prvog elementa niza koji predstavlja. Stoga se elementima varijable broj moţe pristupiti i preko aritmetike sa pointerima na broj, tj. broj[i] je ekvivalentno *(broj+i). Razlika izmeĎu broj i ptr je u tome što je broj konstanta, tako da ne moţe pokazivati ni na šta, dok je ptr varijabla i moţe se iskoristiti da pokazuje na bilo koji drugi cijeli broj.Sljedeći primjer pokazuje kako funkcija najTemp, koja je pokazana u prethodnom poglavlju moţe da se poboljša korištenjem 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 }
98
definiše pointer funkciju koja se naziva Uporedi koja moţe zadrţati adresu bilo koje funkcije koja kao argumente uzima dva konstantna pointera tipa char i vraća cjelobrojnu vrijednost. Takva je, na primjer, funkcija strcmp, koja sluţi za uporeĎivanje stringova. Na taj način imamo: Uporedi = &strcmp; // funkcija Uporedi pokazuje na strcmp // funkciju Operator & nije neophodan i moţe se izostaviti: Uporedi = strcmp; // funkcija Uporedi pokazuje na strcmp // funkciju Kao alternativa, moguće je definisati i inicijalizirati pointer odjednom, kao int (*Uporedi)(const char*, const char*) = strcmp;
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ć
Kada se adresa funkcije pridruţuje 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 moţe koristiti direktno, ili indirektno preko Uporedi. Sljedeća tri poziva su ekvivalentna: strcmp("Suljo","Mujo"); // direktni poziv (*Uporedi)("Suljo","Mujo"); // indirektni poziv Uporedi("Suljo","Mujo"); // indirektni poziv (skraceno) čest slučaj korištenja pointer funkcije je da se prenese kao argument nekoj drugoj funkciji; obično zbog toga što posljednja traţi različite oblike prve u različitim okolnostima. Dobar primjer je binarna pretraţivačka funkcija koja pretraţuje kroz ureĎeni niz stringova. Ova funkcija moţe koristiti funkciju uporeĎivanja (kao što je strcmp) radi uporeĎivanja stringa koji se traţi i niza stringova. No, ovo ne mora da bude prigodno za sve slučajeve. Na primjer,strcmp razlikuje mala i velika slova. Ako bismo ţeljeli da izvršimo pretraţivanje bez razlikovanja malih i velikih slova, onda bismo trebali koristiti drugu funkciju za uporeĎivanje. Kao što je pokazano u sljedećem primjeru, postavljajući funkciju uporeĎivanja kao parametar funkcije pretraţivanja, imamo mogućnost da ih postavimo nezavisno jednu od druge.
99
Pitanja za utvrĎivanje 1. Šta su pointeri ili pokazivači? 2. Koja je razlika u definisanju cjelobrojne varijable i cjelobrojne pointer varijable? 3. Koje je značenje tipa podatka u definiciji pointera? 4. Šta je to null-pointer? 5. Koji operator se koristi da bi se pointer pridruţio adresi neke druge varijable ili konstante? 6. Da li pointer moţe pokazivati na različitu memorijsku lokaciju u različitim vremenskim periodima u programu? 7. Da li na istu memorijsku lokaciju moţe da pokazuje više od jednog pointera? 8. Šta je rezultat inkrementiranja pointer varijable? 9. Šta je to dinamička memorija? 10. Koja je veza pointera i polja? 11. Šta predstavljaju aritmetičke operacije sa pointerima? 12. Objasni pojam funkcijskih pointera?
12.Datoteke Ovo poglavlje pokazuje kako se podaci dobiveni pokretanjem nekog programa mogu sačuvati (pohraniti) na neku datoteku. S obzirom da čuvanje podataka nema svrhu ako tim podacima ne moţemo da pristupamo, biće objašnjeno i kako pročitati podatke sa neke datoteke. 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 obićno nalazi ekstenzija (dio imena iza tačke), koja označava tip podataka u datoteci (npr. .doc za Microsoft Word, .xls Microsoft Excel, .cpp za C++ izvornu datoteku, itd.).
C++ programiranje za srednje škole prof.Smajo Mekić
Linije 1 i 2 predstavljaju potpis funkcije BinTrazi, koja predstavlja poznati algoritam za traţenje kroz sortiranu listu podataka. Lista traţenja je, u ovom slučaju, tabela koja predstavlja polje stringova sa dimenzijom n. Podatak koji se traţi je pod imenom podatak. Linija 2 predstavlja pointer funkciju koja treba da se koristi za uporeĎivanje podatka podatak sa elementima polja. Algoritam za pretraţivanje započinje u liniji 7 koristeći while petlju, i u svakom koraku opseg pretraţivanja polovi. Postupak se zaustavlja kada se granice opsega, označene sa dole i gore, poklope, ili dok se podatak ne naĎe. Podatak se poredi sa srednjim elementom polja (linija 9), i ako se sa njim poklapa, vraća se indeks istog (linija 10). Ako je, pak, podatak manji od srednjeg podatka, pretraţivanje se ograničava na donju polovinu polja (linija 11-12). U suprotnom, pretraţivanje se ograničava na gornju polovinu polja (linija 13-14). U slučaju da nije pronaĎen podatak koji se poklapa sa traţenim, funkcija vraća vrijednost ¡1. Sljedeći primjer pokazuje kako se funkcija BinTrazi moţe pozvati sa strcmp,koji se prenosi kao funkcija za uporeĎivanje. char *gradovi[] = {"Doboj","Kakanj","Sarajevo","Zenica"} cout << BinTrazi("Zenica", gradovi, 4, strcmp) << endl; Rezultat posljednje naredbe bio bi, naravno, 3.
100
U osnovi, postoje dvije vrste datoteka: tekstualne i binarne. Tekstualne datoteke sadrţe tekst, dok binarne mogu sadrţavati i kompleksnije vrste podataka, kao što su slike, izvršni programi, baze podataka, itd. Tekstualnim datotekama je nešto jednostavnije pristupiti, pisati podatke u njih, te čitati sa njih. Upravo to je i razlog zbog čega ce se primjeri u ovom poglavlju odnositi samo na njih. 12.1.Standardna biblioteka fstream
"Životni" ciklus pristupa datotekama Kada program pristupa datotekama, bez obzira da li ih čita, ili na njih piše,ili čini oboje, on prolazi kroz sljedeće korake: Datoteka prvo mora da se otvori. Ovo otvara put u komunikaciji između datoteke i objekta toka u programu (fstream, ifstream, ofstream), koji se koristi u pristupu datoteci. Nakon otvaranja, program čita sa datoteke, piše na nju, ili čini oboje. Na kraju, program zatvara datoteku. Ovo je bitan korak, pošto održavanje komunikacije između datoteke i objekta toka zahtijeva resurse, tako da zatvaranje datoteke oslobađa ove resurse kada više nisu potrebni. Uz to,postoji mogućnost da se kasnije u programu ne može pristupiti datoteci ako prethodno nije zatvorena. 12.2.Otvaranje datoteka Bez obzira da li se sadržaj datoteke treba pročitati ili se na datoteku trebaju ispisati neki podaci, datoteka prvo treba da se otvori. Naredna poglavlja pokazuju kako se to obavlja. Otvaranje datoteke za pisanje Datoteke za pisanje se mogu otvoriti pomoću fstream i ofstream objekata na dva načina: (i) pomoću metode open, ili (ii) pomoću konstruktora (constructor1). Otvaranje pomoću funkcije open Ovaj način otvaranja datoteke postižemo na sljedeći način: 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. MeĎutim,
C++ programiranje za srednje škole prof.Smajo Mekić
U ranijim poglavljima koristili smo standardnu biblioteku iostream (io se odnosi na input/output), koja pored ostalog, daje mogućnost ispisivanja na standardni izlaz (ekran, monitor) pomoću cout, te čitanje sa standardnog upisa (tastatura) pomoću cin. MeĎutim, ova datoteka nam ne omogućava da podatke trajno sačuvamo. U tu svrhu se koristi standardna biblioteka fstream (f se odnosi na datoteku, tj. file), koja omogućava pisanje na i čitanje sa datoteka. Ovo se postiţe pozivanjem sadrţaja datoteke fstream sa: #include Biblioteka fstream definiše 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 može 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 može se koristiti za kreiranje datoteka i pisanje na njih. fstream. Ovaj tip podataka predstavlja općenito tok za datoteke, ima karakteristike i ofstream i ifstream objekata. Pomoću ovog tipa, datoteke se mogu kreirati, može se pisati na njih ali i čitati sa njih.
101
moguće 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 slučaju da ne postoji, ona će se automatski kreirati pod imenom i na lokaciji koju smo upisali. Lokacija se moţe dati kao relativna (relative path) 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 započinje slovom drajva, sadrţavajući sve direktorije i poddirektorije, dok se ne doĎe 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 sljedeći način: ofstream izlaz; izlaz.open("C:\\MFZE\\Busovaca\\ucenici.txt"); Vidimo da se u tom slučaju koriste po dva znaka n, jer samo jedan između 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 sljedećem primjeru: ofstream izlaz; char imeDatoteke[80]; cout << "Unesite ime datoteke: "; cin >> imeDatoteke; izlaz.open(imeDatoteke);
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 slučaju moţemo samo upisivati informaciju na datoteku, ali ne i čitati sa nje.
C++ programiranje za srednje škole prof.Smajo Mekić
Vaţno je zapamtiti da je korištenje relativnog puta bolja opcija, jer se moţe desiti da neki direktorij u apsolutnom putu ne postoji, naročito ako se program koristi na nekom drugom kompjuteru (sa drugačijim rasporedom direktorija). Korištenje drugog argumenta u funkciji open definiše modul u kojem se datoteka treba otvoriti. Neke od opcija (tzv. file mode flag), koje se mogu koristiti date su u Tabeli:
102
MeĎutim, ako se za otvaranje datoteke za pisanje koristi fstream objekat, treba dodati još jedan argument, tj. opcija za pisanje ios::out. U ovom slučaju imamo: fstream izlaz; izlaz.open("ucenici.txt", ios::out); Otvaranje pomoću konstruktor
Otvaranje datoteka za čitanje Sve što je rečeno u prethodnom poglavlju moţe se primijeniti i na otvaranje datoteka za čitanje. Jedina razlika je što se, uz korištenje objekta fstream, umjesto objekta ofstream koristi 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 moţe otvoriti na jedan od sljedećih načina: 1) pomoću ifstream objekta ifstream ulaz; ulaz.open("ucenici.txt"); 2) pomoću fstream objekta fstream ulaz; ulaz.open("ucenici.txt", ios::in); //obavezno dodati argument ios::in 3) pomoću konstruktora ifstream ulaz("ucenici.txt"); fstream ulaz("ucenici.txt", ios::in); Otvaranje datoteka za čitanje i pisanje Kao što je ranije rečeno, objekat fstream se moţe koristiti za otvaranje datoteka i za pisanje i za čitanje. U tu svrhu koristi se sljedeća sintaksa: fstream izlazUlaz; izlazUlaz.open("ucenici.txt", ios::in | ios::out); ili pomoću konstruktora:
C++ programiranje za srednje škole prof.Smajo Mekić
Konstruktori su funkcije koje se automatski pozivaju kada se pokušava kreirati primjerak (eng. instance) nekog objekta (primjerak je prema objektu isto što i varijabla prema tipu podatka). Oni mogu biti opterečeni (eng. overloaded), tako da isti objekat moţe imati konstruktor sa nijednim, jednim, dva, ili više argumenata. U prethodnim primjerima (npr. fstream izlaz;) korištene su naredbe sa konstruktorima bez argumenata. Naredni primjeri pokazuju upotrebu konstruktora sa jednim i dva argumenta, respektivno: ofstream izlaz("ucenici.txt"); fstream izlaz("ucenicii.txt",ios::out); Prvi slučaj zamijenjuje izraz: ofstream izlaz; izlaz.open("ucenici.txt"); a drugi fstream izlaz; izlaz.open("ucenici.txt", ios::out); Primjena konstruktora, u stvari, omogućava definisanje i inicijalizaciju primjerka nekog objekta. Kao i u slučaju definisanja (deklarisanja) i inicijalizacije varijabli, korištenje jednog od načina otvaranja datoteke zavisi od samog programa i naših potreba.
103
fstream izlazUlaz("ucenici.txt", ios::in | ios::out); U oba primjera korišten je bitovni operator i, |, Provjera da li je datoteka otvorena. Prije nego počnemo čitati podatke sa neke datoteke, korisno je znati da li ona uopšte postoji. Provjera se moţe izvršiti na dva načina. Ako se datoteka ne moţe otvoriti za čitanje, onda je: (i) vrijednost ifstream objekta jednaka NULL (nula), (ii) vrijednost funkcije fail objekta ifstream je true(1). Sljedeći primjer ilustruje korištenje oba načina. #include #include using namespace std; int main (){ ifstream ulaz; ulaz.open("ucenici.txt"); cout << "(ulaz) = " << ulaz << endl; cout << "(ulaz.fail()) = " << ulaz.fail() << endl; return 0; }
C++ programiranje za srednje škole prof.Smajo Mekić
Ako datoteka ucenici.txt ne postoji nakon izvršenja programa dobijamo: (ulaz) = 0 (ulaz.fail()) = 1 U slučaju da postoji, izlaz je, na primjer: (ulaz) = 0x22fed4 (ulaz.fail()) = 0 pri čemu 0x22fed4 predstavlja memorijsku lokaciju (adresu) ifstream varijable ulaz.
104
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 ograničenje na broj otvorenih datoteka sa kojima se ne "manipuliše". Zatvranje datoteka se vrši pomoću funkcije close. Sljedeći primjeri pokazuju njenu upotrebu pri zatvaranju datoteka za pisanje i čitanje: ofstream izlaz; izlaz.open("ucenici.txt"); // skup naredbi outfile.close();
C++ programiranje za srednje škole prof.Smajo Mekić
Za razliku od ifstream objekta, ofstream objekat koji pokušava otvoriti datoteku koja ne još postoji nije NULL, a njegova fail funkcija ima vrijednost false(0). To je zbog toga što operativni sistem kreira datoteku, ako ona ne postoji. Ipak, i u ovom slučaju je korisno provjeriti da li datoteka postoji. Naime, ako datoteka postoji, ali ima osobinu read-only2, dobićemo negativan odgovor o njenom postojanju (vrijednost iostream objekta je NULL, a funkcije fail je true, tj. 1).
105
ifstream ulaz; ulaz.open("ucenici.txt"); // skup naredbi ulaz.close(); 12.4.Pisanje na datoteke Pisanje podataka na datoteku se izvodi pomoću operatora za ispisivanje (<<), kao što je to bio slučaj sa ispisivanjem na ekran (cout<<). Jedina razlika je utome što se ovdje koristi fstream ili ofstrem objekat, a ne cout objekat. Sljedeći program pokazuje primjer upisivanja podataka na datoteku ucenici.txt:
C++ programiranje za srednje škole prof.Smajo Mekić
1 #include 2 #include 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 }
106
#include
C++ programiranje za srednje škole prof.Smajo Mekić
U ovom primjeru upis teksta sa tastature je obavljen pomoću funkcijskog člana objekta cin getline() (linija 12), koji kao prvi argument uzima znakovni niz, a kao drugi duţinu istog. Ovim se tekst koji je upisan preko tastature,pridruţuje varijabli podaci, koja je data kao niz od 80 elemenata. U liniji 16 korištena je funkcija ignore() (i ovo je funkcijski član klase iostream), koja u ovom obliku (bez argumenata) ima za cilj da pročita sljedeći karakter pri upisu, ali ga ne pridruţi nijednoj varijabli. To je zbog toga što nema potrebe za pridruţivanjem karaktera, koji označava 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) moţemo dodavati sadrţaj na postojeću datoteku kao što to pokazuje sljedeći primjer. U ovom primjeru zapisivanje se prekida nakon unosa znakova ***.
107
#include #include 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(); }
Analogno prethodnom poglavlju, čitanje podataka sa datoteka obavlja se pomoću operatora za čitanje (>>) kao što je to slučaj sa ispisivanjem sa tastature (cin>>). Sljedeći primjer nadopunjava onaj iz prethodnog dijela, tj. nakon što korisnik upiše informacije na datoteku, program čita iste podatke sa datoteke i ispisuje ih na ekran. 1 #include 2 #include 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;
C++ programiranje za srednje škole prof.Smajo Mekić
12.5.Čitanje sa datoteka
108
Slično primjeru iz prethodnog dijela, podaci se unose pomoću funkcije getline (linija 13) sa nešto drugačijom sintaksom. Ovdje pomenuta funkcija (definisana je kao funkcija, a ne funkcijski član) ima dva argumenta: prvi tipa iostream (cin), a drugi varijabla podaci. Na sličan način se pomoću iste funkcije podaci čitaju sa datoteke (linije 23 i 25), pri čemu je prvi član objekat ulaz tipa ifstream. Prethodni primjer se moţe napisati i na programerski adekvatniji način upotrebom funkcija za čitanje i pisanje na datoteku. #include #include #include 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;
C++ programiranje za srednje škole prof.Smajo Mekić
30 }
109
Iz ovog primjera se vidi da se ifstream i ofstream objekti u funkcijama upisiDatoteku i citajDatoteku prosljeĎuju po referenci, iako nije dna od ovih funkcija ne mijenja sadrţaj datoteke. Razlog leţi u činjenici da unutrašnje stanje objekta toka moţe promijeniti korištenjem open funkcije, iako se sadrţaj ne mijenja. Sukcesivno čitanje Često puta je potrebno pročitati sve podatke sa neke datoteke, pri čemu unaprijed ne poznajemo konačan broj informacija (na primjer, proizvoljan broj vrijednosti neke varijable). U tu svrhu se koristi funkcija eof (od engleske riječi end of file), koja je tačna ukoliko se proĎe posljednja linija u kojoj postoji neka informacija. Sljedeći primjer pokazuje upotrebu ove funkcije u problemu čitanja nizova karaktera (riječi). #include #include 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");
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; }
110
} Linije petlja while, omogućavaju sukcesivno čitanje podataka sa datoteke podaci.txt. Kada se doĎe do posljednje linije sa nekom informacijom, funkcija eof vraća vrijednost true i automatski se izlazi iz petlje. Na analogan način se mogu čitati podaci rasporeĎeni u kolone. Pitanja za utvrĎivanje 1. Nabrojati formate datoteka u kojima se mogu pohraniti podaci! 2. Koja standardna datoteka treba da se pozove kada program piše na datoteku ili čita sa nje? 3. Koji od tri objekta iostream, ifstream, fstream, moţe sluţiti i za upis i za ispis na datoteke? 4. U čemu se suština zatvaranja datoteke? 5. Šta je konstruktor? 6. Da li se stream objekti trebaju proslijediti po vrijednosti ili referenci, i zašto?
13.1.Zadaci pravolinijska struktura Zadatak 1 Potrebno je izračunati 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 pridruţiti ga varijabli A. Sadrţaj varijable prvo treba uvećati za 5, pa umanjiti za 8, na kraju pomnoţiti s 3. Zadatak riješiti upotrebom operatora obnavljajućeg pridruţivanja. 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 svoĎenja rezultata na zajednički tip s operandima. Treba izračunati 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 svoĎenja operanada na zajednički tip. Treba izračunati 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= ....
C++ programiranje za srednje škole prof.Smajo Mekić
13.Zbirka Zadataka
111
Zadatak 12 Na izvor napona U su priključena tri serijski spojena otpornika: R1, R2 i R3. Potrebno je izračunati 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)=
C++ programiranje za srednje škole prof.Smajo Mekić
Sadrzaj varijable kolicnik iznosi: .... Zadatak 6 Treba unijeti godinu roĎenja neke osobe i tekuću godinu. Računaju se godine starosti osobe. Ispis neka bude oblika: Upisi godinu svog rodjenja: Koja je godina sada? Sada imas .... godina. Zadatak 7 Treba izračunati 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 izračunati 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 izračunati 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 ...
112
Zadatak 17 Treba izračunati koliko bi vremena bilo potrebno zvuku da preĎe razmak izmeĎu dva mjesta ako taj isti razmak svjetlost preĎe za t sekundi. Ispis neka bude oblika: Upisi vrijeme (u sek): Svjetlost preĎe 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 izračunati apsolutnu vrijednost unesenog broja. Potom treba provjeriti da li je broj paran. Ako je paran treba izračunati i ispisati njegovu treću potenciju, a ako nije treba ispisati: Broj je neparan.
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 kreće 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 meĎusobno udaljena s kilometara. Izračunati 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 Poluprečnik 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 izračunati snagu P koju mora imati električno kuhalo koje za t minuta moţe vodu mase m grama zagrijati od temperature temp1 do temperature temp2 (temperatura je izraţena 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.
113
Zadatak 4 U pravougli je trouglu poznat ugao alfa (izraţen u stepenima) i kateta a (u cm).Treba izračunati vrijednost hipotenuze c.
Unesi vrijednost ugla alfa u stepenima:
C++ programiranje za srednje škole prof.Smajo Mekić
Unesi broj : Broj ... je paran, a njegova treca potencija iznosi ... ili Broj ... je neparan. Zadatak 2 Treba unijeti dva realna broja pa izračunati i ispisati njihov cjelobrojni kolicnik i ostatak dijeljenja. Potrebno je načiniti i provjeru. Ako je djelitelj 0 treba ispisati odgovarajuću 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 jednačine, pa zavisno o njihovim vrijednostima izračunati i ispisati rješenja. Vaţno je provjeriti vrijednost koeficijenta a, ako je a=0, jednačine nije kvadratna. Treba provjeriti predznak diskriminante jer on odreĎuje hoće li rješenja kvadratne jednačine 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, jednačina nije kvadratna.
114
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 pronaći 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 najvećem. Ispis neka bude oblika: Upisi prvi broj: Upisi drugi broj: Upisi treci broj: Brojevi: ..., ... i ... poredani od najmanjeg ka najvecem: ..., ..., ... Zadatak 8 Treba izračunati jačinu struje, napon ili otpor, prema odabiru korisnika. Za računanje jačine struje treba birati 1, za napon 2, a za otpor 3. Ovisno o tome što se ţeli računati treba unijeti odgovarajuće podatke. Ispis neka bude oblika: Ohmov zakon Za računanje jačine struje upiši 1, za računanje napona upiši 2, a za otpor 3: NPR: U (V)=... R (om)=... Ako je napon ... V, a otpor ... oma, jačina struje iznosi ... ampera Zadatak 9 Program na osnovu unesenog rednog broja mjeseca ispisuje koliko taj mjesec ima dana. U slučaju 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
C++ programiranje za srednje škole prof.Smajo Mekić
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 teče brzinom vr. Kojom se brzinom krece čamac u odnosu na obalu? Za koji ugao će čamac skrenuti sa svoje putanje?
115
2. mjesec ima 28 dana (ili 29 ako je godina prestupna). Zadatak 10 Program na osnovu unesenih vrijednosti stranica trougla računa obim ili površinu, po ţelji korisnika. Za rezultat obima upisuje se 1, a za površinu 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 moţe ostvariti na testu oblikuje bodovnu skalu, a zatim na temelju osvojenog broja bodova na testu, ispisuje odgovarajuću 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.
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 mnoţenja odabranog broja sa brojevima od 1 do 10. Broj bira korisnik. Ispis neka bude oblika: Upisi broj sa kojim zelis mnoziti: ... * 1 = ... ... * 2 = ... ...
C++ programiranje za srednje škole prof.Smajo Mekić
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 * ... * ... * ... * ...
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
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 izračunati njihovu srednju vrijednost. Unos brojeva traje sve dok korisnik ne upiše 0. Primjer riješiti 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 počevši od cifre najmanje teţinske vrijednosti, jednu ispod druge. Ispis neka bude oblika: Upisi prirodni broj: Njegove cifre su: ...
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 savršen (broj je savršen 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 savršene 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 odgovarajuće znakove.Da bi ispis bio u pravilnim stupcima, koristi manipulator setw.
118
... ... 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 najveći uneseni broj. Ispis neka bude oblika: Upisi prirodni broj: Upisi prirodni broj: ... Najveci broj je ... Zadatak 23 Program računa 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
Zadatak 25 Potrebno je ispisati N članova Fibonaccijevog niza. Fibonaccijev niz je niz u kome su prva dva člana jednaka jedan, a svaki sljedeći č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 izračunati najveću zajedničku mjeru dva prirodna broja. Najveća zajednička mjera dva broja je najveći 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 počevši od cifre najveće teţinske vrijednosti, pa od njih sastaviti i ispisati prirodni broj. Unos cifara se prekida kada se unese broj manji od 0 ili veći od 9. Ispis neka bude oblika: Upisi cifru: Upisi cifru:
C++ programiranje za srednje škole prof.Smajo Mekić
Program računa srednju ocjenu uspjeha učenika. Nakon posljednje ocjene treba unijeti 0. U slučaju 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: Pogrešan unos. Ispis neka bude oblika: Srednja ocjena uspjeha je ...
119
Upisi cifru: ... Broj sastavljen od zadanih cifara je ...
Pravolinijska struktura – Rješenje1 #include using namespace std; int main() { float a,b,c,d,srvr; cout<<"Unesi cetiri realna broja"<>a>>b>>c>>d; srvr=(a+b+c+d)/4; cout< using namespace std; int main()
C++ programiranje za srednje škole prof.Smajo Mekić
14.Rješenja
120
{
Pravolinijska struktura - Rješenje3 #include 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)< 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:"< using namespace std; int main() { int a,kolicnik; float b;
C++ programiranje za srednje škole prof.Smajo Mekić
int a; cout<<"Unesi broj:"; cin>>a; cout<
121
cout<<"Unesi prvi broj:"; cin>>a; cout<<"unesi drugi broj:"; cin>>b; kolicnik=a/b; cout<<"Vrijednost izraza a/b= "< using namespace std;
Pravolinijska struktura - Rješenje7 #include 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<>l; r=precnik/2; s=r*r*PI; otpor=ro*l/s; cout<
C++ programiranje za srednje škole prof.Smajo Mekić
int main() { int god,god1,god2; cout<<"Upisi godinu svog rodjenja: "; cin>>god1; cout<<"Koja je godina sada? "; cin>>god2; god=god2-god1; cout<
122
Pravolinijska struktura - Rješenje8 #include 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):";
} Pravolinijska struktura - Rješenje9 #include 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<
C++ programiranje za srednje škole prof.Smajo Mekić
cin>>v1; cout<<"Upisi konacnu brzinu (u m/s):"; cin>>v2; a=(v2-v1)/t; F=m*a; cout<
123
Pravolinijska struktura - Zadatak10 #include 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<
Pravolinijska struktura - Rješenje12 #include using namespace std; int main() { float U,R1,R2,R3,R,I; cout<<"U (V)= "; cin>>U; cout<>R1; cout<>R2; cout<>R3; R=R1+R2+R3; I=U/R; cout<
C++ programiranje za srednje škole prof.Smajo Mekić
}
124
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 "<
C++ programiranje za srednje škole prof.Smajo Mekić
#include 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 "< using namespace std;
125
C++ programiranje za srednje škole prof.Smajo Mekić
Pravolinijska struktura - Rješenje15 #include 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 "<
126
Pravolinijska struktura - Rješenje17 #include 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 "<
C++ programiranje za srednje škole prof.Smajo Mekić
Pravolinijska struktura - Rješenje16 #include 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 "<
127
Struktura grananja - Rješenje2 #include #include 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<
C++ programiranje za srednje škole prof.Smajo Mekić
#include #include 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 "<
128
return 0;
Struktura grananja - Rjeešenje3 #include #include 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= "<
Struktura grananja - Rješenje4 #include
C++ programiranje za srednje škole prof.Smajo Mekić
}
129
#include 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< #include 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<
C++ programiranje za srednje škole prof.Smajo Mekić
{
130
cout< 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
Struktura grananja Rješenje 7 #include using namespace std; int main() {
C++ programiranje za srednje škole prof.Smajo Mekić
{
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 (bmax) { max=b; } if (c>max) { } mid=a; if ((b!=max)&&(b!=min)) { mid=b; } if ((c!=max)&&(c!=min)) { mid=c; } cout<<"Brojevi: "<
C++ programiranje za srednje škole prof.Smajo Mekić
max=c;
132
system("PAUSE");return 0; } Struktura grananja - Rješenje8 #include using namespace std; int main () { cout<<"Omov zakon"<>i; switch (i) { case 1: cout<<"U (V)="; cin>>U; cout<<"R (om)="; cin>>R; I=U/R;
cout<>I; cout<<"R (om)="; cin>>R; U=I*R; cout<<"Ako je jacina struje "<
C++ programiranje za srednje škole prof.Smajo Mekić
cout<<"Ako je napon "<
133
cout<<"U (V)="; cin>>U; cout<<"I (A)="; cin>>I; R=U/I; cout<<"Ako je napon "< using namespace std; int main() { int i; cout<<" Program na osnovu unesenog rednog broja mjeseca ispisuje"; cout<<" koliko taj mjesec ima dana"<>i; switch (i) { case 4: case 6: case 9: case 11: cout<
C++ programiranje za srednje škole prof.Smajo Mekić
cout<<"Upisi redni broj mjeseca: ";
134
case 8: case 10: case 12: cout< #include using namespace std; int main() cout<<"Program na osnovu unesenih vrijednosti stranica trougla racuna "; cout<<" obim ili povrsinu, ovisno o zelji korisnika"<>i; cout<<"a = "; cin>>a; cout<<"b = "; cin>>b; cout<<"c = "; cin>>c; if((a<=0)||(b<=0)||(c<=0))
C++ programiranje za srednje škole prof.Smajo Mekić
{
135
{ cout<<"Vrijednost stranice trougla ne moze biti <=0 " < #include #include using namespace std; int main()
C++ programiranje za srednje škole prof.Smajo Mekić
break;
136
{ float p,i,b, po; cout<<"Program na osnovu osvojenog broja bodova na testu, ispisuje "; cout<<" odgovarajucu ocjenu."<>i; if (i<=0) goto upis; p=i/100; cout<>b; if (b<0 || b>i) cout<<"Neispravan unos, ponovi."; goto upis2; } po=b/p; if (po>=0 && po<=50) cout<
C++ programiranje za srednje škole prof.Smajo Mekić
{
137
dovoljan." <
Struktura grananja - Rješenje12 #include #include using namespace std; int main() { 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" <
C++ programiranje za srednje škole prof.Smajo Mekić
int br, prbr;
138
{ goto kraj; } else { dj1:if(br%prbr==0) { cout<<" * "<
Struktura petlje - Rješenje1 #include using namespace std; int main() {
int brojac,m,n; cout<<"ispis pocinje od broja:"; cin>>m; cout<<"ispis zavrsava brojem:";
C++ programiranje za srednje škole prof.Smajo Mekić
}
139
cin>>n; for (brojac=m;brojac<=n;brojac++) { cout< using namespace std; int main() {
int b, brojac; cout<<"Upisi broj sa kojim zelis mnoziti:"; cin>>b; for (brojac=1;brojac<=10;brojac++) cout<
system("PAUSE"); return 0;
Struktura petlje - Rješenje3 #include #include 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);
C++ programiranje za srednje škole prof.Smajo Mekić
}
140
x2=(-b-sqrt(pom1))/(2*a); cout<<"Rjesenja su realni brojevi x1= "< using namespace std; int main() { int brojac,zbrir; zbir=0;
for (brojac=1;brojac<=100;brojac++) { zbir=zbir+brojac; } cout<
C++ programiranje za srednje škole prof.Smajo Mekić
cout<<"Zbir prvih 100 prirodnih brojeva je:";
141
Struktura petlje - Rješenje5 #include #include 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<
Struktura petlje - Rješenje6 #include 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 "<
C++ programiranje za srednje škole prof.Smajo Mekić
}
142
return 0; }
Struktura petlje - Rješenje8 #include 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 "< using namespace std; int main() { float zbir,brojac,N;
C++ programiranje za srednje škole prof.Smajo Mekić
Struktura petlje - Rješenje7 #include using namespace std; int main() { int brojac,zbir; cout<<"Program sabira sve prirodne trocifrene brojeve."<
143
cout<>N; zbir=0; for(brojac=1;brojac<=N;brojac++) { zbir=zbir+1/brojac; } cout<<"Zbir "<
Struktura petlje - Rješenje10 #include using namespace std; int main() { int N,zbir,brojac; cout<<"Upisi zavrsnu vrijednost raspona:"; cin>>N; zbir=0; cout<<"U intervalu od 1 do "<
Struktura petlje - Rješenje11 #include 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;
C++ programiranje za srednje škole prof.Smajo Mekić
}
144
} cout<<"U intervalu od 1 do "<
Struktura petlje - Rješenje13 #include 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 "<
C++ programiranje za srednje škole prof.Smajo Mekić
Struktura petlje - Rješenje12 #include 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 "<
145
}
Struktura petlje - Zadatak15 #include 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<
C++ programiranje za srednje škole prof.Smajo Mekić
Struktura petlje - Rješenje14 #include 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<
146
Struktura petlje - Rješenje17 #include #include using namespace std; int main() { int znak,red,stupac; znak=32; for(red=1;red<=45;red++) { for(stupac=1;stupac<=5;stupac++) { cout< #include using namespace std; int main() { int i,s,p; s=10; p=40; for(i=1;i<=10;i++) {
C++ programiranje za srednje škole prof.Smajo Mekić
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<
147
cout<
Struktura petlje - Rješenje20 #include 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<
C++ programiranje za srednje škole prof.Smajo Mekić
Struktura petlje - Rješenje19 #include 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: "<
148
Struktura petlje - Rješenje21
#include 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"<0) { i=b%10; s=s+i; b=b/10; } cout<<"Zbir cifara broja "<
Struktura petlje - Rješenje22 #include using namespace std; int main() { int b,max; upis:cout<>b; if (b<=0) goto upis; max=b; while(b>0) { if(b>max) { max=b; } cout<<"Upisi prirodni broj: ";
C++ programiranje za srednje škole prof.Smajo Mekić
}
149
cin>>b; } cout<
#include using namespace std; int main() { float R,br,Ruk1,Ruk; cout<<"Nakon posljednje vrijednosti otpora unijeti 0" <>R; if(R<0) { cout<<"Vrijednost otpora mora biti >0."<0) { br=br+1; Ruk1=Ruk1+1/R; cout<<"Upisi vrijednost otpora u omima: "; cin>>R; } Ruk=1/Ruk1; cout<<"Ukupni otpor "<
using namespace std; int main() { cout<<"Program racuna srednju ocjenu uspjeha ucenika."<
C++ programiranje za srednje škole prof.Smajo Mekić
Struktura petlje - Rješenje23
150
br=0; do { cout<<"Unesi ocjenu: "; cin>>b; if(b==1) { cout<<"Negativan uspjeh."<0); br=br-1; cout<<"Srednja ocjena uspjeha je " <
#include using namespace std; int main() { int prvi,drugi,treci,brojac,N; cout<<"Program ispisuje N clanova Fibonaccijevog niza."<>N; if(N<2) { cout<<"Broj clanova niza mora biti veci ili jednak 2"<
C++ programiranje za srednje škole prof.Smajo Mekić
Struktura petlje - Rješenje25
151
treci=prvi+drugi; cout<<" "<
Struktura petlje - Rješenje26 #include 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"<
Struktura petlje - Rješenje27 #include using namespace std; int main() { cout<<"Program na osnovu unesenih cifara Sastavlja i ispisuje prirodni broj."; < int ci,br;
C++ programiranje za srednje škole prof.Smajo Mekić
}
152
br=0; cout<>ci; while((ci>=0)&&(ci<=9)) { br=br*10+ci; cout<<"Upisi cifru: "; cin>>ci; } cout<<"Broj sastavljen od zadanih cifara je " <
LITERATURA Efikasno programiranje na jeziku C++/Praktični 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 početnike
C++ programiranje za srednje škole prof.Smajo Mekić
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