Professional Documents
Culture Documents
programiranje
za apsolutne poetnike
PRO - MIL
C++ programiranje za apsolutne poetnike Jakopec Ratko, ing PRO-MIL d.o.o. za nakladu, informatiku i edukaciju, Varadin, R. Bokovia 20, 42000 Varadin, tel: 042 / 203 981, 233 971, fax: 042 / 203 991, www.pro-mil.hr Nenad Milija, dipl. inf. Ruica Greguri, dipl. uitelj PRO-MIL d.o.o. Igor Kos, dipl. inf. Ratko Jakopec, ing., Nenad Milija, dipl. inf. Tiskara Varteks, Varadin 953-7156-19-2 PRO-MIL d.o.o. za nakladu, informatiku i edukaciju, Varadin
Sva prava pridrana. Nije dozvoljeno kopirati ili reproducirati ni jedan dio knjige u bilo kojem obliku bez prethodne pismene dozvole nakladnika. Sve o emu smo pisali u ovoj knjizi, uspjeno je primijenjeno na raunalima, stoga ne snosimo nikakvu odgovornost za eventualnu tetu koja bi se mogla povezati s uputama iz knjige. U ovoj knjizi objanjen je program Dev C++, autora: Colin Laplace, Mike Berg, Hongli Lai. Program se nalazi na priloenom CD-u, slobodan je za objavljivanje i umnoavanje. Pojmovi za koje se zna da su zatitni znakovi napisani su poetnim velikim slovom. Nakladnik ne moe provjeriti tonost niti eli utjecati na vjerodostojnost zatitnih znakova.
PRO - MIL
PRO - MIL
Sadraj
Objekti
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
Sadraj
Uvod
to je to program, a to programiranje? Je li teko nauiti programirati? Zato ba C++? Zato ba Dev-C++? Kako se ui programiranje? Kako dalje nakon ove knjige? Instaliranje Dev-C++ programskog okruenja Formiranje radne mape Instalacija grafike
7 8 8 9 10 10 10 12 20 22 25 26 32 34 38 40 42 43 47 49 53 54 58
PRO - MIL
Na prvi program
Formiranje projekta Mogui problem Pokretanje programa Greka u programu Analiza programa Gruba skica programa Varijacije programa Distribucija programa Uitavanje spremljenog projekta
Varijable
Osnovne raunske operacije Varijable
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Analiza programa Varijacije programa Problem dijeljenja Uljepavanje programa Nekoliko primjera programa
Grafika
Podeavanje programskog okruenja Na prvi grafiki program Analiza programa Varijacije programa Crtanje pravokutnika Crtanje crte Crtanje toke Ispis teksta
Donoenje odluke
Funkcije Donoenje odluke Switch naredba
Petlje
For petlja Do while petlja Generator sluajnih brojeva Koritenje sluajnih brojeva
PRO - MIL
Sadraj
Polja
Jednodimenzionalna polja Spremanje brojeva u datoteku Dvodimenzionalna polja
183 184 204 212 215 216 223 234 246 247 248 251 252 262 265 276 278 280 283 284 288 301 302
PRO - MIL
Obrada teksta
String objekti Polje char tipa Obrada string objekata Premjetanje teksta iz char polja u string Premjetanje teksta iz stringa u char polje Spremanje teksta u datoteku
Objekti
Jednostavan primjer klase i objekata Sloeniji primjeri klasa i objekata Komunikacija s metodama Razdvajanje deklaracije i definicije Uporaba konstruktora Nasljeivanje
Veliki program
Jednostavna igra u jednoj datoteci Jednostavna igra u vie datoteka
Saimanje koda
Primjeri saetog pisanja koda
PRO - MIL
Uvod
Objekti
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
Uvod
to je to program, a to programiranje?
Program je niz uputa raunalu o tome kako da napravi odreeni posao. Posao moe bit voenje skladita, izraun plae radnicima ili pretvaranje slike u boji u crno bijelu sliku. Programiranje je pisanje tih uputa. Za pisanje uputa odnosno programa koriste se odreene naredbe. Skup naredbi koje ine cjelinu naziva se programski jezik. Budui da su naredbe pisane naim jezikom, a raunalo razumije samo nule i jedinice, program se nakon pisanja mora prevesti u oblik razumljiv raunalu. Taj postupak se naziva prevoenje. Na engleskom jeziku naziva se Compile. Hrvatski programeri taj postupak obino nazivaju kompajliranje. U programu koji emo mi koristiti, postupak prevoenja naredbi u oblik razumljiv raunalu naziva se kompajlaj, a ovoj knjizi koristit emo izraz prevoenje. Da bismo uspjeno programirali, oigledno je da nam treba program u kojem emo program pisati i program koji e napisani program prevesti u oblik razumljiv raunalu. U dananje vrijeme sve te funkcije, a i mnoge dodatne objedinjene su u jedan program koji emo u ovoj knjizi nazivati programska okolina. On e nam omoguiti pisanje programa, prevoenje programa u oblik razumljiv raunalu, traenje greaka i pokretanje programa. Postoji cijeli niz takvih programa, a mi emo koristiti Dev-C++.
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Zbog svega toga trebat e nam dvije do tri godine svakodnevnog rada da bismo koliko - toliko nauili programirati. Pod pojmom nauiti programirati ne mislim na dobivanje dvojke u koli ili pisanje programa za zbrajanje dva broja. Pod pojmom nauiti programirati mislim na to da smo u stanju napisati program koji zadovoljava neije potrebe i taj netko nam je spreman za to platiti. Nema puno smisla rei da znam programirati, ali ne znam napraviti nita za to bi netko bio spreman platiti. Zbog svega toga vano je da smo radini i strpljivi. Nemojmo iz injenice da prva tri mjeseca neemo puno toga razumjeti, zakljuiti da nismo nadareni za programiranje i odustati. Nakon tri mjeseca neemo puno toga razumjeti, ali nakon tri godine sasvim sigurno hoemo. Ovim uvodom vas nisam htio preplaiti, ve sam vas htio ohrabriti da ustrajete u uenju programiranja, iako e vam se na poetku moda initi da nita ne razumijete i da sporo napredujete.
Zato ba C++?
Zato to je to trenutno najraireniji jezik, osobito u profesionalnoj uporabi. U raunalstvu se klonite ekskluzivnosti. Ako vas veseli da budete posebni, obrijte glavu ili obojite kosu na zeleno. Imate bezbroj mogunosti, ali kad su raunala u pitanju, najbolje je koristiti raunalo koje koristi veina i programski jezik koji koristi veina. U tom sluaju lako dolazimo do programa, lako dolazimo do literature, puno ljudi se razumije u to pa moemo dobiti savjet. Konano, ako traimo posao u smislu da programerska ekipa treba jo jednoga (jednu), vea je vjerojatnost da oni ve koriste sustav s kojim znamo raditi. Bjeite od genijalnih raunala, revolucionarnih sustava i drugaijih razmiljanja. Zamislite koliko je ugodno ivjeti u malom gradu i biti jedini vlasnik takvog genijalnog sustava. Nema literature, nema programa, nema savjeta i kad konano savladamo rad u takvom sustavu nitko nas ne treba jer svi rade na nekim drugim sustavima. Iako po mom sudu C++ ima niz prednosti u odnosu na druge jezike, nemojmo se suvie optereivati time koji emo jezik zapoeti uiti i koju inaicu tog jezika. Glavni problem je nauiti jedan jezik, a kad nam to uspije, ako se ukae potreba, lako emo prijei na drugi. Da bi netko tko nikad nije programirao nauio jedan jezik, treba mu do tri godine, ali kad ve jedan jezik nauimo, da bismo nauili drugi, dovoljno nam je do tri mjeseca. Nauivi jedan jezik, poinjemo razumijevati kako se programira, a to je najtee i najdulje traje. Najlake je nauiti nove naredbe ili bolje reeno novi nain pisanja slinih naredbi u drugom jeziku.
PRO - MIL
Uvod
Zato ba Dev-C++?
Programsko okruenje koje emo koristiti za pisanje naih programa naziva se Dev-C++. Zato sam odabrao upravo ovo okruenje? Zato to je besplatno, ugodnog izgleda, na hrvatskom jeziku i malih dimenzija. Zbog toga to je malih dimenzija, zadovoljavajue e raditi i na starijim raunalima, a nove inaice mogue je u prihvatljivom vremenu uitati s interneta i pomou spore internetske veze. Iako je taj program relativno malih dimenzija, posjeduje sve osobine koje su potrebne za uenje programiranja, a mogao bi posluiti i za manje sloeno profesionalno programiranje.
Kako se ui programiranje?
Programiranje se ne ui tako da se naui sadraj neke knjige, a zatim se eventualno neto radi na raunalu. Programiranje se ui tako da se ukljui raunalo, otvori knjiga, ita sadraj knjige i istovremeno prikazano u knjizi nastojimo napraviti na raunalu. Nakon to smo odreenu naredbu shvatili, nismo zavrili s uenjem. Nakon toga treba napraviti nekoliko desetaka manjih programa u kojima emo tu naredbu koristiti da bismo stekli rutinu u njenom koritenju.
10
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
ma, prouite upute za njegovo koritenje. Naravno, te upute ne moraju biti u obliku tiskane knjige. Najee e biti u obliku teksta na raunalu. - Programi rade unutar nekog operacijskog sustava, najee Windowsa ili Linuxa. Da bi mogli pisati programe za pojedine operacijske sustave, moramo razumjeti kako ti sustavi funkcioniraju pa emo morati nabaviti knjigu koja govori o strukturi operacijskog sustava za koji elimo pisati programe. - Dobro je nabaviti i knjige koje govore openito o programiranju i o nainima rjeavanja pojedinih programskih problema. elimo li napisati program koji sortira odreenu grupu podataka na odreeni nain, ne moramo ga izmiljati. Drugi ljudi prije nas susreli su se s problemom sortiranja i o tom problemu napisali knjige u kojima iznose optimalna rjeenja za pojedine probleme. - S vremenom emo se specijalizirati za pojedine teme, npr. za pisanje igara, za grafiku, za obradu zvuka ili neto slino, pa je dobro nabaviti knjigu koja govori o toj problematici. Dakle, kad se detaljno upoznamo s nekim programskim jezikom, kad upoznamo odreeni operacijski sustav, kad se upoznamo s programerskim tehnikama i odreenim programerskim podrujem, tek emo onda biti sposobni pisati kvalitetne komercijalne programe, odnosno programirati za novce. Zbog toga sam na poetku rekao da nam treba dvije do tri godine da nauimo programirati. U ovom trenutku to vam moda zvui obeshrabrujue, ali ako sve to savladate, stei ete vjetinu kojom ne vlada ba svatko i koja ima svoju trinu cijenu.
PRO - MIL
11
Uvod
Nakon klika na Program zapoet e instaliranje Dev-C++ programa. Program e nas prvo upozoriti da ne smijemo instalirati program, ako je program ve instaliran. Ako zbog nekog razloga instalaciju elimo ponoviti, moramo deinstalirati stari program, a tek nakon toga moemo ga ponovo instalirati.
Ako je Dev-C++ program ve instaliran, zaustavit emo postupak instalacije i deinstalirati staru inaicu programa. Ako Dev-C++ nije instaliran na naem raunalu, klikom na U redu nastavljamo instalaciju.
12
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj 2 - Klikom na OK nastavljamo instalaciju. Klikom na Prihvaam izjavljujemo sa se slaemo s uvjetima koritenja programa.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
1 - Izaberemo jezik.
13
Uvod
Ovdje bismo mogli izabrati komponente koje emo instalirati. Mi neemo nita mijenjati. Samo kliknemo na Dalje.
14
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Kliknemo na Da. Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
PRO - MIL
15
Uvod
Kliknemo na Kraj.
Kliknemo na U redu.
16
PRO - MIL
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
17
Uvod
Klik na Next.
Nakon klika na Next zapoet e instaliranje nekih dodatnih funkcija. Na sporijim raunalima taj proces moe trajati i do pola sata, a na brima nekoliko minuta.
18
PRO - MIL
PRO - MIL
Objekti
Obrada teksta
Polja
Klikom ovdje ugasimo ovaj prozor. Time je instaliranje Dev-C++ programa zavreno.
Petlje
Varijable
Na prvi program
Uvod
19
Uvod
Klik na disk na kojem elimo otvoriti novu mapu, u mojem sluaju na C: disk.
20
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Unesemo naziv mape, u mojem sluaju Radni. Ako je sve u redu, na C: disku trebala bi biti formirana mapa pod nazivom Radni.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
21
Uvod
Instalacija grafike
Da bi Dev-C++ mogao koristiti naredbe za rad s grafikom, runo moramo dodati nekoliko datoteka.
Nakon instaliranja programa Dev-C++, na disku C: u mapi Dev-Cpp nalazit e se mapa include i mapa lib.
Na CD-u priloenom uz knjigu u mapi Grafika nalazi se mapa include i mapa lib.
22
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Sadraj mape include na CD-u kopiramo u mapu include na C: disku. Sadraj mape lib na CD-u kopiramo u mapu lib na C: disku. Bude li potekoa s instaliranjem programa, pogledajmo filmove na kojima moemo vidjeti cijeli tijek instalacije, a nalaze se na priloenom CD-u.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
23
Na prvi program
24
PRO - MIL
PRO - MIL
Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Na prvi program
Objekti
Sadraj
25
Na prvi program
Formiranje projekta
Prilikom svakog pokretanja programa pojavit e se prozor sa sugestijama koje e nam olakati koritenje programa.
1 - Kliknemo na Datoteka.
Program je dio vee cjeline koja se naziva projekt. Zbog toga emo pisanje programa zapoeti formiranjem novog projekta. Pogledajmo kako emo formirati novi projekt.
3 - Izaberemo Projekt.
2 - Izaberemo Nova.
26
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti 5 - Biranje zavravamo klikom na OK. 4 - Ovdje odredimo da e na projekt sadravati C++ program. Obrada teksta Polja 3 - Ovdje unosimo naziv projekta. Na poetku moemo ostaviti naziv koje je predloilo raunalo, a to je Projekt1. Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Otvorit e se novi prozor koji se naziva Novi projekt i u kojem emo izabrati tip projekta. Najvaniji tipovi su Windows Application i Console Application. U emu je razlika? Windows Application izvodi se unutar klasinog windows prozora. Prednost ovog naina pisanja jest to emo dobiti program koji e izgledati kao svaki drugi windows program. Nedostatak mu je to je ovaj nain pisanja programa neto sloeniji, pa je manje prikladan za poetnike. Console Application ne izvodi se unutar klasinog windows prozora, ve unutar pojednostavljene verzije s crnom pozadinom. Nedostatak ovog naina pisanja programa jest to je program veoma ruan i to taj oblik prozora ima manje mogunosti od klasinog prozora. Jedina prednost mu je to je jednostavan, pa je prikladniji za poetnike.
1 - Izaberemo Basic.
PRO - MIL
27
Na prvi program
Sada emo izabrati mapu u koju emo spremiti na projekt. Najbolje je da ga spremimo u prije pripremljenu praznu mapu.
Kliknemo ovdje.
1 - Izaberemo disk na koji emo spremiti na projekt u prije pripremljenu praznu mapu. U mojem sluaju to je disk C. Kliknemo na njega. (Na mojem raunalu disk C naziva se Podaci. Na vaem raunalu moe imati drugaije naziv. Naziv diska nije vaan, vano je da izaberemo onaj disk na kojem smo prije toga pripremili prazni prostor, kao to je opisano u uvodnom poglavlju ove knjige.)
2 - Kliknemo na Spremi.
28
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja 1 - Ovdje bi se trebao nalaziti naziv prostora u koji emo spremiti na C++ projekt. 2 - Klik na Spremi. Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod 2 - Sadraj ovog prozora na vaem raunalu bit e sasvim sigurno drugaiji nego na mojem, budui da njegov sadraj ovisi o programima koji su instalirani u raunalu i nainu koritenja raunala. Nemojte brinuti zbog toga. 3 - Pronai emo mapu Radni i kliknuti na nju. (Ako mapu Radni niste do sada formirali, formirajte je prema uputama danim u uvodnom poglavlju. 4 - Klik na Otvori.
1 - Ovdje bi se trebala nalaziti oznaka diska na kojem smo pripremili prazni prostor za smjetaj naeg projekta.
PRO - MIL
29
Na prvi program
Raunalo e automatski generirati jednostavan C++ program i time je otvaranje projekta zavreno.
U programu bismo se lake snalazili kad bi se ispred svakog reda u programu nalazio broj reda. Pogledajmo kako emo ukljuiti tu mogunost.
1 - Kliknemo na Alati.
30
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Vidimo da se sada ispred svakog reda u programu automatski ispisuje broj reda. Polja Petlje Donoenje Grafika odluke Varijable 3 - Kliknemo na OK. Na prvi program Uvod 2 - Kliknemo na kvadrati ispred opcije Brojevi linije.
PRO - MIL
31
Na prvi program
Mogui problem
1 - Ovo je prije spremljeni projekt.
Prilikom isprobavanja programa moe nam se dogoditi da pokuamo u prostor za spremanje projekta spremiti novi projekt, iako projekt pod tim nazivom ve postoji u tom prostoru. U istom prostoru ne moe biti vie projekta s istim imenom. U tom sluaju, ako elim zadrati stari projekt, novom projektu moramo dati neki drugi naziv, npr. Projekt2.dev.
3 - Klik na Spremi. 2 - Ovo je novi projekt. Ako elimo zadrati stari, moramo mu promijeniti naziv. Ako stari projekt ne elimo zadrati, ostavimo postojei naziv.
1 - Ako novi projekt ima isti naziv kao i stari jer stari projekt ne elimo zadrati, raunalo e nas upozoriti da e stari projekt biti obrisan.
32
PRO - MIL
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << "Ovo je moj tekst." << endl; system("PAUSE"); return 0; }
Na poetku e nam se esto dogaati da umjesto toke sa zarezom ovdje unesemo dvotoje to e uzrokovati greku u programu.
PRO - MIL
Desnu emo dobiti tako da pritisnemo AltGr i, ne putajui tu tipku, pritisnemo tipku n.
Objekti
Lijevu vitiastu zagradu dobit emo tako da pritisnemo tipku AltGr i ne putajui tu tipku, pritisnemo tipku b.
Obrada teksta
Polja
Petlje
To emo uiniti paljivo jer i najmanja greka moe prouzrokovati greku u programu.
Varijable
Umjesto programa koji je generiralo raunalo prilikom otvaranja novog projekta, unesemo ovakav program.
Na prvi program
Uvod
Sadraj
33
Na prvi program
Pokretanje programa
Ve smo rekli da raunalo razumije samo nule i jedinice. Svi sadraji, muzika, filmovi, slike itd. moraju biti prevedeni u nule i jedinice da bi ih raunalo razumjelo. Tako je i s programom. Da bi raunalo razumjelo na program, najprije ga iz oblika koji smo upravo napisali moramo prevesti u nule i jedinice, a tek nakon toga moemo narediti raunalu da ga pokrene. Taj postupak prevoenja na engleskom se jeziku naziva Compile, a prevoditelj naeg C++ programskog okruenja preveo je to sa Kompajlaj. Mi emo u naoj knjizi za taj postupak koristiti izraz prevoenje. U naem programskom okruenju imamo tri vane naredbe vezane uz prevoenje i pokretanje programa.
Ovo je prevedeno kao Kompajlaj. Izaberemo li ovu opciju, na program e se prevesti u oblik razumljiv raunalu, ali se nee pokrenuti. elite li tako prevedeni program pokrenuti, morate izabrati opciju Pokreni.
Ovo je prevedeno kao Pokreni. Ovu opciju moemo koristiti samo ako smo program ve preveli i elimo ga jo jednom pokrenuti.
Ovo je prevedeno kao Kompajlaj i pokreni. Ve iz naziva vidimo da je ovdje prevoenje i pokretanje objedinjeno. Izaberemo li ovu opciju, na program e se prevesti i odmah pokrenuti. Prvi put emo odabrati ovu opciju.
34
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Ovdje se nalazi naziv naeg programa, main.cpp. Iako bismo taj naziv mogli promijeniti, na poetku je najbolje da zadrimo naziv koji je predloilo raunalo. Obrada teksta Polja Petlje Donoenje Grafika odluke Mjesto na koje e raunalo spremiti na program. 3 - Prevoenje i pokretanje naeg programa zapoet emo klikom na Spremi. Varijable Na prvi program Uvod 2 - Otvara se prozor u kojem nas raunalo pita kamo i pod kojim nazivom emo spremiti na program. Raunalo e predloiti da to bude ono isto mjesto u koje smo spremili projekt to emo mi prihvatiti.
PRO - MIL
35
Na prvi program
Nakon klika na Kompajlaj i pokreni najprije e se otvoriti prozor u kojem emo moi pratiti tijek prevoenja naeg programa u nule i jedinice razumljive raunalu.
Nakon prevoenja program e se pokrenuti unutar ovakvog prozora. Ovaj na program ispisuje tekst Ovo je moj tekst. Tekst Press any key to continue raunalo je generiralo automatski i njime nas obavjetava da je dovoljno pritisnuti bilo koju tipku na tipkovnici i prozor u kojem se izvrio na program e se zatvoriti.
36
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Ako ne elimo zadrati stari program, pa smo u prethodnom koraku kliknuli na Spremi bez da smo mijenjali novom programu naziv, raunalo e nas jo jednom upozoriti da e stari program biti obrisan. 1 - Kliknemo na Yes. Stari program e se obrisati, novi e se spremiti, a zatim e zapoeti prevoenje i pokretanje novog programa. Tijek prevoenja i pokretanja programa moemo vidjeti na prethodnoj stranici. Donoenje Grafika odluke Varijable Na prvi program Uvod
Mogui problem
Tijekom rada moe nam se dogoditi da nam raunalo predloi neki naziv programa, iako ve u tom prostoru postoji program s istim nazivom. U tom sluaju, ako elimo zadrati stari program, novom emo dati neki drugi naziv npr. main2.cpp i kliknut emo na Spremi. Ako stari program ne elimo sauvati, ostavit emo novom programu naziv main.cpp i kliknut emo na Spremi.
main.cpp
PRO - MIL
37
Na prvi program
Greka u programu
Gotovo je nemogue unijeti program, a da se tijekom unosa ne pojavi greka. Pogledajmo to e se dogoditi ako pokuamo pokrenuti program u kojem je dolo do greke prilikom unosa.
1 - Kad raunalo naie na greku, prevoenje programa se zaustavlja i raunalo oznaava red u kojem je dolo do greke.
2 - Istovremeno se otvara prozor u kojem moemo vidjeti dodatne informacije o uoenoj greki. Ovdje moemo vidjeti sugestiju da umjesto dvotoja treba staviti toku sa zarezom.
38
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj 1 - Ovdje je dolo do greke jer nismo unijeli toku sa zarezom. Kad takav program pokuamo prevesti i pokrenuti, kao pogrean bit e oznaen deveti red, jer je u njemu greka primijeena, iako se greka zapravo nalazi u osmom redu. Zato imajmo na umu da je oznaavanje redova u kojim se pojavila greka samo gruba orijentacija, a ne precizni pokazatelj.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Oznaavanje pozicije greke prilino je nepouzdano budui da raunalo zapravo ne oznaava poziciju greke, nego poziciju na kojoj je greka primijeena. Pogledajmo ovaj primjer.
Uvod
39
Na prvi program
Analiza programa
#include <cstdlib> #include <iostream>
Ove naredbe emo pisati na poetku svakog C++ programa. Zato? C++ organiziran je tako da su njegove naredbe organizirane u grupe ili, kako bi programeri rekli, biblioteke i na poetku programa moramo rei raunalu koje biblioteke naredbi namjeravamo koristiti. #include - ovo je naredba kojom na poetku programa obavjetavamo raunalo koje biblioteke naredbi elimo koristiti. iostream - skup naredbi koje nam omoguuju komunikaciju s programom, npr. ako to ne bismo ukljuili, ne bi bio mogu ispis teksta Ovo je moj tekst. na ekran. cstdlib - biblioteka standardnih naredbi.
Postoji mnotvo biblioteka naredbi. Moglo bi se dogoditi da se u dvije razliite biblioteke nau dvije naredbe istog naziva, a razliite namjene. Ovom naredbom obavjetavamo prevoditelja da emo koristiti standardne nazive naredbi.
int main()
Naredba int main() oznaava da na ovom mjestu poinje sam program. Ono to smo pisali prije te naredbe ne smatra se programom, nego uputama prevoditelju kako e prevesti program koji slijedi, npr. koje biblioteke naredbi e koristiti prilikom prevoenja.
40
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Ovom naredbom nareujemo raunalu da stane i eka tako dugo dok ne pritisnemo neku tipku. system("PAUSE"); Da bismo bolje razumjeli ovu naredbu, obrisat emo ovaj red u programu, a zatim emo prevesti i pokrenuti program klikom na Kompajlaj i pokreni. return 0; Ova naredba oznauje kraj programa. Nakon te naredbe program se gasi. } Ova vitiasta zagrada oznaava kraj prostora unutar kojeg se nalazi program. Donoenje Grafika odluke Varijable Na prvi program Ovaj red sadri dvije naredbe. Prvom naredbom nareujemo raunalu da tekst koji se nalazi unutar navodnika ispie na zaslonu raunala. Drugom naredbom nareujemo raunalu da prijee u novi red. cout << "Ovo je moj tekst." << endl; Uvod
{ } - Iako neveliki, ovo su jako vani dijelovi programa. Oznauju prostor unutar kojeg se nalazi program, { oznauje poetak, a } kraj programa.
PRO - MIL
41
Na prvi program
Ovo je poetak programa. Ove naredbe pisat emo na poeku svakog naeg programa. Kasnije emo ovdje dodati jo neke naredbe. Iako smo objasnili emu slue pojedine naredbe, trenutno nije bitno da tono poznajemo znaenje svake od njih. Dovoljno je da znamo da te naredbe moramo napisati na poeku svakog naeg programa i da ih tono napiemo.
Ovdje se nalazi glavni dio naeg programa i u ovom dijelu odreujemo to e na program raditi. cout << "Ovo je moj tekst." << endl; U iduim vjebama gornji i donji dio uglavnom neemo dirati, a sve bitno zbivat e se u ovom dijelu programa.
Ovo su naredbe koje piemo na kraju programa. Slino kao to je to sluaj s naredbama na poetku programa, vrlo rijetko emo ih mijenjati i trenutno nije bitno da u potpunost razumijemo znaenje svake od tih naredbi. system("PAUSE"); return 0; } Dovoljno je da znamo da te naredbe moramo napisati na kraju programa da bi program normalno radio.
42
PRO - MIL
Varijacije programa
Jedna od najboljih metoda koje nam pomau da bolje razumijemo funkcioniranje programa i pojedinih naredbi jest da u program unosimo manje izmjene, a zatim opaamo kakve posljedice e takve izmjene izazvati.
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << "Ovo je moj tekst." << endl; system("PAUSE"); return 0; }
Kao to smo ve vidjeli, pokrenemo li ovaj program, na zaslonu raunala dobit emo ovakav rezultat.
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << "OVDJE STAVLJAMO TEKST." << endl; system("PAUSE"); return 0; }
Promijenimo li ovaj red dobit emo ovakav rezultat. Oigledno je da je funkcija ovog reda u programu ispis teksta koji se nalazi unutar navodnika i da taj tekst moemo po volji mijenjati.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
43
Na prvi program
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << "Jaa jesm nism ghgh." << endl; system("PAUSE"); return 0; }
Promijenimo ponovno ovaj red i pokrenimo program. Dobit emo ovakav rezultat. Oigledno je da ovim redom u programa nareujemo raunalu da ispie tekst unutar navodnika na zaslon raunala, ali da raunalo ne ulazi u to ima li taj tekst smisla ili nema.
Iako raunalo ne ulazi u smisao teksta koji smo napisali unutar navodnika, ovdje ipak postoji jedno ogranienje, a to je da unutar navodnika ne smijemo koristiti navodnik. Navodnici oznauju poetak i kraj teksta, pa bi raunalo navodnik unutar teksta smatralo krajem teksta, a sadraj iza tog navodnika grekom. Preuredimo ovaj red i pokuajmo program pokrenuti. Vidjet emo da e raunalo dojaviti greku.
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << "Jaa jesm " nism ghgh." << endl; system("PAUSE"); return 0; }
44
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj #include <cstdlib> #include <iostream> using namespace std; int main() { cout << "Ovo je moj tekst." << endl ; system("PAUSE"); return 0; } #include <cstdlib> #include <iostream> using namespace std; int main() { cout << "Ovo je moj tekst."; system("PAUSE"); return 0; } Da bismo bolje razumjeli njegovu funkciju, obriemo ovaj dio programa. Nova inaica programa trebala bi ovako izgledati. Klikom na Kompajlaj i pokreni pokrenemo program. Ovako bi trebao izgledati rezultat izvoenja ove inaice programa. Program radi i bez obrisanog dijela, ali nakon ispisa naeg teksta raunalo nije skoilo u novi red, nego je sljedei tekst nastavilo pisati u istom redu. Oigledno da je << endl naredba za skok u novi red.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Vratimo na program u prvobitno stanje, a zatim ga pokrenimo klikom na Kompajlaj i pokreni. Ovako e izgledati rezultat rada naeg programa.
Varijable
Na prvi program
Uvod
45
Na prvi program
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << "Ovo je moj tekst." << endl; cout << endl; system("PAUSE"); return 0; }
Postavlja se pitanje ako s << endl nareujemo raunalu da skoi u novi red, bi li s vie takvih naredbi u nizu vie puta skoilo u novi red. Pogledajmo to e se dogoditi ako u na program dodamo jo jednu << endl naredbu.
Vidimo da se je dogodilo ono to smo oekivali. Izmeu prvog i drugog reda teksta pojavio se je jedan prazni red. #include <cstdlib> #include <iostream> using namespace std; int main() { cout << "Ovo je moj tekst." << endl; cout << endl; cout << endl; cout << endl; system("PAUSE"); return 0; } Dodajmo u na program jo nekoliko << endl naredbi.
Pokrenemo li takav program vidimo da se je razmak izmeu dva reda u programu poveao.
46
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Iako nevelik, ovo je JAKO vaan dio programa. Oznaava kraj naredbe ili grupe naredbi koje ine cjelinu. Na prvi program Uvod
Vie naredbi << endl moemo napisati i unutar jednog reda. Pokrenemo li ovu inaicu programa, uvjerit emo se da daje isti rezultat kao i prethodna.
int main() { cout << "Ovo je moj tekst." << endl << endl << endl << endl; system("PAUSE"); return 0; }
Pogledajmo sada podrobnije red u kojem se nalaze naredbe za ispis teksta i skok u novi red.
Propisana rije kojom obavjetavamo raunalo da emo sadraj koji slijedi poslati na neku izlaznu jedinicu, u naem sluaju na zaslon raunala. Uoimo da naredbu << endl ne moemo koristiti ako prije nismo stavili naredbu cout.
Ove oznake obvezno se stavljaju ispred sadraja koji e iz raunala ii na neku izlaznu jedinicu, npr. zaslon raunala.
Tekst unutar navodnika ispisat e se na zaslon raunala. Uoimo da ovaj dio ini cjelinu sa << oznakama i da bez tih oznaka nee funkcionirati.
Ovom naredbom nareujemo raunalu da prilikom ispisa skoi u novi red. Uoimo da ova naredba ini cjelinu s << oznakama.
PRO - MIL
47
Na prvi program
Distribucija programa
Nakon to nae programersko remek djelo proradi, osjetit emo potrebu na program podijeliti s prijateljima ili ga staviti na internet. Postavlja se pitanje to moramo uiniti da bi na program proradio i na prijateljevom raunalu. Prilikom prevoenja programa programsko okruenje iz naeg programa generira prevedeni program koji sadri sve elemente koji su mu potrebni da bi se samostalno pokrenuo u windows programskom okruenju kao i svaki drugi windows program. A gdje se nalazi prevedena inaica naeg programa? Otvorimo Windows Explorer i u njemu otvorimo mapu u koju smo koristili tijekom prevoenja programa. U naem sluaju to je Radni mapa na C disku.
Datoteka s nastavkom exe sadri na preveden program koji moe samostalno raditi u windows okruenju. Dovoljno je da tu datoteku poaljemo prijatelju koji e ju pokrenuti dvostrukim klikom mia.
48
PRO - MIL
Na projekt e se spremiti prilikom prevoenja programa. Ako projekt elimo spremiti bez da smo program preveli, kliknemo na ikonu Spremi.
Spremljeni projekt moemo uitati u nae programsko okruenje na vie naina. Na najjednostavniji nain moemo uitati nekoliko prethodnih spremanja.
PRO - MIL
1 - Kliknemo na Datoteka.
Objekti
Obrada teksta
Polja
Petlje
Ako pokuamo ugasiti programsko okruenje, a da nismo spremili program, raunalo e nas upozoriti.
Varijable
Na prvi program
Uvod
Sadraj
49
Na prvi program
elimo li u nae programsko okruenje uitati program koji ne moemo uitati na nain koji smo vidjeli na prethodnoj stranici, uitat emo ga na neto sloeniji nain.
1 - Kliknemo na Datoteka.
1 - Otvorit e se dodatni prozor u kojem emo izabrati mapu u kojoj se nalazi projekt i naziv projekta.
4 - Kliknemo na Otvori.
50
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Da bismo na program vidjeli, ovdje kliknemo na naziv programa, u naem sluaju to je main.cpp.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Nakon to se spremljeni projekt uitao, mogli bismo biti zbunjeni injenicom da ga ne vidimo u prostoru u kojem smo oekivali da emo ga vidjeti.
Na prvi program
Uvod
51
Varijable
52
PRO - MIL
PRO - MIL
Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Varijable
Objekti
Sadraj
53
Varijable
Sada emo raunalo iskoristiti za raunanje. Unesimo ovaj program u C++ programsko okruenje. Klikom na Kompajlaj i pokreni ga pokrenemo. Dobit emo ovakav rezultat.
Ovaj program zbraja broj 2 i broj 3, a rezultat koji je u ovom sluaju broj 5 ispisuje na zaslon. Pogledajmo vog programa. sada #include <cstdlib> #include <iostream> using namespace std; int main() { cout << 2+3; cout << endl; system("PAUSE"); return 0; Poetak i kraj programa isti su kao i do sada, dok je srednji dio promijenjen. } U ovom redu nareujemo raunalu da zbroj broja 2 i broja 3, a to je broj 5, ispie na zaslon raunala. U ovom redu nareujemo raunalo da skoi u novi red.
54
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Pokuajmo neku drugu raunsku operaciju, npr. oduzimanje. U ovom programu oduzet emo od broja 12 broj 8. Pokrenimo program i pogledajmo na rezultat. #include <cstdlib> #include <iostream> using namespace std; int main() { cout << 12-8; cout << endl; system("PAUSE"); return 0; } Varijable Na prvi program Uvod
Pokuajmo zbrojiti neka druga dva broja, npr. 8 i 4. Pokrenimo program i vidjet emo da e raunalo zbrojiti ta dva broja.
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << 8+4; cout << endl; system("PAUSE"); return 0; }
PRO - MIL
55
Varijable
Dok smo za zbrajanje i oduzimanje koristili oznake uobiajene u matematici, za mnoenje emo koristiti zvjezdicu. Nalazi se iznad broja devet s desne strane, na brojanoj tipkovnici. Mnoenje broja 2 i broja 3 zapisat emo kao 2*3. Pogledamo rezultat.
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << 2*3; cout << endl; system("PAUSE"); return 0; }
Oznaka za dijeljenje takoer ima drugaiji oblik od onog na koji smo navikli u matematici. Kao oznaka dijeljenje koristi se kosa crta koja se nalazi iznad broja 8 s desne strane, na brojanom dijelu tipkovnice. 12 podijeljeno sa 4 napisat emo kao 12/4. Pokrenimo program i pogledamo rezultat.
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << 12/4; cout << endl; system("PAUSE"); return 0; }
56
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Rezultat je pogrean. Mogli bismo zakljuiti da e dijeljenje biti ispravno, ako je rezultat cjelobrojni broj. Ako je rezultat decimalni broj, dolazi do greke. Kako rijeiti taj problem, vidjet emo neto kasnije u ovom poglavlju. Polja Petlje Donoenje Grafika odluke Varijable Pokuajmo ovdje staviti 15/3 i pokrenimo program. Rezultat je ispravan. Na prvi program Uvod
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << 13/4; cout << endl; system("PAUSE"); return 0; }
Pokuajmo ovdje umjesto 12/4 staviti 13/4. Pokrenimo program i pogledajmo rezultat. Rezultat je oigledno pogrean.
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << 15/3; cout << endl; system("PAUSE"); return 0; }
#include <cstdlib> #include <iostream> using namespace std; int main() { cout << 17/3; cout << endl; system("PAUSE"); return 0; }
PRO - MIL
57
Varijable
Varijable
Vidjeli smo da osnovne raunske operacije, osim dijeljenja, funkcioniraju, ali ne ba na nain kako smo mi zamiljali da bi program trebao raditi. Problem naih dosadanjih programa jest u tome to svaki program vri raunsku operaciju izmeu dva konkretna broja i ako elimo izvriti raunsku operaciju izmeu druga dva broja, program moramo iznova pisati i prevoditi. Postavlja se pitanje bismo li mogli napisati npr. program za zbrajanje koji ne bi zbrajao dva konkretna broja, nego bi mogao zbrojiti bilo koja dva broja. To je, naravno, mogue. Unesimo, prevedimo i pokrenimo ovaj program.
#include <cstdlib> #include <iostream> using namespace std; int main() { int a; int b; int c; cin >> a; cin >> b; c = a + b; cout << c; cout << endl; system("PAUSE"); return 0; }
Nakon pokretanja programa ugledat emo zbunjujui crni ekran bez sadraja.
Na tipkovnici izaberemo prvi broj koji elimo zbrajati, npr. broj 3 i zatim pritisnemo Enter tipku na tipkovnici.
58
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Pokrenimo bez ikakvih izmjena isti program jo jednom, ali sada unesimo neke druge brojeve, npr. broj 12 i broj 14. Na slian nain kao i u prethodnom primjeru, dakle tako da nakon svakog unosa broja pritisnemo tipku Enter na tipkovnici, unesimo brojeve 12 i 14. Kao rezultat dobit emo njihov zbroj, a to je broj 26. Vidimo da smo uspjeli postii ono to smo eljeli. Pomou jednog programa moemo zbrajati razliite brojeve, bez da program moramo mijenjati. Donoenje Grafika odluke Varijable Na prvi program Nakon pritiska na Enter tipku na tipkovnici, a zaslonu raunala ugledat em o r e zu lt at zbrajanja broja 3 i broja 5, a to je broj 8. Uvod
Na tipkovnici izaberemo drugi broj koji elimo zbrajati, npr. broj 5 i zatim pritisnemo Enter tipku na tipkovnici.
PRO - MIL
59
Varijable
Analiza programa
#include <cstdlib> #include <iostream> using namespace std; int main() { Poetak programa. a
Naredbom int formirat emo u raunalu prostor poput posude. U taj prostor moemo spremati brojeve. Formirat emo tri prostora, prostor a, prostor b i prostor c.
Naredbom cin u prostor a i prostor b spremit emo broj koji smo unijeli preko tipkovnice, npr. broj 3 i broj 5.
3 a 5 b
c = a + b;
8 cout << c; c =
3 a +
5 b
c 8
system("PAUSE"); return 0; }
Kraj programa.
60
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Naredba za unos. Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Ovom naredbom formiramo prostor u raunalu u koji emo spremati brojeve. Na poetku taj prostor moemo zamisliti kao posudice u koje moemo staviti brojeve, iako su to zapravo rezervirana mjesta u memoriji naeg raunala.
int a ;
int b; int c;
Ovim naredbama se formiraju jo dva prostora, prostor b i prostor c.
Ovdje se nalazi naziv prostora. Zato svaki prostor ima naziv??? Zato to u jednom programu moemo imati vie takvih prostora, pa nam naziv prostora omoguuje da ih razlikujemo.
Nakon formiranja prostor za spremanje brojeva je prazan i bio bi nam sasvim beskoristan kad u njega ne bismo mogli staviti neki broj. U taj prostor broj moemo staviti na vie naina, a jedan od njih je da ga unesemo pomou tipkovnice. Za to emo koristiti naredbu cin.
cin >> a ;
Ova oznaka stavlja se ispred naziva prostora u koji emo unijeti broj.
Ovdje stavljamo oznaku prostora u koji emo unijeti broj. Dakle, broj emo unijeti u prostor a i ne u neki drugi prostor, npr. b ili c.
PRO - MIL
61
Varijable
cin >> b ;
Naredba slina prethodnoj, samo to e se u ovom sluaju unijeti broj spremiti u prostor b.
Osim to u te prostore moemo spremati brojeve, izmeu njih moemo izvoditi raunske operacije na isti nain kao to smo ih izvodili izmeu brojeva. U naem sluaju zbrojit emo sadraj prostora a i sadraj prostora b, a rezultat tog zbrajanja spremit emo u prostor c.
c = a + b ;
Nakon to se naredba c = a + b; izvri, u prostoru c nalazit e se rezultat zbrajanja sadraja prostora a i prostora b, ali da korisnik vidio rezultat moramo narediti raunalu da sadraj prostora c ispie na zaslon raunala. To emo uiniti ovom naredbom.
Naredba za ispis.
cout << c ;
62
PRO - MIL
Varijacije programa
Da bismo bolje razumjeli izradu programa koji koriste prostor za spremanje brojeva, napravit emo niz izmjena na naem programu i opaat emo kako te izmijene utjeu na rad program.
#include <cstdlib> #include <iostream> using namespace std; int main() { int prvi; int drugi; int rezultat; cin >> prvi; cin >> drugi; rezultat = prvi + drugi; cout << rezultat; cout << endl; system("PAUSE"); return 0; }
Prevedimo i pokrenimo ovaj program i vidjet emo da radi jednako kao i prethodni program.
Sad se postavlja pitanje po kojoj logici se biraju nazivi prostora za spremanje brojeva. Pogledajmo neka pravila i sugestije. - Ne smiju se koristi naredbe; npr. int aaa; je dozvoljeno, a int cout; nije. - Koriste se samo brojevi i slova engleske abecede, dakle bez . - Naziv ne smije sadravati razmak; PrviBroj i prvi_broj je dozvoljeno, a prvi broj nije. - Ako naziv sadri brojeve, prvi znak mora biti slovo, dakle a1 je dozvoljeno, a 1a nije. - Pametno je da naziv prostora govori to se u prostoru nalazi. Bolje je da prostor u koji emo spremati povrinu nazovemo povrsina nego qqy1. - Dva razliita prostora ne mogu imati isto ime.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Prvi prostor vie se ne naziva a, nego prvi. Drugi prostor vie se ne naziva b, nego drugi. Trei prostor vie se ne naziva c, nego rezultat.
Varijable
Ovaj program ima potpuno istu strukturu kao prethodni, samo to ima drugaije nazive prostora za spremanje brojeva.
Na prvi program
Uvod
Sadraj
63
Varijable
#include <cstdlib> #include <iostream> using namespace std; int main() { int A; int B; int c; cin >> a; cin >> b; c = a + b; cout << c; cout << endl; system("PAUSE"); return 0; }
Pokuamo li pokrenuti ovaj program, raunalo e dojaviti greku. Do greke je dolo zato to smo ovdje formirali prostor A, a ovdje smo pokuali unijeti broj u prostor a. Raunalo razlikuje velika i mala slova pa njemu prostor a i prostor A nisu isto. S njegove toke gledita mi ovdje pokuavamo unijeti broj u prostor koji ne postoji. Zato e nas raunalo u komentaru greke upozoriti da ne zna to je to a.
64
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Ovaj tip greke veoma je teko pronai u sloenim programima, budui da raunalo nee dojaviti greku i poziciju greke prilikom prevoenja. To se dogaa zato to je program formalno ispravno napisan; cout << "c"; je ispravna naredba, ali ne radi ono to smo htjeli. Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
int main() { int a; int b; int c; cin >> a; cin >> b; c = a + b; cout << "c"; cout << endl; system("PAUSE"); return 0; }
U ovom programu ovu naredbu nismo napisali u ispravnom obliku kao cout << c; nego u obliku cout << "c"; dakle sadraj koji se ispisuje stavili smo u navodnike kao to smo to naviknuli prilikom ispisa teksta koritenjem cout naredbe. Pokrenemo li ovaj program, on e se izvriti i raunalo nam nee dojaviti nikakvu greku, ali kao rezultat neemo dobiti ono to smo oekivali. Vidimo da smo u prostor a unijeli 8, u prostor b unijeli smo 4, ali kao rezultat nismo dobili broj 12, nego slovo c. Zato? cout << c; - ispisuje sadraj prostora c. cout << "c"; - ispisuje slovo c.
PRO - MIL
65
Varijable
#include <cstdlib> #include <iostream> using namespace std; int main() { int broj1; int broj2; int rezultat; cin >> broj1; cin >> broj2; rezultat = broj1 - broj2; cout << rezultat; cout << endl; system("PAUSE"); return 0; }
Prostore za spremanje brojeva moemo koristiti i za druge matematike operacije. Ovdje moemo vidjeti program za oduzimanje. Od sadraja prostora broj1 oduzet e se sadraj prostora broj2, a rezultat e se spremiti u prostor rezultat.
#include <cstdlib> #include <iostream> using namespace std; int main() { int broj1; int broj2; int rezultat; cin >> broj1; cin >> broj2; rezultat = broj1 * broj2; cout << rezultat; cout << endl; system("PAUSE"); return 0; }
66
PRO - MIL
Problem dijeljenja
#include <cstdlib> #include <iostream> using namespace std; int main() { int broj1; int broj2; int rezultat; cin >> broj1; cin >> broj2; rezultat = broj1 / broj2; cout << rezultat; cout << endl; system("PAUSE"); return 0; } Ostao nam je nerijeen problem dijeljenja. Sadraje prostora za spremanje brojeva moemo dijeliti, ali e kao i proli put kad smo pokuali dijeliti, rezultat biti ispravan samo za brojeve iji rezultat dijeljenja nije decimalni broj. Ako je rezultat dijeljenja decimalni broj, rezultat e biti pogrean.
Problem emo rijeiti ovako napisanim programom. Umjesto naredbom int, prostor za spremanje brojeva formirat emo naredbom float; #include <cstdlib> #include <iostream> using namespace std; int main() { float broj1; float broj2; float rezultat; cin >> broj1; cin >> broj2; rezultat = broj1 / broj2; cout << rezultat; cout << endl; system("PAUSE"); return 0; } Pokrenemo li taj program, dobit emo ispravan rezultat.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
67
Varijable
Ovo je jo jedan nain na koji moemo formirati prostor za spremanje brojeva. U emu je razlika izmeu prostora formiranog int naredbom i prostora formiranog float naredbom??? U prostor formiran int naredbom moemo spremati samo brojeve bez decimalnog zareza, a u prostore formirane float naredbom moemo spremati brojeve s decimalnim zarezom.
float broj1 ;
Postavlja se pitanje bismo li mogli u na program unijeti broj s decimalnim zarezom. Pokrenimo jo jednom program iz prethodnog primjera i pokuajmo.
Vidimo da je mogue unijeti decimalne brojeve u na program. Broj 16,25 podijelili smo brojem 2,5 i kao rezultat ispravno dobili 6,5. Pri tome moramo imati u vidu da C++ kao decimalni zarez zapravo ne koristi zarez, nego toku. Dakle, ako elimo unijeti npr. 3,14 unijet emo 3.14 koritenjem tipkovnice.
68
PRO - MIL
Uljepavanje programa
Nai programi dodue rade, ali su tako runi da bi teko bili runiji. Korisnika doeka crni ekran bez ikakvih uputa. Nakon to unesemo dva broja, dobit emo trei bez ikakvog komentara to taj trei broj predstavlja. Budui da smo mi napisali program, mi znamo da treba unijeti dva broja, da nakon svakog unosa treba pritisnuti tipku Enter i mi znamo to predstavlja trei broj koji smo dobili kao rezultat, ali netko drugi veoma bi teko koristio na program. Unesite i pokrenite ovaj program.
#include <cstdlib> #include <iostream> using namespace std; int main() { float broj1; float broj2; float rezultat; cout << "Dijeljenje." << endl; cout << "Unesite prvi broj." << endl; cin >> broj1; cout << "Unesite drugi broj." << endl; cin >> broj2; rezultat = broj1 / broj2; cout << "Rezultat dijeljenja je:" << endl; cout << rezultat; cout << endl; system("PAUSE"); return 0; }
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
U ovom programu na poetku programa, te prije svakog unosa i ispisa rezultata naredbom cout ispisali smo adekvatan komentar koji pomae korisniku da lake shvati emu program slui, to mora unijeti i to je dobio kao rezultat.
Varijable
Na prvi program
Uvod
Sadraj
69
Varijable
Prethodni program mogli bismo jo malo uljepati dodavanjem praznih redova. Unesimo i pokrenimo ovaj program.
Naslov programa.
int main() { Komentar prvog unosa. float broj1; float broj2; float rezultat; cout << "Dijeljenje." << endl; cout << endl; Prvi unos. cout << endl; cout << "Unesite prvi broj." << endl; cin >> broj1; Prazni red. cout << endl; cout << "Unesite drugi broj." << endl; cin >> broj2; Komentar drugog unosa. cout << endl; rezultat = broj1 / broj2; cout << "Rezultat dijeljenja je:" << endl; cout << rezultat; Drugi unos. cout << endl; cout << endl; system("PAUSE"); Komentar rezultata. return 0; } Dva skoka u novi red. Ispis rezultata.
70
PRO - MIL
Prilikom prevoenja programa, kad prevoditelj naie na // oznaku, skae u novi red ne prevodei ostatak reda.
PRO - MIL
Komentar zapoinje // oznakom i pomae nam da se lake snaemo ako program elimo kasnije koristiti.
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
71
Varijable
// ****************************** // Program za izraun brzine // ****************************** #include <cstdlib> #include <iostream> using namespace std; int main() { float put; // prostor za put float vrijeme; // prostor za vrijeme float brzina; // prostor za brzinu cout << "Brzina." << endl; cout << endl; cout << endl; cout << "Unesite prevaljeni put." << endl; cin >> put; cout << endl; cout << "Unesite vrijeme." << endl; cin >> vrijeme; cout << endl; brzina = put / vrijeme; cout << "Brzina je:" << endl; cout << brzina; cout << endl; cout << endl; system("PAUSE"); return 0; }
Osim
to
komentare
moemo pisati u zasebnom redu, moemo ih pisati i na kraju naredbi. Pri tome imajmo na umu da je float put; // komentar ispravno, ali // komentar float put; ili float // komentar put; nije. Dakle, ako komentar unosimo u red s naredbom, komentar mora biti na kraju reda.
Postavlja se pitanje emu takvi komentari slue. Ako smo upravo napisali program, a program ima deset redova, onda nam komentari ne trebaju. Ako napiemo vei program, a elimo ga korigirati nakon dvije godine, onda e nam komentari pojedinih dijelova programa uvelike pomoi pri snalaenju u programu. Komentari su korisni i ako moramo korigirati program koji je netko drugi pisao.
72
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
// ********************************************* // Program za izraun volumena kvadrata // ********************************************* #include <cstdlib> #include <iostream> using namespace std; Pokuajmo za vjebu sami smisliti nekoint main() liko slinih programa. { float stranica_A; float stranica_B; float stranica_C; float volumen; cout << "Izracun volumena." << endl; cout << endl; cout << "Unesite stranicu a." << endl; cin >> stranica_A; cout << "Unesite stranicu b." << endl; cin >> stranica_B; cout << "Unesite stranicu c." << endl; cin >> stranica_C; cout << endl; volumen = stranica_A * stranica_B * stranica_C; cout << "Volumen je:" << endl; cout << volumen; cout << endl; cout << endl; system("PAUSE"); return 0; } Ovo je primjer programa za izraun volumena kvadrata.
PRO - MIL
73
Grafika
74
PRO - MIL
PRO - MIL
Grafika
Objekti
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
75
Grafika
Kliknemo na Ok.
76
PRO - MIL
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); Klikom na Kompajlaj i pokreni pokrenemo cleardevice(); program. circle(320,240,180); getch(); Otvorit e se dva prozora: closegraph(); return 0; - tekstualni koji smo do sada koristili }
Varijable
Na prvi program
Uvod
Sadraj
77
Grafika
Analiza programa
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { Poetak programa. Za razliku od dosadanjih programa, u ovom smo korigirali poetak dodavi mu jo jednu naredbu. Ovom naredbom u program ukljuujemo grafike naredbe.
setbkcolor(WHITE);
setcolor(BLACK);
cleardevice();
Brie stari sadraj zaslona i stare postavke boja. Pokuajmo pokrenuti program bez ove naredbe.
circle(320,240,180);
78
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
getch();
Ovom naredbom zaustavljamo izvoenje programa do trenutka dok ne pritisnemo neku tipku na tipkovnici. Ima istu namjenu kao i system(PAUSE) u normalnim programima. Da bismo bolje razumjeli ovu naredbu, izbacimo je iz programa i pokuajmo pokrenuti program bez nje.
closegraph();
return 0; }
Kraj programa. Uoimo da ovdje vie nema naredbe system(PAUSE); Njenu funkciju sada ima getch(); naredba.
Pogledajmo sada poblie odreene naredbe. Ovom naredbom odreujemo tip grafikog prozora.
int gdriver = 9 ;
Ovaj broj moe biti izmeu 1 i 10. Ako je 9, dobit emo VGA prozor ija maksimalna veliina moe biti 640 X 480 toaka i 16 boja. Ako umjesto broja 9 stavimo broj 6, dobit emo IBM 8514 prozor ija maksimalna veliina moe biti 1024 X 768 toaka i 256 boja. Upotrijebimo li druge brojeve, dobit emo manje prozore s manjim brojem boja.
PRO - MIL
79
Grafika
Nakon to smo naredbom int gdriver = 9; odabrali tip grafikog prozora, ovom naredbom biramo rezoluciju grafikog prozora.
int gmode = 2 ;
Znaenje ovog broja ovisi o tipu grafikog prozora koji smo odabrali. Ako smo naredbom int gdriver = 9; odabrali VGA prozor, stavimo li ovdje broj 0, dobit emo prozor veliine 640 X 200 toaka. Stavimo li 1, dobit emo prozor veliine 640 X 350 toaka, a stavimo li broj 2 koji smo mi odabrali, dobit emo prozor veliine 640 X 480 toaka. Ako smo naredbom int gdriver = 6 ; odabrali IBM 8514 prozor, stavimo li ovdje broj 0, dobit emo prozor veliine 640 X 480 toaka, a stavimo li broj 1, dobit emo prozor veliine 1024 X 768 toaka.
Ovdje unosimo naziv boje. Naziv boje moe biti: BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE.
setbkcolor( WHITE );
80
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Kao i u prethodnoj naredbi, boje moemo odrediti navoenjem njihovog naziva, a moemo i pomou brojeva upotrebom naredbe COLOR. Obrada teksta Polja Ovom naredbom odreuje se boja kojom crtamo. Koristimo iste nazive boja kao i u prethodnoj naredbi. Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Osim navoenja imena boja, boje moemo odrediti i navoenjem njihove brojane vrijednosti.
Plava.
Crvena.
Zelena.
Dodat emo naredbu COLOR iza koje se nalaze tri broja ija vrijednost moe biti izmeu 0 i 255. Boje u raunalu sastoje se od tri boje; crvene, zelene i plave. Sve ostale boje nastaju mijeanjem tih boja. Prvim brojem odreujemo intenzitet crvene boje, drugim intenzitet zelene i treim intenzitet plave boje. Naredbom setbkcolor(COLOR(255,255,255)); dobit emo bijelu boju, a naredbom setbkcolor(COLOR(0,0,0)); dobit emo crnu boju.
setcolor(BLACK);
setcolor(COLOR (0,0,0));
PRO - MIL
81
Grafika
Polumjer kruga.
640
180
480
82
PRO - MIL
Varijacije programa
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle(320,240,220); circle(320,240,165); circle(320,240,110); circle(320,240,55); getch(); closegraph(); return 0; } Napravit emo nekoliko primjera da bismo lake razumjeli kako radi naredba za crtanje kruga. Ovaj program slian je prethodnom. Razlika je u tome to je prethodni crtao samo jedan krug, a ovaj e nacrtati nekoliko krugova razliitog polumjera, ali sa sreditem u istoj toki. Ovdje se nalaze etiri naredbe za crtanje etiri kruga. Pokrenemo li ovaj program, trebali bismo dobiti ovakav rezultat.
PRO - MIL
Objekti
Pokuajmo promijeniti brojeve koji odreuju polumjer kruga i poloaj sredita kruga.
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
83
Grafika
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle(160,140,80); circle(320,140,80); circle(480,140,80); getch(); closegraph(); return 0; }
U ovom primjeru napravit emo tri jednaka kruga, jedan pored drugoga, to emo postii promjenom udaljenosti sredita krugova od lijevog ruba prozora.
Pogledajmo jo nekoliko mogunosti. U ovom sluaju promjenom udaljenosti od gornjeg ruba prozora dobili smo tri kruga, jedan iznad drugoga.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle (320, 60, 60); circle (320, 180, 60); circle (320, 300, 60); getch(); closegraph(); return 0; }
84
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle (60, 60, 60); circle (180, 180, 60); circle (300, 300, 60); getch(); closegraph(); return 0; }
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle(320,240,220); circle(220,140,50); circle(420,140,50); circle(320,240,30); getch(); closegraph(); return 0; }
PRO - MIL
85
Grafika
Crtanje pravokutnika
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); rectangle (160, 100, 480, 380); getch(); closegraph(); return 0; } Osim krunice moemo nacrtati i druge oblike, npr. pravokutnik. Ovdje u program unesemo naredbu za crtanje pravokutnika, a na zaslonu raunala dobit emo ovakav rezultat.
480 480
Naredbom rectangle crtamo pravokutnik, a sa etiri broja koji se nalaze iza naredbe rectangle odreujemo poloaj gornjeg lijevog i donjeg desnog ugla pravokutnika. Funkciju pojedinih brojeva moemo vidjeti na crteu.
86
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle (320, 240, 220); circle (220, 140, 50); circle (420, 140, 50); circle (320, 240, 30); rectangle (260, 342, 380, 338); getch(); closegraph(); return 0; } Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); rectangle (160, 100, 480, 380); rectangle (190, 130, 450, 350); rectangle (220, 160, 420, 320); rectangle (250, 190, 390, 290); getch(); closegraph(); return 0; }
Pravokutnik moemo kombinirati s drugim oblicima. Pokuajmo za vjebu sami izmisliti nekoliko primjera, npr. deblo stabla nacrtamo kao pravokutnik, a kronju kao krug.
PRO - MIL
87
Grafika
Crtanje crte
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); line (120, 100, 500, 380); getch(); closegraph(); return 0; } Crtu moemo nacrtati na vie naina, a uporaba naredbe line jedan je od njih.
640 100 120 380 Naredbom line crtamo crtu, a sa etiri broja koji se nalaze iza naredbe line odreujemo poetak i kraj crte. Funkciju pojedinih brojeva moemo vidjeti na crteu.
500
480
88
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle (320, 240, 220); circle (320, 240, 165); circle (320, 240, 110); circle (320, 240, 55); line (100, 240, 540, 240); line (320, 20, 320, 460); getch(); closegraph(); return 0; } Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); line (100, 240, 540, 240); line (320, 20, 320, 460); getch(); closegraph(); return 0; }
PRO - MIL
89
Grafika
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto (120, 100); lineto (500, 380); getch(); closegraph(); return 0; }
Osim uporabom naredbe line, crtu moemo nacrtati i uporabom naredbi moveto i lineto. Naredbom moveto odreujemo poetak crte, a naredbom lineto odreujemo kraj crte.
500
480
90
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto(160, 240); lineto(160, 450); getch(); closegraph(); return 0; } Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto(160, 240); lineto(160, 450); lineto(480, 450); lineto(480, 240); lineto(160, 240); lineto(320, 120); lineto(480, 240); getch(); closegraph(); return 0; }
Ovaj nain crtanja pogodan je za crtanje vie crta u neprekinutom nizu. Pogledajmo ovaj primjer.
PRO - MIL
91
Grafika
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto(160, 240); lineto(160, 450); lineto(480, 450); getch(); closegraph(); return 0; }
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto(160, 240); lineto(160, 450); lineto(480, 450); lineto(480, 240); getch(); closegraph(); return 0; }
92
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto(160, 240); lineto(160, 450); lineto(480, 450); lineto(480, 240); lineto(160, 240); lineto(320, 120); getch(); closegraph(); return 0; } Polja Saimanje Veliki programi koda Objekti Obrada teksta Petlje #include <cstdlib> #include <iostream> #include <winbgim.h> Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto(160, 240); lineto(160, 450); lineto(480, 450); lineto(480, 240); lineto(160, 240); getch(); closegraph(); return 0; }
PRO - MIL
93
Grafika
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto(160, 240); lineto(160, 450); lineto(480, 450); lineto(480, 240); lineto(160, 240); lineto(320, 120); lineto(480, 240); getch(); closegraph(); return 0; }
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto(160, 240); lineto(160, 450); lineto(480, 450); lineto(480, 240); lineto(160, 240); lineto(320, 120); lineto(480, 240); rectangle(400, 320, 480, 450); rectangle(200, 260, 250, 340); rectangle(300, 260, 350, 340); circle (550, 90, 80); line (0, 450, 640, 450); getch(); closegraph(); return 0; }
94
PRO - MIL
Crtanje toke
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle (320, 240, 220); putpixel (320, 240, BLACK); getch(); closegraph(); return 0; } Ponekad nam je potrebna samo jedna toka, kao u ovom primjeru gdje smo tokom oznaili sredite kruga.
640 380
500
480
PRO - MIL
Objekti
Ovdje unosimo boju toke koju odreujemo na isti nain kao i boju pozadine ili boju crte.
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
95
Grafika
Ispis teksta
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); cout << "Ovo je krug." << endl; circle (320, 240, 220); getch(); closegraph(); return 0; } Moemo li unutar grafikog prozora staviti tekst? Moemo, ali naalost, ne na nain na koji smo to do sada navikli raditi. Ako prije naredbe za crtanje kruga stavimo naredbu i za ispis teksta, tekst e se ispisati, ali ne unutar grafikog prozora, ve unutar tekstualnog prozora.
96
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); outtext ("Ovo je krug."); circle (320, 240, 220); getch(); closegraph(); return 0; }
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); moveto (320, 240); outtext ("Ovo je krug."); circle (320, 240, 220); getch(); closegraph(); return 0; }
Naredbu za odreivanje pozicije poetka crte moemo iskoristiti za odreivanje poetka teksta.
PRO - MIL
97
Grafika
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); outtextxy (320, 240, "Ovo je krug."); circle (320, 240, 220); getch(); closegraph(); return 0; }
Naredba outtextxy objedinjuje naredbu za odreivanje pozicije teksta i naredbu za ispis teksta.
640 240
320
Ovo je krug.
480
98
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Veliina slova. Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); settextstyle (9, HORIZ_DIR, 1); outtextxy (320, 240, "Ovo je krug."); circle (320, 240, 220); getch(); closegraph(); return 0; }
Naredbom settextstyle moemo mijenjati oblik i veliinu slova te smjer ispisa teksta. Stavljamo je prije naredbe za ispis teksta.
settextstyle ( 9, HORIZ_DIR, 1 );
Ovaj broj odreuje oblik slova. Njegova vrijednost moe biti izmeu 0 i 10. Smjer teksta: HORIZ_DIR - vodoravni tekst. VERT_DIR - uspravni tekst od dolje prema gore. -VERT_DIR - uspravni tekst od gore prema dolje.
PRO - MIL
99
Grafika
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle (320, 240, 220); settextstyle(9, HORIZ_DIR, 1); outtextxy(320, 200, "Ovo je krug."); settextstyle(9, HORIZ_DIR, 2); outtextxy(320, 240, "Ovo je krug."); settextstyle(9, HORIZ_DIR, 3); outtextxy(320, 280, "Ovo je krug."); settextstyle(9, HORIZ_DIR, 4); outtextxy(320, 320, "Ovo je krug."); getch(); closegraph(); return 0; }
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle (320, 240, 220); settextstyle(9, HORIZ_DIR, 1); outtextxy(320, 240, "Ovo je krug."); settextstyle(9, VERT_DIR, 1); outtextxy(300, 240, "Ovo je krug."); settextstyle(9, -VERT_DIR, 1); outtextxy(500, 240, "Ovo je krug."); getch(); closegraph(); return 0; }
100
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle (320, 240, 220); settextstyle(0, HORIZ_DIR, 3); outtextxy(320, 40, "Ovo je krug."); settextstyle(1, HORIZ_DIR, 3); outtextxy(320, 80, "Ovo je krug."); settextstyle(2, HORIZ_DIR, 3); outtextxy(320, 120, "Ovo je krug."); settextstyle(3, HORIZ_DIR, 3); outtextxy(320, 160, "Ovo je krug."); settextstyle(4, HORIZ_DIR, 3); outtextxy(320, 200, "Ovo je krug."); settextstyle(5, HORIZ_DIR, 3); outtextxy(320, 240, "Ovo je krug."); settextstyle(6, HORIZ_DIR, 3); outtextxy(320, 280, "Ovo je krug."); settextstyle(7, HORIZ_DIR, 3); outtextxy(320, 320, "Ovo je krug."); settextstyle(8, HORIZ_DIR, 3); outtextxy(320, 360, "Ovo je krug."); settextstyle(9, HORIZ_DIR, 3); outtextxy(320, 400, "Ovo je krug."); settextstyle(10, HORIZ_DIR, 3); outtextxy(320, 440, "Ovo je krug."); getch(); closegraph(); return 0; }
PRO - MIL
101
Donoenje odluke
102
PRO - MIL
PRO - MIL
Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Donoenje odluke
Objekti
Sadraj
103
Donoenje odluke
Funkcije
#include <cstdlib> #include <iostream> #include <cmath> using namespace std; int main() { float broj; float potencija; float rezultat; cout << "Unesite broj:" << endl; cin >> broj; cout << endl; cout << "Unesite potenciju:" << endl; cin >> potencija; cout << endl; rezultat = pow(broj,potencija); cout << "Rezultat je:" << endl; cout << rezultat << endl; cout << endl; system("PAUSE"); return 0; } Pojam funkcije zvui jako pametno, ali iza tog naziva kriju se uglavnom jednostavne stvari, matematike operacije poput potenciranja ili vaenja kvadratnog korijena. Pogledajmo program potenciranje. za
Da bismo u programu mogli koristiti matematike funkcije, moramo u program ukljuiti biblioteku matematikih funkcija.
Naredba za potenciranje.
104
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Varijabla u koju spremamo veliinu kuta kojem emo raunati sinus. Kut mora biti izraen u radijanima, a ne u stupnjevima. Petlje Varijabla u koju spremamo rezultat. Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <cmath> using namespace std; int main() { float kut; float rezultat; cout << "Kut u radijanima:" << endl; cin >> kut; cout << endl; rezultat = sin(kut); cout << "Sinus kuta je:" << endl; cout << rezultat << endl; cout << endl; system("PAUSE"); return 0; }
Ovo je program za izraun sinusa. Ako ne znate to je to sinus, nemojte se time optereivati. To nije bitno za razumijevanje C++ programskog jezika. Vano je uoiti da ova funkcija veliinu kuta ne izraava stupnjevima nego radijanima.
PRO - MIL
105
Donoenje odluke
#include <cstdlib> #include <iostream> #include <cmath> using namespace std; int main() { float broj; float rezultat; cout << "Unesite negativni broj:" << endl; cin >> broj; cout << endl; rezultat = abs(broj); cout << "Broj bez minusa:" << endl; cout << rezultat << endl; cout << endl; system("PAUSE"); return 0; }
106
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj #include <cstdlib> #include <iostream> #include <cmath> using namespace std; int main() { float broj; float rezultat; cout << "Unesite broj:" << endl; cin >> broj; cout << endl; rezultat = sqrt(broj); cout << "Kvadratni korijen je:" << endl; cout << rezultat << endl; cout << endl; system("PAUSE"); return 0; } Varijabla u koju spremamo rezultat. Pogledajmo program za vaenje kvadratnog korijena. to je to uope kvadrati korijen? Ako je 4 puta 4, odnosno 4 na kvadrat, jednako 16, onda je kvadratni korijen od 16 jedak 4.
PRO - MIL
Iako se nam na prvi pogled moe uiniti da je program ispravan, to na alost nije tako. Pokuamo li kvadratni korijen izraunati iz negativnog broja dobit emo besmisleni rezultat. Do toga dolazi zato to nije mogue izraunati kvadratni korijen iz negativnog broja.
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
107
Donoenje odluke
Donoenje odluke
Pokuajmo kvadrati korijen izraunati pomou ovakvog programa.
#include <cstdlib> #include <iostream> #include <cmath> using namespace std; int main() { float broj; float rezultat; cout << "Unesite pozitivan broj." << endl; cin >> broj; cout << endl; if (broj < 0) { cout << "Broj je negativan!" << endl; } else { rezultat = sqrt(broj); cout << "Kvadratni korijen je:" << endl; cout << rezultat; cout << endl; } cout << endl; system("PAUSE"); return 0; }
Ova inaica programa izraunava kvadratni korijen ako smo unijeli pozitivan broj ili nas obavjetava da je unesen negativan broj ako unesemo broj. negativan
108
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <cmath> using namespace std; int main() {
float broj; float rezultat; cout << "Unesite pozitivan broj." << endl; cin >> broj; cout << endl; Broj nula. if (broj < 0)
Formiranje varijabli i unos broja iz kojeg emo vaditi kvadratni korijen. Izvodi se prilikom svakog pokretanja programa.
{ cout << "Broj je negativan!" << endl; } Ovaj dio programa izvodi se samo ako je sadraj varijable broj manji od nule.
else Naredbom else zapoi{ rezultat = sqrt(broj); cout << "Kvadratni korijen je:" << endl; cout << rezultat; cout << endl; } nje dio programa koji se izvodi samo ako sadraj varijable broj nije manji od nule.
PRO - MIL
109
Donoenje odluke
Svi programi koje smo do sada vidjeli izvodili su se redom od prve do posljednje naredbe. U sluaju programa za vaenje kvadratnog korijena to nam ne odgovara jer elimo da program na jedan nain reagira ako unesemo pozitivan broj, a na drugi nain ako unesemo negativan. Ako unesemo pozitivan broj, izraunat emo kvadratni korijen i neemo ispisivati obavijest da je broj negativan, a ako unesemo negativan broj, ispisat emo obavijest da je broj negativan i neemo raunati kvadratni korijen, budui da iz negativnog broja nije mogue izraunati kvadratni korijen. Za razliku od dosadanjih naredbi koje su se nalazile u jednom redu, naredba koja nam omoguuje izvoenje jednog ili drugog dijela programa proteu se kroz vie redova. Pogledajmo strukturu tog sustava.
Uvjet na temelju kojeg e raunalo odluiti hoe li se izvoditi sadraj a ili sadraj b.
if ( broj < 0 ) {
Sadraj a i sadraj b nalaze se unutar vitiastih zagrada. U poetku esto e nam se deavati da izostavimo vitiaste zagrade ili da ih krivo napiemo.
Ovaj dio programa unutar vitiastih zagrada izvrit e se ako je uvjet zadovoljen, tj. ako je sadraj varijable broj manji od nula.
Naredbom else zapoinje dio programa koji se izvrava ako uvjet iza if naredbe nije zadovoljen, tj. ako sadraj varijable broj nije manji od nule. U tom sluaju izvodi se sadraj b, a ne izvodi se sadraj a.
110
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Ovaj program samo ispituje je li unesen broj vei od nule. Ako je broj vei od nule, izvodi se dio programa koji ispisuje tekst Broj je vei od nule. Ako broj nije vei od nule, izvodi se dio programa koji ispisuje tekst Broj vei od nule. nije Varijable Na prvi program Uvod
Da bismo lake shvatili nain koritenja if ... else naredbi, napravit emo niz programa. Ti programi nee raditi nita osobito korisno, ve e im jedina svrha biti uvjebavanje pisanja programa unutar kojih raunalo donosi odluku.
#include <cstdlib> #include <iostream> using namespace std; int main() { float broj; cout << "Unesite broj." << endl; cin >> broj; cout << endl; if (broj > 0) { cout << "Broj je veci od nule." << endl; } else { cout << "Broj nije veci od nule." << endl; } cout << endl; system("PAUSE"); return 0; }
PRO - MIL
111
Donoenje odluke
U ovom programu ispitivat emo je li unesen broj jednak nuli. Za to ispitivanje koristit emo dvostruki znak jednakosti.
#include <cstdlib> #include <iostream> using namespace std; int main() { float broj; cout << "Unesite broj." << endl; cin >> broj; cout << endl; if (broj == 0) { cout << "Broj je jednak nuli." << endl; } else { cout << "Broj nije jednak nuli." << endl; } cout << endl; system("PAUSE"); return 0; } Ako je odgovor na pitanje je li sadraj varijable broj jednak nuli DA, izvrit e se ovaj dio programa. Ispisat e se poruka Broj je jednak nuli. Ako je odgovor na pitanje je li sadraj varijable broj jednak nuli NE, izvrit e se ovaj dio programa. Ispisat e se poruka Broj nije jednak nuli.
Da smo umjesto broj == 0 napisali broj = 0 program ne bi ispitivao je li sadraj varijable broj jednak nuli, nego bi broj nula stavio u varijablu broj.
112
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj #include <cstdlib> #include <iostream> using namespace std; int main() { float broj; cout << "Unesite broj." << endl; cin >> broj; cout << endl; if (broj < 100) { cout << "Broj je manji od sto." << endl; } else { cout << "Broj nije manji od sto." << endl; } cout << endl; system("PAUSE"); return 0; } Vidjeli smo da moemo ispitivati je li varijabla vea, manja ili jednaka nekom broju. U dosadanjim primjerima to je bio broj nula, ali to moe biti bilo koji broj, npr. broj 100 kao primjeru. Polja Saimanje Veliki programi koda Objekti Obrada teksta to je to sluaj u ovom
PRO - MIL
Petlje
Varijable
Na prvi program
Uvod
113
Donoenje odluke
#include <cstdlib> #include <iostream> using namespace std; int main() { float prvi; float drugi; cout << "Unesite prvi broj." << endl; cin >> prvi; cout << endl; cout << "Unesite drugi broj." << endl; cin >> drugi; cout << endl; if (prvi == drugi) { cout << "Brojevi su jednaki." << endl; } else { cout << "Brojevi su razliciti." << endl; } cout << endl; system("PAUSE"); return 0; } Ovdje ispitujemo jesu li sadraji dviju varijabli u koje smo prethodno unijeli brojeve jednaki. Ako unesemo jednake brojeve ispisat, e se obavijest Brojevi su jednaki. Ako unesemo razliite, ispisat e se obavijest Brojevi su razliiti.
114
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
U ovom primjeru ispitujemo je li sadraj varijable prvi manji od sadraja varijable drugi.
#include <cstdlib> #include <iostream> using namespace std; int main() { float prvi; float drugi; cout << "Unesite prvi broj." << endl; cin >> prvi; cout << endl; cout << "Unesite drugi broj." << endl; cin >> drugi; cout << endl; if (prvi < drugi) { cout << "Prvi broj je manji." << endl; } else { cout << "Prvi broj nije manji." << endl; } cout << endl; system("PAUSE"); return 0; }
PRO - MIL
115
Donoenje odluke
#include <cstdlib> #include <iostream> using namespace std; int main() { float prvi; float drugi; cout << "Unesite prvi broj." << endl; cin >> prvi; cout << endl; cout << "Unesite drugi broj." << endl; cin >> drugi; cout << endl; if ((prvi < 5) && (drugi < 5)) { cout << "Oba broja su manja od pet." << endl; } else { cout << "Oba broja nisu manja od pet." << endl; } cout << endl; system("PAUSE"); return 0; }
116
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod Ovdje imamo dva uvjeta, prvi uvjet i drugi uvjet. Svaki od ta dva uvjeta moe biti zadovoljen ili nezadovoljen. Mogue je da je sadraj varijable prvi manji od 5, a mogue je i da nije. Isto tako, mogue je da je sadraj varijable drugi manji od 5, a mogue je i da nije. Postavlja se pitanje u kojem sluaju e se izvravati sadraj a, a u kojem sluaju sadraj b. Ovim oznakama nareujemo raunalu da e se sadraj a izvoditi samo onda kad su zadovoljena oba uvjeta; u naem sluaju kad je sadraj varijable prvi manji od 5 i kad je sadraj varijable drugi manji od 5. U svim ostalim sluajevima izvrit e se sadraj b.
Prilikom formiranja sloenih uvjeta moramo paziti na raspored zagrada. Svaki uvjet, prvi i drugi nalaze se unutar svojih zagrada, a svi zajedno nalaze se unutar jo jednog para zagrada.
PRO - MIL
117
Donoenje odluke
#include <cstdlib> #include <iostream> using namespace std; int main() { float prvi; float drugi; cout << "Unesite prvi broj." << endl; cin >> prvi; cout << endl; cout << "Unesite drugi broj." << endl; cin >> drugi; cout << endl; if ((prvi < 5) || (drugi < 5)) { cout << "Barem jedan je manji od 5." << endl; } else { cout << "Niti jedan nije manji od 5." << endl; } cout << endl; system("PAUSE"); return 0; }
Ako umjesto oznaka && stavimo oznake || ukupni uvjet bit e zadovoljen ako je barem jedan od dva uvjeta zadovoljen.
Oznaku | dobijemo tako da drimo lijevu AltGr tipku, a zatim pritisnemo W tipku.
118
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Ovdje moemo vidjeti primjere jednostavnih ispitivanja na temelju kojih raunalo donosi odluku koji dio programa e se izvoditi, a koji preskoiti. Ovo su samo neki primjeri, dok je broj moguih kombinacija praktiki neogranien. Bilo koju varijablu koju koristimo u programu moemo usporediti s bilo kojim brojem. Isto tako bilo koje dvije varijable koje se koriste u programu moemo meusobno usporeivati.
Primjeri jednostavnih ispitivanja if (broj < 0) Ispitujemo je li sadraj varijable broj manji od broja nula.
if (broj > 0)
if (broj == 0)
Ispitujemo je li sadraj varijable broj jednak broju nula. Ispitujemo je li sadraj varijable broj manji od broja pedeset. Ispitujemo je li sadraj varijable broj vei od broja pedeset.
if (broj == 50)
Ispitujemo je li sadraj varijable broj jednak broju pedeset. Ispitujemo je li sadraj varijable broj razliit od broja pedeset. Ispitujemo je li sadraj varijable prvi vei od sadraja varijable drugi. Ispitujemo je li sadraj varijable prvi manji od sadraja varijable drugi. Ispitujemo je li sadraj varijable prvi jednak sadraju varijable drugi.
if (broj != 50)
if (prvi == drugi)
PRO - MIL
119
Donoenje odluke
Osim jednostavnih ispitivanja if naredbom, u programu moemo imati i veoma sloena ispitivanja. Sloena ispitivanja formiraju se koritenjem zagrada po logici slinoj logici u matematici i uporabom simbola || i &&. Simbol && izmeu dva uvjeta znai da oba uvjeta moraju biti zadovoljena da bi bio zadovoljen ukupni uvjet. Simbol || izmeu dva uvjeta oznauje da je dovoljno da je barem jedan od uvjeta zadovoljen da bi bio zadovoljen ukupni uvjet. Broj moguih kombinacija praktiki je neogranien, a koju kombinaciju emo upotrijebiti ovisi o cilju koji programom elimo postii.
Primjeri sloenih ispitivanja Uvjet je zadovoljen ako je sadraj varijable prvi manji od 5 i ako je sadraj varijable drugi manji od 5. Uvjet je zadovoljen ako je ili sadraj varijable prvi manji od 5, ili ako je sadraj varijable drugi manji od 5, ili ako su obje varijable manje od 5.
Uvjet je zadovoljen ako je sadraj varijable prvi ili sadraj varijable drugi ili if (((prvi < 5) || (drugi < 5)) && (treci < 5)) sadraj obiju varijabli manji od 5 i ako je sadraj varijable treci manji od 5. Uvjet je zadovoljen ako je barem jedna od triju varijabli manja od pet, ili ako su dvije manje od 5, ili ako su sve tri manje od 5.
Uvjet je zadovoljen ako su sve tri varijable manje od pet. Dovoljno je da jedif ((prvi < 5) && (drugi < 5) && (treci < 5)) na varijabla nije manja od 5 i uvjet nije ispunjen.
120
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj int main() { float prvi; float drugi; float treci; cout << "Unesite prvi broj." << endl; cin >> prvi; cout << "Unesite drugi broj." << endl; cin >> drugi; cout << "Unesite treci broj." << endl; cin >> treci; if (((prvi < 5) || (drugi < 5)) && (treci < 5)) { cout << "DA" << endl; } else { cout << "NE" << endl; } cout << endl; system("PAUSE"); return 0; } grama koji moemo iskoristiti za isprobavanje kombinacija s prethodne stranice. U ovom sluaju ukupni uvjet je ispunjen ako je prvi broj manji od 5 ili ako ako su oba manja od 5 i ako je trei broj manji od 5. Ako je ukupni uvjet zadovoljen, izvest e se ovaj dio programa. Ako ukupni uvjet nije Objekti Saimanje Veliki programi koda Obrada teksta Polja je drugi broj manji od 5 ili zadovoljen, izvest e se ovaj dio programa.
PRO - MIL
Petlje
Varijable
Na prvi program
Uvod
121
Donoenje odluke
#include <cstdlib> #include <iostream> using namespace std; int main() { float broj; cout << "Unesite broj." << endl; cin >> broj; if (broj < 0) { cout << "Broj je manji od 0." << endl; } else { if (broj > 0) { cout << "Broj je veci od 0." << endl; } else { cout << "Broj je 0." << endl; } } cout << endl; system("PAUSE"); return 0; }
Osim to moemo u programu imati veoma sloena ispitivanja unutar if naredbe, mogue je jednu if naredbu staviti unutar druge if naredbe. To je nuno ako elimo ispitati vie stvari, npr. je li neki broj vei od nule ili jednak nuli ili je manji od nule. Takvo ispitivanje ne moemo napraviti s jednom if naredbom, nego su nune dvije if naredbe. Pogledajmo ram. ovaj prog-
122
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod Poetak programa. Prva if naredba. Ispituje je li broj manji od 0. Ako je uneseni broj manji od 0, izvodi se ovaj dio. Ako uneseni broj nije manji od 0, izvodi se ovaj dio. Unutar ovog dijela nalazi se druga if naredba. Ako je uneseni broj vei od 0, izvodi se ovaj dio. Ako uneseni broj nije vei od 0, izvodi se ovaj dio. Ako uneseni broj nije ni vei ni manji od nule, onda znamo da je nula. Kraj programa.
#include <cstdlib> #include <iostream> using namespace std; int main() { float broj; cout << "Unesite broj." << endl; cin >> broj; if (broj < 0) { cout << "Broj je manji od 0." << endl; } else { if (broj > 0) { cout << "Broj je veci od 0." << endl; } else { cout << "Broj je 0." << endl; } } cout << endl; system("PAUSE"); return 0; }
Pogledamo programa.
strukturu
PRO - MIL
123
Donoenje odluke
#include <cstdlib> #include <iostream> using namespace std; int main() { float broj; cout << "Unesite broj." << endl; cin >> broj; if (broj < 0) { cout << "Broj je manji od 0." << endl; } else { if (broj > 0) { cout << "Broj je veci od 0." << endl; } else { cout << "Broj je 0." << endl; } } cout << endl; system("PAUSE"); return 0; }
Pogledamo li paljivo ovaj program, vidjet emo da je potpuno identian programu s prethodne stranice. Razlika je jedino u tome to pojedini redovi nisu uvueni. Pokuamo li pokrenuti ovaj program, vidjet emo da radi potpuno jednako kao i inaica s uvuenim redovima. U emu je onda razlika? Zato bismo uope uvlaili redove kad program oigledno radi i bez toga? Razlika je u preglednosti. Program s uvuenim redovima daleko je pregledniji. Usporedimo li program s uvuenim redovima na prethodnoj stranici i ovaj bez uvuenih redova, vidjet emo da je na inaici s uvuenim redovima daleko lake uoiti gdje zapoinju, a gdje zavravaju pojedine if naredbe; koje vitiaste zagrade ine par i sl. Preglednost programa s uvlaenjima redova osobito dolazi do izraaja kod veih i sloenijih programa.
Ne postoje vrsta pravila na koji nain treba uvlaiti redove. Na poetku je najbolje da u vlastitim programima uvlaenja izvodimo slino kao u primjerima danima u knjizi. Osnovna ideja je u tome da se uvue svaka cjelina za koju bi moglo biti nejasno gdje poinje, a gdje zavrava.
124
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod Bez uvlaenja pie se poetak programa i dvije glavne vitiaste zagrade. Sadraj unutar glavnih vitiastih zagrada uvlai se u desnu stranu. Na toj razini pie se ve ina jednostavnih naredbi. Sadraji unutar if naredbe dodatno se pomiu u desnu stranu. To nam pomae da lake uoimo gdje poinje, a gdje zavrava if naredba. Ako se unutar jedne if naredbe nalazi druga if naredba, njen sadraj dodatno se pomie u desnu stranu. To nam pomae da lake uoimo gdje poinje i gdje zavrava druga if naredba te pomae da njen sadraj lake razlikujemo od sadraja prve if naredbe.
#include <cstdlib> #include <iostream> using namespace std; int main() { float broj; cout << "Unesite broj." << endl; cin >> broj; if (broj < 0) { cout << "Broj je manji od 0." << endl; } else { if (broj > 0) { cout << "Broj je veci od 0." << endl; } else { cout << "Broj je 0." << endl; } } cout << endl; system("PAUSE"); return 0; }
PRO - MIL
125
Donoenje odluke
Switch naredba
#include <cstdlib> #include <iostream> using namespace std; int main() { float a; float b; int od; cout << "Unesite 1. broj:" << endl; cin >> a; cout << "Unesite 2. broj:" << endl; cin >> b; cout << "Brojeve cemo:" << endl; cout << "1 - zbrojiti" << endl; cout << "2 - oduzeti" << endl; cout << "3 - mnoziti" << endl; cout << "4 - dijeliti" << endl; cin >> od; switch (od) { case 1: cout << a << " + " << b << " = " << a + b << endl; break; case 2: cout << a << " - " << b << " = " << a - b << endl; break; case 3: cout << a << " x " << b << " = " << a * b << endl; break; case 4: cout << a << " : " << b << " = " << a / b << endl; break; default: cout << "Morate unijeti 1,2,3 ili 4." << endl; } cout << endl; system("PAUSE"); return 0; }
If naredba nam omoguuje grananje na dvije grane. Jedna e se izvriti ako je uvjet zadovoljen, a druga ako uvjet nije zadovoljen. Primjena naredbe if nije elegantna ako se u programu javi potreba za grananjem u vie od dvije grane.
U ovom programu biramo jednu od etiri raunske operacije. Program bismo mogli realizirati i uporabom vie if naredbi, ali daleko je elegantniji ako upotrijebimo switch naredbu.
126
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Ovdje se nalazi int varijabla. Grananje se vri na temelju broja koji se nalazi u varijabli. Int tip je obvezan.
Naredbom case 1: zapoinje dio programa koji e se izvriti ako se u varijabli od nalazi broj 1.
Naredbom break zavrava case 1: naredba. Pokuajmo je obrisati. Pokrenimo program i promatrajmo posljedice.
cout << "Prvi izbor." << endl; break; case 2: cout << "Drugi izbor." << endl; break; case 3: cout << "Treci izbor." << endl; break; case 4: cout << "Cetvrti izbor." << endl; break; default: cout << "Greska!!!" << endl; }
Naredbom case 2: zapoinje dio programa koji e se izvriti ako je sadraj varijable od broj 2. Na temelju sline logike biraju se ostali case dijelovi kojih moe biti proizvoljni broj. (U naem sluaju imamo jo case 3: i case 4:.)
Ovaj dio izvrava se ako ni jedan case uvjet nije zadovoljen, dakle ako u varijabli od nije bio ni broj 1, ni broj 2, ni broj 3, ni broj 4. Kraj switch naredbe.
PRO - MIL
127
Petlje
128
PRO - MIL
PRO - MIL
Petlje
Objekti
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
129
Petlje
For petlja
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; Ovaj program crta niz krugova jednakog promjera. Svakome je sredite pomaknuto za pet toaka u desnu stranu u odnosu na sredite prethodnog.
Vidimo da program funkcionira, ali nije int main() ba elegantan budui da moramo pu{ no puta ponoviti slinu naredbu. int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); #include <cstdlib> cleardevice(); #include <iostream> Ovaj program radi isti circle(260,240,60); #include <winbgim.h> posao, ali je oigledno circle(265,240,60); daleko elegantniji. circle(270,240,60); using namespace std; circle(275,240,60); circle(280,240,60); int main() circle(285,240,60); { circle(290,240,60); int gdriver = 9; circle(295,240,60); int gmode = 2; circle(300,240,60); int x; circle(305,240,60); initgraph(&gdriver, &gmode, ""); circle(310,240,60); setbkcolor (WHITE); circle(315,240,60); setcolor (BLACK); circle(320,240,60); cleardevice(); circle(325,240,60); for (x = 260; x < 365; x = x + 5 ) circle(330,240,60); { circle(335,240,60); circle(x,240,60); circle(340,240,60); } circle(345,240,60); getch(); circle(350,240,60); closegraph(); circle(355,240,60); return 0; circle(360,240,60); } getch(); closegraph(); return 0; }
130
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Kljuna naredba u novoj inaici programa je for naredba. Omoguuje nam izvravanje dijela programa vie puta. To viestruko ponavljanje dijela programa naziva se programska petlja. Slino kao if naredba, i for naredba je veoma sloena i protee se kroz vie redova programa. Pogledajmo sastavne elemente for naredbe.
Ovdje se definira poetna vrijednost varijable koju koristi for naredba i koju prije for naredbe moramo formirati. U naem sluaju poetna vrijednost varijable x je 260.
Petlja e se vrtjeti, odnosno petlja e ponavljati dio programa, tako dugo dok je ovaj uvjet zadovoljen; u naem sluaju, tako dugo dok je sadraj varijable x manji od 365. Kad uvjet vie nije zadovoljen; tj. kad x vie ne bude manji od 365, program e nastavit izvoenje od prve naredbe nakon druge vitiaste zagrade.
for ( x = 260 ; {
x < 365 ;
x=x+5 )
Ovdje odreujemo nain na koji e se vrijednost varijable x mijenjati. U naem sluaju nakon svakog ponavljanja for naredbe, vrijednost varijable x uveat e se za 5, a rezultat e se spremiti u varijablu x.
circle ( x, 240, 60 ); }
Udaljenost sredita kruga od lijevog ruba nije odreena brojem, nego vrijednou varijable x. Budui da se pri svakom ponovnom izvoenju sadraj varijable x mijenja, jednako e se mijenjati i udaljenost sredita kruga od lijevog ruba.
Sadraj unutar navodnika ponavlja se svaki put kad for naredba uvea vrijednost varijable x i provjeri je li x manji od 365.
PRO - MIL
131
Petlje
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() {
int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice();
Naredbe za otvaranje grafikog prozora, odreivanje svojstava grafike i formiranje varijable x koju koristimo u for naredbi.
Ovdje definiramo petlju. Poetna vrijednost varijable petlje x je 260, uveavat e se za 5, a izvravat e se tako dugo dok je sadraj varijable x manji od 365.
for (x = 260; x < 365; x = x + 5 ) Pri svakom ponavljanju petlje ponavlja se sadraj unutar vitiastih zagrada. U naem sluaju na grafikom ekranu e se crtati krug. { circle(x,240,60); } Udaljenost sredita kruga od lijevog ruba nije odreena brojem, nego vrijednou varijable x. Budui da vrijednost varijable x pri svakom ponavljanju raste za 5, sredie novog kruga bit e za pet toaka pomaknuto u desnu stranu.
132
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Vidimo da se ponavlja sadraj unutar vitiastih zagrada for naredbe. Sadraj prije i sadraj poslije for naredbe ne ponavlja se. Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Nemojmo se obeshrabriti ako nam trenutno nije previe jasno ni kako for naredba radi, ni emu bi to trebalo sluiti. Na poetku su takve nedoumice normalne i nipoto nisu dokaz da nismo talentirani za programiranje. Takve nedoumice prevladavaju se tako da napiemo odreenu koliinu programa jer emo jedino na taj nain do kraja shvatiti kako for naredba radi i emu slui. Drugaiji je problem ako nam se ne da pisati programe. Onda bismo doista mogli konstatirati da programiranje nije za nas i trebali bismo se pokuati baviti neim intelektualno manje zahtjevnim, npr. nogometom ili politikom.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int x; cout << "Prije for naredbe." << endl; for (x = 0; x < 9; x = x + 1 ) { cout << x << endl; } cout << "Nakon for naredbe." << endl; cout << endl; system("PAUSE"); return 0; }
Ovaj e nam program pomoi da lake shvatimo funkcioniranje if naredbe. Vrijednost varijable x mijenjat e se od 0 do 9 po 1. Jedino to ovaj program radi jest ispisivanje sadraj varijable x. To nam omoguuje lako opaanje kako se sadraj varijable x mijenja, te koji dio programa se ponavlja i koliko puta. Unoenjem varijacija u taj program najlake emo shvatiti for naredbu.
PRO - MIL
133
Petlje
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int x; cout << "Prije for naredbe." << endl; for (x = 0; x < 9; x = x + 2 ) { cout << x << endl; } cout << "Nakon for naredbe." << endl; cout << endl; system("PAUSE"); return 0; } U prolom primjeru vrijednost varijable x uveavali smo za 1, a u primjeru prije toga za 5. Vrijednost varijable x u for naredbi moemo uveavati za bilo koju vrijednost koja nam u programu treba, npr. za 2. U ovom sluaju vrijednost varijable x raste od 0 do 9 po 2.
Mijenjati moemo poetnu i krajnju vrijednost petlje. U ovom sluaju x e se mijenjati od 10 do 29.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int x; cout << "Prije for naredbe." << endl; for (x = 10; x < 29; x = x + 2 ) { cout << x << endl; } cout << "Nakon for naredbe." << endl; cout << endl; system("PAUSE"); return 0; }
134
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj using namespace std; int main() { int x; cout << "Prije for naredbe." << endl; for (x = 28; x > 9; x = x - 2 ) { cout << x << endl; } cout << "Nakon for naredbe." << endl; cout << endl; system("PAUSE"); return 0; } For naredba moe brojiti i unatrag. U ovom sluaju vrijednost varijable x mijenja se od 28 do 9 po 2.
PRO - MIL
int main() { int x; cout << "Prije for naredbe." << endl; for (x = 18; x > -9; x = x - 2 ) { cout << x << endl; } cout << "Nakon for naredbe." << endl; cout << endl; system("PAUSE"); return 0; }
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
135
Petlje
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int x; cout << "Prije for naredbe." << endl; for (x = 18; x > -9; x = x + 2 ) { cout << x << endl; } cout << "Nakon for naredbe." << endl; cout << endl; system("PAUSE"); return 0; }
Prilikom formiranja for naredbe mogue je napraviti greku koja se naziva mrtva petlja. Do te greke dolazi kad uvjete za kraj petlje tako formuliramo da se oni nikad nee ispuniti, pa e se petlja vjeno izvoditi. U ovom primjeru poetna vrijednost je 18. Ta poetna vrijednost uveava se za 2, a petlja e se ponavljati tako dugo dok je x vei od 9. Ako 18 uveavamo za 2, x e uvijek biti vei od 9 i petlja se nikad nee prekinuti.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int x; cout << "Prije for naredbe." << endl; for (x = 0; x < 9; x = x - 1 ) { cout << x << endl; } cout << "Nakon for naredbe." << endl; cout << endl; system("PAUSE"); return 0; }
136
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Ovaj primjer slian je primjeru na poetku ovog poglavlja. Razlika je u tome to su u ovom sluaju drugaije poetna i krajnja vrijednost x varijable, pa smo dobili drugaiji niz krugova. U ovom sluaju vrijednost varijable x mijenja se od 60 do 580 po 5. Pokuamo sami mijenjati vrijednosti unutar for naredbe i promatrajmo kakve efekte e izazvati te promjene. Uvod
Naredba for ne postoji zato da bi se niz brojeva ispisao na zaslon raunala, nego zato da bi se u programu postigli odreeni efekti. Iako to nije uvijek sluaj, najee se za postizanje eljenih ciljeva koristi varijabla petlje. Pogledajmo nekoliko primjera.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 60; x < 580; x = x + 5 ) { circle(x,240,60); } getch(); closegraph(); return 0; }
PRO - MIL
137
Petlje
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 60; x < 390; x = x + 5 ) { circle(320,x,60); } getch(); closegraph(); return 0; }
Varijablu x moemo staviti umjesto broja koji odreuje udaljenost sredita od gornjeg ruba, pa e se krugovi crtati od gore prema dolje.
Uveavamo li varijablu x za 15 umjesto za 5, pomak sredita krugova bit e vei. Umjesto broja 15 pokuajmo staviti 10, a zatim 20.
int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 60; x < 390; x = x + 15 ) { circle(320,x,60); } getch(); closegraph(); return 0; }
138
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Osim pozicije sredita kruga, varijablom x moemo mijenjati polumjer kruga. #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; Na slian nain moemo crtati nizove drugih geometrijskih oblika, npr. crta. int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 10; x < 640; x = x + 10 ) { line (x, 20, x, 400); } getch(); closegraph(); return 0; } Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 20; x < 210; x = x + 10 ) { circle(320,240,x); } getch(); closegraph(); return 0; }
PRO - MIL
139
Petlje
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 10; x < 640; x = x + 30 ) { rectangle (x, 20, x+20, 380); } getch(); closegraph(); return 0; }
U dosadanjim programima koristili smo jednu varijablu. U ovom primjeru koristima dvije, jednom pomiemo udaljenost sredita od lijevog ruba, a drugom mijenjamo promjer.
int main() { int gdriver = 9; int gmode = 2; int x; int r; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); r = 20; for (x = 20; x < 475; x = x + 15 ) { circle(x,240,r); r = r + 5; } getch(); closegraph(); return 0; }
140
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Prije for naredbe u varijablu r spremimo poetnu vrijednost polumjera kruga. U naem sluaju spremili smo broj 20. For naredba mijenja vrijednost varijable x o 20 do 475 po 15. U naredbi za crtanje kruga upotrijebili smo dvije varijable. Varijablom x odreujemo udaljenost sredita kruga od lijevog ruba, a varijablom r polumjer kruga. Zbog toga e pri svakom ponavljaju polumjer kruga biti vei. Saimanje Veliki programi koda Da bi kod svakog ponavljanja polumjer kruga bio vei, nakon to smo nacrtali krug, unutar vitiastih zagrada for naredbe, broj u varijabli r poveavamo za 5. Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Za razliku od dosadanjih primjera, u ovom formiramo jo jednu varijablu koju smo nazvali r. Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; int r; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); r = 20; for (x = 20; x < 475; x = x + 15 ) { circle(x,240,r); r = r + 5; } getch(); closegraph(); return 0; }
I u ovom sluaju promjena pojedinih elemenata i opaanje rezultata pomoi e nam da bolje razumijemo program; npr umjesto r = r + 5 pokuajmo staviti r = r + 10; umjesto x = x + 15 pokuajmo staviti x = x + 5.
PRO - MIL
141
Petlje
Animacija
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 10; x < 620; x = x + 30 ) { rectangle (x, 20, x+20, 60); } getch(); closegraph(); return 0; } Animaciju moemo napraviti veoma jednostavno. Ovaj program crta niz pravokutnika. Dovoljno je da pravokutnik prije crtanja na novoj poziciji obriemo na staroj i dobit emo iluziju kretanja.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 10; x < 620; x = x + 1 ) { cleardevice(); rectangle (x, 20, x+20, 60); } getch(); closegraph(); return 0; }
142
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj using namespace std; U ovom primjeru animiramo krug koji pada od gornjeg prema donjem rubu . int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 10; x < 465; x = x + 1 ) { cleardevice(); circle (320, x, 10); } getch(); closegraph(); return 0; } Polja Saimanje Veliki programi koda Objekti Obrada teksta Petlje #include <cstdlib> #include <iostream> #include <winbgim.h> Donoenje Grafika odluke Sve grafike elemente koje smo do sada mijenjali moemo animirati. U ovom programu animiramo irenje kruga. Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 10; x < 200; x = x + 1 ) { cleardevice(); circle (320, 240, x); } getch(); closegraph(); return 0; }
PRO - MIL
143
Petlje
Petlja u petlji
Slino kao to moemo unutar if naredbe staviti drugu if naredbu tako unutar for petlje moemo staviti drugu for petlju. Kod ovakvih programa veoma je vano pravilno uvlaiti redove, jer tako lake uoavamo poetak i kraj pojedinih for naredbi.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; int r; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 30; x < 610; x = x + 60 ) { for (r = 5; r < 31; r = r + 5) { delay(100); cleardevice(); circle (x, 240, r); } } getch(); closegraph(); return 0; }
Ovom naredbom nareujemo raunalu da na ovom mjestu stoji onoliko milisekundi koliki broj smo stavili u zagradu. U naem sluaju raunalo e stajati 100 milisekundi. Ovom naredbom usporavamo izvoenje animacije, ako je animacija suvie brza. Na vaem raunalu taj broj moete promijeniti i tako izvoenje animacije prilagoditi brzini svog raunala. (Ako imamo sporo raunalo, ovu naredbu moemo izbaciti.)
Ovdje vidimo tijek cijele animacije, iako e se tijekom animacije istovremeno vidjeti samo jedan krug. Vanjskom petljom pomiemo sredite kruga u lijevu stranu, a unutranjom petljom mijenjamo polumjer kruga.
144
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Skok u novi red. Obrada teksta Sadraj varijable x ispisuje se na zaslon raunala. Polja Petlje Da bi rezultat rada programa bio bolje vidljiv, ovdje smo naredbu cout koristili na nain na koji je do sada nismo koristili. U ovoj inaici sadri tri dijela. Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; int r; cout << "Prije petlje." << endl; for (x = 0; x < 2; x = x + 1 ) { cout << "Vanjska petlja. x = " << x << endl; for (r = 0; r < 3; r = r + 1) { cout << "Nutarnja petlja. r = " << r << endl; } } cout << "Nakon petlje." << endl; cout << endl; system("PAUSE"); return 0; }
Analiziranje ovog programa pomoi e nam da u potpunosti razumijemo nain funkcioniranja petlje unutar petlje. Pri tome nismo ogranieni na to da moemo staviti jednu petlju unutar petlje. Mogue je unutar petlje staviti petlju, a unutar te petlje jo jednu petlju i tako petlje dodavati u skladu s ciljevima koje elimo postii.
PRO - MIL
145
Petlje
Niz petlji
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; Osim to petlju moemo staviti unutar druge petlje, petlje moemo staviti jednu iza druge. U ovom sluaju prva petlja mali krug pomie od dolje prema gore, a zatim druga petlja mali krug iri tako da sve zajedno tvori jednostavan prikaz vatrometa.
int main() { int gdriver = 9; int gmode = 2; int x; int r; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); for (x = 465; x > 100; x = x - 1 ) { cleardevice(); Analiza ovog progcircle (320, x, 10); rama pomoi e } nam da lake razufor (r = 10; r < 91; r = r + 1) #include <cstdlib> mijemo funkcionira{ #include <iostream> nje niza petlji. cleardevice(); circle (320, x, r); using namespace std; } getch(); int main() closegraph(); { return 0; int x; } int r; cout << "Prije petlji." << endl; for (x = 2; x > 0; x = x - 1 ) { cout << "Prva petlja. x = " << x << endl; } for (r = 0; r < 3; r = r + 1) { cout << "Druga petlja. r = " << r << endl; } cout << "Nakon petlji." << endl; cout << endl; system("PAUSE"); return 0; }
146
PRO - MIL
Dozvoljene i nedozvoljene kombinacije petlji for (x = 30; x < 610; x = x + 60) { for (r = 5; r < 31; r = r + 5) { circle (x, 240, r); } }
for (x = 465; x < 100; x = x - 1) { circle (320, x, 10); } for (r = 10; r < 91; y = y + 1) { circle (320, x, r); }
Ovakva ispreplete-
PRO - MIL
for (x = 465; x < 100; x = x - 1) { circle (320, x, 10); for (r = 10; r < 91; y = y + 1) }
ovom
sluaju
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
147
Petlje
While petlja
Do sada smo za svaki novi proraun programe morali iznova pokretati. Daleko elegantnije bilo bi kad bi nas program nakon prorauna pitao elimo li proraun ponoviti ili elimo prekinuti izvoenje programa.
int main() { int broj; int kvadrat; Ovaj program radi upravo tako. Uneint odgovor; semo li nakon prorauna broj 1, proodgovor = 1; raun emo moi ponoviti, a unesewhile (odgovor == 1) mo li 2, odnosno bilo koji broj razliit { od 1 program e se zaustaviti. cout << "Unesite broj" << endl; cin >> broj; kvadrat = broj * broj; cout << "Kvadrat unesenog broja je:" << endl; cout << kvadrat; cout << endl; cout << "Ponovo = unesite 1." << endl; cout << "Kraj = unesite 2." << endl; cin >> odgovor; } cout << endl; U ovom programu koristi se system("PAUSE"); petlja, budui da se dio proreturn 0; grama moe ponoviti vie } puta. Ova petlje nije realizirana for naredbom, nego while naredbom. U emu je razlika? Naredba for pogodnija je za tono odreen broj ponavljanja, a naredba while onda kad unaprijed ne moemo znati broj ponavljanja. (U ovom sluaju mi ne moemo unaprijed znati koliko puta e korisnik htjeti kvadrirati neki broj.)
148
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Prije naredbe while moramo varijabli koju e while naredba koristiti dati neku poetnu vrijednost. Ovdje se unutar zagrada nalazi uvjet koji while naredba ispituje. Uvjeti se formiraju po istoj logici kao i kod for naredbe. Ako je uvjet zadovoljen, izvrit e se naredbe unutar vitiastih zagrada, a nakon Na prvi program Uvod
Kljuna naredba u novoj inaici programa je while naredba. Logika uporabe te naredbe slina je logici uporabe for naredbe i ako bismo se potrudili svaki program realiziran for naredbom mogli bismo realizirati while naredbom i svaki program realiziran while naredbom mogli bismo realizirati for naredbom. Zato imamo dvije naredbe ako rade isti posao? Zato to se neke stvari mogu lake realizirati for naredbom, a neke while naredbom. Pogledajmo elemente while naredbe.
toga se raunalo vraa na while naredbu i ponovo ispituje je li uvjet zadovoljen. Ako jest, ponovo se izvode naredbe unutar vitiastih zagrada. Ako nije, izvodi se prva naredba poslije druge vitiaste zagrade. U naem sluaju ispituje se je li sadraj
Da bi se ponavljanje u nekom trenutku prekinulo, unutar vitiastih zagrada varijabli koju while naredba ispituje treba promijeniti vrijednost.
varijable a jednak broju 1. Zato prije while naredbe moramo u varijablu a staviti broj jedan. Kad bi u varijabli a bio neki drugi broj, raunalo bi skoilo na prvi red nakon druge vitiaste zagrade.
PRO - MIL
149
Petlje
Pogledajmo dijelove naeg programa. #include <cstdlib> #include <iostream> using namespace std; int main() { int broj; int kvadrat; int odgovor; Uobiajeni poetak programa i formiranje varijabli.
U varijablu odgovor stavljamo broj 1. To moramo uiniti jer naredba while ispituje je li u varijabli odgovor broj 1.
odgovor = 1; Naredba while ispituje je li sadraj varijable odgovor jednak broju 1. while (odgovor == 1) Ako jest, izvode se ove naredbe.
{ cout << "Unesite broj" << endl; cin >> broj; kvadrat = broj * broj; cout << "Kvadrat unesenog broja je:" << endl; cout << kvadrat; cout << endl; cout << "Ponovo = unesite 1." << endl; cout << "Kraj = unesite 2." << endl; cin >> odgovor; }
U ovom djelu izraunava se kvadrat unesenog broja. U ovom dijelu u varijablu odgovor unosi se broj na temelju kojeg e while naredba odluiti treba li naredbe unutar vitiastih zagrada ponoviti.
Kraj programa. Izvodit e se kad while naredba ustanovi da sadraj varijable odgovor nije broj 1.
150
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Ovdje naredbom cin preko tipkovnice unosimo novu vrijednost varijable odgovor i time biramo hoemo li petlju ponoviti ili emo izai iz programa. Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable #include <cstdlib> #include <iostream> using namespace std; int main() { int odgovor; odgovor = 1; cout << "Prije while naredbe." << endl; while (odgovor == 1) { cout << "Prvi red bloka ponavljanja" << endl; cout << "1 = nastavak ili 2 = kraj." << endl; cin >> odgovor; cout << "Zadnji red bloka ponavljanja" << endl; } cout << "Nakon while naredbe." << endl; cout << endl; system("PAUSE"); return 0; } Na prvi program Uvod
Varijablu koju e koristiti while naredba moramo prije while naredbe formirati i moramo joj dati odgovarajuu poetnu vrijednost. Zato je u naem sluaju odgovarajua poetna vrijednost 1? Zato to while naredba ispituje je li vrijednost varijable odgovor 1. Ako bi vrijednost varijable odgovor bila npr. 2, nakon while naredbe program bi skoio na ovu naredbu i sadraj unutar navodnika ne bi se izvravao.
PRO - MIL
151
Petlje
U prethodnim programima korisnik je mogao izabrati hoe li program izvoditi ponovo, ali biranje je funkcioniralo na vrlo neprirodan nain. Nije ba logino unijeti broj 1 za ponavljanje prorauna ili broj 2 za prekid programa. Ova inaica programa to biranje izvodi na elegantniji nain. Umjesto unoenja brojeva kao odgovora, u ovom programu unosimo slova. Da bi to bilo mogue, upotrijebili smo novi tip varijable, varijablu char tipa u koju moemo spremiti jedno slovo.
#include <cstdlib> #include <iostream> using namespace std; int main() { int broj; int kvadrat; char odgovor; odgovor = 'd'; while (odgovor != 'n') { cout << "Unesite broj" << endl; cin >> broj; kvadrat = broj * broj; cout << "Kvadrat unesenog broja je:" << endl; cout << kvadrat; cout << endl; cout << "Zelite li ponovo (d/n)?" << endl; cin >> odgovor; } cout << endl; system("PAUSE"); return 0; }
152
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Ovdje se izraunava kvadrat unesenog broja. Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod #include <cstdlib> #include <iostream> using namespace std; int main() { int broj; int kvadrat; char odgovor; odgovor = 'd'; while (odgovor != 'n') { cout << "Unesite broj" << endl; cin >> broj; kvadrat = broj * broj; cout << "Kvadrat unesenog broja je:" << endl; cout << kvadrat; cout << endl; cout << "Zelite li ponovo (d/n)?" << endl; cin >> odgovor; } cout << endl; system("PAUSE"); return 0; } Formiranje varijabli koje emo koristiti u programu. Formiranje varijable tipa char u koju moemo spremiti jedno slovo. Nakon formiranja u varijablu odgovor spremamo slovo d. while naredbom ispitujemo je li sadraj varijable odgovor razliit od slova n. Ako jest, izvodi se sadraj unutar vitiastih zagrada. Ovdje se unosi slovo d ili slovo n na temelju ega e while naredba ponovo izvesti naredbe unutar vitiastih zagrada ako smo unijeli slovo d ili e izvesti naredbe nakon vitiastih zagrada ako smo Kraj programa. unijeli slovo n.
PRO - MIL
153
Petlje
int main() Mali krug kree se od gore pre{ int gdriver = 9; ma dolje, a zatim nas raunalo int gmode = 2; pita elimo li ponoviti animaciju. int x; char odgovor; odgovor = 'd'; U ovom programu koristimo dviinitgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); je razliite vrste petlji. setcolor (BLACK); while (odgovor != 'n') { While naredbom ponavlja se cleardevice(); animacija, a for naredbom, koja for (x = 10; x < 465; x = x + 1 ) { se nalazi unutar while petlje, cleardevice(); animira se kretanje kruga. circle (320, x, 10); } settextstyle(9, HORIZ_DIR, 1); outtextxy(20, 20, "elite li ponovo (d/n)?"); U grafikom prozoru odgovor = getch(); za unos slova u vari} jablu odgovor ne closegraph(); koristi se cin naredreturn 0; ba, nego getch() na} redba.
Ako koristimo getch() naredbu, nakon unosa ne koristima Enter tipku. Dovoljno je pritisnuti slovo d ili slovo n.
154
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj grafikog Saimanje Veliki programi koda Objekti Obrada teksta Nakon izvoenja animacije unosi se odgovor na pitanje elimo li ponoviti animaciju. Kraj programa. Ovaj dio izvodi se kad while naredba ustanovi da sadraj varijable odgovor nije razliit od n. Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; char odgovor; odgovor = 'd'; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); while (odgovor != 'n') { cleardevice(); for (x = 10; x < 465; x = x + 1 ) { cleardevice(); circle (320, x, 10); }
Formiranje varijabli.
Formiranje varijable odgovor. Ta varijabla je char tipa i koristit e je while petlja unutar koje se nalazi program za animaciju. Slui nam za biranje ponavljanja animacije ili kraja programa. U varijablu odgovor sprema se slovo d.
Otvaranje prozora.
settextstyle(9, HORIZ_DIR, 1); outtextxy(20, 20, "elite li ponovo (d/n)?"); odgovor = getch(); } closegraph(); return 0; }
PRO - MIL
155
Petlje
Ovaj program omoguit e nam da lijevom i desnom strelicom na tipkovnici kontroliramo kretanje pravokutnika u lijevu ili desnu stranu. Program naputamo pritiskom na tipku k. Ovaj program ve bismo mogli smatrati jednim elementom primitivne igrice. Dovoljno bi bilo dodati kretanje malih krugova od gore prema dolje i broja koji bi brojio koliko krugova smo ovim pravokutnikom uspjeli uhvatiti.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x = 290; char odgovor = 'd'; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (odgovor != 'k') { rectangle(x, 432, x+60, 438); odgovor = getch(); if (odgovor == 75) { x = x - 5; } if (odgovor == 77) { x = x + 5; } cleardevice(); } closegraph(); return 0; }
156
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Pogledajmo dijelove naeg programa. #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x = 290; char odgovor = 'd'; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (odgovor != 'k') { rectangle(x, 432, x+60, 438); odgovor = getch(); if (odgovor == 75) { x = x - 5; } if (odgovor == 77) { x = x + 5; } cleardevice(); } closegraph(); return 0; } Naredbom za brisanje ekrana briemo pravokutnik na staroj poziciji da bismo ga nacrtali na novoj. (Pokuajmo ovu naredbu izbaciti.) Cijelo vrijeme dok naa primitivna igrica radi, vrtjet e se u ovoj while petlji. Ako pritisnemo tipku k program e izai iz petlje i naa igrica e se ugasiti.
Ovdje program ispituje koja tipka je pritisnuta, a rezultat sprema u varijablu odgovor.
Ako pritisnemo lijevu strelicu, varijabla x, koja odreuje udaljenost pravokutnika od lijeve strane, umanjit e se za 5, pa e se pravokutnik drugi put crtati pomaknut 5 toaka u lijevu stranu.
Ako pritisnemo desnu strelicu, varijabla x e se uveati za 5, pa e se pravokutnik drugi put crtati pomaknut 5 toaka u desnu stranu.
Kraj programa.
PRO - MIL
157
Petlje
Dodamo li u prethodni program ispitivanje je li pritisnuta strelica prema gore ili strelica prema dolje, na pravokutnik moi e se pomicati u sva etiri smjera. #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; Varijablom x odreujemo udaljenost gornjeg lijevog ugla pravokutnika od lijevog ruba grafikog prozora, a varijablom y od gornjeg ruba grafikog prozora. Brojevi 290 i 220 odreuju poetnu poziciju pravokutnika. (Pokuajmo mijenjati te brojeve.)
int main() { int gdriver = 9; int gmode = 2; int x = 290; int y = 220; char odgovor = 'd'; initgraph(&gdriver, &gmode, ""); I u ovom sluaju program e se izvosetbkcolor (WHITE); diti dok korisnik ne pritisne tipku k, setcolor (BLACK); odnosno dok je pritisnuta tipaka razlicleardevice(); ita od k. while (odgovor != 'k') { rectangle(x, y, x+60, y+5); Ovdje smo dodali dio programa u kojem ispiodgovor = getch(); tujemo je li pritisnuta strelica prema gore ili if (odgovor == 75) strelica prema dolje. { x = x - 5; Zato ovdje koristimo broj 72, a ne strelicu } prema gore? if (odgovor == 77) { Zato to strelicu prema gore ne moemo unix = x + 5; jeti u program preko tipkovnice, a broj 72 je } ifra za strelicu prema gore. (75 za lijevo, 77 if (odgovor == 72) za desno i 80 za dolje.) { y = y - 5; } if (odgovor == 80) { y = y + 5; } cleardevice(); } closegraph(); return 0; }
158
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Ako ovu naredbu obriemo, pravokutnik e se crtati na novoj poziciji, ali e ostati i na staroj pa e rezultat kretanja pravokutnika biti trag na zaslonu raunala. Obriimo ovu naredbu i pokrenimo program. Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Da bismo dobili primitivni program za crtanje, dovoljno je da u prethodnom programu maknemo naredbu za brisanje zaslona raunala. #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x = 290; int y = 220; char odgovor = 'd'; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (odgovor != 'k') { rectangle(x, y, x+60, y+5); odgovor = getch(); if (odgovor == 75) { x = x - 5; } if (odgovor == 77) { x = x + 5; } if (odgovor == 72) { y = y - 5; } if (odgovor == 80) { y = y + 5; } cleardevice(); } closegraph(); return 0; }
Varijablama x i y odreena je pozicija gornjeg lijevog ugla pravokutnika. Varijabla x odreuje udaljenost od lijevog ruba, a varijabla y od gornjeg ruba. Udaljenost donjeg desnog ugla pravokutnika od lijevog ruba odreena je sa x + 60, a udaljenost donjeg desnog ugla od gornjeg ruba odreena je sa y+5. irina naeg pravokutnika je 60, a visina 5. (Pokuajmo promijeniti te brojeve.)
PRO - MIL
159
Petlje
elimo li napraviti program za crtanje, pogodnije je za crtanje koristiti toku umjesto pravokutnika.
int main() { int gdriver = 9; int gmode = 2; int x = 290; int y = 220; char odgovor = 'd'; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (odgovor != 'k') { putpixel(x, y, BLACK); odgovor = getch(); if (odgovor == 75) { x = x - 1; } if (odgovor == 77) { x = x + 1; } if (odgovor == 72) { y = y - 1; } if (odgovor == 80) { y = y + 1; } } closegraph(); return 0; }
Ovom naredbom ispisujemo jednu toku na zaslon raunala. Varijabla x odreuje udaljenost toke od lijevog ruba, varijabla y od gornjeg ruba, a BLACK odreuje boju toke.
elimo li dobiti punu crtu, toku moramo pomicati za 1. Pokuajmo umjesto 1 staviti 2 ili 5.
160
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Ovom naredbom ispisujemo krug. Varijabla x odreuje udaljenost sredita kruga od lijevog ruba, varijabla y udaljenost sredita od gornjeg ruba, a 20 je polumjer kruga. Broj 5 odreuje pomak novog sredita u odnosu na staro. Pokuajmo mijenjati taj broj. Saimanje Veliki programi koda Imajmo stalno na umu da emo razumijevanje programa i vjetinu pisanja vlastitih programa stei jedino tako da svaki primjer programa koji je dat u ovoj knjizi mijenjamo na sve naine koji nam padnu na pamet i onda promatramo kakve posljedice izaziva odreena promjena. Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x = 290; int y = 220; char odgovor = 'd'; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (odgovor != 'k') { circle(x, y, 20); odgovor = getch(); if (odgovor == 75) { x = x - 5; } if (odgovor == 77) { x = x + 5; } if (odgovor == 72) { y = y - 5; } if (odgovor == 80) { y = y + 5; } } closegraph(); return 0; }
PRO - MIL
161
Petlje
Objekte na zaslonu raunala osim tipkovnicom moemo pomicati i miem. #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; Naredbom kbhit ispituje se je li bilo koja tipka na tipkovnici pritisnuta.
int main() Naredbom while (!kbhit) nareujemo { raunalu da petlju izvodi tako dugo int gdriver = 9; dok ni jedna tipka nije pritisnuta. int gmode = 2; initgraph(&gdriver, &gmode, ""); Pritisnemo li bilo koju tipku na tipkovsetbkcolor (WHITE); nici, zaustavlja se izvoenje petlje i setcolor (BLACK); prekida se program. cleardevice(); while (!kbhit()) { rectangle(mousex(),mousey(),mousex()+80,mousey()+80 ); } closegraph(); return 0; }
Naredbom mousex() oitava se udaljenost pokazivaa mia od lijevog ruba grafikog prozora.
Naredbom mousey() oitava se udaljenost pokazivaa mia od gornjeg ruba grafikog prozora.
Gornji lijevi ugao pravokutnika odreen je poloajem pokazivaa mia, a donji desni tako da se udaljenost pokazivaa mia od desnog ruba uveava za 80, a udaljenost pokazivaa mia od gornjeg ruba uveava isto tako za 80. Dimenzije naeg pravokutnika su 80 puta 80.
162
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Jasno je da osim postojeih dimenzija kruga i pravokutnika moemo koristi pravokutnike i krugove drugih dimenzija. Isto tako moemo koristiti i druge grafike elemente, npr. toke ili crte. Pokuajmo sami smisliti varijacije ovakvih programa. Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Miem moemo pokretati bilo koji grafiki objekt, npr. krug. #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (!kbhit()) { circle(mousex(),mousey(),100); } closegraph(); return 0; } Otvaranje grafikog prozora.
Poetak programa.
Unutar while petlje stalno se oitava pozicija pokazivaa mia i crta se krug ije sredite odreuje poloaj pokazivaa mia, a polumjer je 100. Petlja se izvodi tako dugo dok niti jedna tipka na tipkovnici nije pritisnuta.
Kraj programa.
PRO - MIL
163
Petlje
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (!kbhit()) { cleardevice(); circle(mousex(),mousey(),100); } closegraph(); return 0; }
Ako u prethodne programe dodamo naredbu za brisanje sadraja grafikog prozora, dobit emo program koji nam omoguuje pomicanje objekta miem.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (!kbhit()) { cleardevice(); line (mousex()+40, mousey(), mousex()-40, mousey()); line (mousex(), mousey()-40, mousex(), mousey()+40); } closegraph(); Na slian nain moemo miem return 0; pomicati neto drugo, npr. dvije } crte koje bi u igri mogle biti nian.
164
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Nedostatak prethodnih programa bio je to se ekran brie i objekt ponovo crta, bez obzira je li to potrebno ili nije, odnosno bez obzira je li dolo do pomaka mia ili nije. Ako nije dolo do pomaka mia, nema potrebe objekt brisati i ponovo crtati. Neprestano brisanje i crtanje moe na sporijim raunalima izazvati treperenje slike, to je veoma neugodno. Ovaj program ispituje je li dolo do pomaka mia ili nije. Ekran se brie i objekt crta na novoj poziciji jedino ako je dolo do pomicanja mia. #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (!kbhit()) { if (ismouseclick(WM_MOUSEMOVE)) { cleardevice(); circle(mousex(),mousey(),100); } clearmouseclick(WM_MOUSEMOVE); } closegraph(); return 0; } Da bi bilo mogue novo oitavanje mia, rezultat starog oitavanja ovom se naredbom mora obrisati. Kad ovu naredbu ne bismo upotrijebili, u programu bi bilo mogue samo jedno oitavanje mia. Ovom naredbom ispitujemo je li dolo do pomaka mia. Sadraj unutar vitiastih zagrada izvrit e se jedino ako je dolo do pomaka mia. U tom sluaju obrisat e se sadraj grafikog prozora i objekt e se nacrtati na novoj poziciji.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
165
Petlje
Osim to moemo oitati je li dolo do pomaka mia, moemo isto tako oitati je li pritisnuta neka tipka na miu. Ovaj program e nam omoguiti da pritiskom na lijevu tipku mia nacrtamo objekt u grafikom prozoru.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (!kbhit()) { if (ismouseclick(WM_LBUTTONDOWN)) { cleardevice(); circle(mousex(),mousey(),100); } clearmouseclick(WM_LBUTTONDOWN); } closegraph(); return 0; }
Ovom naredbom ispitujemo je li pritisnuta lijeva tipka mia. Ako jest izvodi se sadraj unutar vitiastih zagrada.
Ovom naredbom briemo rezultat oitavanja lijeve tipke na miu. Novo oitavanje je mogue jedino nakon brisanja starog oitavanja.
Uoimo, ako smo oitavali ismouseclick(WM_MOUSEMOVE), briemo clearmouseclick(WM_MOUSEMOVE), a ako smo oitavali ismouseclick(WM_LBUTTONDOWN), briemo clearmouseclick(WM_LBUTTONDOWN).
166
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje clearmouseclick(WM_RBUTTONDOWN) Brisanje oitavanja desnog klika. ismouseclick(WM_RBUTTONDBLCLK) Oitavanje duplog desnog klika. Brisanje oitavanja duplog desnog klika. Oitavanje srednjeg klika. Brisanje oitavanja srednjeg klika. Oitavanje duplog srednjeg klika. Brisanje oitavanja duplog srednjeg klika. clearmouseclick(WM_RBUTTONDBLCLK) ismouseclick(WM_MBUTTONDOWN) clearmouseclick(WM_MBUTTONDOWN) ismouseclick(WM_MBUTTONDBLCLK) clearmouseclick(WM_MBUTTONDBLCLK) Donoenje Grafika odluke Varijable Na prvi program Uvod
clearmouseclick(WM_MOUSEMOVE)
ismouseclick(WM_LBUTTONDOWN)
clearmouseclick(WM_LBUTTONDOWN);
ismouseclick(WM_LBUTTONDBLCLK)
Oitavanje duplog lijevog klika. Brisanje oitavanja duplog lijevog klika. Oitavanje desnog klika.
clearmouseclick(WM_LBUTTONDBLCLK)
ismouseclick(WM_RBUTTONDOWN)
PRO - MIL
167
Petlje
Do while petlja
Pokrenemo li ova dva programa, vidjet emo da je rezultat njihovog rada potpuno jednak, iako prvi koristi while naredbu, a drugi do while naredbu. #include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); while (!kbhit()) { if (ismouseclick(WM_LBUTTONDOWN)) { circle(mousex(),mousey(),100); } clearmouseclick(WM_LBUTTONDOWN); } closegraph(); return 0; }
int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); do { if (ismouseclick(WM_LBUTTONDOWN)) { circle(mousex(),mousey(),100); } clearmouseclick(WM_LBUTTONDOWN); } while (!kbhit()); closegraph(); return 0; }
168
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Ovaj dio unutar vitiastih zagrada ponavlja se dok je uvjet zadovoljen, u naem sluaju dok je sadraj varijable a jednak broju 1.
Petlja do while zapoinje odreivanjem vrijednosti varijable koju e koristiti while naredba.
Ovdje se ispituje je li zadovoljen uvjet po istoj logici po kojoj se ispituje i u while naredbi. Uoimo da se ovdje na kraju while naredbe obavezno pie ; oznaka.
U emu je razlika izmeu ovih dviju petlji, osim oigledne razlike u nainu pisanja? Razlika je u tome to se sadraj while petlje nee izvesti niti jednom ako uvjet nije zadovoljen jer se ispitivanje nalazi prije djela koji se ponavlja. Sadraj do while petlje e se bez obzira na uvjet izvesti barem jednom jer se najprije izvodi dio koji se ponavlja, a tek nakon toga ispituje se je li uvjet zadovoljen.
PRO - MIL
169
Petlje
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; for (x = 0; x < 11; x = x + 1) { cout << rand() << endl; } system("PAUSE"); return 0; }
Sluajne brojeve generirat emo naredbom rand(). Problem je u tome to e ovako napisani program pri svakom pokretanju generirati iste sluajne brojeve. Jasno, od takvih sluajnih brojeva ne moemo imati puno koristi. Pokuajmo napisati program koji nee svaki put generirati isti niz brojeva.
170
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Ako umjesto srand(1); stavimo srand (2); dobit emo neki drugi niz brojeva. Pokuajmo i vidjet emo da emo za srand(3); dobit neki trei niz brojeva, a za srand(4); neki etvrti. Problem je u tome to emo za isti broj unutar zagrade dobivati uvijek isti niz. Dakle srand(6) davat e pri svakom pokretanju isti niz brojeva, ali drugaiji nego npr. srand(5). Oito bi bilo dobro kad bismo na neki nain broj unutar zagrade mogli mijenjati. Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Stavimo li naredbu srand(1) prije naredbe rand() postii emo da naredba rand() generira neki niz brojeva. Varijable Na prvi program Uvod
Problem koji se sastoji u tome da naredba rand(); uvijek generira isti niz brojeva rijeit emo naredbom srand(1);.
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; srand(1); for (x = 0; x < 11; x = x + 1) { cout << rand() << endl; } system("PAUSE"); return 0; }
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; srand(2); for (x = 0; x < 11; x = x + 1) { cout << rand() << endl; } system("PAUSE"); return 0; }
PRO - MIL
171
Petlje
#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main() { cout << time(NULL) << endl; system("PAUSE"); return 0; }
Da bi naredba time(NULL) funkcionirala, moramo naredbom #include <ctime> ukljuiti odgovarajuu biblioteku.
Razliite brojeve dobit emo naredbom time(NULL). Iako se ini loginim da naredba time(NULL) pokazuje trenutno vrijeme, ona to ne ini, nego prikazuje trenutno sistemsko vrijeme. To je vrijeme koje je proteklo od 1. sijenja 1970. godine.
Budui da program ne moemo vie puta pokrenuti u istom trenutku, pri svakom pokretanju ove naredbe dobit emo drugi broj.
172
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Taj problem moemo najjednostavnije eliminirati tako da prvi broj koji generira generator sluajnih brojeva ne koristimo u programu. Obrada teksta Polja Petlje U ovom rjeenju problematino je to to su esto poetni brojevi veoma slini. Prvi put smo dobili 6089, drugi put 6132, a trei put 6171. Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main() { int x; srand(time(NULL)); for (x = 0; x < 11; x = x + 1) { cout << rand() << endl; } system("PAUSE"); return 0; }
Stavimo li u naredbu srand(1); umjesto konkretnog broja jedan naredbu time (NULL) koja e u svakom trenutku generirati drugaiji broj, naredba rand() pri svakom e pokretanju generirati drugaiji brojani niz. Sada smo ve blizu onome to smo eljeli, a to je generator sluajnih brojeva.
PRO - MIL
173
Petlje
#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main() { int x; srand(time(NULL)); rand(); for (x = 0; x < 11; x = x + 1) { cout << rand() << endl; } system("PAUSE"); return 0; }
Problem koji bi mogla stvarati pojava da na generator sluajnih brojeva generira niz brojeva u kojem prvi broj u nizu ima slinu vrijednost prilikom vie pokretanja rijeit emo tako da prvi put pozovemo naredbu rand(); i tako generirani broj neemo ni za to koristiti.
Koristit emo sluajne brojeve koji e se generirati prilikom sljedeih pozivanja naredbe rand();. Na taj nain postii emo da e pri nizu uzastopnih pokretanja i prvi broj u svakom od nizova bit razliit.
174
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Sad kad smo konano dobili niz sluajnih brojeva, postavlja se pitanje kako postii da ti sluajni brojevi budu unutar unaprijed odreenih granica. Ako elim da se objekt pojavi na sluajnoj poziciji unutar prozora irokog 640 toaka, bilo bi zgodno da generator sluajnih brojeva generira sluajni broj izmeu 0 i 640.
#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main() { int x; float sb; srand(time(NULL)); rand(); for (x = 0; x < 11; x = x + 1) { sb = rand() / RAND_MAX; cout << sb << endl; } system("PAUSE"); return 0; }
Najprije emo program preurediti tako da generira brojeve izmeu 0 i 1. To emo postii tako da generirani broj podijelimo maksimalnom moguom vrijednou sluajnog broja. U tom sluaju, ako je generirani sluajni broj nula, rezultat e biti nula, a ako je jednak maksimalnoj moguoj vrijednosti bit e 1. Za sve ostale vrijednosti dobit emo broj izmeu nula i jedan.
Maksimalnu moguu vrijednost generiranog sluajnog broja dobit emo naredbom RAND_MAX.
Pokrenemo li takav program kao rezultat dobit emo samo nule, i moda ponekad broj 1. Zato? Zato to je rezultat rada naredbe rand() i naredbe RAND_MAX int tipa, tj. broj bez decimalnog zareza. Rezultat, dodue, spremamo u varijablu sb koja je float tipa, ali raunalo radi tako da izrauna rezultat u int formatu, a tek onda broj pretvara u float. Prvo podijeli dva int broja, makne sadraj desno od zareza, jer int tip nema zarez, i tek onda rezultat sprema u varijablu float tipa.
PRO - MIL
175
Petlje
#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main() { int x; float sb; srand(time(NULL)); rand(); for (x = 0; x < 11; x = x + 1) { sb = static_cast <float> (rand()) / RAND_MAX; cout << sb << endl; } system("PAUSE"); return 0; Problem koji se javio u prethodnom pro} gramu rijeit emo tako da raunalu naredimo da broj koji e generirati naredba rand() i koji je int tipa, prije dijeljenja s RAND_MAX pretvori u float tip. To emo uiniti naredbom: static_cast <float> (rand()) Nakon primjene te naredbe program e generirati sluajne brojeve izmeu broja 0 i broja 1.
Ovom naredbom nareujemo raunalu da jedan tip podatka npr. int pretvori u neki drugi tip, npr. float.
Unutar navodnika navedemo varijablu ili izraz iji tip elimo mijenjati. Mi emo mijenjati tip rezultatu izvoenja rand () naredbe.
176
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Maksimalna vrijednost koju rand() generira. Saimanje Veliki programi koda Mnoimo li broj izmeu 0 i 1 brojem 640, dobit emo brojeve izmeu 0 i 640. Objekti Obrada teksta Za sve ostale vrijednosti rezultat e biti izmeu 0 i 640, a to je ono to smo htjeli postii. Polja Ako je sluajni broj imao maksimalnu moguu vrijednost 1, rezultat e biti 640. Petlje Ako je sluajni broj imao minimalnu moguu vrijednost 0, rezultat e biti nula. Pogledajmo dio programa kojim generiramo sluajni broj izmeu 0 i 640. Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main() { int x; float sb; srand(time(NULL)); rand(); for (x = 0; x < 11; x = x + 1) { sb = (static_cast <float> (rand()) / RAND_MAX) * 640; cout << sb << endl; } system("PAUSE"); Kako emo postii da program ne generireturn 0; ra brojeve izmeu 0 i 1, nego izmeu 0 i } 640? Tako da sluajni broj koji raunalo generira izmeu 0 i 1 pomnoimo sa 640.
Dijeljenjem sluajnog broja maksimalnom moguom vrijednou dobivamo broj izmeu broja 0 i broja 1.
PRO - MIL
177
Petlje
Ako elimo da raunalo generira broj izmeu 0 i 640 bez decimalnog zareza, sluajni broj emo spremiti u int varijablu. Budui da je generirani sluajni broj float tipa, raunalo e nas pri prvom pokretanju programa upozoriti da je dolo do pretvaranja float tipa u int tip.
int main() { int x; Kad float tip broja spremimo u int varijablu, int sb; raunalo e ga automatski pretvoriti u int srand(time(NULL)); tip tako da e mu maknuti sve brojeve derand(); sno od decimalnog zareza. for (x = 0; x < 11; x = x + 1) { sb = (static_cast <float> (rand()) / RAND_MAX) * 640; cout << sb << endl; } system("PAUSE"); return 0; }
Raunalo nas upozorava da je dolo do pretvaranja float tipa u int tip. Budui da je to upravo ono to smo eljeli, ovo upozorenje emo zanemariti.
178
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Budui da poloaj kruga odreuju dva broja, jedan koji odreuje udaljenost sredita od desnog ruba i drugi koji odreuje udaljenost sredita od gornjeg ruba generirat emo dva sluajna broja. Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <winbgim.h> #include <ctime> using namespace std;
int main() { int x; int sx; int sy; Prvi emo spremiti u int varijablu int gdriver = 9; sx i bit e izmeu 0 i 640. Drugi int gmode = 2; emo spremiti u sy i bit e izmeu initgraph(&gdriver, &gmode, ""); 0 i 480. setbkcolor (WHITE); setcolor (BLACK); (Dimenzije grafikog prozora su cleardevice(); 640x480). srand(time(NULL)); rand(); for (x = 1; x < 60; x = x + 1 ) { sx = (static_cast <float> (rand()) / RAND_MAX) * 640; sy = (static_cast <float> (rand()) / RAND_MAX) * 480; circle(sx,sy,20); } getch(); closegraph(); return 0; Poloaj kruga ovisit e o sluajno generiranim brojevima. } Ispis kruga nalazi se unutar petlje pa e se generirati onoliko krugova koliko puta e se petlja izvesti.
PRO - MIL
179
Petlje
Pogledajmo primjer sasvim jednostavne igrice. Raunalo e generirati sluajni broj izmeu 0 i 100, a mi emo pokuati pogoditi koji je to broj. Ako ne pogodimo, raunalo e nas obavijestiti je li zamislilo vei ili manji broj, pa emo pogaati ponovo, dok ne pogodimo. Na kraju nas raunalo obavjetava koliko pokuaja nam je trebalo da pogodimo zamiljeni broj.
#include <cstdlib> #include <iostream> #include <ctime> using namespace std; int main() { int odgovor; int slucajni_br; int brojcanik = 0; srand(time(NULL)); rand(); slucajni_br = (static_cast <float> (rand()) / RAND_MAX) * 100; cout << "Zamislio sam broj od 0 do 100." << endl; cout << "Pogodite koji je to broj" << endl; do { cout << "Unestite odgovor." << endl; cin >> odgovor; brojcanik = brojcanik + 1; if (slucajni_br > odgovor) { cout << "Zamislio sam veci broj." << endl; } if (slucajni_br < odgovor) { cout << "Zamislio sam manji broj." << endl; } } while (slucajni_br != odgovor); cout << "Pogodili ste " << brojcanik << ". put." << endl; system("PAUSE"); return 0; }
180
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj int brojcanik = 0; srand(time(NULL)); rand(); slucajni_br = (static_cast <float> (rand()) / RAND_MAX) * 100; cout << "Zamislio sam broj od 0 do 100." << endl; cout << "Pogodite koji je to broj" << endl; do { cout << "Unestite odgovor." << endl; cin >> odgovor; brojcanik = brojcanik + 1; if (slucajni_br > odgovor) { cout << "Zamislio sam veci broj." << endl; } if (slucajni_br < odgovor) { cout << "Zamislio sam manji broj." << endl; } } while (slucajni_br != odgovor); cout << "Pogodili ste " << brojcanik << ". put." << endl; system("PAUSE"); return 0; } Ispitivanje se ponavlja dok uneseni broj nije jednak zamiljenom. Ovdje unosimo odgovor. Ovdje se generira sluajni broj izmeu 0 i 100. Pri svakom unosu odgovora brojanik poveavamo za 1.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Varijablu brojcanik na poetku emo postaviti za nulu, a nakon svakog pogaanja uveat emo je za jedan i tako emo znati koliko nam je pokuaja trebalo za pogaanje zamiljenog broja.
Uvod
181
Polja
182
PRO - MIL
PRO - MIL
Polja
Objekti
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
183
Polja
Jednodimenzionalna polja
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); moveto (0, 200); lineto (10, 200); lineto (10, 50); lineto (100, 50); lineto (100, 200); lineto (120, 200); lineto (120, 150); lineto (300, 150); lineto (300, 200); lineto (350, 200); lineto (350, 30); lineto (400, 30); lineto (400, 200); lineto (450, 200); lineto (450, 20); lineto (550, 20); lineto (550, 200); lineto (560, 200); lineto (560, 40); lineto (600, 40); lineto (600, 200); lineto (620, 200); lineto (620, 20); lineto (635, 20); lineto (635, 200); lineto (640, 200); getch(); closegraph(); return 0; } Zamislimo da kao pozadinu neke jednostavne igrice elimo nacrtati neto to bi moglo asocirati na nebodere. To moemo uiniti nizom lineto naredbi i to rjeenje funkcionira, ali i sami vidimo da nije ba osobito elegantno. Zamislimo koliko bi to rjeenje bilo nepraktino ako bismo htjeli nacrtati crte s vie detalja, npr. prozorima.
184
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
U ovom programu pojavljuju se uglate zagrade. Dobit emo ih tako da drimo pritisnutu AltGr tipku, a zatim kliknemo slovo f ili slovo g.
Ovaj program radi isti posao kao i prethodni, ali je daleko elegantniji od njega. Pogledamo li paljivo program, vidjet emo da su nam svi elementi poznati od prije, osim neobino definirane varijable polje. Dok smo u dosadanje varijable mogli spremiti jedno slovo ili broj, ini se da u ovu varijablu moemo spremiti mnotvo brojeva. Paljivi analitiar moda bi uoio da broj u uglatoj zagradi odgovara koliini brojeva u vitiastim zagra-
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; int main() { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice();
dama. int polje[54] = { 0, 200, 10, 200, 10, 50, 100, 50, 100, 200, 120, 200, 120, 150, 300, 150, 300, 200, 350, 200, 350, 30, 400, 30, 400, 200, 450, 200, 450, 20, 550, 20, 550, 200, 550, 200, 560, 200, 560, 40, 600, 40, 600, 200, 620, 200, 620, 20, 635, 20, 635, 200, 640, 200 }; moveto (polje[0], polje[1]); for (x = 2; x < 54; x = x + 2 ) { lineto(polje[x], polje[x+1]); } getch(); closegraph(); return 0;
PRO - MIL
185
Polja
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5] = {10, 20, 30, 40, 50}; cout << polje[0] << endl; cout << polje[1] << endl; cout << polje[2] << endl; cout << polje[3] << endl; cout << polje[4] << endl; system("PAUSE"); return 0; }
Detaljno objanjenje funkcioniranja programa s prethodne stranice vidjet emo kasnije, a sada emo pogledati kako funkcioniraju neobine varijable koje smo uoili u prethodnom programu. Ovaj program pomoi e nam da lake shvatimo ovaj novi tip varijable.
int a = 12;
Naredbom int a = 12; u raunalu formiramo prostor odnosno varijablu kojoj smo dali naziv a i u koju smo spremili broj 12;
12 a
Ovom naredbom kao i prethodnom formiramo varijablu, ali dok smo u prethodnu varijablu mogli spremiti samo jedan broj, ova varijabla sadri 5 pretinaca koji se razlikuju po brojevima i u svaki od tih pretinaca moemo spremiti jedan broj.
10 0
20 1
30 2 polje
40 3
50 4
186
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Vidimo da #include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5] = {10, 20, 30, 40, 50}; cout << polje[1] << endl; system("PAUSE"); return 0; } cout << polje[1] << endl; ispisuje sadraj druge elije. Pokuajmo na slian nain ispisati sadraj neke druge npr. sa: cout << polje[0] << endl; sadraj prve elije. (U uglatoj zagradi nalazi se broj nula, a ne veliko slovo o.) Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Novi tip varijable ima poseban naziv, naziva se polje. elije polja meusobno razlikujemo po brojevima, a problem donekle komplicira injenica da prvo polje nije polje 1 nego polje 0, pa onda polje sa 5 elemenata ne sadri polja od 1 do 5 nego od 0 do 4. U poetku e nas ta injenica esto zbunjivati.
U vitiastim zagradama navest emo vrijednosti pojedinih elija. Vrijednosti emo meusobno odvojiti zarezima.
Razlika je u tome da je pri koritenju varijable dovoljno navesti naziv, a ovdje osim naziva u uglatim zagradama moramo navesti broj elije koju elimo ispisati. U gornjem primjeru imajmo na umu da emo ispisati sadraj druge elije, a ne sadraj prve. Prvu bismo ispisali naredbom cout << polje[0] << endl;.
PRO - MIL
187
Polja
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5] = {10, 20, 30, 40, 50}; cout << polje[0] << endl; cout << polje[1] << endl; cout << polje[2] << endl; cout << polje[3] << endl; cout << polje[4] << endl; system("PAUSE"); return 0; }
Ovdje formiramo polje koje se sastoji od 5 elija. U prvu eliju spremamo broj 10, u drugu 20, u treu 30, u etvrtu 40 i u petu 50.
Sadraj polja ispisujemo tako da uz naziv polja u uglatim zagradama navodimo i broj elije koji elimo ispisati.
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5] = {10, 20, 30, 40, 50}; cout << polje[3] << endl; cout << polje[0] << endl; cout << polje[2] << endl; cout << polje[4] << endl; cout << polje[1] << endl; system("PAUSE"); return 0; }
Sadraj polja ne mora se ispisivati po redu, nego se moe ispisivati bilo kojim redoslijedom.
188
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Polja mogu biti i char tipa. Pokuajmo iz ispisa izbaciti endl naredbe: cout << polje[0] << endl; napiimo u obliku cout << polje[0]; Samo cout << polje[4] << endl; nemojmo mijenjati. Saimanje Veliki programi koda Objekti Obrada teksta Polja #include <cstdlib> #include <iostream> using namespace std; int main() { char polje[5] = {'P', 'O', 'L', 'J', 'A'}; cout << polje[0] << endl; cout << polje[1] << endl; cout << polje[2] << endl; cout << polje[3] << endl; cout << polje[4] << endl; system("PAUSE"); return 0; } Petlje Donoenje Grafika odluke Varijable Na prvi program #include <cstdlib> #include <iostream> using namespace std; int main() { float polje[5] = {10.12, 20.14, 30.16, 40.18, 50.19}; cout << polje[0] << endl; cout << polje[1] << endl; cout << polje[2] << endl; cout << polje[3] << endl; cout << polje[4] << endl; system("PAUSE"); return 0; } Uvod
Polja mogu biti float tipa. (Uoimo da zarezom odvajamo brojeve, a toka ima funkciju decimalnog zareza.)
PRO - MIL
189
Polja
#include <cstdlib> #include <iostream> using namespace std; int main() { int a[3] = {2, 3, 0}; a[2] = a[0] + a[1]; cout << a[2] << endl; system("PAUSE"); return 0; }
Kao to je sluaj i kod varijabli, sadraj polja ne moramo definirati prilikom formiranja polja. U ovom sluaju sadraj prve i druge elije polja unosimo cin naredbom, a u treu eliju spremamo rezultat zbrajanja.
#include <cstdlib> #include <iostream> using namespace std; int main() { int b[3]; cin >> b[0]; cin >> b[1]; b[2] = b[0] + b[1]; cout << b[2] << endl; system("PAUSE"); return 0; }
190
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Ovaj nain ispisa sadraja polja daleko je elegantniji. Formirali smo petlju koja e se vrtjeti onoliko puta koliko elija petlje elimo ispisati. Varijabla petlje mijenja se od #include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5] = {10, 20, 30, 40, 50}; int x; for (x = 0; x < 5; x = x + 1) { cout << polje[x] << endl; } system("PAUSE"); return 0; } poetnog broja elije koju eliod 0, do broja krajnje elije koju elimo ispisati, u naem sluaju to je 4. Pri ispisu umjesto polje[1] koristimo polje[x] to znai da se ispisuje ono polje iji broj je jednak trenutnoj vrijednosti varijable x. Objekti Saimanje Veliki programi koda Obrada teksta mo ispisati, u naem sluaju Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Sadraj polja moemo ispisati na ovaj nain. Takav nain funkcionira, ali je neelegantan. Osobito je neprikladan ako bismo htjeli ispisati vee polje.
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5] = {10, 20, 30, 40, 50}; cout << polje[0] << endl; cout << polje[1] << endl; cout << polje[2] << endl; cout << polje[3] << endl; cout << polje[4] << endl; system("PAUSE"); return 0; }
PRO - MIL
191
Polja
Moemo ispisati dio elija polja, npr. prvu, drugu i treu. To emo postii tako da varijablu petlje x mijenjamo od jedan do tri po jedan.
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5] = {10, 20, 30, 40, 50}; int x; for (x = 1; x < 4; x = x + 1) { cout << polje[x] << endl; } system("PAUSE"); return 0; }
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5] = {10, 20, 30, 40, 50}; int x; for (x = 4; x > -1; x = x - 1) { cout << polje[x] << endl; } system("PAUSE"); return 0; }
Sadraj polja moemo ispisivati i unatrag. To emo postii tako da varijablu petlje x mijenjamo unatrag od etiri do nula po jedan.
192
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Kao to je to vrijedilo za sve elemente programa koje smo vidjeli do sada, i za polja vrijedi da emo ih najbolje shvatiti i usvojiti ako napravimo to vei broj varijacija primjera koje smo vidjeli do sada. Pokuajmo sami smisliti to vie slinih primjera. Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5]; int x; cout << "Unos polja." << endl; for (x = 0; x < 5; x = x + 1) { cin >> polje[x]; } cout << "Ispis polja." << endl; for (x = 0; x < 5; x = x + 1) { cout << polje[x] << endl; } system("PAUSE"); return 0; }
Na slian nain pomou petlje moemo uporabom tipkovnice unijeti brojeve u pojedine elije.
Ovu petlju koristimo za unos brojeva u polje. Opet umjesto cin >> polje [0] imamo cin >> polje[x], a varijablu x petlja mijenja od nula do etiri i tako e se unijeti sadraj cijelog polja. Kao i do sada nakon svakog unosa broja pritisnemo Enter tipku.
Koristei isti trik ovdje ispisujemo sadraj polja. Umjesto cout << polje[0] stavili smo cout << polje[x], a x for petlja mijenja od nula do etiri i tako e se ispisati sadraj cijelog polja.
PRO - MIL
193
Polja
Ovdje se formira polje u kojem se nalazi poloaj toaka ijim emo spajanjem dobiti crte. Na prvi pogled moe nam se uiniti da smo to ovdje uinili drugaije nego do sada. Paljivom analizom vidjet emo da nismo.
Najprije imamo int polje[54] =, a zatim u vitiasint main() tim zagradama vrijednosti pojedinih elija. { int gdriver = 9; int gmode = 2; int x; initgraph(&gdriver, &gmode, ""); setbkcolor (WHITE); setcolor (BLACK); cleardevice(); int polje[54] = { 0, 200, 10, 200, 10, 50, 100, 50, 100, 200, 120, 200, 120, 150, 300, 150, 300, 200, 350, 200, 350, 30, 400, 30, 400, 200, 450, 200, 450, 20, 550, 20, 550, 200, 550, 200, 560, 200, 560, 40, 600, 40, 600, 200, 620, 200, 620, 20, 635, 20, 635, 200, 640, 200 }; moveto (polje[0], polje[1]); for (x = 2; x < 54; x = x + 2 ) { lineto(polje[x], polje[x+1]); } getch(); closegraph(); return 0; }
194
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Petlja e se izvoditi dok je x manji od 54. Budui da se x uveava za 2 vrijednost varijable x e rasti od 2 do 52. Varijabla x uveava se za 2. To nam odgovara zato to je kraj svake crte odreen s dva broja, pa kad elimo oitati poziciju novog kraja crte, moramo se u polju pomaknuti za dva lana polja unaprijed. Udaljenost kraja crte od gornjeg ruba grafikog prozora. Donoenje Grafika odluke Varijable Ovaj oblik pogodniji je za koritenje kad u veliko polje elimo unijeti veliku koliinu brojeva. Na prvi program Uvod int polje[5] = {10, 20, 30, 40, 50}; Ovu naredbu moemo napisati i ovako. int polje[5] = { 10, 20, 30, 40, 50 }; moveto (polje[0], polje[1]); Ova naredba odreuje poetak niza crta. Udaljenost od lijevog ruba odreena je sadrajem elije polje[0], tj. prve elije, a udaljenost od gornjeg ruba sa polje[1], tj. sadrajem druge elije. Poetna vrijednost varijable x je 2. for (x = 2; x < 54; x = x + 2 ) { lineto(polje[x], polje[x+1]); } Udaljenost kraja crte od lijevog ruba grafikog prozora.
PRO - MIL
195
Polja
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5] = {10, 20, 30, 40, 50}; cout << polje[0] << endl; cout << polje[1] << endl; cout << polje[2] << endl; cout << polje[3] << endl; cout << polje[4] << endl; system("PAUSE"); return 0; }
Mogli bismo postaviti pitanje trebaju li nam uope polja, budui da bismo ovaj program mogli i ovako realizirati, obinim varijablama.
Vidimo da ovakav program moemo realizirati obinim varijabla#include <cstdlib> #include <iostream> using namespace std; ma, ali ovakav, koji koristi for naredbu, ne moemo realizirati sa-
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje1 = 10; int polje2 = 20; int polje3 = 30; int polje4 = 40; int polje5 = 50; cout << polje1 << endl; cout << polje2 << endl; cout << polje3 << endl; cout << polje4 << endl; cout << polje5 << endl; system("PAUSE"); return 0; }
mo varijablama. int main() { int polje[5] = {10, 20, 30, 40, 50}; int x; for (x = 0; x < 5; x = x +1) { cout << polje[x] << endl; } system("PAUSE"); return 0; }
196
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje U ovom dijelu ispisuje se sadraj varijable r, odnosno najvei broj unesen u polje. Donoenje Grafika odluke Varijable Unos polja. U ovom dijelu programa pretrauje se uneseno polje i najvei broj naen u polju sprema se u varijablu r. Na prvi program Uvod
Ne samo da uporabom polja moemo pisati elegantnije programe, nego nam polja omoguuju realizaciju programa koje bi bilo veoma teko realizirati na neki drugi nain. Pogledajmo nekoliko primjera takvih programa.
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5]; int x; int r;
Polja nam omoguuju operacije sa elijama polja. Ovo je primjer programa koji pretrauje uneseno polje i ispisuje najvei broj u polju.
cout << "Unos polja." << endl; for (x = 0; x < 5; x = x + 1) { cin >> polje[x]; } r = polje[0]; for (x = 1; x < 5; x = x +1) { if (r < polje[x]) { r = polje[x]; } } cout << "Najveci je." << endl; cout << r << endl; system("PAUSE"); return 0; }
PRO - MIL
197
Polja
Pogledajmo detaljnije najzanimljiviji dio prethodnog program, dio u kojem se pretrauje polje i najvei pronaeni broj sprema u r varijablu.
Pretraivanje se nastavlja unutar for petlje, ija se varijabla x mijenja od 1 do 5 po 1. Zato petlja ne poinje s nula? Zato to smo prvu eliju (polje[0]) ve proitali pa je neemo itati unutar for petlje.
Unutar for petlje za svaku vrijednost varijable x ispituje se je li sadraj varijable r manji od polje[x]. Ako jest, znai da je u eliji polje[x] vei broj od onog u varijabli r, pa e se sadraj elije polje[r] spremiti u varijablu r. Ako nije, znai da je broj u polje[x] manji i u tom sluaju nee se izvoditi sadraj unutar vitiastih zagrada.
Ova if naredbe je neobina. Nema else dijela. To je dozvoljeno. Ako nam else dio ne treba, moemo ga izostaviti. U tom sluaju, ako je uvjet zadovoljen, izvodi se sadraj u vitiastim zagradama, a ako nije, nastavlja se izvoenje programa.
198
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> using namespace std; int main() { int polje[5]; int x; int r; cout << "Unos polja." << endl; for (x = 0; x < 5; x = x + 1) { cin >> polje[x]; } r = polje[0]; for (x = 1; x < 5; x = x +1) { if (r > polje[x]) { r = polje[x]; } } cout << "Najmanji je." << endl; cout << r << endl; system("PAUSE"); return 0; }
Jednostavnim promjenama program koji pretrauje polje sa ciljem da nae najvei broj u polju moemo preurediti u program koji trai najmanji broj. emu slue takvi programski postupci? Na slian nain bismo u programu za voenje videoteke mogli pronai korisnike koji nisu vratili film dulje od npr. tjedan dana ili korisnike koji su u proloj godini posudili najvie filmova.
Odgovarajue obavijesti.
preuredimo
ispis
Pokuajmo sami korigirati program tako da pretrauje je li u polje unesen odreen broj ili koliko puta se pojavljuje odreen broj. Pokuajmo napraviti slina pretraivanja slova.
PRO - MIL
199
Polja
#include <cstdlib> #include <iostream> using namespace std; int main() { int p[5]; int zamjena; int privremeni; int x; cout << "Unos polja." << endl; for (x = 0; x < 5; x = x + 1) { cin >> p[x]; } do { zamjena = 0; for (x = 0; x < 4; x = x + 1) { if (p[x] < p[x+1]) { privremeni = p[x]; p[x] = p[x+1]; p[x+1] = privremeni; zamjena = 1; } } } while (zamjena ==1); cout << "Sortirano polje." << endl; for (x = 0; x < 5; x = x +1) { cout << p[x] << endl; } system("PAUSE"); return 0; } Ovo je sasvim sigurno najsloeniji program koji smo do sada vidjeli u ovoj knjizi. Slui za sortiranje polja. Unesemo razliite brojeve u polje, a program e ih sortirati tako da e u prvom polju biti najvei broj, a u posljednjem najmanji.
200
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Ako jest, znai da imamo prvo manji, a zatim vei broj, pa ih treba zamijeniti. U tom sluaju u ovom dijelu e se izvriti zamjena. Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Sortiranje se odvija u do ... while petlji. Petlja se ponavlja tako dugo dok je varijabla zamjena jednaka broju 1.
Na poetku ispitivanja u varijablu zamjena stavlja se broj 0. Ako ne bude potrebno vriti nikakve zamjene u polju, varijabla zamjena ostat e jednaka nuli i izvoenje do ... while petlje e se zaustaviti.
do { zamjena = 0; for (x = 0; x < 4; x = x + 1) { if (p[x] < p[x+1]) { privremeni = p[x]; p[x] = p[x+1]; p[x+1] = privremeni; zamjena = 1; } } } while (zamjena ==1);
U for petlji ita se cijelo polje, s time da se varijabla petlje mijenja za jedan manje od veliine petlje; dakle u naem sluaju ne ide do 4 nego, do 3.
If naredbom ispitujemo je li broj u nekoj eliji polja (p[x]) manji od broja u sljedeoj eliji (p [x+1]. Ako nije, znai da imamo prvo vei broj, a zatim manji. To je ono to elimo i petlja se vrti dalje.
Na kraju zamjene u varijablu zamjena stavit e se broj 1. Zbog toga do ... while petlja e cijeli postupak ponavljati tako dugo dok vie ne bude obavljena ni jedna zamjena i varijabla zamjena ostane jednaka nuli. To znai da nije pronaen ni jedan sluaj da je neki broj manji od sljedeeg tj. da je sortiranje od veeg prema manjem zavreno.
PRO - MIL
201
Polja
Za zamjenu sadraja dviju susjednih elija u polju treba nam pomona varijabla; u naem sluaju to je varijabla privremeni. Zato?
privremeni = p[x];
Da smo odmah napravili drugu naredbu, naredbu p[x] = p[x+1]; onda bi se broj koji se nalazi u p[x+1]; nalazio i u p[x], a broj koji se je do tada nalazio u p[x] bi nestao. Da broj koji se nalazi u p[x] ne bi nestao, privremeno ga spremamo u varijabli privremeni.
p[x] = p[x+1];
Nakon to smo u prethodnom koraku sadraj elije p[x] spremili u varijablu privremeni, sadraj elije p[x+1] spremamo u eliju p[x]. Budui da p[x] usporeujemo sa p[x+1], x mora bit za jedan manji od broja elija.
p[x+1] = privremeni;
Sadraj varijable privremeni sada vraam u polje, ali ne u eliju p[x] u kojoj se taj sadraj do sada nalazio, nego u sljedeu eliju, u eliju p[x+1]. Time smo sadraje elija p[x] i p[x+1] zamijenili.
Na kraju zamjene u varijablu zamjena stavljamo broj jedan. Time smo obavijestili raunalo da je bilo potrebno vriti zamjene u polju, tj. da polje nije bilo sortirano po redu, te da do ... while petlja mora jo jednom provjeriti je li polje sortirano. Kad se ni u jednom sluaju nee dogoditi da je neka elija manja od sljedee, sortiranje je zavreno.
zamjena = 1;
202
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Pokuajmo napisati sline programe koji e vriti neke operacije izmeu polje; npr. programe koji e mnoiti ili dijeliti lanove dvaju polja i rezultat spremati u tree polje. Program koji e usporeivati pojedine elije dvaju polja, a zatim e u tree polje spremiti vrijednost one elije koja sadri vei broj ili manji broj. Program koji e brojiti koliko puta se neki broj pojavljuje u nekom polju. Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Izmeu polja mogu se vriti matematike operacije kao i izmeu varijabli. Ovaj program e zbrojiti sadraje polja po1 i polja po2, a rezultat spremiti u polje po3 i zatim ga ispisati na zaslon raunala.
int main() { int po1[5] = {10, 15, 20, 25, 30}; int po2[5] = {35, 40, 35, 50, 55}; int po3[5]; int a; for (a = 0; a < 5; a = a +1) { po3[a] = po1[a] + po2[a]; cout << po1[a] << " + " << po2[a] << " = " << po3[a] << endl; } system("PAUSE"); return 0; }
PRO - MIL
203
Polja
204
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Ako je sve u redu, u onom istom prostoru u kojem se nalazi na projekt i na program morala bi se nalaziti i datoteka podaci.txt. Za sada je bitno imati na umu da u int ili float varijablu ne moemo staviti neogranieno velik broj.
PRO - MIL
Moramo imati na umu i da broj koji unosimo ne moe biti neogranieno velik. Koliki broj moemo unijeti u polje, odnosno u varijablu, ovisi o svojstvima programskog okruenja koje koristimo.
Mogu li se u programima koristiti i vei brojevi? Naravno, ali taj problem nadilazi potrebe naeg uvodnog prirunika.
Objekti
Ako mijenjamo koliinu brojeva, onda u programu koji e ih itati moramo na isti nain promijeniti veliinu polja i for petlju.
Float tip moe imati najveu vrijednost od 3.40282 * 10-38. To se u programu pie kao 3.40285e-38.
Obrada teksta
Jasno je da moemo staviti i neke druge brojeve, a moemo ih staviti vie ili manje nego u naem primjeru.
Polja
Petlje
Varijable
Na prvi program
Uvod
205
Polja
Ovim programom proitat emo brojeve koji su spremljeni u datoteku podaci.txt, spremit emo ih u polje i na kraju ispisati na zaslon raunala. #include <cstdlib> #include <iostream> #include <fstream> using namespace std; int main() { int x; int polje[8]; ifstream ulaz("podaci.txt"); for (x = 0; x < 8; x = x + 1) { ulaz >> polje[x]; } for (x = 0; x < 8; x = x +1) { cout << polje[x] << endl; } system("PAUSE"); return 0; } Ispis sadraja polja. Ovdje formiramo neto s ime se do sada nismo sretali, a to je objekt. Trenutno nije vano to je to tono objekt. Za sada emo rei da je to element programa pomou kojeg emo itati sadraj datoteke.
Ova petlja mora se vrtjeti onoliko puta koliko brojeva elimo proitati, odnosno koliko nae polje ima elija. U naem sluaju to je osam puta.
Ovom naredbom sadraj datoteke unosi se u polje. Da smo ovdje napisali: cin >> polje[x]; brojevi bi se u polje unosili pomou tipkovnice. ulaz >> polje[x]; je varijacija te naredbe i znai da se brojevi nee u polje unositi pomou tipkovnice nego pomou objekta ulaz, a prije smo definirali da objekt ulaz ita iz datoteke podaci.txt.
206
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Kada uitamo brojeve u polje, s tim brojevima moemo raditi sve ono to moemo raditi i s brojevima koje smo unijeli preko tipkovnice. U ovom programu izraunat emo prosjenu vrijednost unesenih brojeva. Budemo li eksperimentirali s drugim brojevima, imajmo na umu da njihova ukupna suma ne smije biti vea od maksimalne dozvoljene vrijednosti varijable. Donoenje Grafika odluke Varijable #include <cstdlib> #include <iostream> #include <fstream> using namespace std; int main() { int x; int polje[8]; float a = 0; ifstream ulaz("podaci.txt"); for (x = 0; x < 8; x = x + 1) { ulaz >> polje[x]; } for (x = 0; x < 8; x = x +1) { a = a + polje[x]; } a = a / 8; cout << "Prosjek je " << a << endl; cout << endl; system("PAUSE"); return 0; } Na prvi program Uvod
PRO - MIL
207
Polja
Ovaj program omoguuje nam da sadraj polja koji smo unijeli preko tipkovnice spremimo u datoteku.
int main() { int x; int polje[8]; ofstream izlaz("podaci.txt"); for (x = 0; x < 8; x = x + 1) { cin >> polje[x]; } for (x = 0; x < 8; x = x + 1) { izlaz << polje[x]; izlaz << " "; }
Ovdje formiramo objekt izlaz pomou kojeg emo brojeve iz polja spremiti u datoteku podaci.txt.
cout << "Spremanje je gotovo." << endl; cout << endl; system("PAUSE"); return 0; }
Ovdje sadraj polja spremamo u datoteku podaci.txt. Naredbom: izlaz << polje[x]; brojeve iz polja pomou objekta izlaz aljemo u datoteku. Ova naredba slina je naredbi: cout << polje[x]; kojom brojeve aljemo na zaslon raunala. Naredbom izlaz << " "; izmeu dva broja unosimo prazno mjesto.
208
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod Naziv datoteke u koju emo spremati pomou objekta ulaz. #include <cstdlib> #include <iostream> #include <fstream> using namespace std; int main() { int x; int polje[8]; ifstream ulaz("podaci.txt"); for (x = 0; x < 8; x = x + 1) { ulaz >> polje[x]; } for (x = 0; x < 8; x = x +1) { cout << polje[x] << endl; } system("PAUSE"); return 0; }
to smo spremili moemo pogledati editorom, a moemo i programom koji sadraj datoteke ispisuje na zaslon raunala.
PRO - MIL
209
Polja
U ovom programu nema nieg novog. Samo smo kao lego kocke sloili elemente koje smo do sada upoznali. Ovaj program uitava datoteku u polje, sortira polje i zatim sortirano polje sprema natrag u datoteku.
int main() { int x; int p[8]; int zamjena; int privremeni; ifstream ulaz("podaci.txt"); for (x = 0; x < 8; x = x + 1) { ulaz >> p[x]; } cout << "Zapocinje sortiranje." << endl; do { zamjena = 0; for (x = 0; x < 7; x = x + 1) { if (p[x] < p[x+1]) { privremeni = p[x]; p[x] = p[x+1]; p[x+1] = privremeni; zamjena = 1; } } } while (zamjena ==1); ofstream izlaz("podaci.txt"); for (x = 0; x < 8; x = x + 1) { izlaz << p[x]; izlaz << " "; } cout << "Sortiranje je zavrsilo" << endl; system("PAUSE"); return 0; }
Doslovno sa Copy Paste kopiran dio programa koji sortira sadraj polja od najveeg prema najmanjem.
Ovdje vidimo i jedan jako vaan element programiranja. Ne moramo svaku stvar svaki put kad nam treba iznova programirati. Segment programa koji dobro radi obilno prokomentiramo i spremimo, a zatim ga ubacujemo u programe kad nam zatreba, kao to smo ovdje ubacili segment programa koji sortira sadraj polja.
210
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable #include <cstdlib> #include <iostream> #include <fstream> using namespace std; int main() { int x; int polje[8]; ifstream ulaz("podaci.txt"); for (x = 0; x < 8; x = x + 1) { ulaz >> polje[x]; } for (x = 0; x < 8; x = x +1) { cout << polje[x] << endl; } system("PAUSE"); return 0; } Na prvi program Uvod
#include <cstdlib> #include <iostream> #include <fstream> using namespace std; int main() { int x; int polje[8]; ofstream izlaz("podaci.txt"); for (x = 0; x < 8; x = x + 1) { cin >> polje[x]; } for (x = 0; x < 8; x = x + 1) { izlaz << polje[x]; izlaz << " "; } cout << "Spremanje je gotovo." << endl; cout << endl; system("PAUSE"); return 0; }
Da bismo provjerili funkcionira li na program, najprije emo programom koji smo malo prije obradili unijeti brojeve u datoteku.
Nakon to smo brojeve unijeli u datoteku, pokrenemo program za sortiranje datoteke koji vidimo na lijevoj stranici.
PRO - MIL
211
Polja
Dvodimenzionalna polja
Ako postoje jednodimenzionalna polja, moraju postojati i dvodimenzionalna. (U suprotnom bismo imali situaciju kao kad je jedan novinar govorio o lokalnim stanovnicima nekog mjesta, iako nam vjerojatno ne bi mogao objasniti kako izgledaju globalni stanovnici istog mjesta.)
2. stupac 12 22
3. stupac 13 23
4. stupac 14 24
U ovom programu emo gornju tabelu spremiti u dvodimenzionalnu matricu, a zatim emo prvi i drugi red ispisati.
int main() { int polje[2] [4] = {{11, 12, 13, 14}, {21, 22, 23, 24}}; int x; cout << "Prvi red." << endl; for (x = 0; x < 4; x = x + 1) { cout << polje[0] [x] << endl; } cout << endl; cout << "Drugi red." << endl; for (x = 0; x < 4; x = x + 1) { cout << polje[1] [x] << endl; } cout << endl; system("PAUSE"); return 0; } Ispis drugog reda.
212
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod Naziv polja. Prvi red polja. Nalazi se unutar vitiastih zagrada.
Tip polja u naem sluaju je int, a moglo je biti npr. float ili char.
int polje [2] [4] = { {11, 12, 13, 14} , {21, 22, 23, 24} };
Budui da su u ovom tipu polja podaci rasporeeni u redove i stupce, prilino logino je da kad elimo pristupiti nekoj eliji takvog polja moramo navesti u uglatim zagradama broj reda i broj stupca elije kojoj elimo pristupiti.
Broj reda kojem pristupamo, u naem sluaju je to prvi red koji se oznaava brojem nula. Dakle prvi red oznaava broj nula, a drugi broj jedan.
Dvodimenzionalna polja koriste se na slian nain kao jednodimenzionalna. Osobito su korisna u programima u kojima se odvijaju sloeni prorauni.
Osim dvodimenzionalnih postoje i trodimenzionalna polja. Funkcioniraju slino kao dvodimenzionalna, samo to imaju jo i dubinu.
PRO - MIL
213
Obrada teksta
214
PRO - MIL
PRO - MIL
Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Obrada teksta
Objekti
Sadraj
215
Obrada teksta
String objekti
elimo li napisati program za voenje telefonskog imenika ili program za voenje videoteke, osim obrade brojeva i grafike sasvim sigurno e nam trebati obrada teksta. Iako smo i do sada koristili tekstove za ispisivanje raznih obavijesti, ostalo je nejasno na koji nain bismo mogli tekstove pretraivati ili sortirati.
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string odgovor; cout << "Unesite vase ime." << endl; cin >> odgovor; cout << endl; cout << odgovor << ", dobar dan!" << endl; cout << endl; system("PAUSE"); return 0; } Pogledamo li ovaj program, uinit e nam se da smo za lake baratanje tekstom upotrijebili novi tip varijable, string tip; te da smo u programu koristili varijablu koju smo nazvali odgovor.
string odgovor;
Iako ovaj red izgleda kao da formiramo varijablu string tipa koju smo nazivali odgovor, string nije tip varijable nego klasa, a odgovor nije varijabla nego objekt. Time se trenutno ne moramo optereivati i moemo objekt odgovor koristiti kao da smo formirali varijablu string tipa pod nazivom odgovor. Tek neto vee mogunosti koje e nam string pruiti dat e nam naslutiti da se iza toga naziva krije kompleksnija struktura od obine varijable.
216
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti cin >> odgovor; U naredbi cin koju koristimo za unos preko tipkovnice objekt odgovor koristimo kao to bismo koristili varijablu. Dok smo u varijablu char tipa mogli spremiti jedno slovo, u objekt klase string moemo spremati vei tekst. Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable cout << odgovor << ", dobar dan!" << endl; Vidimo da objekt odgovor u naredbi cout koristimo kao da koristimo varijablu. Najprije e se ispisati sadraj objekta odgovor, zatim tekst unutar navodnika i konano skok u novi red. Na prvi program Uvod
#include <string>
Da bi program mogao koristiti string objekte, ovu naredbu moramo staviti na poetak programa. U naem programskom okruenju program e raditi i bez ovog reda, ali je mogue da u nekom drugom programskom okruenju nee. Zbog toga emo stavljati tu naredbu
PRO - MIL
217
Obrada teksta
Oigledno je da u string objekt moemo spremiti tekst i postavlja se pitanje koliko najvie znakova smije sadravati taj tekst. U naelu raunalo bi se samo trebalo brinuti da osigura dovoljno mjesta za spremanje bilo kojeg teksta. U sluaju koritenja kraih tekstova, poput imena, naziva gradova i slino o tome ne moramo voditi brigu. elimo li u string objekt unijeti veu koliinu teksta, da bismo bili sigurni da e sve biti u redu, moemo unaprijed naredbom reserve rezervirati potreban prostor.
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string odgovor; odgovor.reserve(256); cout << "Unesite vase ime." << endl; cin >> odgovor; cout << endl; cout << odgovor << ", dobar dan!" << endl; cout << endl; system("PAUSE"); return 0; }
Program radi jednako kao i prethodni, osim to smo u ovom sluaju za spremanje imena osigurali veliki prostor.
odgovor.reserve(256)
Operacija koja se vri nad objektom. Ovom naredbom se za objekt odgovor rezervira 256 mjesta za spremanje znakova.
Obratimo panju na toku koja se obvezno nalazi izmeu oznake objekta i oznake operacije koja se nad njim vri.
218
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj using namespace std; int main() { string odgovor; odgovor.reserve(256); cout << "Unesite vase ime." << endl; cin >> odgovor; cout << endl; cout << odgovor << ", dobar dan!" << endl; cout << endl; cout << "Imamo " << odgovor.size() << " slova." << endl; cout << endl; cout << "Imamo " << odgovor.capacity() << " prostora." << endl; cout << endl; system("PAUSE"); return 0; }
odgovor.size()
Objekt na koji se naredba odnosi.
Zato ih je na raspolaganju 355, ako smo naredbom odgovor.reserve(256) rezervirali 256 mjesta? Zato to je 256 mjesta samo polazite na temelju kojeg prevoditelj rezervira neto vei prostor.
PRO - MIL
odgovor.capacity()
Naredba capacity() slui za odreivanje broja mjesta koja nam stoje na raspolaganju za unos znakova u objekt odgovor.
Objekti
Obrada teksta
Naredba size() oigledno slui za odreivanje broja znakova unesenog teksta. Rije Stjepan sastoji se od sedam slova.
Polja
Petlje
Varijable
Na prvi program
Uvod
219
Obrada teksta
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string odgovor; odgovor.reserve(256); cout << "Unesite vase ime." << endl; cin >> odgovor; cout << endl; cout << odgovor << ", dobar dan!" << endl; cout << endl; system("PAUSE"); return 0; }
Naredbom cin nije mogue u objekt odgovor unijeti vie odvojenih rijei. Iako smo napisali prezime i ime, uspjeli smo unijeti samo prezime.
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string odgovor; odgovor.reserve(256); cout << "Unesite vase ime." << endl; getline(cin, odgovor); cout << endl; cout << odgovor << ", dobar dan!" << endl; cout << endl; system("PAUSE"); return 0; }
Ako umjesto cin naredbe upotrijebimo ovu naredbu, moi emo unijeti vie rijei u objekt odgovor.
220
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Jedan od problema pri izradi programa javlja se kad korisnik unese neodgovarajuu vrijednost. U ovom sluaju, umjesto da unesemo ime, samo smo pritisnuli tipku enter. Na prvi program Uvod Naredba koja nam omoguuje unos vie rijei u string objekt. #include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string odgovor; odgovor.reserve(256); cout << "Unesite vase ime." << endl; cin >> odgovor; cout << endl; cout << odgovor << ", dobar dan!" << endl; cout << endl; system("PAUSE"); return 0; } U ovom sluaju, na mjestu gdje se oekivalo da emo unijeti tekst, mi smo unijeli brojeve. Postavlja se pitanje na koji bismo nain mogli sprijeiti ili barem smanjiti mogunost unoenja besmislenih odgovora.
getline(cin, odgovor);
String objekt u koji emo unositi tekst. U naem sluaju to je objekt odgovor.
PRO - MIL
221
Obrada teksta
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string odgovor; do { cout << "Unesite vase ime." << endl; getline(cin, odgovor); } while (odgovor.size() == 0); cout << endl; cout << odgovor << ", dobar dan!" << endl; cout << endl; system("PAUSE"); return 0; }
Ova inaica programa e zahtijevati da ponovimo unos ako pritisnemo tipku Enter, a da prije toga nismo nita unijeli.
do { cout << "Unesite vase ime." << endl; getline(cin, odgovor); } while (odgovor.size() == 0);
Naredbu za unos teksta u objekt odgovor stavili smo u do ... while petlju koja se izvodi tako dugo dok je broj slova koja smo unijeli jednak nuli. Kad je taj broj razliit od nule, nastavlja se izvoenje programa.
222
PRO - MIL
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { char niz[255]; cout << "Unesite vase ime." << endl; cin.getline(niz,255); cout << endl; cout << niz << ", dobar dan!" << endl; cout << endl; system("PAUSE"); return 0; }
Formiranje niza ije elije su char tipa. U svaku moemo staviti jedno slovo. Polja Saimanje Veliki programi koda Objekti Obrada teksta
char niz[255];
Naziv niza, u naem sluaju naziv niza je niz.
Broj elija niza. U naem sluaju niz sadri 255 elija to znai da u taj niz moemo spremiti 255 slova.
Naziv niza.
PRO - MIL
Petlje
Tekst se moe unijeti u program i obraivati i na drugi nain; uporabom polja char tipa.
Varijable
Na prvi program
Uvod
Sadraj
223
Obrada teksta
Sadraj niza char tipa ispisuje se na isti nain na koji se ispisuje sadraj varijable.
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { char niz[255]; cout << "Unesite vase ime." << endl; cin >> niz; cout << endl; cout << niz << ", dobar dan!" << endl; cout << endl; system("PAUSE"); return 0; }
Umjesto naredbe: cin.getline(niz,255); moemo staviti naredbu: cin >> niz; ali u tom sluaju moi emo unijeti samo jednu rije. Nakon pritiska razmaknice unos e se prekinuti pa, kao to moemo vidjeti na donjoj slici, iako smo napisali Bunic Stjepan, uneseno je samo prezime. Jasno, ako ba elimo unijeti samo jednu rije onda emo upotrijebiti ovu naredbu jer je jednostavnija.
224
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Poetni dio programa i formiranje potrebnih varijabli. Ovo je glavni dio programa. Ovdje se unosi tekst i ispituje jesu li unesena slova ili brojevi. Ako su uneseni brojevi, unos se ponavlja. Oznaku \ dobit emo pritiskom na AltGr i Q. Zavrni dio programa, ime se spaja s pozdravom i gasi se program. Na prvi program Uvod
U ovu inaicu programa nije mogue unijeti broj na mjestu na kojem oekujemo tekst. U sluaju da unesemo brojeve, raunalo e zahtijevati da ponovimo upis.
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { char niz[255]; int x; int p; do { cout << "Unesite vase ime." << endl; cout << endl; cin.getline(niz,255); x = 0; p = 1; while (niz[x] != '\0') { if (isdigit(niz[x])) { p = 0; } x = x + 1; } } while (p == 0); cout << endl; cout << niz << ", dobar dan!" << endl; cout << endl; system("PAUSE"); return 0; }
PRO - MIL
225
Obrada teksta
Pogledajmo podrobnije glavni dio prethodnog programa u kojem se unosi tekst i ispituje jesu li unesena slova ili brojevi.
Cijeli ovaj dio nalazi se unutar do ... while petlji koja e se ponavljati ako korisnik umjesto slova unese brojeve.
do { cout << "Unesite vase ime." << endl; cout << endl; cin.getline(niz,255); x = 0; p = 1; while (niz[x] != '\0') { if (isdigit(niz[x])) { p = 0; } x = x + 1; } } while (p == 0); Varijabla x uveava se za jedan da bi se pri svakom ponavljanju naredbom niz[x] itao slijede i lan niza. Postavljanje odgovarajuih vrijednosti varijabli. Unos teksta.
While petlja ita niz, slovo po slovo, dok ne doe do kraja niza. Oznaka \0 nalazi se na kraju niza pa niz[x] != '\0' ispituje je li element niza niz[1] jednak znaku za kraj, odnosno jesmo li doli do kraja niza. To radi tako da je na poetku vrijednost varijable x nula, a zatim se uveava po jedan
If naredbom ispitujemo je li znak u nizu broj. Ako jest, u p varijablu se sprema broj nula to e imati za posljedicu da e se ponoviti do ... while petlja, odnosno unos. Ako ni jedan lan niza nije broj, u varijabli p e ostati broj jedan i do ... while petlja se nee ponavljati, odnosno upis se nee ponavljati.
Ovdje se ispituje je li vrijednost varijable p nula i ako jest, do ... while petlja se ponavlja.
226
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Na poetku se x postavlja na nulu, to znai da e se prvi put sa niz[x] ispitivati niz[0] odnosno prva elija niza. x = 0; p = 1; while (niz[x] != '\0') { if (isdigit(niz[x])) { p = 0; } x = x + 1; } While petlja ponavlja se tako dugo dok elija niz[x] nije jednaka oznaci za kraj. Prvi put se ispituje prva elija odnosno elija niz[0]. Nakon to smo while naredbom ispitali jesmo li doli do kraja niza, if naredbom ispitujemo je li elija koju trenutno ispitujemo jednaka nuli. Ako jest, varijabla p postavlja se na nulu, to znai da e se ponoviti glavna do ... while petlja. Ovdje se varijabla x uveava za jedan. To znai da e pri sljedeem izvoenju while petlje x biti 1, pa e se sa niz[x] ispitivati niz[1], zatim pri sljedeem izvoenju while petlje niz[2] i tako do kraja niza. Donoenje Grafika odluke Varijable Na prvi program Uvod
Ovaj program je veoma sloen pa emo odvojeno pogledati vanije elemente programa. Pogledajmo prvo glavnu do ... while petlju.
do Ovdje poinje petlja. { cout << "Unesite vase ime." << endl; cout << endl; cin.getline(niz,255); x = 0; p = 1; while (niz[x] != '\0') { Ovdje e se varijabla p postaviti na nula ako je if (isdigit(niz[x])) jedan od znakova u nizu broj. To e imati za { posljedicu da e se do ... while petlja ponoviti, p = 0; odnosno da e se unos teksta ponoviti. } x = x + 1; } Ovdje se ispituje je li sadraj varijable p jednak } nuli. Ako jest do ... while petlja e se ponoviti, a while (p == 0); to znai da e se upis ponoviti.
Ovdje se u varijablu p sprema broj jedan. To je varijabla o kojoj ovisi hoe li se do ... while petlja ponoviti ili ne.
PRO - MIL
227
Obrada teksta
Ovom naredbom ispitujemo je li jedan znak broj. Moe se ispitivati varijabla char tipa ili jedna elija niza char tipa.
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { char slovo; cin >> slovo; if (isdigit(slovo)) { cout << "Ovo je broj " << slovo << endl; } else { cout << slovo << " nije broj." << endl; } cout << endl; system("PAUSE"); return 0; } U ovom jednostavnom programu moemo vidjeti kako funkcionira ispitivanje je li unesen znak broj ili nije. Osim ispitivanje je li unijeti znak broj, mogua su i druga ispitivanja. U tablici s desne strane moemo vidjeti druge mogunosti.
Pokuajmo u gornji program staviti ostala ispitivanja koja moemo vidjeti u tablici. U tom sluaju morat emo modificirati obavijesti koje daje program.
228
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod ISPITIVANJE ZNAKOVA if (isdigit(slovo)) Ispituje je li sadraj varijable slovo neki broj. if (isalnum(slovo)) Ispituje je li sadraj varijable slovo broj ili slovo. Odgovor je negativan ako unesemo upitnik, toku ili neto slino. if (isalpha(slovo)) Ispituje je li sadraj varijable slovo neko slovo. if (iscntrl(slovo)) Ispituje je li sadraj varijable slovo kontrolni znak. To je znak koji se dobiva ako drimo tipku Ctrl i onda pritisnem npr. slovo v. Je li sadraj varijable slovo neto to se ispisuje na zaslon raunala, dakle slovo, broj ili interpunkcija. U ovu grupu ne pripada prazno mjesto izmeu dviju rijei. if (isgraph(slovo)) if (islower(slovo)) Je li sadraj varijable slovo malo slovo. if (isprint(slovo)) Je li sadraj varijable neto to se ispisuje. Za razliku od sline naredbe if (isgraph(slovo)) ovdje pripada i prazno mjesto izmeu dviju rijei. if (isupper(slovo)) Je li sadraj varijable slovo veliko slovo. if (ispunct(slovo)) Je li sadraj varijable slovo neka interpunkcija.
Osim to moemo ispitivati je li sadraj varijable broj, ispitivati moemo i druga svojstva sadraja varijable char tipa.
PRO - MIL
229
Obrada teksta
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { char slovo[9] = {'8','?','b','\v','*','a',' ','A','#'}; if (isdigit(slovo[0])) { cout << "Prvi znak je broj." << endl; } if (isalnum(slovo[1])) { cout << "Drugi je slovo ili broj." << endl; } else { cout << "Drugi nije ni slovo ni broj." << endl; } if (isalpha(slovo[2])) { cout << "Treci je slovo." << endl; } if (iscntrl(slovo[3])) { cout << "Cetvrti je kontrolni znak." << endl; } if (isgraph(slovo[4])) { cout << "Peti nesto sto se ispisuje." << endl; } if (islower(slovo[5])) { cout << "Sesti je malo slovo." << endl; }
230
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj } Ovaj malo vei program morali smo staviti na dvije stranice. Moemo vidjeti uporabu naredbi za ispitivanje znakova primijenjenu na polje char tipa. Vidimo da ne moemo odjednom ispitivati cijelo polje, nego da ispitujemo pojedine elije u polju. Program moemo korigirati mijenjanjem sadraj polja ili tako da, umjesto stalnog sadraja polja, sadraj polja unosimo preko tipkovnice. Uvijek imajmo u vidu da emo odreenu naredbu usvojiti tek kad napravimo mnotvo primjera u kojima se ta naredba koristi. Odreenu naredbu nismo usvojili kad smo je shvatili. Shvaanje naredbe je samo uvjet da bismo uope mogli poeti uiti. Naredbu smo usvojili tek kad smo je puno puta uspjeno primijenili u raznim programima i na razne naine. Polja Saimanje Veliki programi koda Objekti Obrada teksta
PRO - MIL
Petlje
if (isprint(slovo[6])) { cout << "Sedmi moze biti prazno mjesto." << endl; } if (isupper(slovo[7])) { cout << "Osmi je veliko slovo." << endl; } if (ispunct(slovo[8])) { cout << "Deveti je neka interpunkcija." << endl; } cout << endl; system("PAUSE"); return 0;
Varijable
Na prvi program
Uvod
231
Obrada teksta
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { char slovo1; char slovo2; cout << "Unesite prvo slovo." << endl; cin >> slovo1; cout << "Unesite drugo slovo." << endl; cin >> slovo2; Iako to na prvi pogled nema smisla, znakovi se mogu usporeivati kao i brojevi. Na prvi pogled izgleda da se usporeuju na temelju abecede, ali to nije ba tako. Ovaj program dobro radi ako usporeujemo samo velika ili samo mala slova.
if (slovo1 < slovo2) { cout << "Prvo slovo je prije po abecedi." << endl; } else { cout << "Drugo slovo je prije po abecedi." << endl; } cout << endl; system("PAUSE"); return 0; }
Zato na taj nain ne moemo usporeivati velika i mala slova? Zato to raunalo smatra da velika slova dolaze prije malih. Ako elimo napisati program koji sva slova rasporeuje po abecedi, morali bismo najprije ustanoviti je li neko slovo veliko ili malo, odnosno program bi morao biti neto sloeniji. (Pokuajmo ga napisati.)
232
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj using namespace std; int main() { char slovo = 'A'; char NizSlova[18] = "Ovo je niz slova."; cout << "Jedno slovo je " << slovo << endl; cout << "Tekst je: " << NizSlova << endl; cout << endl; system("PAUSE"); return 0; } Mogla bi nas zbuniti uporaba znaka " i znaka '. Pravilo je jednostavno, jedno slovo pie se u obliku 'a', a vie slova u obliku "Ovo je tekst.". using namespace std; int main() { char slovo; cout << "Unesite slovo." << endl; cin >> slovo; slovo = slovo - 1; cout << "Prethodni znak je " << slovo << endl; slovo = slovo + 2; cout << "slijedeci znak je " << slovo << endl; cout << endl; system("PAUSE"); return 0; } Obrada teksta Slovima moemo dodavati ili oduzimati brojeve. Saimanje Veliki programi koda Objekti
PRO - MIL
Polja
Petlje
Varijable
Na prvi program
Uvod
233
Obrada teksta
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string tekst1 = "Ovo je prvi tekst."; string tekst2 = " Ovo je drugi tekst."; string tekst3; tekst3 = tekst1 + tekst2; cout << tekst3 << endl; cout << endl; system("PAUSE"); return 0; }
Objekte string klase moemo jednostavno zbrojiti i rezultat zbrajanja spremiti u trei objekt.
234
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj using namespace std; int main() { string tekst1; string tekst2; cout << "Unesite prvu rijec." << endl; cin >> tekst1; cout << endl; cout << "Unesite drugu rijec." << endl; cin >> tekst2; cout << endl; if (tekst1 == tekst2) { cout << "Rijeci su jednake." << endl; } else { cout << "Rijeci nisu jednake." << endl; } cout << endl; system("PAUSE"); return 0; } Objekti klase string mogu se meusobno usporeivati. U ovom programu usporeujemo jesu li jednaki.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
235
Obrada teksta
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string tekst1; string tekst2; cout << "Unesite prvu rijec." << endl; cin >> tekst1; cout << endl; cout << "Unesite drugu rijec." << endl; cin >> tekst2; cout << endl; if (tekst1 < tekst2) { cout << "Prva je manja." << endl; } else { cout << "Prva nije manja." << endl; } cout << endl; system("PAUSE"); return 0; }
Dva objekta klase string moemo usporeivati i tako da ispitujemo je li prvi manji od drugog. Ostaje nejasno u kojem smislu se ispituje je li prvi manji od drugog. Oito se ne ispituje koliina slova, nego se objekti rangiraju po abecedi, ab je po abecedi nakon aaaaa, pa u tome smislu ab nije manje nego je vee od aaaaa.
Kao i kod char polja, sustav je prilino primitivan i dobro radi jedino ako se ne mijeaju velika i mala slova, budui da raunalo smatra da su sva velika slova prije malih, pa su u tom smislu manja od malih. Zato raunalo smatra da je AB manje od aaaaa.
236
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program #include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string odgovor; getline(cin, odgovor); cout << "Tekst sadrzi " << odgovor.size() << " znakova." << endl; cout << endl; system("PAUSE"); return 0; Naredba size(). } Uvod
Mogue su i sloenije manipulacije nad tekstom. Ponovno pogledajmo naredbu size() koju smo vidjeli na poetku ovog poglavlja. Omoguuje nam odreivanje broja znakova koje sadri tekst. Pri tome imajmo na umu da raunalo i prazno mjesto izmeu rijei smatra jednim znakom.
PRO - MIL
237
Obrada teksta
Ovaj program pretrauje sadraj objekta tekst i trai pojavljuje li se u tom objektu sadraj objekta trazi. Ako se pojavljuje, obavjetava nas na kojoj poziciji zapoinje traeni tekst. (Prva pozicija nema broj jedan nego broj nula.)
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string tekst; string trazi; int pozicija; cout << "Unesite tekst." << endl; getline(cin, tekst); cout << endl; cout << "Sto trazim?" << endl; getline(cin, trazi); cout << endl; pozicija = tekst.find(trazi); if (pozicija != string::npos) { cout << "Pocetak je na " << pozicija << ". poziciji." << endl; } else { cout << "Nema trazene rijeci." << endl; } cout << endl; system("PAUSE"); return 0; }
238
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Problem ovog programa, odnosno ove naredbe, je u tome to e pronai samo prvo pojavljivanje neke rijei, ako se ista rije vie puta pojavljuje u tekstu. elimo li ispitati sva pojavljivanja neke rijei, morat emo napisati malo sloeniji program. Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Naziv objekta u kojem se nalazi tekst koji pretraujemo. Naredba za pretraivanja. Objekt koji pretraujemo. Ovom naredbom provjeravamo je li traena rije naena u pretraivanom objektu. Uvod
Ovom naredbom utvrujemo poziciju traenog teksta, a rezultat spremamo u varijablu pozicija.
pozicija = tekst.find(trazi);
if (pozicija != string::npos)
Ovom naredbom dobivamo oznaku koja oznaava da traena rije nije naena. Usporeujemo rezultat pretraivanja u pozicija varijabli i obavijest da traena rije nije naena.
PRO - MIL
239
Obrada teksta
Ovaj program radi slian posao kao i prethodni, ali pretraivanje zapoinje od kraja teksta. Ako traimo rije koja se pojavljuje vie puta, ovaj program nai e posljednje pojavljivanje.
#include <cstdlib> #include <iostream> #include <string> using namespace std; Program je u potpunosti identiint main() an prethodnome, samo to { ovdje umjesto naredbe find string tekst; imamo naredbu rfind. string trazi; int pozicija; Time smo raunalu naredili da cout << "Unesite tekst." << endl; pretraivanje zapone od kraja getline(cin, tekst); teksta koji se nalazi u objektu cout << endl; tekst. cout << "Sto trazim?" << endl; getline(cin, trazi); cout << endl; pozicija = tekst.rfind(trazi); if (pozicija != string::npos) { cout << "Pocetak je na " << pozicija << ". poziciji." << endl; } else { cout << "Nema trazene rijeci." << endl; } cout << endl; system("PAUSE"); return 0; }
240
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj using namespace std; int main() Ovaj program smo tako korigirali da { smo, iako s naredbom find zapoistring tekst; njemo pretraivanje s lijeve strane, string trazi; pronali drugo pojavljivanje traene int pozicija; rijei. cout << "Unesite tekst." << endl; getline(cin, tekst); cout << endl; cout << "Sto trazim?" << endl; getline(cin, trazi); cout << endl; pozicija = tekst.find(trazi,6); if (pozicija != string::npos) { cout << "Pocetak je na " << pozicija << ". poziciji." << endl; } else { cout << "Nema trazene rijeci." << endl; } cout << endl; system("PAUSE"); return 0; pozicija = tekst.find(trazi,6); } Budui da prva rije radi poinje na 5, raunalo je nalo drugo pojavljivanje rijei radi. Pomou ove naredbe napravit emo program koji e pronai sva pojavljivanja neke rijei, a ne samo prvo ili posljednje.
PRO - MIL
U ve poznatu naredbu find dodali smo broj 6 ime smo naredili raunalu da pretraivanje objekta tekst zapone od znaka na poziciji 6.
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
241
Obrada teksta
Ovaj program moe pronai svako pojavljivanje neke rijei u nekom tekstu.
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() U ovom programu koristimo nared{ bu find, a pozicija poetka pretraistring tekst; vanja nije odreena brojem, nego string trazi; sadrajem varijable trenutno. int duljina; int trenutno = 0; Varijabla trenutno je na poetku 0, int polozaj; da bi prvo pretraivanje poelo od cout << "Unesite tekst." << endl; poetka teksta. Ako na nekoj pozigetline(cin, tekst); ciji pronaemo traenu rije, varicout << endl; jablu trenutno uveavamo za tu cout << "Sto trazim?" << endl; poziciju + 1, da bi novo pretraivagetline(cin, trazi); nje poelo nakon poetka ve nacout << endl; ene rijei i da bi se eventualno duljina = tekst.size(); pronala nova rije, a ne ponovo while (trenutno < (duljina + 1)) ista. { polozaj = tekst.find(trazi,trenutno); if (polozaj != string::npos) { cout << "Nalazi se na " << polozaj << ". mjestu." << endl; trenutno = polozaj + 1; } else Budui da smo doavi do ove toe ve { prilino napredovali u vjetini programiratrenutno = duljina + 1; nja, ovaj put je objanjenje funkcioniranja } programa neto skromnije. } cout << endl; Pokuajmo shvatiti kako funkcionira progsystem("PAUSE"); ram i pokuajmo ga korigirati tako da ispie return 0; adekvatnu obavijest, ako se traena rije } uope ne pojavljuje. Pokuajmo isti program napisati koritenjem rfind naredbe.
242
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Naredba za dodavanje teksta. Sadraj koji dodajemo.
tekst.insert(6,umetak);
Pozicija na koju dodajemo tekst. Obrada teksta Saimanje Veliki programi koda Objekti #include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string tekst = "Ovo je tekst."; tekst.insert(6," dobar"); cout << tekst << endl; cout << endl; system("PAUSE"); return 0; Naredba insert moe se napisati } i na ovaj nain.
PRO - MIL
Polja
Petlje
int main() { string tekst = "Ovo je tekst."; string umetak = " moj"; tekst.insert(6,umetak); cout << tekst << endl; cout << endl; system("PAUSE"); return 0; }
Varijable
Na prvi program
Uvod
243
Obrada teksta
Dio teksta spremljenog u objekt klase string moemo obrisati erase naredbom.
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string tekst = "Ovo je dobar tekst."; tekst.erase(7,6); cout << tekst << endl; cout << endl; system("PAUSE"); return 0; } Pozicija od kojem poinje brisanje.
Naredba za brisanje.
tekst.erase(7,6);
244
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Pozicija od koje zapoinje zamjena teksta. Koliko emo znakova zamijeniti. Donoenje Grafika odluke Varijable Na prvi program #include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { string tekst = "Ovo je dobar tekst."; string drugi = "dodatan"; tekst.replace(7,5,drugi); cout << tekst << endl; cout << endl; system("PAUSE"); return 0; } Naredba za zamjenu teksta. Objekt u kojem mijenjamo dio teksta. Uvod
Naredbom replace moemo dio teksta koji se nalazi u objektu klase string zamijeniti nekim drugim tekstom.
tekst.replace(7,5,drugi);
Sadraj kojim emo zamijeniti tekst u objektu tekst. Zamijenit emo 5 znakova, poevi od sedmog sa sadrajem objekta drugi. Umjesto objekta drugi mogli bismo staviti i tekst unutar navodnika.
PRO - MIL
245
Obrada teksta
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { Ovdje, na nain koji smo ve vidjeli u ovom pogchar niz[255]; lavlju, ime unosimo u char polje i provjeravamo string tekst; jesu li uneseni brojevi ili slova. Ako su uneseni tekst.reserve(256); brojevi, unos se ponavlja. Naredba isdigit ne bi int x; radila da smo koristili objekt klase string. int p; do { cout << "Unesite vase ime." << endl; cout << endl; cin >> niz; x = 0; p = 1; while (niz[x] != '\0') Ovdje tekst iz polja tipa { char premjetamo u obif (isdigit(niz[x])) jekt klase string koji smo { nazvali tekst. p = 0; } To smo uinili da bismo x = x + 1; mogli koristiti size nared} bu. } while (p == 0); cout << endl; tekst = niz; cout << "Ime " << tekst << " sadrzi " << tekst.size() << " slova." << endl; cout << endl; system("PAUSE"); Naredba niz.size nije dozvoljena. Naredba return 0; size radi jedino s objektima, ali ne i s poljima. }
246
PRO - MIL
using namespace std; int main() { string tekst = "Tekst."; char *polje = (char*)tekst.c_str(); cout << polje[0] << endl; cout << polje[1] << endl; cout << polje[2] << endl; cout << polje[3] << endl; cout << polje[4] << endl; cout << polje[5] << endl; cout << endl; system("PAUSE"); return 0; } Tekst iz objekta selimo u char polje koje smo nazvali polje.
Naziv char polja u koje emo spremiti tekst iz objekta. U naem sluaju naziv je polje.
Naziv objekta iz kojeg tekst selimo u char polje. U naem sluaju naziv objekta je tekst.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
247
Obrada teksta
#include <cstdlib> #include <iostream> #include <string> #include <fstream> using namespace std; int main() { int x; Kad smo spremali brojeve, izmeu string tekst[8]; brojeva stavljali smo prazno mjesto ofstream izlaz("podaci.txt"); da bismo znali gdje zavrava jedan for (x = 0; x < 8; x = x + 1) broj, a po inje drugi. { getline(cin, tekst[x]); U ovom programu prazna mjesta } nisu prikladna za razlikovanje sadrfor (x = 0; x < 8; x = x + 1) aja pojedinih elija jer se prazna { mjesta nalaze izmeu rijei. izlaz << tekst[x]; izlaz << " # "; } cout << endl; cout << "Spremanje je gotovo." << endl; cout << endl; system("PAUSE"); return 0; }
Umjesto praznih mjesta, izmeu sadraja pojedinih elija stavljamo # Ta oznaka e nam pomoi prilikom itanja datoteke.
248
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Oznaku # koristit emo da bismo utvrdili jesmo li doli do kraja sadraja jedne elije polja. Ovo rjeenje je jednostavno, ali je manjkavo. Ako bi netko prilikom unosa teksta unio # oznaku, poremetio bi ispravno funkcioniranje programa. Zbog toga bi program za unos teksta trebalo tako modificirati da ne dozvoljava unos # oznake. Donoenje Grafika odluke Varijable Na prvi program Uvod #include <cstdlib> #include <iostream> #include <string> #include <fstream> using namespace std; int main() { int x; string tekst[8]; string privremeni; ifstream ulaz("podaci.txt"); for (x = 0; x < 8; x = x + 1) { do { ulaz >> privremeni; if (privremeni != "#") { tekst[x] = tekst[x] + privremeni + " "; } } while (privremeni != "#"); } for (x = 0; x < 8; x = x +1) { cout << tekst[x] << endl; } cout << endl; system("PAUSE"); return 0; }
Programom slinim programu za itanje datoteka u kojima se nalaze brojevi itat emo sadraj datoteke u kojoj se nalaze tekstovi.
PRO - MIL
249
Objekti
250
PRO - MIL
PRO - MIL
Objekti
Objekti
Polja
Petlje
Varijable
Na prvi program
Uvod
Sadraj
251
Objekti
252
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja #include <cstdlib> #include <iostream> Uoimo da taj program radi potpuno isti posao kao ovaj. Oito je da se u malim programima ne isplati koristiti klase i objekte. Njihove prednosti dolaze do izraaja u veim programima. using namespace std; int main() { cout << "Ovo je nas tekst." << endl; cout << endl; system("PAUSE"); return 0; } Petlje Donoenje Grafika odluke Varijable Unesimo u programsku okolinu i pokrenimo na prvi program koji koristi klase i objekte. Na prvi program #include <cstdlib> #include <iostream> using namespace std; class tekst { public: void pisi() { cout << "Ovo je nas tekst." << endl; } }; int main() { tekst t; t.pisi(); cout << endl; system("PAUSE"); return 0; } Uvod
Imajmo u vidu da prednost uporabe objekata dolazi do izraaja u veim programima. Manji programi koje emo vidjeti u ovom poglavlju mogu se elegantnije napraviti bez uporabe objekata. Unato tome, mi emo vidjeti primjere uporabe objekata u malim programima jer emo na primjerima malih programa lake shvatiti princip uporabe objekata.
PRO - MIL
253
Objekti
Najprije emo pogledati zanimljive dijelove naeg programa, a zatim funkcioniranje programa kao cjeline.
Ovaj dio programa izrazito je slian ovom dijelu programa iz prolog poglavlja.
tekst t; t.pisi();
U prvom redu formira se objekt klase tekst koji smo nazvali t. U drugom redu nad objektom t vri se operacija pisi(). Unutar zagrada nema sadraja, jer se nita ne unosi u objekt t, ali su zagrade svejedno obvezne. Oblik t.pisi bez zagrada nije ispravan.
U prvom redu formirali smo objekt klase string koji smo nazvali tekst. U drugom redu nad objektom tekst izvrili smo operaciju reserve(250) kojom smo osigurali prostor za spremanje teksta. Izmeu naziva objekta i naziva operacije nalazi se toka.
Naziv klase na temelju koje emo formirati objekt. U naem sluaju naziv klase je tekst.
tekst t ;
Naziv objekta koji formiramo na temelju klase. U naem sluaju formiramo objekt t klase tekst.
t . pisi() ;
Naziv objekta iju metodu emo koristiti. U naem sluaju koristit emo metodu t. Obvezna toka. Naziv metode koju sadri objekt t. U naem sluaju koristimo metodu pisi().
254
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj #include <cstdlib> #include <iostream> using namespace std; class tekst { public: void pisi() { cout << "Ovo je nas tekst." << endl; } }; int main() { tekst reci; reci.pisi(); cout << endl; system("PAUSE"); return 0; } Ovdje vidimo da objekt moemo nazvati i drugaije, npr. reci. Ako smo formirali objekt reci, onda naredba koja je do sada imala oblik: t.pisi(); dobiva oblik: reci.pisi(); Dakle, sad se operacija pisi vri nad objektom reci. #include <cstdlib> #include <iostream> using namespace std; int main() { int a; a = 12; cout << a << endl; cout << endl; system("PAUSE"); return 0; } Uoimo da postoji slinost izmeu formiranja objekta reci klase tekst i varijable a tipa int. I ovdje se najprije navodi tip varijable, a zatim naziv a. Nad varijablom moemo vriti razne operacije. U naem sluaju u varijablu a spremamo broj 12.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
255
Objekti
#include <cstdlib> #include <iostream> using namespace std; class tekst { public: void pisi() { cout << "Ovo je nas tekst." << endl; } }; int main() { tekst prvi; tekst drugi; tekst treci; prvi.pisi(); drugi.pisi(); treci.pisi(); cout << endl; system("PAUSE"); return 0; }
Kao to moemo formirati vie varijabli int tipa, tako moemo formirati vie objekata klase tekst. U ovom primjeru formirali smo tri objekta, objekt prvi, objekt drugi i objekt trei. Za biranje naziva objekata vrijede slina pravila kao i za biranje naziva varijabli.
class tekst { public: void pisi() { cout << "Ovo je nas tekst." << endl; } };
Za razliku od klase string koju je ve netko prije napisao, a mi je samo koristimo, klasu tekst morali smo sami napisati. U ovom dijelu programa formira se klasa tekst.
256
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Vidimo da je rezultat rada takvog programa potpuno jednak kao i rezultat rada programa u kojem smo formirali klasu tekst. Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Formiranje klase zapo inje naredbom class. To je naredba C++ jezika i ne moe se mijenjati.
class tekst
Nakon naredbe class slijedi naziv klase. U naem sluaju klasu smo nazvali tekst, ali mogli smo i drugaije.
#include <cstdlib> #include <iostream> using namespace std; class BrdaIDoline { public: void pisi() { cout << "Ovo je nas tekst." << endl; } }; int main() { BrdaIDoline t; t.pisi(); cout << endl; system("PAUSE"); return 0; }
U ovoj inaici programa klasu smo nazvali BrdaIDoline. To je dozvoljeno, samo to sad naredbu koja je prije imala oblik: tekst t; moramo napisati u obliku: BrdaIDoline t; Dakle, formiramo objekt t klase BrdaIDoline. (Drugo je to je pametno da nam naziv klase govori emu klasa slui, pa je loginije da se klasa za ispis teksta zove tekst, a ne BrdaIDoline.)
PRO - MIL
257
Objekti
public: void pisi() { cout << "Ovo je nas tekst." << endl; }
U ovom djelu nalazi se popis varijabli i metoda koje posjeduje neka klasa. Metode su mudar naziv za operacije koje neka klasa moe izvriti. U naem sluaju klasa ne sadri varijable. Ima samo jednu metodu koju smo nazivali pisi(). Popis metoda poinje naredbom public: Poblie znaenje te naredbe vidjet emo kasnije.
Ova naa mala klasa ne sadri varijable i sadri samo jednu metodu odnosno moe napraviti samo jednu operaciju. Tu metodu nazvali smo pisi (). Ispred naziva metode nalazi se naredba void. Njeno znaenje poblie emo objasniti kasnije.
Unutar vitiastih zagrada nalaze se naredbe koje pojedina metoda izvrava. Naa jednostavna metoda samo naredbom cout ispisuje tekst unutar navodnika na zaslon raunala.
258
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj #include <cstdlib> #include <iostream> using namespace std; class tekst { public: void Pero() { cout << "Ovo je nas tekst." << endl; } }; int main() { tekst t; t.Pero(); cout << endl; system("PAUSE"); return 0; } t.pisi(); pisati u obliku: t.Pero(); Kao i kod biranja naziva varijabli i klasa, i ovdje je pametno da nam naziv metode govori to metoda radi. Zato je naziv pisi za metodu koja ispisuje tekst bolji od naziva Pero. Naziv metode biramo po volji, pazei na ogranienja o kojima smo govorili kad smo govorili o biranju naziva varijabli. Pametno je da naziv metode tako izaberemo da nam govori emu metoda slui.
PRO - MIL
U kojem smislu ne vraa vrijednost vidjet emo kasnije kad ovakvu metodu usporedimo s onima koje vraaju vrijednost.
Objekti
Void naredba ispred naziva metode oznauje da metoda ne vraa nikakvu vrijednost.
void pisi ()
Dok naziv metode uz odreena ogranienja moemo birati po volji, ove dvije zagrade se ovdje moraju obavezno nalaziti.
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
259
Objekti
Pogledajmo strukturu naeg programa. #include <cstdlib> #include <iostream> using namespace std; class tekst { public: void pisi() { cout << "Ovo je nas tekst." << endl; } }; int main() { tekst t; t.pisi(); cout << endl; system("PAUSE"); return 0; } Poetni dio programa.
U ovom dijelu nalaze se klase koje program koristi. U naem sluaju imamo samo jednu klasu, klasu pisi().
Glavni dio programa. Sada moemo vidjeti zato smo program zapoinjali s int main() oznakom, odnosno oznakom da je to glavni dio. Kad raunalo pokrene program, najprije e se pokrenuti ovaj dio, a ostali dijelovi e se koristiti po potrebi.
Klasa se moe sastojati od vie tipova sadraja. Jedan od njih je public. Kasnije emo podrobnije vidjeti to oznaka public oznaava.
class tekst { public: void pisi() { cout << "Ovo je nas tekst." << endl; } };
U klasi se mogu nalaziti varijable i metode. U naem sluaju varijable ne koristimo, a imamo jednu metodu koju smo nazvali pisi(). Metode su zapravo programi koji odreuju koje operacije neka klasa moe izvesti .
260
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Umjesto class tekst stavit emo class slika. Umjesto t.pisi(); tj. umjesto pozivanja metode pisi() u klasi tekst stavit emo crtaj.krug(); Saimanje Veliki programi koda Objekti Obrada teksta Umjesto tekst t; tj. umjesto naredbe formiranja objekta t klase tekst stavimo slika crtaj. Time emo formirati objekt crtaj klase slika. Polja Petlje Umjesto void pisi() stavit emo void krug(). Donoenje Grafika odluke Iako program i ovako radi, malo emo ga preurediti. Varijable Na prvi program Uvod
Unutar metode ne mora se nalaziti program za ispis. Moe se nalaziti bilo to, npr. program za crtanje kruga.
#include <cstdlib> #include <iostream> #include <winbgim.h> using namespace std; class tekst { public: void pisi() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); circle(320,240,180); getch(); closegraph(); } }; int main() { tekst t; t.pisi(); cout << endl; system("PAUSE"); return 0; }
Izbacimo naredbu cout << endl; i naredbu system("PAUSE");. Iako program radi i s tim naredbama, bez njih e raditi neto elegantnije. Ovaj se program odvija u grafikom prozoru pa su nepotrebni razmak i pauza u tekstualnom prozoru.
PRO - MIL
261
Objekti
#include <cstdlib> #include <iostream> using namespace std; class tekst { public: void prva() { cout << "Ovo je prva metoda." << endl; } void druga() { cout << "Ovo je druga metoda." << endl; } void treca() { cout << "Ovo je treca metoda." << endl; } }; int main() { tekst t; t.prva(); t.druga(); t.treca(); cout << endl; system("PAUSE"); return 0; }
Objekt formiramo jednom, a zatim pozivamo metode po logici da najprije navedemo naziv objekta, zatim stavimo toku i konano naziv metoda. Zagrade na kraju te ; oznaka su obvezne.
262
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Prva klasa koju smo nazvali tekst1. Druga klasa koju smo nazvali tekst2. Uoimo da je dozvoljeno da se metoda pod istim nazivom pisi() nalazi u obje klase. Saimanje Veliki programi koda Ovdje na temelju svake klase formiramo objekt, a zatim pozivamo metodu od svake klase odnosno operaciju koju objekt moe izvriti Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program #include <cstdlib> #include <iostream> using namespace std; class tekst1 { public: void pisi() { cout << "Ovo je klasa tekst1." << endl; } }; class tekst2 { public: void pisi() { cout << "Ovo je klasa tekst2." << endl; } }; int main() { cout << "Zovemo metodu klase tekst1." << endl; tekst1 t1; t1.pisi(); cout << endl; cout << "Zovemo metodu klase tekst2." << endl; tekst2 t2; t2.pisi(); cout << endl; system("PAUSE"); return 0; } Uvod
Program moe sadravati vie klasa, npr. u ovom sluaju klasu tekst1 i klasu tekst2.
PRO - MIL
263
Objekti
#include <cstdlib> #include <iostream> using namespace std; class tekst { public: void pisi() { cout << "Upravo koristimo objekt." << endl; } }; int main() { tekst t; cout << "Objekt koristimo 1. put." << endl; t.pisi(); cout << endl; cout << "Objekt koristimo 2. put." << endl; t.pisi(); cout << endl; cout << "Objekt koristimo 3. put." << endl; t.pisi(); cout << endl; system("PAUSE"); return 0; }
Jednom formirani objekt moemo proizvoljni broj puta koristiti u programu. To je jedna od prednosti koritenja klasa i objekata. Operaciju koja se u programu esto ponavlja stavimo u klasu, u programu formiramo objekt i pozivamo odreenu operaciju kad god nam zatreba, bez potrebe da je ponovo piemo.
Sve klase koje smo do sada formirali bile su veoma jednostavne budui da nisu komunicirale s ostatkom programa na nain da bi bilo mogue u klasu unijeti neke podatke ili iz klase iitati neke podatke, npr. brojeve ili tekst. U nastavku ovog poglavlja vidjet emo na koji nain moemo u klase unositi ili iz klasa iitavati podatke.
Uporaba klasa i objekata veoma je sloena ideja, i kao uvijek do sada, imajmo na umu da emo te programske tehnike usvojiti tek kad napravimo velik broj primjera.
264
PRO - MIL
Komunikacija s metodama
Pogledajmo sada program koji sadri klasu u koju je mogue unijeti podatke iz drugih dijelova programa.
#include <cstdlib> #include <iostream> using namespace std; class pravokutnik { private: int c; public: void naslov() { cout << "Povrsina pravokutnika." << endl; cout << endl; } int povrsina (int a, int b) { c = a * b; return (c); } }; int main() { pravokutnik p; p.naslov(); cout << "Povrsina je "; cout << p.povrsina(2,3); cout << endl << endl; system("PAUSE"); return 0; } Klasa pravokutnik sadri jednu varijablu. To je varijabla c int tipa, a nalazi se u private grupi.
Osim varijable u sa sadri i dvije metode u public grupi. To su metoda naslov() i metoda povrsina (int a, int b). Objekti Saimanje Veliki programi koda Obrada teksta Polja private grupi, kla-
PRO - MIL
Petlje
Varijable
Na prvi program
Uvod
Sadraj
265
Objekti
#include <cstdlib> #include <iostream> using namespace std; class pravokutnik { private: int c; Prethodni program malo smo modificirali da bi lake mogli shvatiti razliku izmeu naredbe private i naredbe public.
public: U public podruju dodali smo int pov; varijablu koju smo nazvali pov. void naslov() { cout << "Povrsina pravokutnika." << endl; cout << endl; } Sadraj varijable c koja je formirana u int povrsina (int a, int b) { c = a * b; pov = c; return (c); } }; int main() { pravokutnik p; p.naslov(); cout << "Povrsina je "; cout << p.povrsina(2,3); cout << endl; cout << "p.pov je " << p.pov << endl; // cout << "p.c je " << p.c << endl; cout << endl << endl; system("PAUSE"); return 0; } private podruju i u kojoj se nalazi rezultat izrauna povrine spremili smo u varijablu pov koja je formirana u public podruju.
Ovdje vidimo da sadraju varijable pov moemo pristupiti u glavnom programu, iako je formirana u objektu. Pristupamo joj tako da prvo napiemo naziv objekta zatim toku i na kraju varijablu, dakle u p.pov obliku. Pokuamo li na isti nain pristupiti varijabli c, doi e do greke. (elimo li probati, maknimo // oznaku na poetku reda.) Ve iz ovog primjera bismo mogli zakljuiti u kojem smislu je c varijabla private, a kojem smislu je pov varijabla public.
266
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Ovdje su formirane jo dvije varijable, varijabla a i varijabla b. Iako bi bilo logino da tim varijablama moemo pristupiti izvan klase odnosno izvan objekta, jer su formirane u public podruju, to ipak nije sluaj. Pokuamo li im pristupiti izvan objekta doi e do greke. Dakle izvana moemo pristupiti samo onim varijablama koje su u public podruju formirane samostalno kao pov varijabla, a ne moemo onima koje su formirane unutar neke metode. Polja Petlje Donoenje Grafika odluke Varijable Na prvi program class pravokutnik { private: int c; public: int pov; void naslov() { cout << "Povrsina pravokutnika." << endl; cout << endl; } int povrsina (int a, int b) { c = a * b; pov = c; return (c); } }; Za razliku od private podruja, svemu to formiramo u public podruju moemo pristupiti i izvan klase, odnosno izvan objekta. To ne moemo uiniti tako da samo navedemo naziv varijable ili procedure nego tako da prvo navedemo naziv objekta, zatim toku i na kraju naziv varijable ili procedure. Ako pristupamo proceduri, moramo navesti i zagrade. Uvod
Naredba private oznaava podruje u kojem se nalaze varijable i metode koje se mogu koristiti unutar klase odnosno unutar objekta, ali se njima ne moe pristupiti iz glavnog programa, odnosno izvan objekta. U ovom programu u private podruju imamo samo varijablu c. Mogli bismo imati i procedure.
PRO - MIL
267
Objekti
private: int c;
Unutar private podruja u ovom sluaju formirali smo samo varijablu c. Mogli bismo staviti i procedure, ali u tom sluaju bismo tim procedurama mogli pristupiti samo unutar klase odnosno samo unutar objekta. Nain pisanja bio bi isti kao i unutar public podruja.
Ovdje formiramo pov varijablu int tipa. Varijable unutar klase formiramo na potpuno jednak nain kao i unutar glavnog programa.
public: int pov; void naslov() { cout << "Povrsina pravokutnika." << endl; cout << endl; } int povrsina (int a, int b) { c = a * b; pov = c; return (c); }
Ovdje formiramo metodu za ispis teksta na zaslon raunala. Takav tip procedure ve smo vidjeli u prethodnim primjerima.
Ovdje formiramo metodu za izraun povrine pravokutnika. Vidimo da joj je oblik drugaiji od oblika naslov() metode pa emo je poblie pogledati.
Do sada smo formiranje metode zapoinjali s void. Ova metoda zapoinje s int. to to znai? To znai da e ova metoda biti int tipa, odnosno da e rezultat njenog rada biti broj int tipa. Naredbom: cout << p.povrsina(2,3); ispisat emo rezultat rada metode povrsina na zaslon, a rezultat je broj int tipa.
Naziv metode.
268
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta c = a * b; pov = c; Unutar metode mogu se koristiti varijable koje smo koristili za unos, varijabla a i varijabla b, te se mogu koristiti sve one varijable koje su formirane u public ili private podruju, dakle varijabla c i varijabla pov. return (c); Ovom naredbom odreujemo koju vrijednost e procedura vraati u glavni program, odnosno to e naredba cout << p.povrsina(2,3); ispisati. Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Void naredba znai da metoda naslov nee vraati nikakav rezultat rada. Sad e netko upitati, kako ne vraa kad ispisuje tekst na zaslon. Ispisuje, ali se ispisivanje zbiva unutar metode. U glavnom programu mogue je napisati: cout << p.povrsina(2,3); ali nije mogue napisati: cout << p.naslov(); Mogue je jedino s: p.naslov(); pozvati metodu naslov koja onda unutar sebe ispisuje tekst na zaslon raunala.
Prazne zagrade znae da u ovu metodu nita nije mogue unijeti na nain da se napie: p.naslov(2,3); Mogue je unutar metode staviti cin naredbu pa neto unijeti npr. preko tipkovnice, ali nije mogue nita unijeti na gore opisan nain.
void naslov ()
PRO - MIL
269
Objekti
#include <cstdlib> #include <iostream> using namespace std; class racunaj { private: int c; public: int metoda1(int a, int b) { c = a + b; return (c); } int metoda2(int a, int b) { c = a + b; return (a); } int metoda3(int a, int b) { c = a + b; return (b); } }; int main() { racunaj r; cout << "return(c) daje " << r.metoda1(2,4) << endl; cout << "return(a) daje " << r.metoda2(2,4) << endl; cout << "return(b) daje " << r.metoda3(2,4) << endl; system("PAUSE"); return 0; }
U ovom programu moemo lijepo vidjeti kako o naredbi return ovisi to e se naredbom r.metoda1(2,4) ispisati na zaslon raunala.
Ako smo u metodi upotrijebili naredbu return (c), naredbom r.metoda1(2,4) ispisat e se sadraj varijable c. Naredbom return(a) ispisat e se sadraj varijable a, a naredbom return(b) ispisat e se sadraj varijable b.
270
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj using namespace std; class racunaj { private: int a; int b; int c; public: void unesi(void) { cout << "Unesite stranicu a." << endl; cin >> a; cout << "Unesite stranicu b." << endl; cin >> b; } void povrsina(void) { c = a * b; cout << "Povrsina je " << c << endl; } }; int main() { racunaj p; p.unesi(); p.povrsina(); cout << endl; system("PAUSE"); return 0; } Na prvi program p.povrsina(2,3); Mogue je jedino naredbom: p.unesi(); pozvati metodu za unos brojeva. Petlje Saimanje Veliki programi koda Objekti Obrada teksta Metodom povrsina izraunava se povrina i ispisuje rezultat. Rezultat se ispisuje unutar metode. Nije mogua naredba: cout << p.povrsina(); Polja Donoenje Grafika odluke U ovom programu imamo dvije void metode. Metodom unesi unose se brojevi u varijablu a i varijablu b. To se vri unutar metode. Nije mogue napisati naredbu: Varijable
PRO - MIL
Uvod
271
Objekti
#include <cstdlib> #include <iostream> using namespace std; class racunaj { private: int a; int b; int c; U ovom programu najprije raunamo povrinu, a zatim dobiveni rezultat mnoimo sa cijenom kvadratnog metra povrine da bismo dobili cijenu povrine.
public: void unesi(void) { cout << "Unesite stranicu a." << endl; cin >> a; cout << "Unesite stranicu b." << endl; cin >> b; } int povrsina(void) { c = a * b; return (c); } Obratimo panju na }; injenicu da unutar glavnog programa smiint main() jemo koristiti c varijab{ lu, iako c varijabla posint c; toji u klasi racunaj. int u; racunaj p; p.unesi(); cout << "Cijena kvadratnog metra." << endl; cin >> c; u = c * p.povrsina(); cout << "Cijena poda je " << u << endl; cout << endl; system("PAUSE"); return 0; }
Vidjeli smo da rezultat izrauna unutar metode moemo ispisati na dva naina. Ako je metoda tipa void onda se rezultat ispisuje unutar metode. Tada naredba tipa: cout << povrsina(); nije mogua. Ako metoda nije void tipa, nego int ili float ili char, onda je mogue napisati gore navedenu naredbu. Postavlja se pitanje u emu je razlika u funkcionalnosti tih dvaju naina ispisa. Razlika je u tome da ako metoda nije void tipa, onda metodu moemo koristiti unutar izraza poput: u = c * p.povrsina();
272
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj #include <cstdlib> #include <iostream> using namespace std; class racunaj { private: int a; int b; int c; int p; int u; public: void unesi(void) { cout << "Unesite stranicu a." << endl; cin >> a; cout << "Unesite stranicu b." << endl; cin >> b; cout << "Cijena kvadratnog metra." << endl; cin >> c; } void cijena(void) { p = a * b; cout << "Povrsina je " << p << endl; u = p * c; cout << "Cijena je " << u << endl; } }; int main() { racunaj p; p.unesi(); p.cijena(); cout << endl; system("PAUSE"); return 0; } Da je to int metoda i da rezultat vra amo return naredbom, mogli bi napisati ili return (p) ili return(u), ali ne bismo mogli vratiti obje vrijednosti. Ukratko, koju od metoda ispisa emo upotrijebiti ovisi o potrebama koje moramo zadovoljiti.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Ako za ispis koristimo void metodu pa uporaba naredbe return nije mogua, ispisom rezultata unutar metode moemo ispisati vie vrijednosti.
Varijable
Na prvi program
Uvod
273
Objekti
Naredba cout << p.povrsina(2,3); zbunjujua je izmeu ostalog i zato to istovremeno slui za unos broja 2 i broja 3 u metodu i za ispis rezultata mnoenja, odnosno rezultata rada metode.
Kad raunalo naie na ovakvu naredbu, najprije e broj dva i broj tri proslijediti u varijablu a i varijablu b koje se nalaze u metodi povrsina.
Unutar metode povrsina raunalo e sadraj varijable a i varijable b pomnoiti, a rezultat spremiti u varijablu c.
Kad raunalo naie na naredbu return(c) , sadraj varijable c ispisat e na zaslon raunala. Ova naredba tada e funkcionirati kao da smo u programu koji ne sadri klase i objekte napisali: cout << c;
274
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj #include <cstdlib> #include <iostream> using namespace std; class pravokutnik { private: float c; public: void naslov() { cout << "Povrsina pravokutnika." << endl; cout << endl; } float povrsina (float a, float b) { c = a * b; return (c); } }; int main() { float a1; float b1; pravokutnik p; p.naslov(); cout << "Unesite stranicu a." << endl; cin >> a1; cout << "Unesite stranicu b." << endl; cin >> b1; cout << "Povrsina je "; cout << p.povrsina(a1,b1); cout << endl << endl; system("PAUSE"); return 0; } Kao to smo ve rekli, metode ne moraju biti int tipa. Mogu biti i nekog drugog tipa. U ovom programu imamo metodu float tipa. Vidimo da naredbu: p.povrsina(a1,b1) moemo pisati i tako da unutar zagrada umjesto konkretnih brojeva stavimo varijable.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
275
Objekti
#include <cstdlib> #include <iostream> using namespace std; class pravokutnik { private: int c; public: int povrsina (int a, int b); }; int pravokutnik :: povrsina (int a, int b) { c = a * b; return (c); };
U deklaraciji klase samo su nabrojeni elementi klase i podijeljeni u private i public podruje. Ovdje se nalazi samo zaglavlje metode pravokutnik u kojem su odreena ulazna i izlazna svojstva metode, ali ovdje nema sadraja metode.
int main() { cout << "Povrsina pravokutnika" << endl; cout << endl; pravokutnik p; cout << "Povrsina je = " << p.povrsina(2,3) << endl; cout << endl; system("PAUSE"); return 0; }
Sadraj metode pravokutnik, odnosno dio programa kojim odreujemo to e metoda pravokutnik raditi nalazi se ovdje.
Ovako napisanu klasu koristimo na isti nain kao i klase koje smo do sada koristili.
276
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Tip vrijednosti koju e metoda vraati kao rezultat. U ovom sluaju je int, a mogao bi biti i neki drugi npr. float.
Obvezna ; oznaka Deklaracija metode u deklaraciji klase. Ovdje je naveden naziv metode i ulazno-izlazna svojstva metode, ali ne i program metode.
Definicija metode. Ovdje se nalazi program koji odreuje to ta metoda radi, odnosno svojstva metode.
Naziv klase.
Naziv metode.
U veini sluajeva do sada noviji nain izrade programa bio je elegantniji od starog. U ovom sluaju to ba ne izgleda tako. Ovakav nain pisanja klase oigledno je manje elegantan od prethodnog. Postoji vea vjerojatnost da e doi do greke budui da treba uskladiti deklaraciju metode i definiciju metode. Ovaj nain pisanja klasa doista je manje elegantan od naina koji smo koristili u prethodnim programima i ima ga smisla upotrebljavati samo kad elimo vei program razdijeliti u vie datoteka. Ako klase piemo na ovaj nain, tada moemo u jednu datoteku staviti sve deklaracije klasa, a u druge datoteke definicije metoda. Ako se program nalazi u jednoj datoteci, bolje je definiciju metode napisati unutar deklaracije metode kao to smo to inili u prethodnim programima.
PRO - MIL
277
Objekti
Uporaba konstruktora
#include <cstdlib> #include <iostream> using namespace std; class pravokutnik { private: int a; int b; public: pravokutnik(void) { cout << "Stranica a:" << endl; cin >> a; cout << "Stranica b:" << endl; cin >> b; } int povrsina(void) { return (a * b); } }; U ovom programu nalazi se nekoliko neobinosti. Prva neobinost jest ova metoda. Neobino je to to ima isti naziv kao i klasa. Klasu smo nazvali pravokutnik i ova metoda zove se pravokutnik. Druga neobinost jest to ova metoda nema nikakvu oznaku povratne vrijednosti, nije ni void pravokutnik(), ni int pravokutnik().
int main() { pravokutnik p; cout << "Povrsina je " << p.povrsina() << "." << endl; cout << endl; system("PAUSE"); return 0; }
Neobino je i to to je nigdje ne pozivamo. U ovom redu formiramo objekt p klase pravokutnik, a ve u sljedeem redu pozivamo metodu povrsina.
Iako nigdje u programu nije vidljivo pozivanje metode pravokutnik, njen sadraj se oigledno izvrava. Oigledno je da prije izvoenja metode povrina raunalo unosi stranicu a i stranicu b. Takva metoda naziva se konstruktor, a izvrava se u trenutku formiranja objekta. Dakle, ova metoda izvrila se u trenutku kad smo naredbom pravokutnik.p formirali objekt p klase pravokutnik.
278
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj using namespace std; class pravokutnik { U ovom programu imamo private: dva konstruktora. int a; int b; Jednome je ulazni dio void public: tipa, to znai da se u njega pravokutnik(void) ne moe unositi vrijednost { tako da napiemo: cout << "Stranica a:" << endl; cin >> a; pravokutnik p2(3,4); cout << "Stranica b:" << endl; cin >> b; } Drugome je ulazni dio (int a1, pravokutnik(int a1, int b1) int b1), to znai da se u nje{ ga moe vrijednost unositi a = a1; tako da napiemo: b = b1; } pravokutnik p2(3,4); int povrsina(void) { return (a * b); } Ovdje formiramo objekt klase pravokutnik bez }; vrijednosti u zagradi. U tom sluaju primijenit e se pravokutnik(void) konstruktor. int main() { pravokutnik p1; cout << "Povrsina je " << p1.povrsina() << "." << endl; cout << endl; pravokutnik p2(3,4); cout << "Za p2(3,4) povrsina je " << p2.povrsina() << "." << endl; cout << endl; system("PAUSE"); Objekt p2(3,4); u zagradi ima dva broja, pa e se u return 0; tom sluaju primijeniti pravokutnik(int a1, int b1) kon} struktor. U tom sluaju povrina e se izraunati mnoenjem brojeva 3 i 4, bez unosa tipkovnicom.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
279
Objekti
Nasljeivanje
#include <cstdlib> #include <iostream> using namespace std; class kvadrat Klasa kvadrat napisana je na { uobiajeni nain. protected: int br; public: void unos (void) Klasa kub napisana je na nain koji { do sada nismo koristili. cout << "Unesite broj:" << endl; cin >> br; Naredbom: } int izracun (void) class kub : public kvadrat { return (br * br); formiramo klasu kub koja nasljeuje } varijable i metode klase kvadrat. Dak}; le klasa kub moe koristiti metodu class kub : public kvadrat unos, iako je ona definirana u klasi { unos. public: int izracun(void) { return (br * br * br); Objekt objekt2 klase kub moe koristiti meto} du unos koja se nalazi u klasi kvadrat kao da }; je njezina klasa. To je mogue jer je klasa kub naslijedila klasu kvadrat. int main() { kvadrat objekt1; objekt1.unos(); cout << "Kvadrat je " << objekt1.izracun() << endl; Metodu izracun cout << endl; posjeduju obje kub objekt2; klase. U tom sluobjekt2.unos(); aju klasa kub kocout << "Kub je " << objekt2.izracun() << endl; ristit e svoju inaicout << endl; cu objekta izracun. system("PAUSE"); Inaica u klasi kub return 0; prekrila je inaicu } u klasi kvadrat.
280
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Pogledajmo meusobnu povezanost bitnih dijelova programa u kojem je primijenjena tehnika nasljeivanja klasa.
U klasi kvadrat definirane su dvije metode, metoda unos i metoda izraun. Klasu kvadrat moemo koristiti na nain koji smo koristili u dosadanjim primjerima.
Ovako deklarirana klasa kub nasljeuje sve varijable i metode klase kvadrat. Klasa sadri metodu izracun, iako metodu izraun posjeduje i klasa kvadrat koju nasljeuje. U tom sluaju klasa kub koristit e vlastitu inaicu metode izracun.
Ovdje koristimo metodu unos, iako je klasa kub ne posjeduje. To je mogue jer klasa kub nasljeuje klasu kvadrat, a klasa kvadrat sadri klasu unos.
objekt2.izracun()
Iako metodu izracun posjeduje i klasa kvadrat, objekt2 koristit e vlastitu inaicu metode izraun.
PRO - MIL
281
Veliki programi
282
PRO - MIL
PRO - MIL
Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Veliki programi
Objekti
Sadraj
283
Veliki programi
Unutar deklaracije klase nalazi se konstruktor koji varijabli x daje poetnu vrijednost 290. Ta varijabla odreuje poziciju objekta koji pomiemo pomou tipkovnice.
Ovdje je sadraj metode pomak. U metodu se unosi podatak o tome koja tipka je pritisnuta. Metoda ispituje je li pritisnuta strelica u lijevu ili strelica u desnu stranu. Ako je neka od tih tipki pritisnuta, vrijednost varijable x koja odreuje poloaj objekta koji pomiemo adekvatno e se poveati ili smanjiti.
Ovdje je sadraj metode crtaj. Ona crta objekt koji pomiemo pomou strelica na tipkovnici.
284
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki prokoda grami Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Male programe moemo smjestiti u jednu datoteku. Za vee programe to nije praktino rjeenje. Ako je veliki program u jednoj velikoj datoteci tee je pronai greku, tee je napraviti izmjenu programa i tee je podijeliti posao izmeu vie programera. U ovom poglavlju vidjet emo kako podijeliti jedan neto vei program u vie datoteka. Najprije emo program napisati u jednoj velikoj datoteci, a zatim ga podijeliti u vie manjih datoteka.
class bomba { Deklaracija sadri konstruktor koji odreuje poetprivate: nu poziciju bombe. int x, y; public: bomba() { x = (static_cast <float> (rand()) / RAND_MAX) * 620; y = -((static_cast <float> (rand()) / RAND_MAX) * 480); } void crtanje(); void brisanje(); }; void bomba :: crtanje() Sadraj metode crtanje. { rectangle (x,y,(x+20),(y+5)); } void bomba :: brisanje() Sadraj metode brisanje. { setcolor(WHITE); rectangle (x,y,(x+20),(y+5)); setcolor(BLACK); y = y + 5; if (y > 490) { y = -((static_cast <float> (rand()) / RAND_MAX) * 480); x = (static_cast <float> (rand()) / RAND_MAX) * 620; } }
Ovdje se nalazi deklaracija klase bomba. Sastoji se od varijabli x i y koje odreuju poloaj bombe na zaslonu te metode crtanje koja crta bombu i od metode brisanje koja brie bombu da bi se dobila iluzija kretanje bombe.
PRO - MIL
285
Veliki programi
Ovdje se nalazi glavni dio programa koji e koristiti prije formirane klase.
int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice();
Odreivanja svojstva grafike, veliine grafikog prozora, boje pozadine i boje objekata.
Formiranje generatora sluajnih brojeva kojim emo odreivati mjesto pojavljivanja bombi, odnosno objekata koji se kreu odozgo prema dolje.
srand(time(NULL)); Formiranje triju objekta klase bomba, bomba1, bomba2 i bomba3. To su objekti koji se kreu odozgo prema dolje.
objekt brod;
Formiranje objekata brod klase objekt. To je objekt koji mi pomiemo pomou tipkovnice, koristei strelicu u lijevo i strelicu u desno.
brod.crtaj(); Crtanje objekta koji pomiemo na poetnoj poziciji koritenjem metode crtaj.
Ovdje se u svakom objektu klase bomba poziva metoda brisanje bombe na staroj poziciji.
286
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki prokoda grami Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Ovdje se u svakom objektu klase bomba poziva metoda za crtanje bombe na novoj poziciji. Neprestanim brisanjem bombe na staroj poziciji i crtanjem na novoj stvara se iluzija kretanja, odnosno padanja bombi.
delay(1);
Naredba koja zaustavlja program odreeno vrijeme. Slui za regulaciju brzine igre.
if (kbhit()) {
odgovor = getch();
Ako je pritisnuta neka tipka na tipkovnici, ovdje se kod pritisnute tipke sprema u varijablu odgovor.
brod.pomak(odgovor); }
brod.crtaj();
Izvoenje igre prekida se pritiskom na tipku k. Ovdje se ispituje je li pritisnuta tipka k i, ako je pritisnuta, izvoenje igre se zaustavlja.
return 0; }
Nemojmo zaboraviti da sva etiri dijela programa moraju biti unijeta u nau programsku okolinu da bismo mogli pokrenuti program.
PRO - MIL
287
Veliki programi
Pogledajmo sada kako emo prethodni program raspodijeliti u vie datoteka. Otvorimo novi projekt na uobiajen nain. Prije toga otvorimo praznu mapu u koju emo spremiti novi projekt.
288
PRO - MIL
PRO - MIL
Izaberemo Postavke projekta. C++ programiranje za apsolutne poetnike Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod Sadraj
Objekti
289
Veliki programi
2 - Klik na Novo.
290
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Datoteku preimenujemo u bomba.cpp i kliknemo na OK.
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
291
Veliki programi
292
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki prokoda grami Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Ovaj dio isti je kao u programu koji se nalazi u jednoj datoteci. Ovom naredbom ukljuuje se biblioteka grafikih naredbi. Razlika je u tome to su dodane dvije include naredbe. #include <winbgim.h> #include "bomba.h" Ovom naredbom ukljuuje se datoteka bomba.h u kojoj se nalazi deklaracija klase bomba. void bomba :: crtanje() Ovdje ukljuujmo datoteku u { kojoj se nalazi deklaracija klarectangle (x,y,(x+20),(y+5)); se ije metode ovdje definira} mo. void bomba :: brisanje() { setcolor(WHITE); rectangle (x,y,(x+20),(y+5)); Ovaj dio programa isti je kao i u setcolor(BLACK); prethodnoj inaici. y = y + 5; if (y > 490) { y = -((static_cast <float> (rand()) / RAND_MAX) * 480); x = (static_cast <float> (rand()) / RAND_MAX) * 620; } } Na prvi program Uvod
U datoteku bomba.cpp spremimo metode klase bomba; metodu crtanje i metodu brisanje.
PRO - MIL
293
Veliki programi
Ovo je dio programa koji se u ovoj inaici razlikuje od inaice sa samo jednom datotekom. Ako je naziv datoteke bomba.h, ovaj dio imat e oblik: #ifndef BOMBA_H #define BOMBA_H Kad bi se datoteka zvala npr. datoteka.h, ovaj dio imao bi oblik:
class bomba { #ifndef DATOTEKA_H private: #define DATOTEKA_H int x, y; public: bomba() { x = (static_cast <float> (rand()) / RAND_MAX) * 620; y = -((static_cast <float> (rand()) / RAND_MAX) * 480); } void crtanje(); void brisanje(); Naredbu #endif pisat emo na kraju }; svake datoteke koja poinje naredbom #ifndef. #endif
294
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki prokoda grami Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable #include <winbgim.h> #include "objekt.h" void objekt :: pomak(char tipka) { kretanje = tipka; if (kretanje == 75) { setcolor (WHITE); rectangle(x, 432, x+60, 438); setcolor (BLACK); x = x - 5; } if (kretanje == 77) { setcolor (WHITE); rectangle(x, 432, x+60, 438); setcolor (BLACK); x = x + 5; } } void objekt :: crtaj() { rectangle(x, 432, x+60, 438); } Naredbama #include ukljuimo grafiku biblioteku winbgim.h i datoteku objekt.h u kojoj se nalazi deklaracija klase objekt. Kad bi se deklaracija klase nalazila u drugaije nazvanoj datoteci, npr. datoteci naziv.h, morali bismo napisati: #include "naziv.h" Naziv datoteka moemo birati, a nastavak h je obvezan. Na program naredbom: #include <winbgim.h> ukljuuje samo grafiku biblioteku jer druge biblioteke ne koristimo. Da npr. neto raunamo morali bismo naredbom: #include <cmath> ukljuiti i matematiku biblioteku. Na prvi program Uvod
U datoteku objekt.cpp spremimo metode klase bomba; metodu pomak i metodu crtaj.
PRO - MIL
295
Veliki programi
I ova deklaracija klase zapoinje naredbom #ifndef i naredbom #define iza kojih se nalazi naziv datoteke u kojoj je deklaracija klase. #ifndef OBJEKT_H #define OBJEKT_H class objekt { private: int x; char kretanje; public: objekt() { x = 290; } void pomak(char); void crtaj(); }; #endif Budui da se deklaracija klase objekt nalazi u datoteci objekt.h iza naredbe #ifndef i naredbe #define, pie se OBJEKT_H. Kad bi se deklaracija klase nalazila npr. u datoteci klasa.h, ovaj dio imao bi oblik: #ifndef KLASA_H #define KLASA_H
Naredbu #endif pisat emo na kraju svake datoteke koja poinje naredbom #ifndef.
296
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki prokoda grami Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Glavni program se u ovoj inaici razlikuje od inaice koja se cijela nalazi u jednoj datoteci po tome to u ovoj inaici moramo osim: #include <cstdlib> #include <iostream> #include <winbgim.h> dodati i naredbe: #include "objekt.h" #include "bomba.h" kojima se u program ukljuuju datoteke koje sadre deklaracije klase objekt i klase bomba.
#include <cstdlib> #include <iostream> #include <winbgim.h> #include <ctime> using namespace std; #include "objekt.h" #include "bomba.h" int main() { int gdriver = 9; int gmode = 2; initgraph(&gdriver, &gmode, ""); setbkcolor(WHITE); setcolor(BLACK); cleardevice(); char odgovor = 'd'; srand(time(NULL)); bomba bomba1, bomba2, bomba3; objekt brod; brod.crtaj(); do { bomba1.brisanje(); bomba2.brisanje(); bomba3.brisanje(); bomba1.crtanje(); bomba2.crtanje(); bomba3.crtanje(); delay(2); if (kbhit()) { odgovor = getch(); brod.pomak(odgovor); } brod.crtaj(); } while (odgovor != 'k'); return 0; }
PRO - MIL
297
Veliki programi
Rezultat izvoenja naeg programa izgledat e otprilike ovako. Ovo su bombe koje se kreu odozgo prema dolje. Ovo je brod koji strelicom lijevo moemo pomicati u lijevu stranu i strelicom desno u desnu stranu.
Prilikom prvog prevoenja i pokretanja ovog programa programska okolina e nas upozoriti da je dolo do pretvaranja varijable float tipa u varijablu int tipa. Upozorenje emo zanemariti, budui da to nije greka, ve smo to uinili namjerno prilikom generiranja sluajnog broja. Prilikom sljedeeg prevoenja i pokretanja programa ovo upozorenje se vie nee pojavljivati.
298
PRO - MIL
main.cpp
using namespace std; #include "objekt.h" #include "bomba.h" int main() { GLAVNI PROGRAM; } U ovom shematskom prikazu naeg programa moemo vidjeti logiku po kojoj se program podijeljen u vie datoteka povezuje u jednu cjelinu. Koristei ovu logiku, moemo daleko vei program razdijeliti na vei broj datoteka.
objekt.h
#ifndef OBJEKT_H #define OBJEKT_H class objekt { DEKLARACIJA KLASE; }; #endif }; #endif
bomba.h
#ifndef BOMBA_H #define BOMBA_H class bomba { DEKLARACIJA KLASE;
objekt.cpp
#include "objekt.h" void objekt :: pomak(char tipka) { SADRAJ OBJEKTA; } void objekt :: crtaj() { SADRAJ OBJEKTA; }
bomba.cpp
#include "bomba.h" void bomba :: crtanje() { SADRAJ OBJEKTA; } void bomba :: brisanje() { SADRAJ OBJEKTA; }
PRO - MIL
Objekti
Obrada teksta
Polja
Petlje
Varijable
Na prvi program
Uvod
299
Saimanje koda
300
PRO - MIL
PRO - MIL
Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
Saimanje koda
Objekti
Sadraj
301
Saimanje koda
Obje inaice programa radit e potpuno isti pisao, zbrojit e dva broja.
#include <cstdlib> #include <iostream> #include <cstdlib> #include <iostream> using namespace std; int main() { int a; int b; int c; cin >> a; cin >> b; c = a + b; cout << c << endl; system("PAUSE"); return 0; } U sluaju da formiramo vie varijabli istog tipa, ne moramo svaku staviti u zasebni red, nego ih moemo formirati u jednom redu. Dakle umjesto: int a; int b; int c; moemo napisati: int a, b, c; using namespace std; int main() { int a, b, c; cin >> a; cin >> b; c = a + b; cout << c << endl; system("PAUSE"); return 0; }
302
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> using namespace std; int main() { int a; a = 12; cout << a << endl; system("PAUSE"); return 0; }
Umjesto: int a; a = 12; moemo napisati: int a = 12; #include <cstdlib> #include <iostream> using namespace std; int main() { int a = 12; cout << a << endl; system("PAUSE"); return 0; }
U if naredbi mogu se izbaciti vitiaste zagrade, ako se unutar vitiastih zagrada nalazi jedan red. Ako se nalazi vie redova, uporaba vitiastih zagrada je obvezna.
#include <cstdlib> #include <iostream> using namespace std; int main() { int a; cin >> a; if (a > 12) { cout << "Broj je veci od 12." << endl; } else { cout << "Broj nije veci od 12." << endl; } cout << a << endl; system("PAUSE"); return 0; }
int main() { int a; cin >> a; if (a > 12) cout << "Broj je veci od 12." << endl; else cout << "Broj nije veci od 12." << endl; cout << a << endl; system("PAUSE"); return 0; }
Ova inaica programa radit e jednako kao i gornja inaica s vitiastim zagradama.
PRO - MIL
303
Saimanje koda
#include <cstdlib> #include <iostream> #include <cmath> using namespace std; int main() { float a, b; cin >> a; if (a < 0) { cout << "Broj je negativan." << endl; } else { b = sqrt(a); cout << b << endl; } system("PAUSE"); return 0; }
Ovo je program za vaenje kvadratnog korijena. Ako je broj pozitivan, izraunat e kvadratni korijen, a ako je negativan, ispisat e obavijest da je broj negativan. U ovom dijelu programa vitiaste zagrade moemo izbaciti jer se unutar vitiastih zagrada nalazi samo jedan red. U ovom dijelu programa vitiaste zagrade ne moemo izbaciti jer se unutar vitiastih zagrada nalazi vie od jednog reda.
#include <cstdlib> #include <iostream> #include <cmath> using namespace std; int main() { float a, b; cin >> a; if (a < 0) cout << "Broj je negativan." << endl; else b = sqrt(a); cout << b << endl; system("PAUSE"); return 0; }
Ako bismo ovom djelu vitiaste zagrade izbacili, ne bismo dobili obavijest o greki, ali program ne bi ispravno radio, ako bismo pokuali izraunati kvadratni korijen iz negativnog broja.
304
PRO - MIL
C++ programiranje za apsolutne poetnike Sadraj Saimanje Veliki programi koda Objekti Obrada teksta Polja Petlje Donoenje Grafika odluke Varijable Na prvi program Uvod
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; for (x=10; x<17; x=x+1) { cout << x << endl; } system("PAUSE"); return 0; }
I u petljama se moe izostaviti vitiasta zagrada ako se unutar vitiaste zagrade nalazi samo jedan red.
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; for (x=10; x<17; x=x+1) cout << x << endl; system("PAUSE"); return 0; }
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; for (x=10; x<17; x++) cout << x << endl; system("PAUSE"); return 0; }
x=x+1
moemo
Pokrenemo li bilo koju od ove tri inaice programa, dobit emo jednak rezultat.
Na slian nain moemo umjesto: x = x - 1; napisati: x-- (Dva minusa, bez razmaka.)
PRO - MIL
305
Saimanje koda
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; for (x=5; x<51; x=x+5) cout << x << endl; system("PAUSE"); return 0; }
int main() { int x; for (x=5; x<51; x+=5) cout << x << endl; system("PAUSE"); return 0; }
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; cin >> x; if (x) cout << "Broje nije nula." << endl; else cout << "Broje je nula." << endl; system("PAUSE"); return 0; }
#include <cstdlib> #include <iostream> using namespace std; int main() { int x; cin >> x; if (x != 0) cout << "Broje nije nula." << endl; else cout << "Broje je nula." << endl; system("PAUSE"); return 0; }
Korisnost nekih od navedenih kraenja prilino je dvojbena jer u nekim sluajevima zbog utede jednog znaka naruavamo itljivost programa.
306
PRO - MIL