c++ osnove
TRANSCRIPT
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
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).
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).
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.
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:";
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
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
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
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).
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
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:
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),
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;
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:
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.
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;
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.
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;
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)
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
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.
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= ";
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
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 ....
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.
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)
{
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.
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.
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>
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:
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
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 ({}).
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;
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
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.
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:
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
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:
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>
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>
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:
#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:
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
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
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).
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
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.
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:
#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
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:
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:
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
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)
{
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:
...
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
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
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;
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:
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;
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]
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}};
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
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 ()
{
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!