c++ osnove

78

Click here to load reader

Upload: robert-zbodulja

Post on 22-Oct-2014

230 views

Category:

Documents


26 download

TRANSCRIPT

Page 1: C++ osnove

Podaci i varijable

Program obrađuje podatke smještene u memoriji računala. Računalo za svaki podatak predviđa i rezervira mjesto u memoriji.Mjesto u memoriji rezervirano za pohranu podatka naziva se varijabla. Svako rezervirano mjesto u memoriji ima svoju jedinstvenu memorijsku adresu. Memorijske adrese su višeznamenkasti binarni brojevi.Korisnicima je označavanje varijabli višeznamenkastim binarnim brojevima neprikladno, pa im se zato pridjeljuju simbolička imena. Simboličko ime je ime koje se sastoji od slova, brojaka i znaka podcrtavanja. Svaki put kad program naiđe na simboličko ime, povezuje ga s pripadajućom varijablom.

Simboličko ime

Simboličko ime (identifikator) određuje korisnik poštujući ova pravila: Pri oblikovanju imena smiju se rabiti slova engleske abecede, brojevi i znak podcrtavanja (_). Ime mora započeti slovom ili znakom podcrtavanja (_). Broj znakova u simboličkom imenu (dužina) nije ograničen. Ne smije se rabiti razmak. Ne smiju se rabiti naši dijakritički znakovi (č, ć, ž, š, đ). Ne smiju se rabiti ključne riječi ili oznake operatora programskog jezika.

Program razlikuje velika i mala slova, pa su, primjerice, SLOVA i slova dva različita simbolička imena koja predstavljaju dvije različite varijable.

Ako se oblikuje ime sastavljeno od više riječi, uobičajeno je riječi odvajati znakom podcrtavanja ili ih pisati spojeno tako da je svako prvo slovo u riječi veliko. Npr.: ime_ od_vise_rijeci ili ImeOdViseRijeci.

Primjeri ispravnih simboličkih imena su npr.: Y, promjer_kruga, DatumUpisa, _kon1, Val23m1_X.

Primjeri neispravnih simboličkih imena

Razlog neispravnosti:

1Y Započinje brojem.

x[1] Sadrži znakove zagrada.

Datum Upisa Sadrži razmak.

goto Simboličko ime je ključna riječ.

brojač1 Sadrži naše dijakritičke znakove.

Tipovi podataka

Svakoj se varijabli osim simboličkog imena mora pridijeliti i oznaka tipa podatka koji će u nju biti pohranjen. Po oznaci tipa podatka računalo "zna" koliko mjesta u memoriji treba predvidjeti, koji su rasponi vrijednosti te kakve su operacije s podatkom te vrste moguće. Razlikuju se osnovni i ostali tipovi podataka.U osnovne tipove podataka ubrajaju se:

brojevi (cijeli i realni), znakovi logički podaci (npr. true/false, da/ne, istina/laž, 1/0) konstante.

Cijeli brojevi

Page 2: C++ osnove

Cijeli broj može biti prikazan sa ili bez predznaka.

Cijeli broj s predznakom

Ako je podatak cijeli broj (engl. integer), njegova oznaka tipa je int. Varijabli označenoj s int može se pridružiti samo cijeli broj.Za pohranu cijelog broja u memoriji predviđena su 4 bajta (32 bita). Prvi je bit rezerviran za predznak, pa za pohranu broja ostaje 31 bit. 31 bit omogućava pohranu brojeva iz raspona: [–231, 231–1] tj. od –2.147.483.648 do 2.147.483.647.

Cijeli broj bez predznaka

Kod cijelog broja bez predznaka bit predznaka više nije potreban pa su na raspolaganju 32 bita za prikaz broja.

Najveća vrijednost koju je moguće prikazati s 32 bita je dvostruko veća od one s 31 bitom pa se tako mogu prikazati brojevi iz raspona [0, 232–1] tj. od 0 do 4.294.967.295.

Ako se želi deklarirati cjelobrojna varijabla bez predznaka, potrebno je ispred oznake tipa podatka staviti ključnu riječ unsigned.

Primjeri deklaracije cjelobrojnih varijabli

int x;

int _kon1,d,Val23m1_X;

unsigned int x;

Realni brojevi

Realni brojevi mogu se prikazati: s nepomičnom decimalnom točkom (engl. fixed point), s pomičnom decimalnom točkom (engl. floating point).

Programski jezik C++ za odjeljivanje cjelobrojnog od decimalnog dijela broja rabi decimalnu točku a ne zarez.

Prikaz realnog broja s pomičnom decimalnom točkom

Prikaz realnog broja s pomičnom decimalnom točkom naziva se i eksponencijalni prikaz. Eksponencijalni prikaz broja je oblika:M*10E.

M označava dio broja koji se naziva mantisa, a zapisuje se tako da je prva znamenka različita od nule lijevo od decimalne točke.E je eksponent kojim treba potencirati bazu 10.U programskom jeziku C++ realni brojevi se upisuju u obliku MeE, npr. 9.11e31. Slovo e može biti zapisano kao malo ili veliko slovo. Praznine unutar zapisa broja nisu dopuštene (prazninu prevoditelj prihvaća kao kraj broja).

Page 3: C++ osnove

Broj s nepomičnom decimalnom točkom Broj s pomičnom decimalnom točkom

6.345 6.345e0

1236.345 1.236345E+3

0.000765 7.65e-4

Podaci tipa float

Ako je podatak realni broj, njegova oznaka tipa je float. Varijabli označenoj s float može se pridružiti realni broj.

Primjeri deklaracije realnih varijabli

float x;

float promjer_kruga, _kon1, Val23m1_X;

Primjeri pridruživanja realnih brojeva varijablama tipa float

x=4.78;

y=9.11e-31;

Za pohranu realnog broja u memoriji su predviđena 4 bajta (32 bita).

Omogućena je pohrana brojeva u rasponu: [od –3.4*1038 do –1.4*10-45], [od 1.4*10-45 do 3.4*1038] i 0.

Kada se govori o točnosti u realnu se varijablu sprema 7 znamenki mantise. Ako se unese više od sedam znamenki, prilikom prevođenja će biti zanemarene najmanje vrijedne decimalne znamenke (prema potrebi broj se zaokružuje).

Točnost realne varijable

x=1.23456; sprema se 1.23456 Broj s pomičnom decimalnom točkom.

y=1.23456739; sprema se 1.234567 Uneseno više od 7 znamenki, zanemaruju se.

z=1.23456789; sprema se 1.234568 Uneseno više od 7 znamenki, zaokruženje.

w=12345670.; sprema se 1.234567e+7Broj se ne može prikazati sa 7 znamenaka pa se prikazuje u eksponencijalnom prikazu.

v=0.00123456789; 0.001234568Prikazuje se 7 znamenki računajući od prve različite od 0.

Treba uočiti razliku između broja znamenki koje se spremaju i broja znamenki koje se prikazuju na zaslonu. Broj znamenaka prikaza na zaslonu se po potrebi može podesiti odgovarajućom naredbom. Uobičajeno se realni brojevi prikazuju s najviše 6 znamenaka, računajući od prve različite od 0.

Realne varijable veće točnosti

Ako navedena točnost varijable tipa float ne zadovoljava ili ako se žele rabiti brojevi izvan zadanog raspona vrijednosti float varijable, mogu se upotrijebiti realne varijable veće točnosti.To su varijable tipa:

double (eksponent 308, s točnošću 15 decimalnih znamenki) long double (eksponent 4932, s točnošću 18 decimalnih znamenki).

Konstante

U programima se često rabe veličine čije se vrijednosti tijekom izvođenja programa ne smiju mijenjati. Takve se veličine nazivaju konstantama (npr. fizikalne ili matematičke konstante).

Page 4: C++ osnove

Kada se u kodu rabe brojevne konstante, pohranjuju se u obliku jednog od osnovnih brojevnih tipova podataka. Realne brojevne konstante postaju tipa double, a cjelobrojne tipa int.

Brojevne konstante se mogu spremiti u rezervirana mjesta u memoriji. Takva rezervirana mjesta treba zaštititi od mogućih neželjenih promjena tijekom odvijanja programa. Za zaštitu se koristi ključna riječ const koja se dodaje ispred oznake tipa podatka.

Primjer deklaracije realne konstante

const double pi = 3.14159265359;

Ako se u programu pokuša promijeniti vrijednost konstante, prilikom prevođenja će program prevoditelj (engl. compiler) javiti pogrešku.

Znakovi

Ako je podatak znak, njegova oznaka tipa je char. Varijabli označenoj s char može se pridružiti:

jedan znak unutar jednostrukih navodnika ili

ASCII vrijednost tog znaka (dekadska protuvrijednost).

Primjer pridruživanja vrijednosti varijablama tipa char

char slovo1='A';Pridružen je znak označen jednostrukim navodnicima.

char slovo2=65; Pridružen je dekadski ekvivalent ASCII znaka.U gornjem primjeru u varijable slovo1 i slovo2 će se u oba slučaja spremiti ista vrijednost, znak A i to u obliku broja koji predstavlja ASCII vrijednost znaka A. Programer može birati način pridruživanja koji mu je pogodniji.

Za pohranu znaka u memoriji je predviđen 1 bajt (8 bitova). 1 bajt omogućava pohranu jednog od 28 = 256 različitih znakova.

Logički podaci

Logički podaci su podaci koji mogu poprimiti samo jednu od dvije moguće vrijednosti. To su na primjer true/false, da/ne, istina/laž, 1/0.

Page 5: C++ osnove

Varijabla koja je pogodna za pohranu logičkog podataka je tipa bool. Takav tip varijable može poprimiti vrijednosti true (1) ili false (0).

Pri ispisu se true pretvara u 1, a false u 0.

Znakovni nizovi

Za pohranu teksta (niza od jednog ili više znakova) rabe se znakovni nizovi (engl. character strings). Za sada je dovoljno znati da se sadržaj znakovnog niza koji se unosi izravno u programsku naredbu navodi unutar para dvostrukih navodnika.

Primjer pohrane teksta

"Ovo je znakovni niz"

String

Za lakše baratanje znakovnim nizovima promjenjive duljine u standardnoj je biblioteci jezika C++ definiran tip podataka string. Tip podataka string "brine" o prostoru kojeg za znakovni niz treba predvidjeti u memoriji, te podržava funkcije i operacije vezane uz znakovne nizove.

Kada se radi s varijablama tipa string, znakovni se nizovi mogu jednostavno pridružiti operatorom pridruživanja, dopuniti operatorom +, uspoređivati operatorima uspoređivanja i sl.

Tip podataka string je definiran u biblioteci string koju treba uključiti pretprocesorskom naredbom #include (#include<string>).

Zadatak:

Potrebno je unijeti ime, godinu rođenja i tekuću godinu. Ne temelju tih podataka treba izračunati godine starosti. Ispis neka bude oblika:

Upisi svoje ime:

Upisi godinu svog rodjenja:

Koja je godina sada?

..... ima .... godina.

Rješenje:

#include<iostream>

#include<string>

using namespace std;

int main()

{

            int god, god1, god2;

            string ime;

            cout<<"Upisi svoje ime:";

Page 6: C++ osnove

            cin>>ime;

            cout<<endl<<"Upisi godinu svog rodjenja:";

            cin>>god1;

            cout<<endl<<"Koja je godina sada? ";

            cin>>god2;

            god=god2-god1;

            cout<<endl<<ime<<" ima "<<god<<" godina."<<endl;

            return 0;

}

Rezultat:

Upisi svoje ime:Ivana

Upisi godinu svog rodjenja:1993

Koja je godina sada? 2010

Ivana ima 17 godina.

Tip podatka operanda i rezultata

Programski jezik C++ dozvoljava gotovo sve vrste pretvaranja tipova podataka. Stoga treba biti oprezan kod deklariranja varijabli u koje se pohranjuju operandi i rezultat. Tipovi podatka se automatski pretvaraju prema određenim pravilima:

Ako su oba operanda istog tipa, takvog je tipa i rezultat. Ako su operandi različitih tipova, svode se na zajednički tip (uobičajeno složeniji tip) prije

zadane operacije. Taj se zajednički tip određuje prema normi ISO/IEC1998. Npr. ako je jedan operand int, a drugi float, oba se pretvaraju u složeniji tip, a to je float, a takav je i rezultat.

Primjeri pretvaranja raznih tipova podataka

int a,x;float b;

S obzirom na deklaraciju varijabli a, b, x rezultat izraza a*x/b bit će tipa float.

int a,x; float b; a=43; b=1.1;x=a/b;

Varijabla x poprima vrijednost 39.

int a,b; float x; a=43; b=11;x=a/b;

Varijabla x poprima vrijednost 3.

Deklaracija podataka

Varijable se razlikuju prema njihovim simboličkim imenima i oznaci tipa podatka koji se u njih pohranjuje. Program prevoditelj će pravilno prevesti izvorni kôd samo ako je za svaku varijablu prije uporabe jednoznačno određeno simboličko ime i tip podatka. Zbog toga se na početku programa najavljuju varijable

Page 7: C++ osnove

koje će se rabiti u programu.

Postupak najave, tj. zadavanja simboličkog imena varijabli i određivanje tipa podatka koji će se u tu varijablu pohraniti, naziva se deklariranje. Deklarira se tako da se navede tip podataka, a nakon njega zapiše popis varijabli odabranog tipa odvojenih zarezom i na kraju točka-zarez (;).

Primjeri deklaracije varijabli

int x;Značenje oznaka vrste int i float objašnjeno je u nastavku.

float b;

int c,d,e;Više istovrsnih varijabli se može deklarirati u slijedu tako da ih se odvoji zarezom.

Operator pridruživanja

Varijabli se pridružuje vrijednost s pomoću operatora pridruživanja. Operator pridruživanja je znak =.Ovdje se treba naviknuti na novo značenje znaka =, koji više ne označava izjednačavanje (jednakost) kao u matematici. Operatorom pridruživanja se objektu s lijeve strane operatora pridružuje vrijednost s njegove desne strane, pa stoga objekt s lijeve strane operatora pridruživanja uvijek mora biti varijabla.

Primjeri pridruživanja vrijednosti

x=5;Izraz se može čitati: "varijabli x se pridružuje broj 5" ili "u memorijsku lokaciju koja je predočena simboličkim imenom x spremi broj 5".

x=x+3;Izraz se može čitati: "sadržaju varijable x dodaj broj 3 i zatim taj zbroj spremi u varijablu x".

int x=5; Pridruživati se može i u istome redu u kome se varijabla deklarira.

x=c=b=5;Izraz se može čitati: "varijabli b se pridružuje broj 5, varijabli c sadržaj varijable b, varijabli x sadržaj varijable c". Konačni rezultat: sadržaj sve tri varijable je isti i jednak je broju 5.

Funkcije

U većini programa postoje cjeline koje se ponavljaju više puta. Kako bi se izbjeglo opetovano pisanje istih ili vrlo sličnih dijelova programa, može ih se izdvojiti, imenovati i spremiti na za to predviđenu lokaciju. Izdvojeni nizovi naredbi koji čine logičke cjeline, a obavljaju točno utvrđene zadatke nazivaju se funkcije. Moguće je:

stvoriti vlastite funkcije pa ih potom rabiti u svom programu

Page 8: C++ osnove

koristiti već postojeće i za uporabu pripremljene funkcije pohranjene u biblioteke.

 Biblioteke se isporučuju uz program C++ pa ih svaki programer može uključiti u svoj program i zatim rabiti njihove funkcije.

Deklaracija funkcije

Poput varijable i funkciju treba deklarirati tj. najaviti i jednoznačno odrediti. Pri deklaraciji funkcije osim njenog naziva navodi se tip funkcije, tj. tip podatka koji funkcija vraća pozivatelju kao rezultat svog rada (izlazni podaci) te broj i tip podataka koji se predaju funkciji prilikom njezina poziva (argumenti, ulazni podaci).Naziv funkcije se zadaje poštujući pravila tvorbe simboličkih imena (identifikatora).

Opći oblik deklaracije funkcije

tip funkcije naziv_funkcije (popis argumenata)

Primjer deklaracije funkcije

float volumen_kvadra (float a, float b, float c)naziv: volumen_kvadratip funkcije: realni brojargumenti: tri realna broja

Definicija funkcije

Svaka se funkcija sastoji od skupa naredbi koje određuju što i kako funkcija radi. Taj se skup naredbi naziva tijelo funkcije. Tijelo funkcije započinje nakon otvorene vitičaste zagrade ({), a završava zatvorenom vitičastom zagradom (}).Zbog preglednosti uobičajeno je tijelo funkcije pisati uvučeno u odnosu na ostali izvorni kôd.Tijelo funkcije se sastoji od naredbi. Svaka naredba završava znakom točka-zarez (;). Više naredbi se može zapisati u jednome retku, ali svaka od njih mora završiti znakom točka-zarez (;). Naredba se može protezati i kroz nekoliko redaka; važno je samo da na kraju bude znak točka-zarez (;).Funkcija završava ključnom riječi return. Iza ključne riječi return se zapisuje podatak kojeg funkcija vraća pozivatelju kao rezultat svog rada (u primjeru koji slijedi funkcija vraća sadržaj varijable v).Funkciju volumen_kvadra

float volumen_kvadra (float a,float b,float c){  float v;  v=a*b*c;  return v;}

Poziv funkcije

Funkcija se izvršava tako da ju se „pozove“ u glavnom programu. Funkcija se poziva navođenjem njenog naziva i argumenata zapisanih u redosljedu koji je zadan deklaracijom.

Poziv funkcije volumen_kvadra

vol=volumen_kvadra(x,y,z);

Funkcija main

Page 9: C++ osnove

Programi se mogu sastojati od mnogo funkcija. Kako bi se “znalo” na kojem mjestu započinje glavni program, tj. koja se funkcija treba izvršiti prva, uvodi se funkcija main. Funkcija main se naziva “ulazna točka”.Svaki C++ program mora imati funkciju main. Ako je nema, program prevoditelj javlja pogrešku. Postoji više oblika funkcije main.

Jedan od oblika funkcije main

int main (){

return 0;}

U ovom primjeru u deklaraciji funkcije main je definirano da će tip podatka koji funkcija vraća pozivatelju (rezultat funkcije) biti cijeli broj, a argumenata nema. Posljednja naredba u tijelu funkcije main je return 0. Pozivatelju će biti vraćena 0 kao poruka da su sve naredbe funkcije main izvršene ispravno.

Pretprocesorske naredbe

Prije glavne, main funkcije, navode se pretprocesorske naredbe. To su naredbe koje se izvršavaju prije početka prevođenja izvornog kôda. Ovisno o pretprocesorskim naredbama, pretprocesor mijenja i dopunjuje izvorni kôd.

Opći oblik pretprocesorske naredbe

#naredba parametri

Pretprocesorske naredbe započinju znakom #. Za razliku od ostalih naredbi, ne završavaju znakom točka-zarez (;).Postoji više pretprocesorskih naredbi, a jedna od najčešćih je naredba include.

 

include

Naredbom include se u izvorni kod programa uključuje sadržaj biblioteke čiji je naziv naveden unutar znakova (<) i (>). Posljedica je ista kao da je umjesto naredbe include u program prepisan cjelokupni sadržaj odabrane biblioteke.

Opći oblik  naredbe include

#include <naziv_biblioteke>

Kada programer naredbom include uključi željenu biblioteku, na raspolaganju su mu sve funkcije te biblioteke. Postoje razne biblioteke u koje su smještene funkcije razvrstane po sličnosti. U programu se može uporabiti proizvoljan broj naredbi include (on ovisi o broju biblioteka čiji se sadržaj želi uključiti u izvorni kod).

Ulazni i izlazni tokovi

Da bi program bio koristan, mora komunicirati s ulazno/izlaznim uređajima (tipkovnicom, monitorom, diskom i sl.). Komunikacija s ulazno/izlaznim uređajima se u programu C++ ostvaruje ulazno-izlaznim tokovima (engl. input and output streams).

Page 10: C++ osnove

Svaki program prima podatke posredstvom ulazno-izlaznih tokova i rezultat predaje okolini posredstvom ulazno-izlaznih tokova. S gledišta programa sasvim je svejedno o kojem je ulaznom ili izlaznom uređaju riječ pa se svi podaci u program unose i iz programa predaju okolini na isti način.Ulazno-izlaznim tokovima se rukuje funkcijama biblioteka iostream.

Biblioteka iostream

iostream je biblioteka koja sadrži niz ulazno-izlaznih funkcija koje omogućavaju rukovanje ulazno-izlaznim tokovima. Dvije funkcije koje su najčešće u uporabi su cout i cin.

cout

Funkcija cout usmjerava podatke s izlaznog toka na zaslon monitora. Ispis podataka se ostvaruje operatorom ispisa (<<).

Primjena funkcije cout

cout<<13; Ispisat će broj 13.

cout<<"Moguc je i ispis niza znakova";S desne strane operatora ispisa može biti bilo koji tip podataka. U primjeru će se ispisati tekst naveden unutar navodnika.

cout<<34<<a<<"Moguc je i ispis niza znakova";

Moguće je ulančavanje operatora ispisa koje se izvodi slijeva nadesno. Ispisat će se redom jedno iza drugog: 34, vrijednost varijable a i tekst naveden unutar navodnih znakova.

endl

U prethodnom bi se primjeru svi podaci ispisali u istome redu. Ako korisnik želi pregledniji ispis, tj. nakon završenog ispisa jednog podatka pokazivač prebaciti na početak sljedećeg reda treba rabiti konstantu endl (također pohranjenu u biblioteci iostream).

Uporaba konstante endl

cout<<34<<endl;cout<<a<<endl;cout<<"Moguc je i ispis niza znakova"<<endl;

cout<<34<<endl<<a<<endl<<"Moguc je i ispis niza znakova";

U oba primjera će rezutlat (ispis) biti isti.

cin

Funkcija cin usmjerava podatke s tipkovnice na ulazni tok. Podaci se u ulazni tok umeću operatorom unosa (>>).

Primjena funkcije cin

Page 11: C++ osnove

cin>>x;Program očekuje unos podatka s tipkovnice koji će biti pohranjen u varijablu x.

cin>>a>>b;Moguće je ulančavanje operatora unosa koje se izvodi slijeva na desno.

Posljedica funkcije unosa cin je prekid izvršenja programa sve dok se ne unese podatak i pritisne tipka Enter (program "čeka" da korisnik upiše podatak). Više ulaznih podataka može se upisati u istome retku, odvojeni prazninama (tek na kraju treba pritisnuti tipku Enter)

namespace

Ako korisnik istodobno u svom programu rabi više biblioteka može se dogoditi da su u njima pohranjene funkcije istog imena koje rade različite stvari.Da bi se izbjegla zabuna koja nastaje pozivom takvih funkcija, mogu se sve funkcije pojedine biblioteke označiti dodatnim imenom naredbom namespace. Zadatak takvog označavanja je jednoznačno određivanje funkcija tj. mogućnost razlikovanja funkcija istog imena koje se nalaze u različitim bibliotekama.

Opći oblik naredbe namespace

namespace dodatno_ime

 Pri pozivanju funkcije označene dodatnim imenom uz željeno ime funkcije treba navesti i dodatno ime kojim je ta funkcija označena. Postoje dva načina kako to učiniti. Može se koristiti operator dodjele područja (dvije dvotočke, ::) ili naredba using.

Opći oblik naredbe using

using namespace dodatno_ime

Poziv funkcija označenih dodatnim imenom

Korištenjem operatora dodjele područja se pri pozivu svake od funkcija uz njeno ime treba navesti i dodatno ime. Korištenjem naredbe using namespace dodatno_ime se funkcije označene dodatnim imenom pozivaju bez dodatnog imena.

Pozivanje funkcija označenih dodatnim imenom

biblioteka1 biblioteka2 korisnički program

namespace prvafunkcija alfafunkcija betafunkcija eta

namespace drugafunkcija gamafunkcija deltafunkcija alfa

#include <biblioteka1>#include <biblioteka2>using namespace prva;......naredbaalfanaredbabetadruga::deltanaredba......

U ovom primjeru se i u biblioteci biblioteka1 i u biblioteci biblioteka2 nalazi funkcija naziva alfa. Te dvije biblioteke potječu od različitih izvora pa funkcije alfa imaju potpuno različito djelovanje. Programer u svom programu želi rabiti funkcije iz obje biblioteke što je naveo naredbama #include. Kad programer u svom programu želi pozvati funkciju alfa mora nekako reći koju od dvije funkcije alfa želi. To može učiniti na dva načina:

Page 12: C++ osnove

Prvi je da na početku programa navede naredbu using namespace dodatno_ime funkcija odgovarajuće biblioteke. U primjeru će se zbog naredbe using namespace prva uvijek pri pozivu funkcije alfa rabiti funkcija označena dodatnim imenom prva.

Druga je mogućnost da se pri pozivu funkcije u programu navede dodatno ime ispred imena funkcije (međusobno odvojeni dvostrukom dvotočkom). U ovom primjeru pozivom druga::delta rabit će se funkcija delta iz biblioteke biblioteka2.

std

U programu C++ postoji skupina funkcija koje su potrebne mnogim korisnicima i redovito se isporučuju uz program. Skup svih takvih standardnih funkcija naziva se zajedničkim imenom standardna biblioteka (engl. standard library). Funkcije standardne biblioteke nisu smještene u jednoj biblioteci već se nalaze u raznim bibliotekama ali su sve, dogovorno, označene dodatnim imenom std.

Pozivanje funkcija standardne biblioteke

std::ime_funkcijePri pozivu svake od funkcija uz njeno ime treba navesti i dodatno ime std.

using namespace std;

Kada se upotrijebi ova naredba, a potom pozove funkcija bez oznake dodatnog imena podrazumijeva se da je riječ o funkciji označenoj dodatnim imenom std.

STANDARD LIBRARY

Operatori

Operatori su simboli koji predstavljaju (zamjenjuju) određene funkcije. U C++ je definirano nekoliko skupina operatora. Npr.:

aritmetički operatori (binarni i unarni), logički operatori, operatori uspoređivanja (relacijski operatori),

Page 13: C++ osnove

ostali operatori.

Aritmetički binarni operatori

Binarni aritmetički operatori

Funkcija Operator

Zbrajanje +

Oduzimanje -

Množenje *

Dijeljenje /

Modularno dijeljenje(rezultat je cjelobrojni ostatak dijeljenja dvaju cjelih brojeva)

%

Zadatak:

Treba izračunati zbroj, razliku, umnožak i kvocijent dvaju realnih brojeva. Ispis

neka bude oblika:

Unesi prvi broj:

unesi drugi broj:

.... + .... = ....

.... - .... = ....

.... * .... = ....

.... / .... = ....

 Rješenje:

#include <iostream>

using namespace std;

int main()

{

     float a,b;

     cout<<"Unesi prvi broj:"<<endl;

     cin>>a;

     cout<<"unesi drugi broj:"<<endl;

     cin>>b;

     cout<<a<<"+"<<b<<"="<<a+b<<endl;

     cout<<a<<"-"<<b<<"="<<a-b<<endl;

     cout<<a<<"*"<<b<<"="<<a*b<<endl;

     cout<<a<<"/"<<b<<"="<<a/b<<endl;

Page 14: C++ osnove

return 0;

}

 Provjera za unos brojeva 5.5 i 1.2:

Unesi prvi broj:

5.5

unesi drugi broj:

1.2

5.5+1.2=6.7

5.5-1.2=4.3

5.5*1.2=6.6

5.5/1.2=4.58333

Zadatak:

Potrebno je izračunati cjelobrojni kvocijent i cjelobrojni ostatak dijeljenja dvaju

cijelih brojeva.

Ispis neka bude oblika:

Upisi djeljenik:

Upisi djelitelj:

.... : .... = .... cijelih, a ostatak je ....

Rješenje:

#include<iostream>

using namespace std;

int main()

{

     int a,b,ostatak,kvoc;

     cout<<"Upisi djeljenik:";

     cin>>a;

     cout<<"Upisi djelitelj:";

     cin>>b;

     kvoc=a/b;

     ostatak=a%b;

     cout<<a<<":"<<b<<"="<<kvoc <<"  cijelih, a ostatak je "<<ostatak;

return 0;

}

Provjera za unos brojeva 66 i 12:

Page 15: C++ osnove

Upisi djeljenik:66

Upisi djelitelj:12

66:12=5 cijelih, a ostatak je 6

Napomena: prilikom rješavanja ovog zadatka valja imati na umu da operator modulo djeluje samo na cijele brojeve.

Aritmetički unarni operatori

Unarni aritmetički operatori

Operator Funkcija

- Mijenja predznak broja.

++ Uvećava broj za 1 (inkrementiranje).

-- Umanjuje broj za 1 (dekrementiranje).Pri uporabi unarnih operatora za uvećanje i umanjenje važno je obratiti pozornost na položaj operatora. Djelovanje operatora ovisi o tome nalazi li se operator prije (prefiksni) ili poslije (postfiksni) varijable. Prefiksni operator najprije djeluje na varijablu sa svoje desne strane i zatim vraća tako promijenjenu vrijednost, a postfiksni najprije vraća postojeću vrijednost, a tek zatim djeluje na varijablu sa svoje lijeve strane.

Unarni operatori Sadržaj varijabli po izvršenju naredbi

a=1;b=++a +5;

a=2b=7

a=1;b=a++ +5;

a=2b=6

Zadatak:

Potrebno je unijeti cijeli broj i pohraniti ga u varijablu A. Potom u varijablu X pohraniti vrijednost koja se dobije kada se na

varijablu A primijeni postfiksni unarni operator A++ (uvećanje nakon dobave iz memorije).

Ispisati sadržaj varijabli X i A.

Unesi broj za operaciju A++:

Kad operacija zavrsi X= ...

Kad operacija zavrsi A= ...

Potom treba promijeniti naredbeni redak u kome se računa vrijednost varijable X, tako da se na varijablu A primijeni

unarni operator ++A (uvećanje prije dobave iz memorije).

Ispisati sadržaj varijabli X i A.

Page 16: C++ osnove

Unesi broj za operaciju ++A:

Kad operacija zavrsi X= ...

Kad operacija zavrsi A= ...

Usporediti rezultate te tako pokazati djelovanje unarnih operatora A++ i ++A.

Rješenje za A++:

#include<iostream>

using namespace std;

int main()

{

     int X,A;

     cout<<"Unesi broj za operaciju A++: ";

     cin>>A;

     X=A++;

     cout<<"Kad operacija zavrsi X= "<<X<<endl;

     cout<<"Kad operacija zavrsi A= "<<A<<endl;

return 0;

}

Provjera za unos broja 5 (A++):

Unesi broj za operaciju A++:5

Kad operacija zavrsi X=5

Kad operacija zavrsi A=6

Postfiksni operator najprije vraća postojeću vrijednost varijable A koja se potom pridružuje varijabli X. Potom operator djeluje na vrijednost varijable A i uvećava je za 1.

Rješenje za ++A:

#include<iostream>

using namespace std;

Page 17: C++ osnove

int main()

{

     int X,A;

     cout<<"Unesi broj za operaciju ++A: ";

     cin>>A;

     X=++A;

     cout<<"Kad operacija zavrsi X= "<<X<<endl;

     cout<<"Kad operacija zavrsi A= "<<A<<endl;

return 0;

}

Provjera za unos broja 5 (++A):

Unesi broj za operaciju ++A:5

Kad operacija zavrsi X=6

Kad operacija zavrsi A=6

Prefiksni operator najprije djeluje na vrijednost varijable A i uvećava je za 1. Potom tako promijenjenu vrijednost pridružuje varijabli X.

Unarni operatori za uvećanje i umanjenje ne mogu se primijeniti na konstante niti na aritmetičke izraze.

Neispravna primjena operatora ++

(A+B)++

5.18++

Operatori obnavljajućeg pridruživanja

Operatori obnavljajućeg pridruživanja omogućavaju kraći zapis nekih aritmetičkih izraza. Sastoje se od odgovarajućeg aritmetičkog operatora i znaka jednakosti.

Aritmetički izrazi s operatorima obnavljajućeg pridruživanja Uobičajeni prikaz aritmetičkih izraza

a+=5 a=a+5

a/=5-b a=a/(5-b)

a-=b+5 a=a-(b+5)

a*=(b-c)+5 a=a*((b-c)+5))

Logički operatori

Za rad s logičkim podacima, postoje logičke funkcije. Logičke se funkcije zapisuju logičkim operatorima.

Logički operatori mogu biti unarni i binarni.

Page 18: C++ osnove

Logički operatori

Oznaka operatora Funkcija Operator

! Negacija (unarni operator koji 1 pretvara u 0 i obratno) NOT

&& Logički I (binarni operator) AND

|| Logički ILI (binarni operator) OR

Operator ILI zapisuje se simbolima || (kombinacija tipki Alt Gr+W).

Tablica stanja operatora                I

Tablica stanja operatora               ILI

Tablica stanja operatora                NE

A B A && B

0 0 0

0 1 0

1 0 0

1 1 1

A B A || B

0 0 0

0 1 1

1 0 1

1 1 1

A ! A

0 1

1 0

Zadatak:

Potrebno je unijeti dva podatka tipa bool pa ih pohraniti u varijable A i

B. Ispisuje se negacija od A, vrijednost (A I B) te (A ILI B).

Ispis neka bude oblika:

Vrijednost logickog podatka A=

Vrijednost logickog podatka B=

Ako je logicki podatak A= ...  tada je suprotno od A ....

Za A= .... i B= ....  (A I B) = ....

Za A= .... i B= .... (A ILI B)= ....

 Rješenje:

#include<iostream>

using namespace std;

int main()

{

     bool a,b,c,d,e;

     cout<<"Vrijednost logickog podatka A=";

     cin>>a;

     cout<<"Vrijednost logickog podatka B=";

     cin>>b;

     c=!a;

     d=a&&b;

Page 19: C++ osnove

     e=a||b;

     cout<<endl<<"Ako je logicki podatak A="<<a<<" tada je suprotno od A="<<c<<endl;

     cout<<"Za A="<<a<<" i B="<<b<<" (A I B)=" <<d<<endl;

     cout<<"Za A="<<a<<" i B="<<b<<" (A ILI B)=" <<e<<endl;

return 0;

}

 Provjera za unos vrijednosti 0 i 1:

Vrijednost logickog podatka A=0

Vrijednost logickog podatka B=1

Ako je logicki podatak A=0 tada je suprotno od A=1

Za A=0 i B=1 (A I B)=0

Za A=0 i B=1 (A ILI B)=1

Operatori usporedbe

Dva se podatka mogu uspoređivati, a rezultat usporedbe je podatak tipa bool. Ako je napisani izraz istinit, rezultat usporedbe će biti 1 (true), a ako nije, rezultat će biti 0 (false). Uspoređuje se uporabom operatora usporedbe.

Operatori usporedbe se najčešće rabe u naredbama grananja.

Operatori usporedbe

Operator Funkcija

< manje

<= manje ili jednako

> veće

>= veće ili jednako

= = jednako

!= različito

Uporaba operatora usporedbe

Izraz Vrijednost

5<13 1 (DA)

8<=8 1 (DA)

5==8 0 (NE)

5!=2+3 0 (NE)

Page 20: C++ osnove

Zadatak:

Potrebno je unijeti dva cijela broja. Nakon toga se ti brojevi

uspoređuju operatorima usporedbe pa se ispisuje rezultat usporedbe.

Ispis neka bude oblika:

Vrijednost prvog broja=

Vrijednost drugog broja=

Je li .... < .... odgovor: ....

Je li .... > .... odgovor: ....

Je li .... == .... odgovor: ....

Je li .... != .... odgovor: ....

 Rješenje:

#include<iostream>

using namespace std;

int main()

{

int a,b;

bool c,d,e,f;

cout<<"Vrijednost prvog broja=";

cin>>a;

cout<<"Vrijednost drugog broja=";

cin>>b;

c=a<b;

d=a>b;

e=a==b;

f=a!=b;

cout<<endl<<"Je li "<<a<<"<"<<b<<" odgovor: " <<c<<endl;

cout<<endl<<"Je li "<<a<<">"<<b<<" odgovor: " <<d<<endl;

cout<<endl<<"Je li "<<a<<"=="<<b<<" odgovor: " <<e<<endl;

cout<<endl<<"Je li "<<a<<"!="<<b<<" odgovor: " <<f<<endl;

return 0;

}

 Provjera za unos vrijednosti 234 i 123:

Vrijednost prvog broja=234

Vrijednost drugog broja=123

Page 21: C++ osnove

Je li 234<123 odgovor: 0

Je li 234>123 odgovor: 1

Je li 234==123 odgovor: 0

Je li 234!=123 odgovor: 1

Komentari

U datoteci izvornog kôda korisno je opisati što se kojim od dijelova kôda želi postići, što su argumenti, objasniti deklaraciju varijabli i sl.

Takvi se pomoćni opisi nazivaju komentari. Komentari mogu kasnije pomoći programeru ili nekom drugom tko mora mijenjati dijelove izvornog kôda da razumije što je zadaća pojedinog dijela programa.

Komentar je tekst koji započinje s dvostrukom kosom crtom //, a završava krajem reda. Može biti napisan u istom redu s naredbom ili u zasebnom redu.

Primjeri uporabe komentara

int god, god1, god2; //deklaracija cjelobrojnih varijabli

//unos godine rodjenja i tekuce godinecin>>god1;cin>>god2;

god=god2-god1; //racuna se starost

Pri prevođenju izvornog kôda komentar se ne prevodi. Stoga se komentar osim za opis dijelova izvornog kôda katkad rabi i za privremeno isključivanje dijelova izvornog kôda.

Isključivanje dijela izvornog koda komentarom

cin>>god1;cin>>god2;//god=god2-god1;

Naredba god=god2-god1; neće se prevesti ni izvršiti jer se smatra komentarom.

Matematičke funkcije

Korisnik ima na raspolaganju mnogo pripremljenih, gotovih funkcija razvrstanih u odgovarajuće biblioteke. Većina matematičkih funkcija pohranjena je u biblioteci cmath. Ako se želi rabiti neka od funkcija te biblioteke, biblioteku u program treba uključiti pretprocesorskom naredbom #include.

Matematičke funkcije

Deklaracija funkcijeOpis

float abs(float x) Kao rezultat vraća apsolutnu vrijednost broja x.

float ceil(float x) Zaokružuje argument x na najbliži veći cijeli broj.

float floor(float x) Zaokružuje argument x na najbliži manji cijeli broj.

float fmod(float djeljenik, float djelitelj) Računa ostatak dijeljenja dva realna broja.

Page 22: C++ osnove

float pow(float baza, float eksponent) Računa potenciju: baza na eksponent.

float sqrt(float x) Računa kvadratni korijen argumenta x.

float sin(float x) Računa sinus argumenta x (x je kut zadan u radijanima).

float atan(float x) Računa arkus tangens argumenta x (vraća kut izražen u radijanima).

Zadatak:

Treba unijeti koordinate točaka A i B, pa izračunati njihovu udaljenost u koordinatnom sustavu. Ispis neka bude oblika:

Koordinate tocke A :

x1=...

y1= ...

Koordinate tocke B :

x2=...

y2=...

Udaljenost tocaka A(...,...) i B(...,...) je ...

Udaljenost točaka A(x1,y1) i B(x2,Y2) u koordinatnom sustavu računa se formulom:

Pri računanju će se rabiti matematička funkcija za računanje potencije odabrane baze na željeni eksponent i

matematička funkcija za računanje kvadratnog korijena.

Rješenje:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

      float x1,y1,x2,y2,pom,d;

      cout<<"Koordinate tocke A:"<<endl;

      cout<<"x1= ";

      cin>>x1;

      cout<<"y1= ";

Page 23: C++ osnove

      cin>>y1;

      cout<<"Koordinate tocke B:"<<endl;

      cout<<"x2= ";

      cin>>x2;

      cout<<"y2= ";

      cin>>y2;

      pom=pow((x2-x1),2)+pow((y2-y1),2);

      d=sqrt(pom);

      cout<<"Udaljenost tocaka A("<<x1<<","<<y1<<") i B("<<x2<<","<<y2<<") je "<<d;

      return 0;

}

Provjera za unos vrijednosti 0,0 i 5,5:

Koordinate tocke A :

x1= 0

y1= 0

Koordinate tocke B :

x2= 5

y2= 5

Udaljenost tocaka A(0,0) i B(5,5) je 7.07107.

Grananje

Za rješavanje većine zadataka potrebne su složenije programske strukture kod kojih redoslijed izvršavanja naredbi ovisi o vrijednostima podataka koji se obrađuju.

Grananje je programska struktura koja omogućuje različit tijek programa, ovisno o rezultatu postavljenog uvjeta. To je važna struktura bez koje bi mogućnost rješavanja zadataka računalom bila vrlo ograničena.

Blokovi naredbi

Dijelovi programa koji se uvjetno izvode, grupiraju se u skupine ili blokove naredbi. Svaki se blok naredbi omeđuje parom otvorena-zatvorena vitičasta zagrada ({}). Ako blok naredbi ima samo jednu naredbu zagrade se mogu izostaviti. Blokovi naredbi se obično pišu uvučeno zbog preglednosti.

Primjer bloka naredbi

{     int x;     cout<<endl<<"Upisi cijeli broj u bloku:";     cin>>x;}

Naredbe grananja

Page 24: C++ osnove

Naredbe grananja su:

if, if-else, if-else if-else, switch-case.

Jednostruko uvjetno grananje

Naredba if omogućava jednostruko uvjetno grananje programa. Uvjet je logički izraz, a upisuje se unutar para okruglih zagrada. Na kraju naredbe if ne stavlja se znak točka zarez (;).

Ako je vrijednost uvjeta logička istina (true, 1), izvodi se blok naredbi koji se nalazi iza naredbe if. Ako je vrijednost uvjeta logička neistina (false, 0), blok naredbi iza naredbe if se preskače i

izvođenje se nastavlja od prve naredbe iza bloka.

Zadatak:

Treba unijeti cijeli broj različit od 0 pa provjeriti da li je negativan ili pozitivan. U oba slučaja ispisati apsolutnu vrijednost broja. Ispis neka bude oblika:

Upisi cijeli broj razlicit od 0:

Broj ... je negativan. Apsolutna vrijednost mu je ....

ili

Broj ... je pozitivan. Apsolutna vrijednost mu je ....

Page 25: C++ osnove

 Rješenje:

#include<iostream>

using namespace std;

int main()

{

     int a;

     cout<<"Upisi cijali broj razlicit od 0:";

     cin>>a;

     if(a<0)

     {

         cout<<"Broj "<<a<<" je negativan. Apsolutna vrijednost mu je "<<-a<<endl;

     }

     if(a>0)

     {

         cout<<"Broj "<<a<<" je pozitivan. Apsolutna vrijednost mu je "<<a<<endl;

      }

      return 0;

}

 Provjera za unos vrijednosti -45:

Upisi cijeli broj razlicit od 0: -45

Broj -45 je negativan. Apsolutna vrijednost mu je 45.

Dvostruko uvjetno grananje

Dvostruko uvjetno grananje omogućava da se ovisno o ispunjenju postavljenog uvjeta izvodi jedan od dva neovisna bloka naredbi.

Page 26: C++ osnove

Ako je vrijednost uvjeta logička istina (true, 1), izvodi se prvi blok naredbi. Nakon njegova završetka izvođenje se nastavlja od prve naredbe iza drugog bloka.

Ako je vrijednost uvjeta logička neistina (false, 0), preskače se prvi blok i izvodi se drugi blok (iza naredbe else). Nakon njegova završetka izvođenje se nastavlja od prve naredbe iza drugog bloka.

Zadatak:

Treba unijeti realni broj pa provjeriti da li je taj broj veći od ili jednak 0 (>=0). Ako jest, računa se kvadratni korijen tog broja, a ako nije ispisuje se odgovarajuća poruka.Ispis neka bude oblika:

Upisi realni broj:Kvadratni korijen od ... je ....iliGreska. Broj je manji od 0.

U zadatku je pokazana primjena matematičke funkcije za računanje kvadratnog korijena.

Rješenje:

#include<iostream>

#include<cmath>

using namespace std;

int main()

{

     float broj,rez;

     cout<<"Upisi broj:";

     cin>>broj;

     if (broj>=0)

Page 27: C++ osnove

     {

          rez=sqrt(broj);

          cout<<"Kvadratni korijen od "<<broj<<" je "<<rez<<endl;

      }

      else

      {

          cout<<"Greska. Broj je manji od 0"<<endl;

      }

      return 0;

}

 Provjera za unos vrijednosti 81.5:

Upisi broj: 81.5

Kvadratni korijen od 81.5 je 9.02773.

Uvjetni operator

Jednostavni oblici naredbe if-else mogu se zamijeniti uvjetnim operatorom koji se zapisuje znakom upitnik (?).

Opći oblik naredbe if-else zapisan  uvjetnim operatorom

(uvjet) ? (naredba 1) : (naredba

2)

Ovakav način zapisa rabi se kod postavljanja jednostavnih uvjeta, kada naredba stane u jedan redak.

Grananje zapisano naredbom if-else Grananje zapisano uvjetnim operatorom ?

if (a<0)

      cout<<-a;

else

      cout<<a; (a<0)?(cout<<-a):(cout<<a);

Višestruko uvjetno grananje

Višestruko uvjetno grananje omogućava ispitivanje više uvjeta. Ovisno o ispunjenju postavljenih uvjeta izvodi se odgovarajući blok naredbi.

Page 28: C++ osnove

Ako je vrijednost prvog uvjeta logička istina (true, 1), izvodi se prvi blok naredbi. Nakon njegova završetka izvođenje se nastavlja od prve naredbe iza zadnjeg bloka naredbi. Ako je vrijednost prvog uvjeta logička neistina (false, 0), provjerava se drugi uvjet.

Ako je vrijednost drugog uvjeta logička istina (true, 1), izvodi se drugi blok naredbi. Nakon njegova završetka izvođenje se nastavlja od prve naredbe iza zadnjeg bloka naredbi. Ako je vrijednost drugog uvjeta logička neistina (false, 0), provjerava se treći uvjet.

Provjere se tako redom nastavljaju sve do naredbe else. Ako do tada niti jedan od uvjeta nije imao vrijednost logičke istine (true, 1), izvršit će se zadnji blok naredbi koji se nalazi iza naredbe else.

Page 29: C++ osnove

Zadatak:

Treba unijeti koeficijente linearne jednadžbe, pa ovisno o njihovim vrijednostima izračunati i ispisati iznos varijable x. U slučaju da je vrijednost jednog od koeficijenata 0, ispisati odgovarajuća upozorenja.

Ispis neka bude oblika:

Upisi koeficijent a:

Upisi koeficijent b:

Ako je a=0, jednadzba 0*x+...=0 nema rjesenje.

ili

Ako je b=0 rjesenje jednadzbe ..*x+0=0 :

x=0.

ili

Rjesenje jednadzbe ...*x+. .=0 :

x=...Rješenje:

#include<iostream>

Page 30: C++ osnove

using namespace std;

int main()

{

     float a,b,x;

     cout<<"Upisi koeficijent a:";

     cin>>a;

     cout<<"Upisi koeficijent b:";

     cin>>b;

     if(a==0)

     {

         cout<<"Ako je a=0, jednadzba "<<a<<"*x+("<<b<<")=0 nema rjesenje." <<endl;

     }

     else if(b==0)

     {

         cout<<"Ako je b=0, rjesenje jednadzbe "<<a<<"*x+("<<b<<")=0:"<<endl;

         cout<<"x=0"<<endl;

     }

     else

     {

          x=-b/a;

          cout<<"Rjesenje jednadzbe "<<a<<"*x+("<<b<<")=0:"<<endl;

          cout<<"x= "<<x<<endl;

     }

     return 0;

}

Provjera za unos vrijednosti 6 i 18:

Upisi koeficijent a: 6

Upisi koeficijent b: 18

Rjesenje jednadzbe 6*x+(18)=0 :

x=-3

Ugnježđivanjem naredbi if može se ispitivati više različitih uvjeta. Ugnijezditi if naredbe znači smjestiti jednu if naredbu unutar druge. Sljedeći zadatak pokazuje takav primjer.

Zadatak:

Treba upisati prirodni broj, a zatim provjeriti je li uneseni broj veći, manji ili jednak 100, te je li paran ili neparan.

Ispis neka bude oblika:

Page 31: C++ osnove

Upisi prirodni broj:

Uneseni broj ... je ... od 100. Paran je. (ili Neparan je.)

Zadatak je riješen s pomoću ugniježđenih naredbi if. Vanjski blok naredbi if provjerava je li broj veći, manji ili

jednak 100. Unutarnji blokovi naredbi if (neovisno o tome je li broj veći ili manji od 100) provjeravaju parnost

broja.

Rješenje:

#include<iostream>

using namespace std;

int main()

{

     int a;

     cout<<"Upisi prirodni broj:";

     cin>>a;

     if (a==100)

          cout<<"Unesen je broj 100. Paran je."<<endl;

     else if (a<100)

     {

          cout<<"Uneseni broj "<<a<<" je manji od 100.";

          if (a%2==0)

                cout<<" Paran je."<<endl;

          else

                cout<<" Neparan je."<<endl;

     }

     else

     {

          cout<<"Uneseni broj "<<a<<" je veci od 100.";

          if (a%2==0)

                cout<<" Paran je."<<endl;

          else

                cout<<" Neparan je."<<endl;

     }

     return 0;

}

Provjera za unos vrijednosti 875:

Upisi prirodni broj: 875

Page 32: C++ osnove

Uneseni broj 875 je veci od 100 i neparan je.

Naredba switch-case

Naredba switch-case omogućava jednostruko grananje koje ovisi o vrijednosti postavljenog uvjeta.

Za razliku od višestrukog uvjetnog grananja kod kojeg su uvjeti logički izrazi, u naredbi switch-case uvjet je cjelobrojni izraz ili cjelobrojna varijabla. Izračun cjelobrojnog izraza ili vrijednost cjelobrojne varijable mora biti cijeli broj.

Vrijednost uvjeta se uspoređuje s nizom zadanih cjelobrojnih konstanti: konst1, konst2, konst3, itd. Ako je vrijednost uvjeta jednaka nekoj od zadanih konstanti, izvršava se blok naredbi pridružen toj konstanti.

Po završetku izvršenog bloka, naredba break prekida izvršavanje switch-case bloka naredbi i nastavlja program prvom naredbom nakon switch-case bloka.

Ako vrijednost uvjeta nije jednaka niti jednoj od ponuđenih konstanti, izvršava se blok naredbi pridružen naredbi default. U slučaju izostavljanja naredbe default program će nastaviti izvršavanje prvom naredbom nakon switch-case bloka.

Cjelokupni switch-case blok zapisuje se unutar para otvorena-zatvorena vitičasta zagrada ({}).

Page 33: C++ osnove

Zadatak:

Treba izračunati ukupni otpor za otpore R1 i R2 ovisno o tome jesu li spojeni serijski ili paralelno. Ispis neka bude oblika:

Otpor R1 (u omima):

Otpor R2 (u omima):

Za serijski spoj otpora upisi 1, a za paralelni 2:

Ako se otpori od ... oma i ... oma spoje u ... ukupni je otpor ... oma.

Definirane su dvije grane (jedna za paralelni spoj, druga za serijski). Ovisno o tome što korisnik upiše (broj 1 ili broj 2) izvršit će se jedna

od dvije grane. U slučaju da korisnik unese vrijednost koja nije 1 ili 2, ispisat će se upozorenje.

Rješenje:

#include<iostream>

#include<iostream>

using namespace std;

int main()

{

     float R,R1,R2;

Page 34: C++ osnove

     int i;

     cout<<"Otpor R1 (u omima):";

     cin>>R1;

     cout<<"Otpor R2 (u omima):";

     cin>>R2;

     cout<<"Za spoj otpora u seriju upisi 1, a za paralelu 2:";

     cin>>i;

     switch (i)

     {

     case 1:

           R=R1+R2;

           cout<<"Ako se otpori od "<<R1<<" oma i " <<R2;

           cout<<" oma spoje u seriju ukupni je otpor " <<R<<" oma."<<endl;

     break;

     case 2:

           R=(R1*R2)/(R1+R2);

           cout<<"Ako se otpori od "<<R1<<" oma i " <<R2;

           cout<<" oma spoje u paralelu, ukupni je otpor " <<R<<" oma."<<endl;

     break;

     default:

           cout<<"Pogresan unos. Unesi 1 ili 2"<<endl;

     }

     return 0;

}

Provjera za unos vrijednosti 2 i 4 te odabir paralelnog spoja:

Otpor R1 (u omima): 200

Otpor R2 (u omima): 400

Za spoj otpora u seriju upisi 1, a za paralelu 2: 2

Ako se otpori od 200 oma i 400 oma spoje u paralelu, ukupni je

otpor 133.333 oma.

Naredba goto

Naredba goto je naredba bezuvjetnog skoka. Ona omogućava nastavak odvijanja programa od odabrane naredbe.

Naredba na koju se želi skočiti, tj. od koje se želi nastaviti odvijanje programa, može biti bilo gdje u programu. Naredbu od koje se želi nastaviti odvijanje programa treba označiti oznakom (simboličkim

Page 35: C++ osnove

imenom) iza koje dolazi znak dvotočke.

 Naredba goto najčešće smanjuje razumljivost i preglednost kôda pa ju treba izbjegavati.

Opći oblik naredbe goto

naziv_naredbe:naredba;

           .....

           .....

                         goto naziv_naredbe;

naziv_naredbe je simboličko ime naredbe od koje se nastavlja odvijanje programa.

 Zadatak:

Pokazan je primjer u kome korisnik mora unijeti broj različit od 0. Ukoliko unese nulu, naredba goto ga vraća na ponovni upis broja.

Postupak se ponavlja opetovano, sve dok korisnik ne upiše broj različit od 0.

#include<iostream>

using namespace std;

int main()

{

     int a;

upis:cout<<"Upisi broj razlicit od 0:";cin>>a;

     if(a==0)

     {

           cout<<"Pogresan unos. Ponovi!"<<endl;

           goto upis;

     }

     if(a<0)

     {

Programska petlja

Ponekad se dijelovi programa trebaju izvršit više puta (iterirati). Struktura koja to omogućuje naziva se programska petlja. Programskom petljom dijelovi programa se mogu ponavljati unaprijed zadani broj puta ili sve dok je određeni uvjet ispunjen.

Page 36: C++ osnove

Petlje se u programu ostvaruju naredbama:

for, while, do-while.

Petlja for

Petlja for se najčešće rabi ako se dijelovi programa (blokovi naredbi) ponavljaju unaprijed poznati broj puta.

for (pocetno_stanje; uvjet; prirast)            {                blok naredbi            }naredba iza bloka

Svaka for petlja ima svoju kontrolnu varijablu kojoj se vrijednost svakim prolaskom kroz petlju mijenja ovisno o vrijednosti prirasta. Kontrolnu varijablu petlje potrebno je prije ulaska u petlju deklarirati.

Kao što je u prikazu osnovnog oblika for petlje vidljivo, prilikom zadavanja petlje najprije treba zadati početnu vrijednost kontrolne varijable petlje (pocetno_stanje).

Slijedi uvjet. Rezultat uvjeta mora biti logički podatak (tip bool). Blok naredbi koji se nalazi u petlji izvršava se sve dok je vrijednost uvjeta jednaka logičkoj istini (true, 1). Kad vrijednost uvjeta postane neistina (false, 0), petlja se prekida.

Treći podatak je prirast. To je iznos za koji se mijenja vrijednost kontrolne varijable petlje.

Vrijednosti početnog stanja, uvjeta i prirasta odvajaju se znakom točka-zarez (;). Iza naredbe for ne stavlja se znak točka-zarez (;). Ako se zabunom ipak stavi, neće se izvršiti blok naredbi u petlji.

Blok naredbi koji se ponavlja zadani broj puta označava se parom otvorena-zatvorena vitičasta zagrada ({}).

 

U sljedećem primjeru je prikazan tijek izvršavanja petlje for. Zadatak:

Potrebno je ispisati brojeve od 1 do 20. Ispis neka bude oblika:

Ispis brojeva od 1 do 20:

Page 37: C++ osnove

1 2 3 4 5 6 7 8 9 ......20

Potrebno je:

Deklarirati kontrolnu varijablu petlje i zadati joj početnu vrijednost: int brojac=1.

Postaviti uvjet (vrijednost varijable brojac mora biti manja od 20): brojac<=20.

Zadati vrijednost prirasta za koju se mijenja vrijednost kontrolne varijable petlje (u ovome slučaju za

1): brojac++.

Naredba koja se izvodi konačan broj puta je ispis trenutačnih vrijednosti varijable brojac.

Rješenje:

#include<iostream>

using namespace std;

int main()

{

            int brojac;

            cout<<"Ispis brojeva od 1 do 20:"<<endl;

            for (brojac=1;brojac<=20;brojac++)

            {

                        cout<<brojac<<" ";

            }

            cout<<endl;

            return 0;

}

Rezultat (zbog preglednosti ispisa nakon svakog broja ispisuje se jedno prazno mjesto):

Ispis brojeva od 1 do 20:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Varijabla brojac na početku ima vrijednost 1. Prvo se provjerava uvjet. Uvjet je ispunjen jer je istina da je

(brojac<=20) zbog toga što je brojac trenutno jednak 1 pa izraz glasi (1<=20). Kako je uvjet ispunjen

izvršavaju se narede bloka, tj. ispisuje se trenutačna vrijednost varijable brojac (a to je 1).

Zatim se djelovanjem unarnog operatora inkrement (brojac++) mijenja sadržaj varijable brojac za vrijednost

prirasta (povećava se za 1). Sada je vrijednost varijable brojac jednaka 2.

Izvođenje se vraća na početak petlje, provjerava se uvjet (brojac<=20). Uvjet je ispunjen (jer je vrijednost

brojac jednaka 2), ispisuje se trenutačna vrijednost varijable brojac (a to je 2), mijenja se sadržaj varijable

brojac za vrijednost prirasta i tako redom.

Postupak se ponavlja do trenutka ispisa broja 20. Zatim se ponovo mijenja sadržaj varijable brojac i ona

poprima vrijednost 21. Uvjet (brojac<=20) više nije ispunjen jer je vrijednost varijable brojac jednaka 21 i

Page 38: C++ osnove

program kreće s izvršenjem prve naredbe iza petlje for.

Sljedeći zadatak prikazuje primjer prirasta koji ima vrijednost različitu od 1.Zadatak:

Treba ispisati parne brojeve u rasponu od 50 do 100. Ispis neka bude oblika:

Parni brojevi iz intervala od 50 do 100 su:

50 52 54 56.........           98 100

Prirast je 2 (jer je razlika dvaju susjednih parnih brojeva 2). Može se zapisati: brojac=brojac+2 ili

brojac+=2

Rješenje:

#include<iostream>

using namespace std;

int main()

{

            int brojac;

            cout<<"Parni brojevi iz intervala od 50 do 100 su:"<<endl;

            for (brojac=50;brojac<=100;brojac+=2)

            {

                        cout<<brojac<<" ";

            }

            cout<<endl;

            return 0;

}

Rezultat (zbog preglednosti ispisa nakon svakog broja ispisuje se jedno prazno mjesto):

Parni brojevi iz intervala od 50 do 100 su:

50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94

96 98 100

Osim pozitivnih vrijednosti prirasta moguće su i negativne vrijednosti prirasta. U tom se slučaju tijekom odvijanja petlje vrijednost kontrolne varijable smanjuje, stoga treba biti oprezan prilikom zadavanja početne vrijednosti kontrolne varijable petlje i uvjeta.

Zadatak:

Treba ispisati parne brojeve u rasponu od 100 do 50. Ispis neka bude oblika:

Page 39: C++ osnove

Parni brojevi iz intervala od 100 do 50 su:

100 98 96 94 ..........             52 50

Razlika u odnosu na prethodni zadatak je jedino u naredbovnom retku u kome je zadana petlja for.

Rješenje:

for (brojac=100;brojac>=50;brojac-=2)

Rezultat (zbog preglednosti ispisa nakon svakog broja ispisuje se jedno prazno mjesto):

Parni brojevi iz intervala od 100 do 50 su:

100 98 96 94 92 90 88 86 84 82 80 78 76 74 72 70 68 66 64 62 60 58 56

54 52 50

U nastavku su primjeri različitih mogućnosti uporabe petlje pri rješavanju zadataka.

Zadatak:

Potrebno je zbrojiti prvih N prirodnih brojeva. Ispis neka bude oblika:

Upisi broj do kojeg zelis zbrajati:

Zbroj prvih ... prirodnih brojeva je ....

Prije ulaska u petlju treba deklarirati varijablu zbroj i pridružiti joj početnu vrijednost 0. Ta će

varijabla po završetku petlje sadržavati podatak o zbroju N prirodnih brojeva.

Potrebno je unijeti vrijednost za varijablu N koja označava posljednji broj željenog raspona. Petlja se

treba ponavljati N puta stoga je tako valja i zadati.

Početna vrijednost kontrolne varijable brojac bit će 1(brojac=1), uvjet: (brojac<=N) a prirast

(brojac++).

Naredba koja se izvodi konačan broj puta je uvećavanje vrijednosti varijable zbroj za tekuću

vrijednost kontrolne varijable brojac (zbroj=zbroj+brojac;).

Kada uvijet petlje (brojac<=N) više ne bude ispunjen, petlja se prekida a izvršava se prva naredba

iza petlje. To je ispis sadržaja varijable zbroj.

Rješenje:

#include<iostream>

Page 40: C++ osnove

using namespace std;

int main()

{

            int brojac,zbroj,N;

            cout<<" Upisi broj do kojeg zelis zbrajati: ";

            cin>>N;

            zbroj=0;

            for (brojac=1;brojac<=100;brojac++)

            {

                        zbroj=zbroj+brojac;

            }

            cout<<"Zbroj prvih "<<N<<" prirodnih brojeva je:"<<zbroj<<endl;

            return 0;

}

Rezultat za upis broja 100:

Upisi broj do kojeg zelis zbrajati: 100

Zbroj prvih 100 prirodnih brojeva je: 5050

Zadatak:

Potrebno je prebrojiti sve prirodne brojeve djeljive sa 7 iz raspona od M do N. Ispis neka bude oblika:

Upisi pocetnu vrijednost raspona:

Upisi zavrsnu vrijednost raspona:

U rasponu od ... do ... ima ...  brojeva djeljivih sa 7.

Prije ulaska u petlju treba deklarirati varijablu broj i pridružiti joj početnu vrijednost 0. Ta će varijabla

po završetku petlje sadržavati podatak o broju brojeva djeljivih sa 7 iz zadanog raspona brojeva.

Potrebno je unijeti vrijednosti za varijable M i N koje označavaju početnu i završnu vrijednost

željenog raspona brojeva. Kontrolna će varijabla petlje poprimati vrijednosti iz zadanog raspona

brojeva: početna vrijednost: (brojac=M), uvjet: (brojac<=N), s prirastom 1 (brojac++).

U bloku naredbi petlje provjeravat će se djeljivost trenutne vrijednosti kontrolne varijable petlje sa

brojem 7;

if (brojac%7==0). Ako je uvijet ispunjen vrijednost varijable broj se uvećava za 1 (broj=broj+1;).

Kada uvijet (brojac<=N) više ne bude ispunjen, petlja se prekida a izvršava se prva naredba iza

petlje. To je ispis sadržaja varijable broj.

Rješenje:

#include<iostream>

Page 41: C++ osnove

using namespace std;

int main()

{

     int broj,brojac, M, N;

     cout<<"Program prebrojava sve prirodne brojeve djeljive sa 7 iz raspona od M do N"<<endl;

     cout<<"Upisi pocetnu vrijednost raspona: ";

     cin>>M;

     cout<<"Upisi zavrsnu vrijednost raspona: ";

     cin>>N;

     broj=0;

     for(brojac=M;brojac<=N;brojac++)

     {

              if(brojac%7==0)

              {

                       broj=broj+1;

              }

     }

     cout<<"U rasponu od "<<M<<" do "<<N<<" ima "<<broj<<" brojeva djeljivih sa 7."<<endl;

     return 0;

}

Rezultat za unos brojeva 1 i 100:

Program prebrojava sve prirodne brojeve djeljive sa 7 iz raspona od M

do N.

Upisi pocetnu vrijednost raspona: 1

Upisi zavrsnu vrijednost raspona: 100

U rasponu od 1 do 100 ima 14 brojeva djeljivih sa 7.

Zadatak:

Potrebno je ispisati djelitelje odabranog prirodnog broja. Po unosu broja treba provjeriti da li je uneseni broj prirodan, ako nije valja ponoviti unos. Ispis neka bude oblika:

Upisi prirodni broj:

Djelitelji broja  ...  su: ...

Po unosu broja N, provjerava se da li je taj broj manji ili jednak 0 (N<=0). Ako je, broj nije prirodan i unos treba ponoviti.

Kontrolna se varijabla petlje, brojac mijenja od 1 do N. U bloku naredbi petlje provjerava se djeljivost broja N sa svakom od trenutnih vrijednosti kontrolne

varijable petlje if(N%brojac==0).

Ako je uvjet istinit (pronađen je djelitelj) ispisuje se trenutna vrijednost kontrolne varijable petlje.

Rješenje:

Page 42: C++ osnove

#include<iostream>

using namespace std;

int main()

{

             int brojac,N;

        upis:cout<<"Upisi prirodni broj: ";

             cin>>N;

             if (N<=0)

                         goto upis;

             cout<<"Djelitelji broja "<<N<<" su: ";

             for (brojac=1;brojac<=N;brojac++)

             {

                         if(N%brojac==0)

                                    cout<<brojac<<"  ";

             }

             cout<<endl;

             return 0;

}

Rezultat za unos broja 56:

Upisi prirodni broj: 56

Djelitelji broja  56  su: 1  2  4  7  8  14  28  56

 Zadatak:

Potrebno je ispisati sve troznamenkaste brojeve čiji je zbroj znamenaka 5, a zadnja im je znamenka 0 (znamenka jedinice). Ispis neka bude oblika:

Troznamenkasti brojevi ciji je zbroj znamenaka 5, a zadnja im je znamenka 0 su:

...

...

Da bi se dobili svi troznamenkasti brojevi koje treba provjeriti, potrebno je načiniti petlju čija se

vrijednost kontrolne varijable mijenja unutar potrebitog raspona:

Page 43: C++ osnove

početna vrijednost: (brojac=100), uvjet: (brojac<=999), prirast: (brojac++).

Zatim iz svakog troznamenkastog broja treba izdvojiti znamenke jedinice, desetice i stotice. Problem

se rješava uporabom aritmetičkih operatora za cjelobrojno i modularno dijeljenje:

(j=brojac%10), (d=(brojac/10)%10), (s=brojac/100).

Jedno od mogućih rješenja, npr. za broj 745:

            745 % 10 = 5

            (745 / 10) % 10 = 4

            745 / 100 = 7

Kada se znamenke određenog broja izdvoje, potrebno ih je zbrojiti (zbroj=j+d+s).

Svaki od brojeva koje treba provjeriti mora zadovoljiti dva uvjeta: zbroj znamenaka mora biti jednak

5 (zbroj==5) a zadnja znamenka mora biti jednaka 0 (j==0). Stoga treba zadati složeni uvjet

uporabom logičkog operatora I (AND).

Ako je složeni uvjet if((zbroj==5)&&(j==0)) istinit, broj se ispisuje.

Rješenje:

#include<iostream>

using namespace std;

int main()

{

            int brojac,j,d,s,zbroj;

            cout<<"Troznamenkasti brojevi ciji je zbroj znamenaka 5,";

            cout<<" a zadnja im je znamenka 0 su: "<<endl;

            for(brojac=100;brojac<=999;brojac++)

            {

                        j=brojac%10;

                        d=( brojac /10)%10;

                        s= brojac /100;

                        zbroj=j+d+s;

                        if((zbroj==5)&&(j==0))

                                   cout<< brojac <<"  ";

            }

            return 0;

}

Rezultat:

Troznamenkasti brojevi ciji je zbroj znamenaka 5, a zadnja im je

znamenka 0 su:

140  230  320  410  500

Ugnježđena petlja for

Page 44: C++ osnove

Petlje for se mogu pisati jedna unutar druge, tj. biti ugniježđene jedna unutar druge.

Pri ulazu u vanjsku petlju, kontrolna varijabla vanjske petlje poprima početnu vrijednost. Provjerava se uvjet vanjske petlje, pa ako je ispunjen, ulazi se u unutarnju petlju.

Pri ulazu u unutarnju petlju, kontrolna varijabla unutarnje petlje poprima početnu vrijednost, provjerava se uvjet unutarnje petlje, pa ako je ispunjen izvršava se blok naredbi unutarnje petlje.

Po završetku bloka naredbi unutarnje petlje mijenja se vrijednost kontrolne varijable unutarnje petlje za vrijednost prirasta unutarnje petlje. Sve dok je zadovoljen uvjet unutarnje petlje njen blok naredbi se opetovano ponavlja uz stalnu vrijednost kontrolne varijable vanjske petlje.

Kada uvjet unutarnje petlje nije ispunjen izlazi se iz unutarnje petlje i ponovo se počne izvršavati vanjska petlja. Vrijednost kontrolne varijable vanjske petlje se mijenja za vrijednost prirasta, provjerava se uvjet vanjske petlje pa ako je ispunjen, ulazi se u unutarnju petlju. Sada se ponovo ponavlja opisan postupak izvršavanja unutarnje petlje.

Sve se ponavlja do trenutka kada uvjet vanjske petlje više nije ispunjen. Valja uočiti da se za svaku vrijednost kontrolne varijable vanjske petlje izvodi cjelokupna unutarnja petlja.

Sljedeći zadatak prikazuje tijek izvršavanja ugnježđene petlje for.

 Zadatak:

Treba ispisati tablicu množenja za brojeve od 1 do 10. Ispis neka bude oblika:

1 2 3 4 5 6 7 8 9 10

Page 45: C++ osnove

2 4 6 8 10 12 14 16 18 20

3 6 9 12 15 18 21 24 27 30

4 8 12 16 20 24 28 32 36 40

5 10 15 20 25 30 35 40 45 50

6 12 18 24 30 36 42 48 54 60

7 14 21 28 35 42 49 56 63 70

8 16 24 32 40 48 56 64 72 80

9 18 27 36 45 54 63 72 81 90

10 20 30 40 50 60 70 80 90 100

Za oblikovanje ispisa koriste se ugnježđene petlje. Vanjska petlja (kontrolna varijabla red) oblikuje ispis 10

redaka, a unutarnja (kontrolna varijabla stup) za svaki redak, 10 stupaca. Vrijednosti varijabli red i stup

mijenjaju se ovako:

red stup

1 1

1 2

1 3

... ...

1 10

2 1

2 2

... ...

2 10

... ...

10 10

Da bi ispis bio oblikovan u pravilnim stupcima, rabi se manipulator (operator za rukovanje ispisom)

setw(int). On određuje koliki će se prostor predvidjeti za ispis podatka koji slijedi u izlaznom toku. Svi su

manipulatori definirani u biblioteci iomanip, pa tu biblioteku treba uključiti naredbom include.

U unutarnjoj se petlji ispisuje umnožak trenutnih vrijednosti vanjske i unutarnje petlje (red*stup)

Napomena: za svaku vrijednost kontrolne varijable vanjske petlje (red) izvodi se 10 puta cjelokupna

unutarnja petlja (stup).

Page 46: C++ osnove

Rješenje:

#include<iostream>

#include<iomanip>

using namespace std;

int main()

{

            int stup,red;

            for(red=1;red<=10;red++)

            {

                        for(stup=1;stup<=10;stup++)

                        {

                                   cout<<setw(7)<<red*stup;

                        }

            cout<<endl;

            }

            return 0;

}

Rezultat:

1 2 3 4 5 6 7 8 9 10

2 4 6 8 10 12 14 16 18 20

3 6 9 12 15 18 21 24 27 30

4 8 12 16 20 24 28 32 36 40

5 10 15 20 25 30 35 40 45 50

6 12 18 24 30 36 42 48 54 60

7 14 21 28 35 42 49 56 63 70

8 16 24 32 40 48 56 64 72 80

9 18 27 36 45 54 63 72 81 90

10 20 30 40 50 60 70 80 90 100

Beskonačna petlja

Može se dogoditi da je uvjet petlje uvijek ispunjen. Petlja će se tom slučaju izvoditi beskonačno puta. Ako se dogodi da se pokrene program u kojem je beskonačna petlja, može ga se prekinuti zatvaranjem prozora u kojem se izvršava program.

Primjer beskonačne petlje

for(b=3;b<10;) Vrijednost varijable b je uvijek manja od 10 pa

Page 47: C++ osnove

cout<<"beskonacna petlja";će se petlja ponavljati neograničen broj puta.

Da bi se izbjegla beskonačna petlja, treba: Zadati uvjet koji jamči konačan broj ponavljanja petlje. Navesti sva tri izraza u zagradi iza naredbe for. Izbjegavati promjenu vrijednosti kontrolne varijable petlje unutar bloka naredbi petlje.

Primjer posljedice beskonačne petlje:

Petlja while

Petlja while se najčešće rabi ako broj ponavljanja petlje nije unaprijed poznat, nego ovisi o ispunjenju zadanog uvjeta.Osnovni oblik petlje while je:

while (uvjet){       blok naredbi}naredba iza bloka

Kod ove se vrste petlje uvjet ispituje na početku, a blok naredbi petlje ponavlja se sve dok je uvjet ispunjen.

Uvjet je logički izraz čiji rezultat mora biti logički podatak (tip bool). Kada rezultat postane logička neistina (false, 0), preskače se blok naredbi petlje i program se nastavlja od prve naredbe nakon bloka naredbi petlje.

Pošto se kod petlje while uvjet ispituje na početku može se dogoditi da se blok naredbi u petlji ne izvrši niti jednom.

Page 48: C++ osnove

Zadatak:

Treba unijeti N realnih brojeva (N nije unaprijed poznat!) pa izračunati i prikazati njihovu srednju vrijednost (brojeve upisuje korisnik). Nakon posljednjeg broja treba unijeti nulu. Ispis neka bude oblika:

Nakon posljednjeg broja unesi nulu.

Unesi broj:

Unesi broj:

...

Uneseno je ... brojeva. Srednja vrijednost je ....

Na početku programa, prije petlje, od korisnika se očekuje unos prve vrijednosti x (naredba cin>>x) čime se određuje hoće li

se petlja uopće pokrenuti.

Petlja će se ponavljati sve dok se unose vrijednosti različite od 0. To određuje uvjet: while(x!=0).

Po ulasku u petlju treba uneseni broj x pribrojiti pomoćnoj varijabli zbroj. Uz to, treba prebrojiti koliko je brojeva uneseno tako

da se sadržaj pomoćne varijable broj uveća za 1. Zatim treba unijeti sljedeći broj x koji će biti provjeren uvjetom petlje. Taj će

broj odrediti hoće li petlja stati ili će nastaviti s izvršavanjem.

Po završetku petlje računa se srednja vrijednost (zbroj/broj).

Rješenje:

Page 49: C++ osnove

#include<iostream>

using namespace std;

int main()

{

            cout<<" Program racuna srednju vrijednost N unesenih brojeva."<<endl;

            float x,broj,zbroj;

            broj=0;

            zbroj=0;

            cout<<"Nakon posljednjeg broja unesi nulu"<<endl;

            cout<<"Unesi broj:"<<endl;

            cin>>x;

            while(x!=0)

            {

                        broj++;

                        zbroj+=x;

                        cout<<"Unesi broj:";

                        cin>>x;

            }

            cout<<"Uneseno je "<<broj<<" brojeva. Srednja vrijednost je "<<zbroj/broj<<endl;

            return 0;

}

Rezultat:

Program racuna srednju vrijednost N unesenih brojeva. Nakon posljednjeg broja unesi nulu.

Unesi broj:

234

Unesi broj:

13

Unesi broj:

345

Unesi broj:

65

Unesi broj:

77

Unesi broj:

0

Uneseno je 5 brojeva. Srednja vrijednost je 146.8

Page 50: C++ osnove

 Zadatak:

Potrebno je unesenom prirodnom broju prebrojiti znamenke. U slučaju da je broj manji ili jednak nula, upis se ponavlja. Ispis neka bude oblika:

Upisi prirodni broj:

Broj znamenka je: ...

Broj znamenaka upisanog broja nije unaprijed poznat. Pomoći će petlja while:

Za prebrojavanje znamenaka uvodi se pomoćna varijabla br čija je početna vrijednost 0 (br=0).

Početna vrijednost varijable koja se koristi u uvjetu je uneseni broj (b).

Petlja će se ponavljati sve dok je vrijednost varijable b veća od 0. Zato je uvjet: while(b>0).

Da bi se znamenke prebrojale od vrijednosti varijable b valja odvojiti znamenku najmanje težinske

vrijednosti pa dobiveni rezultat vratiti u varijablu b (b=b/10). Zatim treba varijablu koja prebrojava

znamenke (br) uvećati za 1 (br=br+1).

Nakon toga treba provjeriti uvjet petlje. Ako je uvjet: while (b>0) ispunjen, blok naredbi se

ponavlja.

Kada se prebroji posljednja znamenka (znamenka najveće težinske vrijednosti), uvjet više neće biti

ispunjen pa će se petlja prekinuti.

Npr. za broj 345, broj znamenaka je 3:

345710=34 br=br+1=0+1=1 34>0 ? DA

34/10=3 br=br+1=1+1=2 3>0 ? DA

3/10=0 br=br+1=2+1=3 0>0 ? NE

Rješenje:

#include<iostream>using namespace std;int main(){            int br,b;            cout<<"Program unesenom prirodnom broju prebrojava znamenke."<<endl;       upis:cout<<"Upisi prirodni broj: ";            cin>>b;            if (b<=0)            {                        goto upis;            }            br=0;            while(b>0)            {                        b=b/10;                        br=br+1;            }            cout<<"Broj znamenki je: "<<br<<endl;            return 0;}

Rezultat za broj 67432:

Page 51: C++ osnove

Program unesenom prirodnom broju prebrojava znamenke.

Upisi prirodni broj: 67432

Broj znamenki je: 5

Petlja do-while

Petlja do-while se rabi ako broj ponavljanja petlje nije unaprijed poznat, nego ovisi o ispunjenju zadanog uvjeta.Osnovni oblik petlje do-while je:

do{      blok naredbi}while (uvjet);

Glavno obilježje petlje do-while je izvođenje bloka naredbi petlje bar jedanput neovisno o istinitosti uvjeta jer se uvjet ispituje nakon izvođenja bloka naredbi petlje. U tome je i osnovna razlika petlje do-while u odnosu na petlje for i while kod kojih se može dogoditi da se blok naredbi ne izvede nijedanput.

Zadatak:

Treba unijeti N prirodnih brojeva (N nije unaprijed poznat!) pa pronaći i ispisati najveći uneseni broj. Nakon posljednjeg broja treba unijeti 0. Ispis neka bude oblika:

Nakon posljednjeg broja unesi nulu.

Unesi prirodni broj:

Page 52: C++ osnove

Unesi prirodni broj:

...

Najveci broj je ... Na početku programa, prije petlje, od korisnika se očekuje unos prvog broja b.

Potom valja pretpostaviti da je prvi uneseni broj najveći. Pretpostavlja se tako da se broj b pohrani

u varijablu max (max=b).

Petlja će se ponavljati sve dok se unose brojevi veći od 0. Zato je uvjet: while(b>0).

U petlji se mora dokazati ili odbaciti pretpostavka da je u varijablu max pohranjen trenutno najveći

broj

(if(b>max)). Ako uvjet nije ispunjen, unosi se novi broj, a ako je, varijabla max dobiva vrijednost

trenutno najvećeg broja a potom se unos nastavlja.

Po unosu broja 0, petlja završava. Najveći broj je pohranjen u varijabli max.

Rješenje:

#include<iostream>

using namespace std;

int main()

{

     int b,max;

     cout<<endl<<"Nakon posljednjeg broja unesi 0. Unesi prirodni broj: ";

     cin>>b;

     max=b;

     do

     {

            if(b>max)

            {

                   max=b;

            }

     cout<<"Unesi prirodni broj: ";

     cin>>b;

     }

     while(b>0);

     cout<<endl<<"Najveci broj je: "<<max<<endl;

     return 0;

}

Rezultat:

Nakon posljednjeg broja unesi nulu.

Unesi prirodni broj: 85

Unesi prirodni broj:14

Page 53: C++ osnove

Unesi prirodni broj:396

Unesi prirodni broj:384

Unesi prirodni broj:0

Najveci broj je 396

Naredba break

Naredba break se rabi kad treba prekinuti izvođenje bloka naredbi unutar petlje. Nakon naredbe break program prelazi na prvu naredbu iza programske petlje.Naredba break je i sastavni dio switch-case naredbe.

Zadatak:

Treba unijeti 10 prirodnih brojeva, pa ih zbrojiti. U slučaju unosa broja 5, unos se prekida. Ispisuje se poruka o unosu broja 5, a potom i broj unesenih brojeva do unosa broja 5, te njihov zbroj. Ispis neka bude oblika:

Upisi broj:

Upisi broj:

...

Uneseno je ... ispravnih brojeva. Njihov je zbroj....

Sve dok uvjet naredbe if nije ispunjen, if(A==5), blok naredbi petlje for se ponavlja. Kada se uvjet ispuni, izvršenje petlje se

prekida.

Rješenje:

#include <iostream>

using namespace std;

int main ()

{

     int n,A,zbroj,broj;

     zbroj=0;

     broj=0;

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

     {

            cout <<"Upisi broj:";

            cin>>A;

            if (A==5)

Page 54: C++ osnove

            {

                     cout<<"Prekid zbog unosa broja 5"<<endl;

                     break;

            }

            broj=broj+1;

            zbroj=zbroj+A;

     }

     cout<<endl<<"Uneseno je "<<broj<<" ispravnih brojeva. Njihov je zbroj "<<zbroj<<endl;

  return 0;

}

Rezultat:

Upisi broj:4

Upisi broj:8

Upisi broj:2

Upisi broj:9

Upisi broj:1

Upisi broj:3

Upisi broj:5

Prekid zbog unosa broja 5.

Uneseno je 6 ispravnih brojeva. Njihov je zbroj 27

Naredba continue

Ponekad je potrebno preskočiti dio bloka naredbi do kraja programske petlje pa nakon toga petlju nastaviti. U tu se svrhu rabi naredba continue.Preporuča se umjesto naredbe continue rabiti naredbe grananja jer nepažljiva uporaba naredbe continue može izazvati beskonačnu petlju.

Zadatak:

Treba unijeti 10 prirodnih brojeva, pa ih zbrojiti. U slučaju unosa broja 5, ispisuje se poruka o unosu broja 5, preskače se dio bloka do kraja programske petlje pa se nakon toga petlja nastavlja. Na kraju se ispisuje broj ispravno unesenih brojeva te njihov zbroj.

Ispis neka bude oblika:

Upisi broj:

Upisi broj:

...

Page 55: C++ osnove

Uneseno je ... ispravnih brojeva. Njihov je zbroj....

Ako se unese broj 5, ispisat će se poruka:

Unesen je broj 5. On se ne pribraja i ne prebrojava.

Sve dok uvjet naredbe if nije ispunjen, if(A==5), blok naredbi petlje for se ponavlja. Kada se uvjet ispuni, preskače se dio bloka

do kraja programske petlje pa se nakon toga petlja nastavlja.

Rješenje:

#include <iostream>

using namespace std;

int main ()

{

      int n,A,zbroj,broj;

      zbroj=0;

      broj=0;

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

      {

            cout <<"Upisi broj:";

            cin>>A;

            if (A==5)

            {

                  cout<<"Unesen je broj 5. On se ne pribraja i ne prebrojava."<<endl;

                  continue;

            }

            broj=broj+1;

            zbroj=zbroj+A;

       }

        cout<<endl<<"Uneseno je "<<broj<<" ispravnih brojeva. Njihov je zbroj "<<zbroj<<endl;

        return 0;

}

Rezultat:

Upisi broj:4

Upisi broj:8

Upisi broj:2

Upisi broj:5

Unesen je broj 5. On se ne pribraja i ne prebrojava.

Upisi broj:1

Upisi broj:3

Page 56: C++ osnove

Upisi broj:5

Unesen je broj 5. On se ne pribraja i ne prebrojava.

Upisi broj:3

Upisi broj:5

Unesen je broj 5. On se ne pribraja i ne prebrojava.

Upisi broj:7

Uneseno je 7 ispravnih brojeva. Njihov je zbroj 28.

Polja (nizovi)

U programima se ponekad rabe skupovi podataka istog tipa koji predstavljaju cjelinu. Npr. popis poštanskih brojeva mjesta u Hrvatskoj. Ako bi se za poštanski broj svakog mjesta deklarirala posebna varijabla trebalo bi izmisliti imena za mnogo varijabli iste vrste. Rukovanje takvim varijablama bilo bi vrlo nespretno. Malo prikladnije bilo bi u spomenutom primjeru varijable označavati M1, M2, M3 i tako redom ali to ne bi bitno olakšalo obradu podataka spremljenih u takve varijable.

Puno je smislenije skup podataka istog tipa pohraniti pod zajedničkim imenom, a redni broj podatka u tom skupu označiti brojem (indeksom). Takav način pohrane omogućavaju polja (nizovi) podataka.

Polje je konačni niz podataka istog tipa koji predstavljaju cjelinu. Sastoji se od članova polja. Položaj svakog od članova unutar polja određen je cjelobrojnim brojčanim indeksom koji se zapisuju unutar uglatih zagrada.

Polja mogu biti:

jednodimenzionalna višedimenzionalna.

Jednodimenzionalno polje

Kod jednodimenzionalnih polja članovi polja (podaci) su poredani u niz (jedan iza drugoga), a indeks svakog od članova odgovara njegovoj udaljenosti od prvog člana.

Jednodimenzionalno polje

X[0] X[1] X[2] ... ... X[N-1]

Svaki od članova niza se označava cjelobrojnim indeksom i to tako da prvi član niza ima indeks 0, a posljednji član indeks za jedan manji od duljine polja (u gornjem primjeru duljina polja je N).

Kod izdvajanja (dohvaćanja) članova niza, indeks člana niza može biti zadan kao:

cjelobrojna konstanta, cjelobrojna varijabla, cjelobrojni izraz.

Način zadavanja indeksa članova niza

X[3] cjelobrojna konstanta

X[a] cjelobrojna varijabla

Page 57: C++ osnove

X[a*3-1] cjelobrojni izraz

Polje treba deklarirati (svi članovi polja moraju biti istog tipa) kako bi se u memoriji osigurao potreban prostor za podatke u polju.

Primjeri deklaracije polja

tip_clanova_niza ime_niza [duljina_niza] Opći oblik deklaracije jednodimenzionalnog polja

int X[6]; Polje X je jednodimenzionalno polje koje ima šest članova koji su po tipu cijeli brojevi.

int a[100];

float X[20];

char tekst[50];

Članovi polja mogu biti bilo kojeg tipa (int, float ili bilo kojeg drugog).

int A[6];

int A;

Kao što se pri deklaraciji ne smiju ponavljati ista imena varijabli, tako se ni ime polja ne smije podudarati s imenom drugog polja ili neke od varijabli. Primjerice, ovakva je deklaracija pogrešna.

Članovima deklariranog polja mogu se pridružiti vrijednosti. Vrijednosti se navode unutar para vitičastih zagrada, odvojene zarezom.

Pridruživanje vrijednosti članovima polja

int X[6]={2,34,1,67,99,7} Polje X ima 6 članova i svi su po tipu cijeli brojevi.

int X[ ]={2,34,1,67,99,7}Vrijedit će i ako se ne navede duljina polja: (prevoditelj sam "zaključuje" da je u listi šest članova i nakon toga se duljina polja više ne može mijenjati).

X[a*3-1] cjelobrojni izraz

Član polja X[0] X[1] X[2] X[3] X[4] X[5]

Vrijednost 2 34 1 67 99 7

Članovi polja se razlikuju po indeksu koji se mijenja od 0 do N–1 (N je ukupan broj članova niza) pa je za upis i ispis članova polja prikladno rabiti petlju. Petlja for se rabi ako je unaprijed poznat broj ponavljanja petlje, a petlja while i petlja do-while ako broj ponavljanja nije unaprijed poznat.Ovdje će biti prikazani samo najjednostavniji primjeri rada s jednodimenzionalnim poljima.

Zadatak:

Treba unijeti članove jednodimenzionalnog polja int X[6] = {2,34,1,67, 99,7} pa ih ispisati.

Ispis treba izgledati ovako:

A[0]=2   A[1]=34   A[2]=1   A[3]=67   A[4]=99   A[5]=7Rješenje:

#include <iostream>

using namespace std;

Page 58: C++ osnove

int main ()

{

            int i;

            int A[6]={2,34,1,67,99,7};

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

            {

                        cout<<"A["<<i<<"]="<<A[i]<<"   ";

            }

            cout<<endl;

            return 0;

}

Rezultat:

A[0]=2   A[1]=34   A[2]=1   A[3]=67   A[4]=99   A[5]=7

Duljina deklariranog poljaDuljina deklariranog polja se ne može mijenjati tijekom izvođenja programa, a mora biti veća ili jednaka broju članova polja. Ako je deklarirana duljina polja veća od broja članova kojima je pridružena vrijednost, preostalim se članovima pridružuje vrijednost 0.

Zadatak:

Primjer pridruživanja nule članovima polja može se vidjeti ako se u prethodnom primjeru u polje A[6], pohrane samo četiri podatka:

Rješenje:

            int A[6]={2,34,1,67};

Rezultat:

A[0]=2   A[1]=34   A[2]=1   A[3]=67   A[4]=0   A[5]=0

Zadatak:

Page 59: C++ osnove

Treba unijeti N članova jednodimenzionalnog polja, pa ih ispisati i zbrojiti. N mora biti manji ili jednak 10 (N<=10). Ispis neka bude oblika:

Upisi broj clanova polja:

Upisi X[...] clan polja:

....

....

Zbroj ... clanova polja iznosi ....

Kako nije unaprijed poznat broj članova polja (N) treba ga unijeti i provjeriti da li je 0<N<=10. Provjera se izvodi petljom

while.

Prva petlja for će poslužiti za upis članova polja, a druga za zbrajanje i ispis.

Rješenje:

#include <iostream>

using namespace std;

int main ()

{

            int N,i,zbroj;

            int X[10];

            zbroj=0;

            do

            {

                      cout<<"Upisi broj clanova polja:";

                        cin>>N;

            }

            while((N<=0)||(N>10));

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

            {

                        cout<<endl<<"Upisi X["<<i<<"]:";

                        cin>>X[i];

            }

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

            {

                        cout<<X[i]<<endl;

                        zbroj=zbroj+X[i];

            }

            cout<<endl<<"N="<<N<<". Zbroj "<<N <<" clanova polja iznosi "<<zbroj <<endl;

Page 60: C++ osnove

            return 0;

}

Rezultat:

Upisi broj clanova polja:5

Upisi X[0]: 11

Upisi X[1]: 2

Upisi X[2]: 8

Upisi X[3]: 6

Upisi X[4]: 5

11

2

8

6

5

N=5. Zbroj 5 clanova polja iznosi 32

Oprez!

U radu s poljima treba biti oprezan jer jezik C++ ne provjerava granice polja prilikom pristupa članovima polja. Ako se navede prevelik ili negativan indeks, prevoditelj neće javiti pogrešku i pri izvršavanju programa pristupit će se memorijskoj adresi koja nije u području rezerviranom za polje. To će prouzročiti neispravan rad programa:

Ako se izdvaja (dohvaća) član s nedozvoljenim indeksom, rezultat je slučajni broj. Ako se vrijednost pridružuje članu s nedozvoljenim indeksom, vrijednost će se pohraniti u memoriju

na mjesto predviđeno za druge sadržaje što će vjerojatno prouzročiti pogrešan rad programa.

Višedimenzionalno polje

Neka npr. treba imenovati varijable u koje će biti pohranjen poštanski broj mjesta u Hrvatskoj i županija u kojoj se mjesto nalazi. To se može napraviti tako da se za svaku kombinaciju smisli posebno ime, npr. M1Z1, M2Z1, M1Z2, M2Z2 itd. S takvim varijablama je vrlo nespretno rukovati. Umjesto toga mnogo je bolje rabiti višedimenzionalno polje.

Članovi dvodimenzionalnog polja mogu se izdvojiti (dohvatiti) pomoću dva indeksa. Zamislimo li polje podataka kao tablicu onda prvi indeks određuje redak, a drugi stupac.

Prvi član polja ima indeks [0][0] a posljednji indeks [(broj redaka-1)][(broj stupaca-1)].

Za X[2][3] indeksi su:

X[0][0] X[0][1] X[0][2]

X[1][0] X[1][1] X[1][2]

Page 61: C++ osnove

Deklaracija

Deklaracija dvodimenzionalnog polja:

int X[2][3] X je dvodimenzionalno polje koje se može prikazati kao tablica s dva retka i tri stupca u kojima su pohranjeni podaci po tipu cijeli brojevi.

Pridruživanje vrijednosti

Pridruživanje vrijednosti članovima polja

int X[2][3]={ {..., ..., ...},

              {..., ..., ...} };Vrijednosti članova pojedinih redaka omeđuju se parom otvorena-zatvorena vitičasta zagrada

int X[2][3]={ {1, 2, 3},

              {4, 5, 6} }; Članovima polja mogu se pridružiti vrijednosti i prilikom deklaracije.

Zadatak:

Treba unijeti članove dvodimenzionalnog polja pa ih ispisati u obliku tablice.

int X[2][3]= { {1,2,3},

                    {4,5,6}};

Ispis je oblika:

1   2   34   5   6

Potrebno je koristiti ugniježđenu petlju for.

Rješenje:

#include <iostream>

using namespace std;

int main ()

{

            int i,j;

            int X[2][3]= { {1,2,3},

                           {4,5,6}};

Page 62: C++ osnove

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

            {

                        for(j=0;j<3;j++)

                        {

                                   cout<<X[i][j]<<" ";

                        }

                        cout<<endl;

            }

            return 0;

}

Rezultat:

1   2   3

4   5   6

Ako se primjer dopuni, uz vrijednost pojedinog člana niza bit će zapisani i njegovi indeksi.

#include <iostream>

using namespace std;

int main ()

{

            int i,j;

            int X[2][3]= { {1,2,3},

                           {4,5,6}};

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

            {

                        for(j=0;j<3;j++)

                        {

                                  cout<<"X["<<i<<"]["<<j<<"]= "<<X[i][j]<<"  ";

                        }

                        cout<<endl;

            }

            return 0;

}

Rezultat:

X[0][0]=1   X[0][1]=2   X[0][2]=3

X[1][0]=4   X[1][1]=5   X[1][2]=6

Page 63: C++ osnove

Ako se kod pridruživanja vrijednosti izostave vitičaste zagrade koje označavaju pojedine retke polja, članovi se popunjavaju po redu (red po red).

Ako pojedinim članovima nije pridružena vrijednost, pridružuje im se 0.

Znakovni niz

Ako je podatak znak, njegova oznaka tipa je char. Podatak tipa char je predstavljen jednim znakom unutar jednostrukih navodnika ili ASCII vrijednošću tog znaka (dekadska protuvrijednost).

 Primjer pridruživanja vrijednosti varijablama tipa char

char slovo1='A';Pridružen je znak označen jednostrukim navodnicima.

char slovo2=65;Pridružen je dekadski ekvivalent ASCII znaka.

Ako je podatak tekst (niz znakova) rabe se znakovni nizovi (engl. character strings). Znakovni niz je jednodimenzionalno polje čiji su članovi znakovi (engl. char). Sadržaj se u znakovni niz unosi između para dvostrukih navodnika. Npr.:

char X[] = "Ovo je znakovni niz"

a u memoriju se sprema:

'O' 'v' 'O' '' 'j' 'e' '' 'z' 'n' 'a' 'k' 'o' 'v' 'n' 'i' '' 'n' 'i'

Svaki znakovni niz završava zaključnim znakom '\0' (engl. null character). Taj znak ne treba posebno navoditi, ali treba znati da on zauzima jedno mjesto u memoriji.

Zadatak:

Treba prebrojiti koliko puta se pojavljuje slovo o u znakovnom nizu:

Koliko slova o ima u ovoj rečenici?

Ispis neka bude ovakav:

U znakovnom nizu: Koliko slova o ima u ovoj recenici? Ima ... slova o.

Rješenje:

#include <iostream>

using namespace std;

int main ()

{

Page 64: C++ osnove

            int i,brojo;

            brojo=0;

            char X[]="Koliko slova o ima u ovoj recenici?";

            for (i=0;X[i]!='\0';i++)

            {

                        if(X[i]=='o')

                        {

                                   brojo=brojo+1;

                        }

            }

            cout<<endl<<"U znakovnom nizu: Koliko slova o ima u ovoj recenici? Ima ";

            cout<<brojo<<" slova o."<<endl;

            return 0;

}

Rezultat:

U znakovnom nizu: Koliko slova o ima u ovoj recenici? Ima 6 slova o.

Sa znakovnim nizovima je moguće izvoditi različite operacije. Za većinu operacija postoje gotove funkcije u biblioteci cstring.

Valja razlikovati znakove od znakovnih nizova!