Download - Vjezbe 1-8
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum:12.10.2010.
Razvojno okruženje
Na nastavi vježbi i workshopa predmeta Uvod u programiranje se koristi integrirano
razvojno okruženje Microsoft Visual Studio. Svi zadaci i primjeri s kojima ćete se
susretati u nastavnim materijalima ovog predmeta bit će riješeni u navedenom
razvojnom okruženju. Što se tiče izbora verzije Visual Studia sasvim je svejedno hoćete li
koristiti verziju 2005, 2008 ili 2010. Sve verzije su vrlo slične i svaka od njih je dostatna
za savladavanje sadržaja koji će se raditi na predmetu Uvod u programiranje. U nastavku
će biti predstavljeni koraci za izradu prvog C++ programa u Visual Studio 2010.
Nakon pokretanja programa pojavit će se osnovni prozor Visual Studija 2010.
Za pisanje standardnog C++ programa, prvo ćemo kreirati novi projekt:
File→ New→ Project.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
Izaberite Win32 Console Application.
U ovom koraku potrebno je i imenovati projekt. Nakon što ste odredili ime projektu
pokreće se Wizard u kojem izaberete opciju Empty project.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
Kreirani projekt se pojavljuje u prozoru koji se naziva Solution Explorer.
Budući da je projekt prazan, potrebno je u njega dodati .cpp datoteku (file). Novu
datoteku dodajte otvaranjem objektnog menija (desni klik) vašeg projekta i izborom
opcije Add →New Item …
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
4
Fakultet informacijskih tehnologija
Izaberite opciju C++ File (.cpp) i imenujte vašu datoteku.
Rezultat je prikazan na sljedećoj slici.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
5
Fakultet informacijskih tehnologija
Razvojno okruženje je spremno za pisanje prvog programa.
PRVI PROGRAM
Počet ćemo s jednostavnim programom koji ispisuje na ekran rečenicu: "STO JE DANAS
LIJEP DAN".
//Prvi program u C++
#include<iostream>
using namespace std;
void main ()
{
cout<<"STO JE DANAS LIJEP DAN ";
system ("pause");
}
Razmotrimo svaku od linija koda.
Prva linija:
//Prvi program u C++
započinje s dvije kose crte što znači da je riječ o jednolinijskom komentaru. Komentar
ima ulogu dokumentiranja, te olakšava čitljivost programa. Kompajler u potpunosti
igonorira komentare. (Osim ovakvog načina pisanja komentara možete imati i višelinijski
komentar koji započinje znakovima /*, a završava */).
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
6
Fakultet informacijskih tehnologija
Druga linija:
#include<iostream>
je predprocesorska direktiva (naredba) i ona se procesira prije nego se program
kompajlira. Sve predprocesorske direktive započinju znakom #. Ova linija omogućava
uključivajnje input/output stream datoteke zaglavlja (header file). U ovoj biblioteci se
nalazi izlazni tok (output stream) kao i funkcije koje omogućavaju ispis podataka na
ekranu. Ovu datoteku ćemo uključivati u svaki program koji budemo radili kako bi smo
bili u mogućnosti ispisivati podatke na ekran i unositi ih s tastature.
Treća linija :
using namespace std;
using i namespace su ključne riječi jezika C++ kojima se „aktivira“ odreĎeno područje
imena (imenik - namespace), a std je naziv imenika u kojem su obuhvaćene sve
standardne funkcije, uključujući i funkcije iostream biblioteke. Imenici su se kasno
pojavili u programskom jeziku C++, a uvedeni su da se izbjegne kolizija istih imena
funkcija ili varijabli iz različitih biblioteka. Na primjer, ako dvije različite funkcije iz
različitih biblioteka imaju isto ime, prevoditelj će prijaviti grešku. Kad ne bi postojali
imenici, jedino riješnje u takvom slučaju bi bilo promijeniti ime funkcije u jednoj od
biblioteka, što je ponekad nemoguće jer proizvoĎači redovito biblioteke isporučuju u
prevedenom obliku.
Četvrta linija:
void main ()
je takoĎer dio svakog C++ programa. Zagrade iza ključne riječi main ukazuju na to da
je riječ o funkciji. C++ programi se sastoje od mnoštva funkcija, od koji jedna mora
biti funkcija main. C++ programi se počinju izvršavati od funkcije main. Ključna
riječ void ukazuje na to da funkcija main "ne vraća" nikakvu vrijednost.
Lijevom vitičastom zagradom { započinje tijelo svake funkcije. U skladu s tim desnom
vitičastom zagradom } završava se tijelo svake funkcije.
Linija:
cout<<"STO JE DANAS LIJEP DAN ";
omogućava ispis niza znakova (koji se nalaze izmeĎu dvostrukih navodnika) na ekran.
Cijela linija, naredba cout, operator redirekcije << (eng. stream insertion operator), niz
karaktera i tačka-zarez, se naziva iskaz. Svaki iskaz u C++ programu mora završiti s
tačka-zarezom.
Ovako napisan program se naziva izvornim (source) kodom. Nakon pisanja izvornog koda
program je potrebno kompajlirati. U razvojnom okruženju Microsof Visual Studio program
ćete kompajlirati koristeći opciju Build → Compile ili kombinacijom tipki Ctrl+F7.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
7
Fakultet informacijskih tehnologija
Nakon kompajliranja u Output prozoru vidljive su informacije o procesu kompajliranja
(npr. je li kompajliranje bilo uspješno ili neuspješno, broj grešaka i upozorenja). U našem
primjeru kompajler nije pronašao niti jednu grešku. Vodite računa, kompajler će prijaviti
sintaktičke greške (nepravilno napisana naredba, zaboravljen točka-zarez isl), ali neće
prijaviti logičke pogreške.
Ukoliko je program uspješno kompjaliran
izaberite na meniju Debug opciju Start
Without Debugging (Ctrl +F5) ili opciju
Start Debugging (F5). Ukoliko izaberete
opciju Start Debugging (F5) terminalni
prozor će se otvoriti i zatvoriti prebrzo da
bi ste mogli vidjeti njegov sadržaj. Stoga
se u izvorni kod dodaje još jedna linija:
system ("pause");
koja će omogućiti da terminalni prozor
ostane otvoren, a njegov sadržaj vidljiv.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
8
Fakultet informacijskih tehnologija
Za sve one korisnike koji su imali prilike ranije vidjeti i koristiti biblioteku iostream.h,
korisno je reći da je iostream nov (Standardom propisani) naziv za iostream.h datoteku
zaglavlja. Ova promjena imena je posljedica uvoĎenja imenika, jer je bilo potrebno sve
standardne biblioteke uvrstiti u imenik std. Kako je tad već postojalo mnoštvo koda koji
je koristio iostream.h biblioteku, ona se zbog nespojivosti s tim starim kodom nije smjela
mijenjati. Rješenje je bilo definirati novu biblioteku sličnog imena u kojoj su definirane
sve funkcije kao i u staroj iostream.h biblioteci, ali unutar imenika std. Standard
dozvoljava upotrebu i starog nazivlja, ali se ono ne preporučuje.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum:19.10.2010.
Vrste podataka: varijable i konstante
Varijable/Promjenjive
Bez obzira na jezik u kojem je pisan, svaki program se sastoji od niza naredbi
koje mijenjaju vrijednost objekata pohranjenih u memoriji računara. Računar dijelove
memorije u kojima su smješteni objekti razlikuje pomoću pripadajuće memorijske
adrese. Kako programer tokom pisanja programa ne bi morao pamtiti memorijske
adrese, svi programski jezici omogućavaju da se vrijednostima objekata pristupa preko
simboličkih naziva, razumljivih ljudima. Iz perspektive računara objekt je samo dio
memorije u kojem je pohranjena njegova vrijednost u binarnom obliku.
U programskom jeziku C++ pod objektima se obično podrazumijevaju složeni tipovi
podataka, koje ćemo spominjati kasnije. Jednostavni objekti koji "pamte" jedan karakter,
cijeli ili realni broj se nazivaju varijablama (promjenjivim).
Da bi kompajler pravilno preveo naš izvorni C++ kod u mašinski jezik, svaku varijablu
treba prije njenog korištenja u kodu deklarirati.
Deklaracija varijable:
Tip Identifikator;
gdje Tip može biti bilo koji tip poznat kompajleru, a
Identifikator je ime varijable (ime mora biti jedinstveno).
Svrha: Ovakvom deklaracijom dajemo instrukciju C++ kompajleru da rezervira dovoljno
memorije za pohranu vrijednosti naznačenog tipa i poveže tu memorijsku lokaciju s
imenom (identifikatorom) varijable.
C++ dopušta da varijable deklarirate gotovo bilo gdje prije nego ih upotrijebite u
tijelu funkcije, no preporuka je da deklarirate sve varijable na početku funkcije kako bi
sve deklaracije varijabli bile na jednom mjestu, čime će se poboljšati čitljivost programa.
Preporučljivo je imenovati varijable imenima koja imaju značenje tj. da svojim imenom
ukazuju na ono što predstavljaju. TakoĎer, preporučljivo je ukratko komentirati koje to
vrijednosti sadrži odreĎena varijabla.
Prilikom imenovanja varijabli – odreĎivanja identifikatora, potrebno je voditi računa i o
sljedećem:
• ime varijable smije sadržavati samo slova engleske abecede (a, ..., z, A, ..., Z),
znamenke (0, ..., 9) i znak podvlačenja (underscore tj. _);
• prvi znak imena ne smije biti znamenka;
• ne preporučuje se da ime varijable počinje znakom podvlačenja niti da sva slova
imena budu velika;
• mala i velika slova se razlikuju (x i X su dva različita imena);
• ključne riječi jezika se ne mogu koristiti kao imena varijabli.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
Popis nekih od ključnih riječi u programskom jeziku C++:
Inicijalizacija varijable
Moguće je dodijeliti inicijalnu vrijednost varijabli prilikom njene deklaracije.
Tip Identifikator = Izraz;
gdje je: Izraz bilo koji validan izraz čija je vrijednosti istog tipa kao i Tip.
Svrha: ovim dajete varijabli inicijalnu vrijednost.
Deklaraciju/inicijalizaciju varijable možemo predstaviti uz pomoć sintaks dijagrama na
sljedeći način:
tip identifikator
izraz=
,
;
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
auto double int struct
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
Napomena:
Prilikom deklaracije varijabli treba paziti da se u istom dijelu programa NE smije
deklarirati više varijabli sa istim imenom, čak i ako su različitog tipa. Zato će u
slijedećem kodu kompajler javiti pogrešku o višekratnoj deklaraciji varijable a :
int a, b, c;
float a; //GREŠKA: ponovno korištenje naziva a
Konstante
C++ omogućava i deklaraciju podataka čije su vrijednosti konstantne (nepromjenjive).
Deklaracija konstanti je naročito korisna kada su u pitanju univerzalne konstante, poput
ili baze prirodnog logaritma, e.
const long double Pi = 3. 141592653589793;
const double e = 2.71828182846;
Deklaracija konstanti
Konstante deklariramo na sljedeći način:
const Tip Identifikator = Izraz;
gdje je: const C++ ključna rječ;
Tip može biti bilo koji tip poznat kompajleru;
Identifikator je ime konstante (ime mora biti jedinstveno);
Izraz je bilo koji validan izraz čija je vrijednosti istog tipa kao i Tip.
Svrha: Deklarira i osigurava vrijednosti za imenovanu konstantu. Bilo kakav pokušaj da
se tokom izvoĎenja programa promjeni vrijednost konstante je greška.
Deklaraciju konstanti možemo predstaviti i sintaks dijagramom:
tip identifikator izraz= ;const
Dva su bitna razloga za korištenje imenovanih konstanti u programu umjesto njihovih
vrijednosti: jedan od razloga je čitljivost, a drugi je mogućnost izmjene vrijednosti
konstante u deklaraciji (tj. samo na jednom mjestu).
Preporučljivo je deklarirati sve konstante na početku funkcije unutar koje će se koristiti.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
4
Fakultet informacijskih tehnologija
FAZE PROCESA PROGAMIRANJA
Prije nego naučene sadržaje o deklaraciji varijabli i konstanti primjenite na konkretnim
zadacima potrebno je reći nešto i o načinu rješavanja zadataka, tj. o fazama procesa
programiranja.
Postoji nekoliko faza u procesu programiranja:
1. Analiza i specifikacija problema
2. Dizajn
3. Kodiranje
4. Verifikacija i validacija
5. Održavanje
1. ANALIZA I SPECIFIKACIJA PROBLEMA
Prva faza se sastoji u analiziranju problema i preciznoj specifikaciji informacija
koje će se koristiti u rješavanju problema. Ove se informacije mogu klasificirati na
sljedeći način:
vrijednosti koje se moraju unijeti u program izvana – ulazne vrijednosti;
vrijednosti dane u problemu – konstantne vrijednosti;
vrijednosti koje se moraju producirati kao rješenje problema;
Specifikacija je zapravo proces identifikacije svake od ovih vrijednosti. Kada smo
napravili preciznu definiciju problema spremni smo dizajnirati njegovo rješenje.
2. DIZAJN
Druga faza se sastoji od tri koraka:
opis podatkovnih objekata koje ćemo koristiti u rješavanju problema;
opis operacija (aktivnosti) koje se moraju primijeniti na ove podatkovne objekte kako
bi se riješio problem;
odreĎivanje slijeda operacija koje će dovesti do rješenja problema;
Sekvencijalni niz operacija (aktivnosti) koji će dovesti do rješenja problema zove se
algoritam. Faza dizajniranja rezultira izradom algoritma, koji ustvari predstavlja model
rješenja problema.
Osim tri navedena koraka u ovoj fazi se odreĎuju i ograničenja. Npr. ukoliko se u
zadatku vrši dijeljenje razlomaka potrebno je postaviti ograničenje da je dijeljenje s
nulom (0) nedefinirano.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
5
Fakultet informacijskih tehnologija
Opis podatkovnih objekata
Kako bi smo opisali podatkovne objekte moramo ih identificirati prema vrsti, tipu
i imenu koje se vezuje uz odreĎeni podatkovni objekt. Ukoliko ste uspješno prošli fazu
analize i specifikacije problema ovaj korak će biti jednostavan.
Podatkovni objekti za ulazne i izlazne vrijednosti moraju biti varijable
(promjenjive), budući da će se njihove vrijednosti mijenjati od trenutka pokretanja do
trenutka izvršenja programa.
Opis operacija (aktivnosti)
Primjer operacija koje vode ka rješenju problema:
unos potrebnih vrijednosti
izvoĎenje operacija (npr. aritmetičkih )
dodjeljivanje vrijednosti izlaznim varijablama
ispis izlazne vrijednosti
Kreiranje algoritma
Algoritam možete kreirati na više načina; bilo da ga opišete svakidašnjim jezikom,
bilo pseudo jezikom ili da crtate dijagram toka.
Primjer algoritma predstavljenog dijagramom toka:
start
kraj
broj
suma=0
broj=0
suma+=broj
broj>=o
suma
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
6
Fakultet informacijskih tehnologija
3. KODIRANJE Treća faza je zapravo implementacija podatkovnih objekata i algoritma u neki od
programskih jezika.
4. VERIFIKACIJA I VALIDACIJA Jednom kada algoritam pretvorite u kod, četvrti korak u razvojnom ciklusu je
provjera jesu li algoritam i program korektni. Uobičajeni način je testiranje programa
sa setom podataka za koji unaprijed znamo tačan izlaz.
Ukoliko se program kompajlira i izvrši normalno, ali rezultati nisu korektni, onda je to
znak da program sadrži jednu ili više logičkih grešaka. Za razliku od sintaktičkih
pogrešaka, kompajler neće prepoznati logičku pogrešku. Stoga je od izuzetne važnosti da
korisnik pokrene program nekoliko puta koristeći set podataka za koji unaprijed zna
korektne rezultate. Proces testiranja programa iznimno je važan jer se program ne može
smatrati korektnim ukoliko nije provjeren više puta.
5. ODRŽAVANJE
Često puta nakon što je program napravljen, testiran i stavljen u upotrebu pojavit će se
potreba za nekim izmjenama u njemu.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
7
Fakultet informacijskih tehnologija
Zadaci za vježbu
ZADATAK 1: Dvije uobičajene skale za mjerenje temperature su Fahrenheit i Celsius.
Tačka ključanja vode je 212˚F ill 100˚C. Tačka zamrzavanja vode je 32 ˚F ili 0˚C. Ako
pretpostavimo da je odnos izmeĎu dvije skale moguće izraziti sljedećim izrazom F= 5
9C
+ 32 napravite program koji će konvertirati temperaturu izraženu u stupnjevima Celsiusa
u temperaturu izraženu u stupnjevima Fahrenheita.
Pri izradi programa poštujte sve faze procesa programiranja.
1. Analiza i specifikacija Input Output
Temperatura u stupnjevima Celzijusa Temperatura u stupnjevima Fahrenheita
2. Dizajn
Podatkovni objekt Vrsta vrijednosti Tip objekta Identifikator
Temperatura u
stupnjevima
Celzijusa
varijabla float TemperaturaC
Temperatura u
stupnjevima
Fahrenheita
varijabla float TemperaturaF
Dijagram toka:
Start
TemperaturaC
TemperaturaF=9/5*TemperaturaC+32
TemperaturaF
Kraj
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
8
Fakultet informacijskih tehnologija
3. Kodiranje
/*program za konvertiranje temperature izražene u stupnjevima
Celzijusa u temperaturu izraženu u stupnjevima Fahrenheita*/
#include <iostream>
using namespace std;
void main()
{
float
TemperaturaC; //temperatura u Celzijusima
float
TemperaturaF; //temperatura u Fahrenheitima
cout<< "Unesite temperaturu u C"<<endl;
cin >>TemperaturaC;
TemperaturaF=9*TemperaturaC/5+32; //napomena:vodite racuna o cjelobrojnom dijeljenju
cout<<"Temepratura u Farenheitima iznosi "<<TemperaturaF<<endl;
system ("pause");
}
4. Testiranje
Testiranje programa podrazumijeva unos u program skupa podataka za koje unaprijed
znate rezultate.
Npr. Tačka ključanja vode je na 212˚F, odnosno na 100˚C.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
9
Fakultet informacijskih tehnologija
ZADATAK 2: Pero Perić instalira optički kabl za kompaniju Metro City Cable Company.
Za svaku instalaciju naplaćuje se osnovna usluga u iznosu od 25,00 $ i dodatna usluga u
iznosu od 2,00$ za svaki metar postavljenog kabla. Potrebno je napraviti program koji će
računati ukupnu dobit od Perinog rada u toku mjeseca. Ako je Pero je instalirao 263
kilometra kabla na 27 različitih lokacija u toku mjeseca januara koliku je dobit ostvario za
svoju kompaniju? (Odgovor: 526 675$)
1. Analiza i specifikacija problema
Input Konstante Output
Broj instalacija Cijena osnovne usluge Dobit
Kilometri kabla Cijena kabla po metru
Ostale informacije –ime zaposlenika, ime kompanije i mjesec nisu relevantne za
rješavanje problema, stoga se mogu zanemariti.
2. Dizajn
Podatkovni objekti Vrsta vrijednosti Tip objekta Ime objekta
Broj instalacija varijabla integer Instalacije
Količina
upotrijebljenog kabla
u kilometrima
varijabla double KilometaraKabla
Količina
upotrijebljenog kabla
u metrima
varijabla double MetaraKabla
Dobit varijabla double Dobit
Osnovna usluga konstanta double OsnovnaUsluga
Cijena kabla po
metru
konstanta double CijenapoMetru
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
10
Fakultet informacijskih tehnologija
Dijagram toka:
Start
Instalacija
KilometaraKabla
OsnovnaUsluga=25.00;
CijenapoMetru=2.00;
MetaraKabla=1000 * KilometaraKabla
Dobit=Instalacija *OsnovnaUsluga+CijenapoMetru*MetaraKabla;
Dobit
Kraj
3. Kodiranje
/* Ovaj program računa dobit koju ostvaruje
zaposlenik postavljajući opticki kabl*/
#include <iostream>
using namespace std;
void main()
{
const double
OsnovnaUsluga = 25.00, //cijena osnovne usluge po instalaciji
CijenapoMetru = 2.00; // jedinična cijena kabla
int Instalacije; //broj instalacija
double KilometaraKabla, MetaraKabla, Dobit; //kilometara postavljenog kabla
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
11
Fakultet informacijskih tehnologija
cout<< "\nUnesite broj instalacija i "
<< "\nbroj kilometara upotrijebljenog kabla.\n";
cin>>Instalacije>>KilometaraKabla;
MetaraKabla = 1000 * KilometaraKabla;
Dobit = Instalacije * OsnovnaUsluga + CijenapoMetru * MetaraKabla;
cout<<"Dobit = "<< Dobit << " $\n\n";
system ("pause");
}
4. Testiranje Za testiranje izaberimo sljedeće podatke:
27 instalacija i 263 Km kabla
Dobit=27*25 + 263 * 2*1000=675 +526000=526675
5. Održavanje
A što ako se cijena osnovne usluge poveća na 30 $ ?
Umjesto:
const double OsnovnaUsluga = 25.00;
Pisat ćemo:
const double OsnovnaUsluga = 30.00;
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum: 22.10.2010.
DIJAGRAM TOKA (FLOWCHART)
Dijagram toka je sredstvo za vizualnu prezentaciju toka podataka, operacija koje se
izvode, te slijeda (sekvence) kojim se navedene operacije izvode u informacijskom
sistemu. Crtanje dijagrama toka je jedna od faza rješavanja problema i uvelike olakšava
pisanje programskog koda. Pri crtanju dijagrama toka potrebno je slijediti određena, te
koristiti standardne simbole koje je propisao American National Standard Institute.
CILJEVI
Po završetku ovog materijala razumjet ćete sljedeće koncepte:
značenje dijagrama toka
osnovne dijelove dijagrama toka (simboli i konektori)
prednosti i ograničenje dijagrama toka.
ZNAČAJ DIJAGRAMA TOKA
Dijagram toka je reprezentacija kojom ilustrirate sekvencu operacija koje je potrebno
izvršiti kako bi se došlo do rješenja problema. Dijagram toka se crta u ranoj fazi
formuliranja kompjuterskog rješenja. Dijagram toka olakšava komunikaciju između
programera i poslovnih ljudi. Dijagram toka igra značajnu ulogu u procesu programiranja
jer olakšava razumijevanje logike kompliciranih i opsežnih problema. Jednom kad ste
nacrtali dijagram toka postaje jednostavno napisati program u bilo kojem programskom
jeziku. Vrlo često je nemoguće objasniti logiku programa bez dijagrama toka. Osim toga,
dijagram toka je neizostavan dio dokumentacije bilo kojeg programa.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
SMJERNICE ZA CRTANJE DIJAGRAMA TOKA
Za crtanje dijagrama toka koriste se standardni simboli. Neke od često korištenih simbola
možete pogledati u sljedećoj tabeli:
Napomena
Bilješka
Komentar
terminalni simbol
(start, kraj)
unos podataka
simbol za procesiranje
simbol odluke
ispis (izlaz) podataka
simbol komentara
simbol konektora
(spajanje dijelova programa)
linije toka
predefinirani procesi
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
Pravila za crtanje dijagrama toka:
Da bi ste nacrtali korektan dijagram toka, potrebno je napraviti popis svih zahtijeva.
Dijagram toka treba biti pregledan i jednostavna za pratiti.
Dijagram tok treba biti jednoznačan (ne smije kod osobe koja ga gleda izazivati
višeznačne konotacije).
Uobičajen smjer toka je s lijeva na desno ili odozgo prema dolje.
U dijagramu toka kad je u pitanju simbol za procesiranje može postojati samo jedan izlaz
podataka.
ili
Kad je u pitanju simbol odluke može postojati samo jedan ulaz podataka, ali mogu
postojati dva ili tri izlaza podataka (jedan za svaki mogući odgovor).
> 0< 0
= 0
ili
> 0< 0
Terminalni simbol (start, kraj) također može imati samo jedan ulazni, odnosno jedan
izlazni tok podataka.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
4
Fakultet informacijskih tehnologija
Ukoliko želite jasnije opisati podatke ili korake koristite simbol za napomene/komentare
(annotation symbol).
Ukoliko je dijagram toka kompleksan bolje je koristiti simbole konektora kako bi ste
reducirati broj linija toka. Izbjegavajte presijecanje (križanje) linija.
Vodite računa da vam dijagram toka ima logičan početak i kraj.
PREDNOSTI
Prednosti dijagrama toka su:
Komunikacija: Dijagram toka olakšava komunikaciju svih koji su zainteresirani za
rješavanje problema.
Efektivna analiza: Uz pomoć dijagrama toka problem se može efektivnije
analizirati problem.
Odgovarajuća dokumentacija: Dijagram toka je dio obavezne programske
dokumentacije, koja može služiti u različite svrhe.
Efikasno kodiranje: Korektan dijagram toka olakšava pisanje programa (bez
obzira u kojem programskom jeziku).
Otklanjanje grešaka: Dijagram toka olakšava pronalaženje grešaka.
Efikasno održavanje programa: Olakšava održavanje programa.
OGRANIČENJA
Kompleksnost: Ponekad je problem kompleksan, pa je i dijagram toka kojim ga
pokušavate predstaviti kompleksan i „nezgrapan“.
Alternative i održavanje: U slučaju potrebe za alternativnim rješenjima vrlo često
je neophodno dijagram toka nacrtati ponovno (iz početka).
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum:26.10.2010.
OPERATOR SIZEOF
Operator sizeof je unarni operator koji kao rezultat daje broj bajta što ih operand
zauzima u memoriji računara.
Valja naglasiti da standard C++ jezika ne definira veličinu bajta, osim u smislu rezultata
što ga daje sizeof operator; tako je sizeof (char) jednak 1. Naime, duljina bajta ovisi o
arhitekturi računara. Mi ćemo podrazumijevati da bajt sadrži 8 bita.
Operand sizeof operatora može biti identifikator tipa ili konkretni objekt koji je već
deklariran:
Na primjer:
float f;
cout<<sizeof (f);
ili
cout<<sizeof(float);
Operator sizeof se može primijeniti na izraz, koji se u tom slučaju ne izračunava već se
određuje duljina njegovog rezultata.
float f;
int i;
cout<< sizeof(f*i);
Operator sizeof se može primijeniti i na pokazivače, reference, polja, strukture, unije i
objekte. Ne može se primijeniti na funkcije, ali se može primijeniti na pokazivače na
funkcije. U svim slučajevima on vraća ukupnu duljinu tih objekata izraženu u bajtima.
Rezultat operatora sizeof je tipa size_t, cjelobrojni tip bez predznaka koji ovisi o
implementaciji kompajlera.
Operator sizeof se uglavnom koristi kod dinamičkog alociranja memorijskog prostora
kada treba izračunati koliko memorije treba osigurati za neki objekt.
Mi ćemo operator sizeof iskoristiti da saznamo koliko je bajta memorije potrebno za
pohranu svakog od tipova podataka koje smo do sad spominjali.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
ZADATAK: Napišite program koji će ispisati veličinu svih tipova podataka (koje
poznajete) izraženu u bajtima.
#include <iostream>
using namespace std;
void main() { cout << "Velicina int-a je:\t"<< sizeof(int)<<endl; cout << "Velicina short int-a je:\t"<<sizeof(short)<<endl; cout << "Velicina long int-a je:\t"<< sizeof(long)<<endl; cout << "Velicina char-a je:\t"<< sizeof(char)<<endl; cout << "Velicina float-a je:\t"<< sizeof(float)<<endl; cout << "Velicina double-a je:\t"<< sizeof(double)<<endl; system ("pause"); }
Zašto je važno znati koliko bajta je potrebno za pohranjivanje nekog tipa podatka? Broj
bajta je u direktnoj vezi s rasponom vrijednosti koje može pohraniti taj tip podatka.
Uzmimo na primjer tip podatka char. Za pohranu tipa podatka char potreban jedan bajt
memorije, tj. 8 bita. Budući da se sa 8 bita može predstaviti 28-1=256-1=255 različitih
vrijednosti, to znači da će se tipom podatka char moći predstaviti najviše 255 različitih
znakova. Provjerite u sljedećoj tablici raspon vrijednosti koje može poprimiti tip podatka
char.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
Tip Veličina/potrebno memorije Raspon vrijednosti
char 1byte signed: -128 do 127
unsigned: 0 do 255
short int
(short) 2bytes
signed: -32768 do 32767
unsigned: 0 do 65535
int 4bytes signed: -2147483648 do 2147483647
unsigned: 0 do 4294967295
long int
(long) 4bytes
signed: -2147483648 do 2147483647
unsigned: 0 do 4294967295
bool 1byte true ili false
float 4bytes 3.4e +/- 38 (7 znamenki)1
double 8bytes 1.7e +/- 308 (15 znamenki)
long double 8bytes 1.7e +/- 308 (15 znamenki)
No, šta se desi ukoliko podatku tipa integer pokušamo dodijeliti vrijednost veću od
2147483647 (vidi tablicu)? Ili tipu podatka float vrijednost veću od 3.4 3810 ? Ovi
pokušaji će rezultirati pojavom koja se naziva prekoračenje opsega tipa podatka.
ZADATAK: Napišite program koji će pokušati povećati vrijednost cjelobrojne varijable
Broj=2147483647 za 1.
/* Ovaj program demonstrira prekoračenje
opsega vrijednosti cjelobrojnog tipa podatka*/
void main() { int Broj=2147483647; cout << "Vrijednost varijable je:" << Broj << endl; Broj=Broj+1; cout << "nakon sabiranje sa 1 je:" << Broj << endl; system ("pause"); }
Koja vrijednost će biti ispisana naredbom:
cout << "nakon sabiranje sa 1 je:" << Broj << endl; ? (Najmanja moguća.)
1 riječ je o zapisu decimalnih brojeva tehnikom pomičnog (kliznog) zareza; prvi broj je baza ili mantisa, oznaka e upućuje na činjenicu da se baza mniži s 10, a broj koji se pojavljuje iza oznake e je eksponenet;
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
4
Fakultet informacijskih tehnologija
Ili
Pokušajte povećati vrijednost varijable unsigned short int Broj=65535 za 1.
/* Ovaj program demonstrira prekoračenje opsega
vrijednosti unsigned short int tipa podatka*/
#include <iostream>
using namespace std;
void main() { unsigned short int Broj; Broj =65535; cout << "Vrijednost varijable je:" << Broj << endl; Broj=Broj+1; cout << "Nakon sabiranje sa 1 je:" << Broj << endl; system ("pause"); }
Koja vrijednost će biti ispisana naredbom:
cout << "Nakon sabiranje sa 1 je:" << Broj << endl; (Najmanja moguća.)
Šta zaključujete?
Niste dobili matematički korektne rezultate (u prvom slučaju 2147483648; u drugom
slučaju 65536 ), već ste dobili najmanju moguću vrijednost koju može poprimiti
navedeni tip podatka (u prvom slučaju -2147483648; u drugom slučaju 0). Odnosno, u
slučaju prekoračenja opsega vrijednosti – vrijednosti se ponavljaju od najmanje ka
najvećoj.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum: 01.11.2010.
Operatori i izrazi
U C++ izrazi su niz podataka (operanda) i operatora kombiniranih tako da rezultiraju
nekom vrijednošću.
Na primjer:
2.2 + 3.3
je izraz koji se sastoji od dva operanda ( 2.2 i 3.3), te jednog operatora (+), a rezultira
vrijednošću 5.5.
Budući da su svi operatori i njihov prioritet objašnjeni u predavanjima pozabavimo se
njihovom primjenom.
Zadatak 1: Izračunajte vrijednosti sljedećih izraza, te obrazložite dobivene rezultate!
a. R1=70-5%3*4+9
b. R2=7*10-5%3*4+9
c. R3=(7*(10-5)%3)*4+9
d. R4=7%5%3
e. R5=7%(5%3)
f. R6=(7%5%3)
U Zadatku 1 koristimo aritmetičke operatore (+,-,*, %), pri čemu operator množenja (*)
i operator modulo (% - ostatak cjelobrojnog dijeljenja) imaju viši prioritet od operatora
zbrajanja (+) i oduzimanja (-).
Osim toga, operatori +,/,*,% su operatori asocijativni s lijeva, što znači da ukoliko imate
dva operatora istog prioriteta najprije primjenjujete onaj koji zauzima krajnju lijevu
poziciju.
U primjeru b.
R1=7*10-5%3*4+9
primjenom navedenih pravila o prioritetu i asocijativnosti, dobit ćemo sljedeći
međurezultat:
R1=70-2*4+9
ponovnom primijenimo navedenih pravila, dobit ćemo:
R1=70-8+9
a krajnji rezultat je
R1=71.
Upotrebom zagrada možemo promijeniti uobičajeni redoslijed izvršavanja operacija.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
U primjeru c.
R3=(7*(10-5)%3)*4+9
imamo iste operande kao i u primjeru b. ali je zbog uvođenja zagrada redoslijed primjene
operatora potpuno drugačiji.
Prvo rješavamo izraz u zagradi (10-5):
R3=(7*5%3)*4+9
Sljedeći izraz koji rješavamo je (7*5%3), a to rezultira slijedećim međurezultatom:
R3=(35%3)*4+9
iz čega slijedi:
R3=2*4+9
a konačni rezultat je
R3=17.
/* Izrazi - prioritet operatora*/
#include <iostream> using namespace std; void main() { int R1,R2,R3,R4,R5,R6;//sve variajble su deklarirane kao cjelobrojne jer su i operandi cjelobrojni R1=70-5%3*4+9; cout<<"Rezultat izraza 70-5%3*4+9 je "<<R1<<endl; R2=7*10-5%3*4+9; cout<<"Rezultat izraza 7*10-5%3*4+9 je "<<R2<<endl; R3=(7*(10-5)%3)*4+9; cout<<"Rezultat izraza (7*(10-5)%3)*4+9 je "<<R3<<endl; R4=7%5%3; cout<<"Rezultat izraza 7%5%3 je "<<R4<<endl; R5=7%(5%3); cout<<"Rezultat izraza 7%(5%3) je "<<R5<<endl; R6=(7%5%3); cout<<"Rezultat izraza (7%5%3) je "<<R6<<endl; system ("pause"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe http://dl.fit.ba/
Fakultet informacijskih tehnologija
Zadatak 2: Ako su vrijednosti varijabli R1=2.0, R2=3.0, R3=4.0, a vrijednosti varijabli I1=4, I2=5 i I3=8, izračunajte vrijednosti sljedećih
izraza, te obrazložite dobivene rezultate!:
a=R1+R2+R3
b=I3/3
c=I3/3.0
d=(R2+R1)*I1
e=I3/I2*5.1
f=I1++
g=++I2
h=R1++
i=(I2<R2)&&(R2>R1)
j=(I3==I1)||(R2>=R1)
k=(I2!=R2)||(R2<=R1)
/* Izrazi - prioritet operatora*/ #include <iostream> using namespace std; void main() { float R1=2.0, R2=3.0, R3=4.0, a, h; double c,d,e; int I1=4, I2=5, I3=8, b, f,g; bool i,j,k; //rezultati ovih izraza mogu biti ili istina ili laz a=R1+R2+R3;//varijabla a je realna vrijednost - zbrajate tri realne vrijednosti cout<<"Rezultat izraza R1+R2+R3 je "<<a<<endl; b=I3/3; //varijabla b je cjelobrojna vrijedost-dijelite dvije cjelobrojne vrijednosti cout<<"Rezultat izraza I3/3 je "<<b<<endl; c=I3/3.0; //varijabla c je realna vrijednost-dijelite cijeli broj s realnim brojem cout<<"Rezultat izraza I3/3.0 je "<<c<<endl;
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe http://dl.fit.ba/
Fakultet informacijskih tehnologija
d=(R2+R1)*I1; //varijabla d je realna vrijednost - vrsimo operacije nad operandima razlicitog tipa cout<<"Rezultat izraza (R2+R1)*I1 je "<<d<<endl; e=I3/I2*5.1;//varijabla e je realna vrijednost- vrsimo operacije nad operandima razlicitog tipa cout<<"Rezultat izraza I3/I2*5.1 je "<<e<<endl; f=I1++;//varijabla f je cjelobrojna vrijednost-operator inkrementa se primjenjuje iskljucivo na cjelobrojne vrijednosti cout<<"Rezultat izraza I1++ je "<<f<<" a vrijednost varijable I1 je "<<I1<<endl; //nakon izvrsavanja ovog izraza f ima vrijednost 4, a I1 ima vrijednost 5 g=++I2; //varijabla g je cjelobrojna vrijednost cout<<"Rezultat izraza ++I2 je "<<g<<" a vrijednost varijable I2 je "<<I2<<endl; //nakon izvrsavanja ovog izraza g ima vrijednost 6, a I1 ima vrijednost 6 h=R1++;//iako kompjaler nece prijaviti gresku NE PRIMIJENJUJTE operator inkrementa na realne vrijednosti cout<<"Rezultat izraza R1++ je "<<h<<" a vrijednost varijable R1 je "<<R1<<endl; i=(I2<R2)&&(R2>R1);//varijabla i je logickog tipa (bool)-kompajler predstavlja true kao 1, a false kao 0 cout<<"Rezultat izraza (I2<R2)&&(R2>R1) je "<<i<<endl; j=(I3==I1)||(R2>=R1);//varijabla j je logickog tipa (bool)-kompajler predstavlja true kao 1, a false kao 0 cout<<"Rezultat izraza (I3==I1)||(R2>=R1) je "<<j<<endl; k=(I2!=R2)||(R2<=R1);//varijabla k je logickog tipa (bool)-kompajler predstavlja true kao 1, a false kao 0 cout<<"Rezultat izraza (I2!=R2)||(R2<=R1) je "<<k<<endl; system ("pause"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe http://dl.fit.ba/
5
Fakultet informacijskih tehnologija
Za rješavanje naredna tri zadatka upotrijebit ćemo uvjetni operator (izraz). Sintaksu
uvjetnog operatora možemo predstaviti uz pomoć dijagrama na sljedeći način:
Izraz kojim se
izražava uvjet? izraz2 izraz3: ;
ili
izraz_1?izraz_2:izraz_3;
Značenje: izraz_ 1 se evaluira i ukoliko je istinit, izvršava se izraz_2, u protivnom se
izvršava izraz_3.
Uvjetni operator nam po prvi put omogućava da ostvarimo grananja u programu.
Zadatak 3:
Napišite program koji će omogućiti unos dva cijela broja, usporediti ih, te ispisati veći
broj. Obavezno upotrijebite uvjetni operator. Poštujte sve faze procesa programiranja.
Analiza i specifikacija
Input: dva cijela broja
Output: veći od dva unesena broja
Konstanti: nema
Podatak Vrsta vrijednosti Tip podatka Identifikator/ime
broj1 var int broj1
broj2 var int broj2
Dizajn
Start
kraj
broj1
broj2
broj1>=broj2
broj1 broj2
da ne
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe http://dl.fit.ba/
6
Fakultet informacijskih tehnologija
Kod
/* Upotreba uvjetnog operatora*/ #include <iostream> using namespace std; void main() { int broj1, broj2; cout<<"Unesite dva cijela broja"<<endl; cin>>broj1>>broj2; (broj1>=broj2)?cout<<"veci je "<<broj1:cout<<"veci je "<<broj2; /* obratite paznju na operator >=; izabrali smo ovaj operator jer u slučaju da unesete dva ista broja program nece nista ispisati*/ system ("pause"); }
Problem smo mogli riješiti i uvođenjem dodatne varijable rezultat:
/* Upotreba uvjetnog operatora*/ #include <iostream> using namespace std; void main() { int broj1, broj2, rezultat; cout<<"Unesite dva cijela broja"<<endl; cin>>broj1>>broj2; rezultat=(broj1>=broj2)?broj1:broj2; cout<<"veci je "<<rezultat<<endl; system ("pause"); }
Zadatak 4: Napišite program koji će za uneseno malo slovo engleske abecede ispisati to
isto slovo samo veliko i obrnuto, za uneseno veliko slovo ispisati malo. Obavezno
upotrijebite uvjetni operator. Poštujte sve faze procesa programiranja.
Napomene: Prisjetite se osobina tipa podatka character! Kakav je tip podatka character?
Kako se kompajler "ponaša" prema tipu podatka char? Koje vrijednosti imaju velika i
mala slova prema ASCII kodnoj shemi?
Analiza i specifikacija
Input: slovo (malo/veliko) engleske abecede
Output: odgovarajuće (veliko/malo) slovo engleske abecede
Konstanti: nema
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator/ime
slovo engleske abecede var char znak
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe http://dl.fit.ba/
7
Fakultet informacijskih tehnologija
start
kraj
znak
(znak>=97)&&(znak<=122)
char (znak-32) char (znak+32)
da ne
/* Upotreba uvjetnog i casting operatora*/ #include <iostream> using namespace std; void main() { char znak; cout<<"Unesite slovo engleske abecede"<<endl; cin>>znak; ((znak>=97)&&(znak<=122))? cout<<char(znak-32):cout<<char (znak+32); system ("pause"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe http://dl.fit.ba/
8
Fakultet informacijskih tehnologija
Zadatak 5: Napišite program koji će omogućiti unos troznamenkastog cijelog broja, a
ispisati srednju znamenku tog broja.
Analiza i specifikacija
Input: troznamenkasti broj
Output: jednoznamenkasti broj (srednja znamenka)
Konstanti: nema
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator/ime
Troznamenkasti broj varijabla int broj
Jednoznamenkasti broj varijabla int desetice
Start
broj
desetice=broj/10%10
broj>=100&&broj>=100
End
desetice
da
Niste unijeli troznamenkasti broj
ne
Isti učinak možete postići i nekom drugom kombinacijom operatora i operanada.
Pokušajte sami!
#include <iostream> using namespace std; void main() { int broj, desetice; cout<<"Unesite broj"<<endl; cin>>broj; if (broj>=100 && broj <= 999) { desetice=(broj/10)%10; cout<<"znamenka desetica je "<<desetice; } else cout<<"Niste unijeli troznamenkasti broj"<<endl; system ("pause>null"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum:08.11.2010.
PROGRAMSKA STRUKTURA SELEKCIJA
Svi dosadašnji zadaci i primjeri izvršavali su se sekvencijalno, odnosno sve naredbe
unutar programa su se izvršavale onim redom kojim su se pojavljivale. No, sekvencijalno
izvršavanje naredbi nije dostatno za rješavanje iole kompleksnijih problema. Stoga je
potrebno uvesti kontrolnu (programsku) strukturu – selekciju.
Selekcija se u C++ može predstaviti sljedećim iskazima:
if iskazom
if – else iskazom i
switch iskazom.
IF ISKAZ
Sintaksu if iskaza možemo predstaviti:
if (uvjet) {blok_naredbi;}
Ili sintaks dijagramom:
if ( )
Izraz koji
predstavl
ja uvjet
iskaz
izraz
{ }
gdje je if ključna riječ (u našem jeziku se prevodi sa ako);
uvjet je izraz čija je vrijednost tipa bool (istina/laž);
blok naredbi je niz naredbi koje će se izvršiti u slučaju da je vrijednost izračunatog izraza
istina;
If iskaz koristimo da predstavimo sljedeći tok aktivnosti:
uvjet
predstavljen
izrazom
neka aktivnost
da
ne
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
Na primjer:
if (rezultat_testa<60) cout<<"Pali ste na testu!";
Uvjet (rezultat_testa<60) se provjerava (evaluira) i ako je istinit, ispisuje se poruka
"Pali ste na testu!" . Ukoliko uvjet nije istinit iskaz cout<<"Pali ste na testu!";
neće biti izvršen. Izvršavanje programa se nastavlja na prvoj sljedećoj naredbi.
U prethodnom primjeru unutar if iskaza se nalazi samo jedna naredba (cout<<"Pali ste
na testu!";), no moguće je i da ukoliko je uvjet istinit treba izvršiti više naredbi. U tom
slučaju govorimo o bloku naredbi i koristimo vitičaste zagrade {}.
Na primjer:
if (radni_sati>40) { prekovremeni=radni_sati - 40; honorar=prekovremeni*satnica; }
Primjer: Napišite program za jednostavnu igru pogađanja brojeva (u intervalu od 1 do
10).
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator
Broj koji unosi
korisnik
varijabla int pokusaj
Broj koji predstavlja
pogodak
varijabla int pogodak
#include <iostream> using namespace std; void main() { int pogodak = 7; int pokusaj; cout << "Zamislio sam broj izmedju 1 i 10" << endl; cout << "Pokusajte pogoditi o kojem je broju rijec " << endl; cin >> pokusaj; if (pokusaj == pogodak)
cout << "Nevjerojatno, pogodili ste" << endl; system ("pause"); }
broj==pokusaj
da
ne
start
kraj
broj
pokusaj=7;
Bravo,
pogodili
ste!!!
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
Program radi,ali potrebna su neka poboljšanja. Ako korisnik unese broj 7, dobije poruku
"Nevjerojatno, pogodili ste". Šta se događa ukoliko unesete pogrešan broj? Ništa. Nema
nikakve poruke, nikakve sugestije.
Ukoliko želimo korisniku uputiti poruku da nije pogodio traženi broj nužno je upotrijebiti
if-else iskaz.
IF – ELSE ISKAZ
Sintaksu if-else iskaza možemo predstaviti:
if (uvjet) {blok_naredbi_1;} else {blok_naredbi_2;}
Ili sintaks dijagramom:
if ( )
Izraz koji
predstavl
ja uvjet
iskaz
izraz
{ } else
iskaz
izraz
{ }
gdje je if ključna riječ (u našem jeziku se prevodi sa ako);
else je također ključna riječ (u našem jeziku se prevodi sa inače)
uvjet je izraz čija je vrijednost tipa bool (istina/laž);
blok naredbi_1 je niz naredbi koje će se izvršiti u slučaju da je vrijednost izračunatog
izraza istina;
blok naredbi_2 je niz naredbi koje će se izvršiti u slučaju kad vrijednost izračunatog
izraza nije istinita;
If- else iskaz koristimo da predstavimo sljedeći tok aktivnosti:
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
4
Fakultet informacijskih tehnologija
Na primjer:
if (rezultat_testa<60) cout<<"Pali ste na testu!"; else cout<<"Polozili ste test!";
Uvjet (rezultat_testa<60) se provjerava (evaluira) i ako je istinit, ispisuje se poruka
"Pali ste na testu!" . Ukoliko uvjet nije istinit izvršit će se iskaz cout<<"Polozili
ste test!";.
Vratimo se ponovno našem primjeru.
Upotrijebimo if-else iskaz kako bi smo upozorili korisnika u slučaju kad njegov pokušaj
pogađanja traženog broja nije korektan.
broj==pokusaj
start
kraj
broj
pokusaj=7;
Bravo,
pogodili
ste!!!
Zao mi je,
niste
pogodili
da ne
Poboljšali smo program. Korisnik će dobiti odgovor i kada je njegov pokušaj pogađanja
korektan i kada nije. Ali pokušajmo prilagoditi program tako da bude sličniji stvarnoj
situaciji. Što obično kažete kada je odgovor pogrešan? Broj je veći od tvog pokušaja ili
broj je manji od tvog pokušaja.
#include <iostream> using namespace std; void main() { int pogodak = 7; int pokusaj; cout << "Zamislio sam broj izmedju 1 i 10" << endl; cout << " Pokusajte pogoditi o kojem broju je rijec "<<endl; cin >> pokusaj; if (pokusaj == pogodak) cout <<"Nevjerojatno, pogodili ste" << endl; else cout <<"Zao mi je, niste pogodili"<< endl; system ("PAUSE>null"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
5
Fakultet informacijskih tehnologija
broj==pokusaj
start
kraj
broj
pokusaj=7;
Bravo,
pogodili
ste!!!
da ne
broj>pokusaj
Unijeli ste
veci broj
od
trazenog.
Unijeli ste
manji broj
od
trazenog.
da ne
#include <iostream> using namespace std; void main() { int pogodak = 7; int pokusaj; cout << "Zamislio sam broj izmedju 1 i 10" << endl; cout << " Pokusajte pogoditi o kojem broju je rijec "<<endl; cin >> pokusaj; if (pokusaj == pogodak) cout <<"Nevjerojatno, pogodili ste" << endl; else { if (pokusaj>pogodak) cout <<"Zao mi je, niste pogodili. Unijeli ste prevelik broj"; else cout<<"Zao mi je, niste pogodili. Unijeli ste premali broj"<<endl; } system ("PAUSE>null"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
6
Fakultet informacijskih tehnologija
Primjećujete da se u bloku neposredno iza ključne riječi else pojavljuje novi if-else iskaz.
Riječ je o tzv. Ugniježđenom if-else iskazu, odnosno if-or-if-else formatu (strukturi).
Program je moguće još poboljšati. Naime, mogli smo umjesto da u kodu zadamo broj koji se pogađa (int pogodak = 7;) koristiti funkciju koja generira „slučajni“ broj. Riječ je o
funkciji rand () iz biblioteke <cstdlib>. No, ukoliko upotrijebimo funkciju rand () bez
dodatnih ograničenja funkcija će generirati „slučajni“ broj u intervalu od 1 do 32676.
Riječ „slučajni“ je pod navodnicima jer je zapravo riječ o generiranju broja po određenom
algoritmu. Dakle, tako da dobiveni broj nije slučajan u pravom smislu te riječi, ali je
moguće dobiti dovoljan broj različitih brojeva prije nego se skvenca počne ponavljati.
Npr. #include <iostream> #include <cstdlib> using namespace std; void main() { int slucajni_broj = rand(); cout<<slucajni_broj<<endl; }
Kako bi smo ograničili generiranje „slučajnog“ broja na interval od 1 do 10, potrebno je
učiniti sljedeće:
int pogodak = rand()%10+1;
/* na vrijednost koju funkcija rand vrati ćemo primjeniti cjelobrojno dijeljenje s 10 (čiji je mogući rezultat 0,1,2,3,4,5,6,7,8 i 9) te ćemo dodati +1 (kako bi se mogao dobiti i broj 10)*/
I ovako poboljšan program ima neke nedostatke. Svaki uput kad pokrenete program
dobijete isti broj (istu vrijednost). Ukoliko želite da svaki put prilikom pokretanja
programa dobijete različit broj potrebno je upotrijebiti još jednu funkciju i još jednu
biblioteku:
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; void main() { srand((unsigned)time(0)); int slucajni_broj = rand()%10+1; cout << slucajni_broj << endl; }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
7
Fakultet informacijskih tehnologija
ZADATAK: Većina velikih svjetskih gradova redovito vrši mjerenja zagađenja zraka.
Očitavanja se vrše u 12:00 sati na tri različita mjesta u gradu. Prosječna vrijednost ova
tri očitanja se naziva indeks zagađenja. Napišite program za računanje indeksa
zagađenja, te ispišite odgovarajuće poruke. Vrijednost indeksa zagađenja veća ili jednaka
50 smatra se rizičnom, a vrijednost manja od 50 se smatra prihvatljivom.
Analiza i specifikacija problema
Input: mjerenje 1, mjerenje 2, mjerenje 3
Output: indeks zagađenja
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator
mjerenje 1 varijabla float mjerenje1
mjerenje 2 varijabla float mjerenje2
mjerenje 3 varijabla float mjerenje3
indeks zagađenja varijabla float indeks
Start
kraj
mjerenje1,
mjerenje2,
mjerenje3
indeks=(mjerenje1
+mjerenje2+mjere
nje3)/3
indeks>=50
Indeks
zagađenja
je rizičan
Indeks
zagađenja
je
prihvatljiv
da ne
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
8
Fakultet informacijskih tehnologija
Kod
// upotreba if-else iskaza #include <iostream> using namespace std; void main() { float mjerenje1,mjerenje2,mjerenje3,indeks; const int broj_mjerenja =3; cout<<"Unesite vrijednosti sva tri mjerenja"<<endl; cin>>mjerenje1>>mjerenje2>>mjerenje3; indeks=(mjerenje1+mjerenje2+mjerenje3)/broj_mjerenja; if (indeks>=50) cout<<"Indeks zagadjenja je rizican i iznosi "<<indeks<<endl; else cout<<"Indeks zagadjenja se smatra prihvatljivim, a iznosi "<<indeks<<endl; system("pause>null"); }
ZADATAK: Napišite program za izračunavanje indeksa tjelesne mase (BMI) te ispišite
odgovarajuće poruke. Indeks tjelesne mase se računa po formuli:
BodyMassIndex=2sin avi
masa. Masa se izražava u kilogramima, a visina u metrima. Ukoliko
vam je indeks tjelesne mase u rasponu od 20 do 25 vaša tjelesna masa je u skladu s
vašom visinom, ukoliko je vaš BMI manji od 20 pothranjeni ste, a ukoliko je veći od 25
naginjete gojaznosti.
Napomena: za rješavanje zadatka primijenite if-or-if-else format
Analiza i specifikacija problema
Input: masa u kg, visina u metrima
Output: BMI
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator
masa varijabla float Masa
visina varijabla float Visina
BMI varijabla float BMI
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
9
Fakultet informacijskih tehnologija
Start
kraj
masa,
visina
BMI=masa/visina2
(BMI>=20 )
&&
(BMI<=25)
Vasa masa
odgovoara
vasoj visini
da
BMI<20
Pothranjeni
ste
Naginjete
gojaznosti
ne
da
ne
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
Fakultet informacijskih tehnologija
Kod
// if-or-if-else format #include <iostream> #include <cmath> using namespace std; void main() { float masa, visina, BMI; cout<<"Unesite masu u kilogramima"<<endl; cin>>masa; cout<<"Unesite visinu u metrima"<<endl; cin>>visina; BMI=masa/pow(visina,2); if ((BMI>=20)&& (BMI<=25)) // u direktnom bloku se nalazi samo jedna naredba-nisu potrebne viticaste zagrade cout<<"Vasa masa je u skladu s vasom visinom, a BMI iznosi "<<BMI<<endl; else //u alterantivnom bloku se nalazi vise naredbi-potrebne viticaste zagrade { if (BMI<20) cout<<"Pothranjeni ste "<<endl; else cout<<"Naginjete gojaznosti"<<endl; } system("pause"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum: 18.11.2010.
VIŠESTRUKI IZBOR: SWITCH ISKAZ
U prethodnom materijalu smo govorili o strukturi izbora i iskazima kojim ju je moguće
predstaviti. Spominjali smo jednostruki izbor (if iskaz) i dvostruki izbor (if-elese iskaz).
C++ nudi i mogućnost višestrukog izbora korištenjem iskaza switch.
Sintaksa switch iskaza se može predstaviti sintaks dijagramom:
switch ( )Cjelobrojni
izraz{ }
case konstanta :
default :
iskaz
izraz
iskaz
izraz
ili
switch (cjelobrojni_izraz) {
case konstanta _1: prvi_blok_naredbi; break; case kostanta_2: drugi_blok_naredbi; break; case kostanta_3: treći_blok_naredbi; break; . . . case kostanta_n: n-ti blok naredbi; break; default: m-ti blok naredbi;
}
Na dijagramu toka višestruki izbor se može predstaviti na više načina; u
nastavku je jedan od njih:
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
case 1
case 2
case n
iskaz 1 break
break
break
iskaz 2
iskaz n
default iskaz
switch(izraz)
.
.
.
da
da
da
ne
ne
ne
Gdje su:
switch i default ključne (rezervirane) riječi;
cjelobrojni_izraz je izraz čiji je rezultat cjelobrojna vrijednost (ili vrijednost
kompatibilna s cjelobrojnom vrijednošću );
case konstanta_n je niz mogućih slučajeva.
Za izvršavanje switch iskaz najprije se evaluira cjelobrojni izraz. Ukoliko se izračunata
vrijednost nalazi na popisu mogućih slučajeva (case konstanta_n), izvršavanje programa
se nastavlja na bloku naredbi iza navedenog slučaja i prekida se kada dođe do iskaza
break.
Ukoliko se vrijednost cjelobrojnog izraza ne nalazi na popisu mogućih slučajeva
izvršavaju se naredbe koje se nalaze iza ključne riječi default. Korištenje ključne riječi
default je opcionalno (tj. nije nužno da ju koristite da bi switch iskaz funkcionirao).
Ukoliko ne koristite default, a vrijednost cjelobrojnog izraza se ne nalazi na popisu
mogućih slučajeva izvršavanje programa se nastavlja na prvoj naredbi iza switch iskaza.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
Zadatak: Napraviti program koji će na osnovu dva unesena broja i znaka za operaciju
(+, -, * i /) izvršiti operaciju nad unesenim brojevima. Poštujte sve faze procesa
programiranja.
Analiza i specifikacija
Input: broj 1, broj 2, operacija
Output: rezultat
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator/ime
broj 1 varijabla float broj_1
broj 2 varijabla foat broj_2
operacija varijabla char operacija
rezultat varijabla float rezultat
Ograničenja: broj_2!=0 Dijeljenje s 0 nije moguće.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
4
Fakultet informacijskih tehnologija
start
kraj
broj_1,
broj_2,
operacija
operacija == ˙+˙
operacija==˙-˙
operacija==˙*˙
operacija==˙/˙
ne
ne
ne
rezultat=broj_1+broj_2 break
rezultat=broj_1- broj_2
rezultat=broj_1*broj_2
break
break
broj2!=0da
Dijelje
nje s 0
nije
mogu
će
rezultat=broj_1/broj_2da
ne
Niste
unijeli
korektnu
operaciju!
ne
rezultat
rezultat
rezultat
rezult
atbreak
da
da
da
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
5
Fakultet informacijskih tehnologija
Kod
#include <iostream> using namespace std; void main() { float broj1, broj2,rezultat=0; char operacija; cout<<"Unesite dva broja "<<endl; cin>>broj1; cin>>broj2; cout<<"Unesite operaciju "; cin>>operacija; switch (operacija) { case '+':rezultat=broj1+broj2;cout<<rezultat<<endl;break; case '/':if (broj2==0){cout<<"dijeljenje s 0 nije moguce"; break;} else rezultat=broj1/broj2;cout<<rezultat<<endl;break; case '-': rezultat=broj1-broj2;cout<<rezultat<<endl;break; case '*':rezultat=broj1*broj2;cout<<rezultat<<endl;break; default: cout<<"Niste unijeli odgovarajucu operaciju"<<endl; } system ("pause"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
6
Fakultet informacijskih tehnologija
Zadatak: Napišite program koji će za slovo uneseno s tastature odrediti je li riječ o
vokalu ili konsonantu, te ispisati odgovarajuću poruku. Poštujte sve faze procesa
programiranja.
Analiza i specifikacija
Input: slovo
Output: odgovarajuća poruka
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator/ime
slovo varijabla char slovo
Ograničenja: nema.
Napomena: C++ je jezik koji razlikuje mala i velika slova.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
7
Fakultet informacijskih tehnologija
slovo
slovo == ˙A˙
slovo == 'e'
slovo == 'i'
slovo == 'o'
break
Unijeli ste
konsonant
vokalda
slovo == 'u'
start
kraj
slovo == ˙a˙
slovo == ˙E˙
slovo == 'O'
slovo == 'I'
slovo == 'U'
breakvokalda
breakvokalda
breakvokalda
breakvokalda
breakvokalda
breakvokalda
breakvokalda
breakvokalda
breakvokalda
ne
ne
ne
ne
ne
ne
ne
ne
ne
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
8
Fakultet informacijskih tehnologija
Kod #include <iostream> using namespace std; void main() { char slovo; cout<<"unesite jedno slovo "; cin>>slovo; switch (slovo) { case 'A': cout << "Unijeli ste vokal"<<endl;break; case 'a': cout << "Unijeli ste vokal"<<endl;break; case 'E': cout << "Unijeli ste vokal"<<endl;break; case 'e': cout << "Unijeli ste vokal"<<endl;break; case 'I': cout << "Unijeli ste vokal"<<endl;break; case 'i': cout << "Unijeli ste vokal"<<endl;break; case 'O': cout << "Unijeli ste vokal"<<endl;break; case 'o': cout << "Unijeli ste vokal"<<endl;break; case 'U': cout << "Unijeli ste vokal"<<endl;break; case 'u': cout << "Unijeli ste vokal"<<endl;break; default: cout << "Unijeli ste konsonant"<<endl; } system ("pause>null"); }
ILI (kraće napisan switch iskaz)
#include <iostream> using namespace std; void main() { char slovo; cout<<"unesite jedno slovo "; cin>>slovo; switch (slovo) { case 'a': case 'A': case 'E': case 'e': case 'I': case 'i': case 'O': case 'o': case 'U': case 'u': cout << "Unijeli ste vokal"<<endl;break; default: cout << "Unijeli ste konsonant"<<endl; } system ("pause"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
9
Fakultet informacijskih tehnologija
Zadatak: Napišite program koji će za uneseni broj mjeseca ispisati koliko taj mjesec ima
dana. Predvidite što se dešava u slučaju prijestupne godine. Poštujte sve faze procesa
programiranja.
Analiza i specifikacija
Input: mjesec
Output: odgovarajuća poruka
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator/ime
mjesec varijabla int mjesec
prijestupna_godina varijabla char prijestupna
Ograničenja: nema
start
kraj
mjese
c
mjesec=={1,3,5,
7,8,10,12}
mjesec
=={4,6,9,11}
mjesec==2
ne
ne
ne
break
Takav
mjesec ne
postoji.
31 danda
da
da
30 dana break
(prijestupna ==
'd')||(prijestupn
a ==''D)
29 dana
28 dana
break
da
ne
break
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
10
Fakultet informacijskih tehnologija
Kod
#include <iostream> using namespace std; int main() { int mjesec; char prijestupna; cout<<"unesite redni broj mjeseca za koji zelite saznati koliko ima dana"<<endl; cout<<"1 za januar "<<endl; cout<<"2 za februar "<<endl; cout<<"3 za mart "<<endl; cout<<"4 za april "<<endl; cout<<"5 za maj "<<endl; cout<<"6 za juni "<<endl; cout<<"7 za juli "<<endl; cout<<"8 za august "<<endl; cout<<"9 za septembar "<<endl; cout<<"10 za oktobar "<<endl; cout<<"11 za novembar "<<endl; cout<<"12 za decembar "<<endl<<endl; cin>>mjesec; switch (mjesec) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:cout<<"Mjesec koji ste odabrali ima 31 dan";break; case 4: case 6: case 9: case 11:cout<<"Mjesec koji ste odabrali ima 30 dana"<<endl;break; case 2: cout<<"Je li godina prijestupna (D ili d)? "<<endl; cin>>prijestupna; if ((prijestupna =='d')||(prijestupna =='D')) { cout<<"Februar ima 29 dana.";break; } else cout<<"Februar ima 28 dana";break; default:cout<<"Niste odabrali odgovarajuci mjesec"<<endl; } system ("PAUSE"); return 0; }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
11
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum:22.11.2010.
NAREDBA „WHILE“
U jeziku C++ programska struktura iteracija (ponavljanje) se može predstavljati sa:
while iskazom (petljom),
do-while iskazom (petljom),
for iskazom (petljom).
Sintaksa iskaza „while“ se može predstaviti sintaks dijagramom:
while ( )
Izraz kojijm se
predstavlja uvjet
ponavljanja
iskaz
izraz
{ }
ili while (uvjet)
{ naredba_1; naredba_2; naredba_3 ... }
gdje je:
while ključna (rezervirana) riječ u C++;
uvjet je izraz čiji je rezultat logička (bool) vrijednost (istina/laž);
naredbe su skup naredbi koje je potrebno izvršavati sve dok je uvjet istinit;
Na dijagramu toka while iskaz predstavljamo na sljedeći način:
Smisao naredbe „while“ je u sljedećem:
Uvjet (izraz) u zagradi se izračunava, i ako je on
tačan (preciznije, različit od 0), izvršavaju se
naredbe u bloku navedenom unutar vitičastih
zagrada neposredno iza naredbe while. Nakon što
se čitav blok izvrši, uvjet se ponovno provjerava,
i ako je i dalje istinit, blok naredbi se ponovo
izvršava, itd. Dakle, blok naredbi se izvršava sve
dok je navedeni uvjet istinit. Tek kada uvjet
postane neistinit, program se nastavlja izvršavati
od sljedeće naredbe iza while-bloka.
U slučaju kada se blok sastoji od samo jedne
naredbe, vitičaste zagrade koje odreĎuju pripadni
blok se ne moraju pisati.
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
Kao ilustraciju naredbe while napišimo sekvencu naredbi koja će ispisivati sve brojeve od
1 do 100 (svaki broj u novi red):
int i=1; while (i<= 100) { cout<<i<<endl; i++; }
Ili:
int i =1; while (i<=100) cout<<i++<<endl;
Kako se kod naredbe while blok izvršava sve dok je naznačeni uvjet ispunjen, nužno je
da se unutar petlje nalazi naredba koja će promijeniti vrijednost varijabli koje se javljaju
unutar uvjeta. U suprotnom, ako je uvjet na početku bio istinit, takav će sigurno i ostati,
pa se petlja nikad neće završiti. U ekstremnijim slučajevima, vrijednosti varijabli se mogu
mijenjati unutar samog uvjeta, kao u slijedećem primjeru (primjer radi što i prethodna
dva):
int i=0; while (++i<=100) cout<<i<< endl;
Zadatak: Napišite program koji će omogućiti unos pozitivnih cijelih brojeva, te izračunati
njihovu sumu. U trenutku kad korisnik unese negativan broj, program ispisuje izračunatu
sumu (ne računajući taj negativni broj) i završava sa radom.
Analiza i specifikacija
Ulazni podaci: broj
Izlazni podaci: suma
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator
broj varijabla int broj
suma varijabla int suma
Ograničenja: broj mora biti pozitivan;
Upute:
Uvedite varijablu suma čija će početna vrijednost biti nula. Svaki put kada unesete novi
broj, njega dodajete na trenutnu vrijednost sume. Postupak se ponavlja sve dok su
uneseni brojevi pozitivni:
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
#include <iostream> using namespace std; void main () { int suma =0; //Suma unesenih brojeva int broj; //Broj koji unosi korisnik cout<<"Unesi brojeve koji ce se zbrajati "; cout<<" negativan broj oznacava prekid."<<endl; cout<<"Unesi broj "; cin>>broj; while (broj>=0) { suma+=broj; cout<<"Unesi broj: "; cin>> broj; } cout<< "\nSuma unesenih brojeva: "<<suma; system ("pause>null"); }
Primjećujete da smo ovdje naredbu za unos morali pisati 2 puta, jednom ispred petlje, a
drugi put unutar petlje. Razlog je činjenica da se uvjet kod naredbe while ispituje na
početku petlje, tako da odmah na početku moramo znati kakav je broj da bismo znali
treba li uopće da se izvrši ili ne. Taj problem možemo riješiti sljedećim, funkcionalno
ekvivalentnim, ali logički elegantnijim programom:
Dijagram toka Kod
#include <iostream> using namespace std; void main () { int suma=0, broj=0; cout<<"Unesi brojeve koji ce se zbrajatii "; cout<<" negativan broj oznacava prekid. "<<endl; while (broj>=0) { suma+=broj; cout<<"Unesi broj:"; cin>>broj; } cout<<"\nSuma unesenih brojeva je: "<<suma; system ("pause>null"); }
Primjećujete da smo ovdje inicijalizirali i varijablu broj. Ovo je neophodno iz sljedećeg
razloga: ako varijablu broj ne inicijaliziramo, njena početna vrijednost će biti slučajna
(nepredvidiva) i kao posljedica toga istinitost uvjeta u while petlji će biti nepredvidljiva.
Obratite pažnju na redoslijed naredbi unutar petlje.
start
kraj
broj
suma=0
broj=0
suma+=broj
broj>=o
sumada
ne
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
4
Fakultet informacijskih tehnologija
Šta bi se desilo da prvo unosite broja, a tek onda računate sumu?
Odgovor: Kad unesete negativni broj koji je uvjet za izlazak iz petlje i njegova vrijednost
bi se pribrojila sumi, a to želite izbjeći.
Česta greška prilikom korištenja naredbe while je stavljanje tačka-zareza iza uvjeta.
Kompajler neće javiti grešku. Program će raditi, ali neispravno, jer će računar „smatrati“
da je tijelo petlje prazno, a naredbe koje smo željeli da budu u petlji izvršit će se izvan
nje! Vjerojatno će se program "zaglaviti" u beskonačnoj petlji, jer ako je uvjet bio
ispunjen na početku, takav će ostati zauvijek, jer su se naredbe koje mijenjaju vrijednost
varijabli koje učestvuju u izrazu najvjerojatnije nalazile unutar bloka, koji nije shvaćen
kao pripadni blok while petlje.
Zašto kompjaler ne otkriva grešku s tačka-zarezom?
Formalno gledajući, ovo nisu sintaktičke (jezičke) nego logičke greške: petlje bez tijela
nisu zabranjene u jeziku C++ .
Zadatak: Napišite program koji će ispisati koliko ima parnih, a koliko neparnih brojeva u
intervalu od 15 do 99.
Analiza i specifikacija
Ulazni podaci: nema
Izlazni podaci: broj parnih brojeva, broj neparnih brojeva
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator
broj varijabla int broj
parni varijabla int parni
neparni varijabla int neparni
Ograničenja: ( broj>=15) && (broj<=99)
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
5
Fakultet informacijskih tehnologija
Dijagram toka Kod
Zadatak: Napišite program za ispis prirodnih brojeva u intervalu od 1 do 100. Nakon
svakog petog (5) broja potrebno je ispisati novi red.
Analiza i specifikacija
Ulazni podaci: nema
Izlazni podaci: broj
start
kraj
broj=15
parni=0
neparni=0
broj<=99
broj%2==0
parni++neparni++
broj++
parni
neparni
dane
da
ne
#include <iostream> using namespace std; void main () { int broj = 15, parni=0, neparni=0; while (broj <= 99) { if (broj%2==0) parni ++; else neparni++; broj++; } cout<<"U intervalu od 15 do 99 ima"<<parni<<" parna brojeva"<<endl; cout<<"U intervalu od 15 do 99 ima"<<neparni<<" neparna brojeva"<<endl; system ("pause>null"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
6
Fakultet informacijskih tehnologija
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator
broj varijabla int broj
Ograničenja: (broj>=1)&&(broj<=100)
Dijagram toka Kod
# #include <iostream> using namespace std; void main () { int broj=1; while (broj <= 100) { cout<<broj<<endl; if (broj%5==0) cout<<endl; broj++; } system ("pause>null"); }
start
kraj
broj=1
broj<=100
broj%5==0
broj
\n
da
da
broj++
ne
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
1
Fakultet informacijskih tehnologija
Datum:22.11.2010.
FOR PETLJA
Najčešći algoritmi koji koriste ponavljanje su oni gdje želimo ponoviti neku akciju zadani
broj puta. Takvi algoritmi se u C++ predstavljaju for petljom. Isto kao i kod while petlje,
i kod for petlje uvjet izvršavanja se provjerava na početku tijela petlje.
Sintaksa „for“ iskaza se može predstaviti sintaks dijagramom:
for ( ; ; )Izraz
inicijalizacije
Izraz kojim se
predstavlja uvjet
ponavljanja
Izraz kojim se
predstavlja
korak pomaka
iskaz
izraz
{ }
ili
for (inicijalizacija brojača; uvjet ponavljanja; izmjena vrijednosti brojača) { naredbe; }
Na dijagramu toka for petlja se može predstaviti na više načina
ili
brojac =incijalna vrijednost, krajnja vrijednost
naredbe
istina
laž
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
2
Fakultet informacijskih tehnologija
Gdje je:
for rezervirana (ključna) riječ
inicijalizacija brojača, uvjet ponavljanja i izmjena vrijednosti brojača su izrazi
naredbe su skup naredbi koje treba izvršavati sve dok je uvjet istinit.
Kad izvršavanje programa dosegne for petlju događa se sljedeće:
1. Evaluira se izraz kojim postavljamo inicijalnu vrijednost brojača;
2. Evaluira se izraz kojim je predstavljen uvjet ponavljanja;
3. Ukoliko je uvjet ponavljanja istinit
a) izvršavaju se naredbe unutar tijela petlje;
b) evaluira se izraz kojim mijenjamo vrijednost brojača;
c) vraćamo se na korak 2
Ukoliko uvjet ponavljanja nije istinit izvršavanje programa se nastavlja na prvoj naredbi
iza for petlje.
Zadatak
Napišite program za izračunavanje prosječne godišnje količine padalina. Poštujte sve faze
procesa programiranja.
Upute: Prosječna godišnja količina padalina se dobije zbrajanjem količine padalina za
svaki mjesec i dijeljenjem s brojem mjeseci (12). Dakle, potrebno je omogućiti unos
količine padalina 12 puta (za svaki mjesec), te unesene vrijednosti zbrojiti. Budući da se
određena aktivnost (unos količine padalina) treba izvršiti zadani broj puta (12) for petlja
je idealan izbor.
Analiza i specifikacija
Ulazni podaci:količina padalina za svaki mjesec
Izlazni podaci:prosječna godišnja količina padalina
Međurezultat: ukupna godišnja količina padalina, brojač
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator
brojač varijabla int mjesec
mjesečne padaline varijabla double padaline
ukupna godišnja količina padalina varijabla double ukupno
prosječna godišnja količina padalina varijabla double prosjek
Ograničenja: nema
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
3
Fakultet informacijskih tehnologija
Dijagram toka
I način II način
mjesec=1
start
kupno=0
padaline
ukupno+=padaline
prosjek=ukupno/12
prosjek
kraj
mjesec <=12
mjesec++
istina
laž
Kod
#include <iostream> #include <iomanip> //uključivanje ove biblioteke vam omogucava formatiranje ispisa using namespace std; void main() { double ukupno=0, //ukupna godisnja kolicina padalina padaline, //kolicina padalina za svaki mjesec prosjek; //prosjecna godisnja kolicina padalina int mjesec; // redni broj mjeseca (1-12) for (mjesec=1;mjesec<=12; mjesec++) { cout<<"Unesi kolicinu padalina za mjesec "<<mjesec<<endl; cin>>padaline;
ukupno+=padaline; }
mjesec=1, 12
istina
laž
start
kupno=0
padaline
ukupno+=padaline
prosjek=ukupno/12
prosjek
kraj
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
4
Fakultet informacijskih tehnologija
prosjek=ukupno/12; cout<<"Prosjecna kolicina padalina "<< setprecision(2)<<prosjek<<endl;/*ograničili smo rezultat na dvije decimale – zahtijeva uključivanje <iomanip>*/ system ("pause>null"); }
Zadatak
Napišite program koji za uneseno n, izračunava i ispisuje sumu S=1!+2!+3!...+n!
Poštujte sve faze procesa programiranja.
Upute: U zadatku se traži suma faktorijela do broja n (uključujući i n). Pojam faktorijela
vam je (nadam se) poznat iz matematike. Faktorijel od npr. 3 iznosi 1*2*3=6. Dakle,
potrebno je izračunati vrijednosti faktorijela za svaki prirodni broj do n, a zatim zbrojiti
sve dobivene vrijednosti.
Analiza i specifikacija
Ulazni podaci: n
Izlazni podaci: suma
Međurezultat: faktorijel, brojač
Dizajn
Podatak Vrsta vrijednosti Tip podatka Identifikator
brojač varijabla int i
broj n varijabla int n
faktorijel varijabla int faktorijel
suma varijabla int S
Ograničenja: n mora biti veće od 0
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
5
Fakultet informacijskih tehnologija
start
n
S=0
faktorijel=1
i=1,n
S=S+faktorijel
s
laž
istinafaktorijel=faktorijel*i
kraj
n>0
istina
ne
postoji
laž
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
6
Fakultet informacijskih tehnologija
#include <iostream> using namespace std; void main() { int n, S=0, faktorijel=1; cout<<"unesite vrijednost broja n"<<endl; cin>>n; if (n>0) { for (int i=1; i<=n;i++) { faktorijel*=i; S+=faktorijel; cout<<i<<"!"; if (i<n)//ovaj if iskaz sluzi samo za formatirenje ispisa cout<<"+"; } cout<<" = "<<S<<endl; } else cout<<"ne postoji faktorijel od negativnih vrijednosti"<<endl; system ("pause>null"); }
Zadatak
Napišite program za ispis tablice množenja prvih 10 prirodnih brojeva. Poštujte sve faze
procesa programiranja.
Upute:
Podsjetimo se kako izgleda tablica množenja:
1* 1 =1 2 * 1 = 2 3 * 1 = 3 4 * 1 = 4 ….
1* 2 =2 2 * 2 = 4 3 * 2 = 6 4 * 2 = 8 ….
1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 4 * 3 = 12 ….
…. …. …. ……
Uočavate da se vrijednosti množenika i množitelja mijenjaju prema određenom pravilu.
Množenik, u našem slučaju prvi je broj 1, ostaje isti a množitelj mijenja vrijednost od 1
do 10; nakon toga množenik je 2, a množitelj opet mijenja vrijednost od 1 do 10 itd …
Budući da se i vrijednost množenika i množitelja mijenja zadani broj puta (10 u oba
slučaja) for petlja je logičan izbor. No, budući da je potrebno mijenjati dvije vrijednosti
množenik
množitelj
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
7
Fakultet informacijskih tehnologija
neće nam biti dovoljna jedna for petlja. Upotrijebit ćemo dvije for petlje, jednu unutar
druge; od koji će nam jedna omogućiti promjenu vrijednosti množenika, a druga for
petlja će nam omogućiti promjenu vrijednosti množitelja. Riječ je o tzv. ugniježđenoj for
petlji. Osim jednostavnog množenja potrebno je formatirati ispis kako bi naša tablica
množenja doista i izgledala kao tablica. Za formatiranje ispisa koristit ćemo biblioteku
<iomanip>.
Analiza i specifikacija
Potrebna su nam dva podatka: vrijednost množenika i vrijednost množitelja.
Dizajn
Podatak Vrsta vrijednost Tip podatka Identifikator
množenik varijabla int i
množitelj varijabla int j
Ograničenja: nema
Dijagram toka
kraj
i=1, 10
j=1, 10
i*j
start
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
8
Fakultet informacijskih tehnologija
Kod
#include <iostream> #include <iomanip> //uključivanje ove biblioteke vam omogucava formatiranje ispisa using namespace std; void main() { cout<<"Tablica mnozenja do broja 10"<<endl; cout<<endl; for (int i=1; i<=10; i++) { for (int j=1; j<=10; j++) { cout<<i<<" * "<<setw(3)<<j<<" = "<<setw(3)<<i*j<<endl; /*setw(vrijednost)prikazuje sljedecu vrijednost u polju specificne sirine u nasem slucaju sirine 3*/ } cout<<endl; } system ("pause>null"); }
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
9
Fakultet informacijskih tehnologija
BIBLIOTEKA <IOMANIP>
U dosadašnjim primjerima smo za formatiranje ispisa koristili novi red (endl ili "\n") i/ili
tabulator ("\t"). Za zahtjevnije formatiranje ispisa potrebno je primijeniti mogućnosti
koje nudi biblioteka <iomanip>. Biblioteka <iomanip> sadrži tzv. format manipulatore.
Neke od njih možete pronaći u narednoj tablici:
Manipulator Opis
setw(width) prikazuje sljedeću vrijednost u polju specifične širine
boolalpha
noboolalpha
Koristi slovnu prezentaciju logičkih vrijednosti (true i false).
Isključuje se s noboolalpha.
setprecision
(precision)
prikazuje vrijednost sa specifičnom preciznošću
setiosflags(flaglist) postavlja oznake formata u listu, gdje je lista niz od jedne ili više
oznaka odvojenih simbolom |
Neke od oznaka su:
ios:: showpoint (prikazuje decimalnu tačku i nule iza decimalne
tačke)
ios::fixed (prikazuje realne vrijednosti u formatu fiksnog zareza)
ios::scientific (prikazuje realne vrijednosti u formatu
kliznog/pomičnog zareza)
ios::left (prikazuje vrijednosti poravnate s lijeve strane )
ios::right (prikazuje vrijednosti poravnate s desne strane)
Primjer
ako imate sljedeće varijable:
double alfa = 8.0/3.0, beta = 9.0/3.0;
upotrebom naredbi:
cout<<alfa<<endl; cout<<beta<<endl;
dobit ćete sljedeći ispis:
Ukoliko upotrijebite:
cout<<alfa<<endl;
cout<<setiosflags(ios::showpoint)<<beta<<endl;
ispis će izgledati ovako:
a ukoliko upotrijebite:
cout<<setiosflags(ios::fixed)<<setprecision(3)<<alfa<<endl;
cout<<setiosflags(ios::fixed)<<setprecision(3)<<beta<<endl;
ProgramiranjeI_sylabus.doc
Uvod u programiranje::Vježbe
http://dl.fit.ba/
10
Fakultet informacijskih tehnologija
dobit ćete sljedeći ispis:
Ukoliko upotrijebite:
bool varijabla = 0;
cout<<boolalpha<<varijabla<<endl;
cout<<noboolalpha<<varijabla<<endl;
dobit ćete sljedeći ispis: