vjezbe 1-8

72
Uvod u programiranje::Vježbe http://dl.fit.ba/ 1 Fakultet informacijskih tehnologija [email protected] 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: FileNewProject.

Upload: alma-arslanagic-pozder

Post on 27-Jun-2015

1.309 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

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.

Page 2: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

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.

Page 3: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

3

Fakultet informacijskih tehnologija

[email protected]

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 …

Page 4: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

4

Fakultet informacijskih tehnologija

[email protected]

Izaberite opciju C++ File (.cpp) i imenujte vašu datoteku.

Rezultat je prikazan na sljedećoj slici.

Page 5: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

5

Fakultet informacijskih tehnologija

[email protected]

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 */).

Page 6: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

6

Fakultet informacijskih tehnologija

[email protected]

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.

Page 7: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

7

Fakultet informacijskih tehnologija

[email protected]

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.

Page 8: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

8

Fakultet informacijskih tehnologija

[email protected]

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.

Page 9: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

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.

Page 10: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

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

Page 11: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

3

Fakultet informacijskih tehnologija

[email protected]

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.

Page 12: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

4

Fakultet informacijskih tehnologija

[email protected]

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.

Page 13: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

5

Fakultet informacijskih tehnologija

[email protected]

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

Page 14: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

6

Fakultet informacijskih tehnologija

[email protected]

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.

Page 15: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

7

Fakultet informacijskih tehnologija

[email protected]

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

Page 16: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

8

Fakultet informacijskih tehnologija

[email protected]

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.

Page 17: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

9

Fakultet informacijskih tehnologija

[email protected]

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

Page 18: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

10

Fakultet informacijskih tehnologija

[email protected]

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

Page 19: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

11

Fakultet informacijskih tehnologija

[email protected]

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;

Page 20: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

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.

Page 21: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

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

Page 22: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

3

Fakultet informacijskih tehnologija

[email protected]

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.

Page 23: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

4

Fakultet informacijskih tehnologija

[email protected]

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).

Page 24: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

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.

Page 25: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

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.

Page 26: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

3

Fakultet informacijskih tehnologija

[email protected]

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;

Page 27: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

4

Fakultet informacijskih tehnologija

[email protected]

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.

Page 28: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

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.

Page 29: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 30: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

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;

Page 31: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 32: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe http://dl.fit.ba/

5

Fakultet informacijskih tehnologija

[email protected]

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

Page 33: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe http://dl.fit.ba/

6

Fakultet informacijskih tehnologija

[email protected]

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

Page 34: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe http://dl.fit.ba/

7

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 35: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe http://dl.fit.ba/

8

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 36: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

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

Page 37: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

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!!!

Page 38: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

3

Fakultet informacijskih tehnologija

[email protected]

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:

Page 39: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

4

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 40: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

5

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 41: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

6

Fakultet informacijskih tehnologija

[email protected]

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; }

Page 42: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

7

Fakultet informacijskih tehnologija

[email protected]

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

Page 43: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

8

Fakultet informacijskih tehnologija

[email protected]

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

Page 44: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

9

Fakultet informacijskih tehnologija

[email protected]

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

Page 45: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 46: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

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:

Page 47: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

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.

Page 48: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

3

Fakultet informacijskih tehnologija

[email protected]

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.

Page 49: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

4

Fakultet informacijskih tehnologija

[email protected]

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

Page 50: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

5

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 51: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

6

Fakultet informacijskih tehnologija

[email protected]

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.

Page 52: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

7

Fakultet informacijskih tehnologija

[email protected]

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

Page 53: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

8

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 54: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

9

Fakultet informacijskih tehnologija

[email protected]

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

Page 55: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

10

Fakultet informacijskih tehnologija

[email protected]

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; }

Page 56: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

11

Fakultet informacijskih tehnologija

[email protected]

Page 57: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

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.

Page 58: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

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:

Page 59: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

3

Fakultet informacijskih tehnologija

[email protected]

#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

Page 60: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

4

Fakultet informacijskih tehnologija

[email protected]

Š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)

Page 61: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

5

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 62: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

6

Fakultet informacijskih tehnologija

[email protected]

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

Page 63: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

1

Fakultet informacijskih tehnologija

[email protected]

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ž

Page 64: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

2

Fakultet informacijskih tehnologija

[email protected]

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

Page 65: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

3

Fakultet informacijskih tehnologija

[email protected]

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

Page 66: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

4

Fakultet informacijskih tehnologija

[email protected]

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

Page 67: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

5

Fakultet informacijskih tehnologija

[email protected]

start

n

S=0

faktorijel=1

i=1,n

S=S+faktorijel

s

laž

istinafaktorijel=faktorijel*i

kraj

n>0

istina

ne

postoji

laž

Page 68: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

6

Fakultet informacijskih tehnologija

[email protected]

#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

Page 69: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

7

Fakultet informacijskih tehnologija

[email protected]

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

Page 70: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

8

Fakultet informacijskih tehnologija

[email protected]

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"); }

Page 71: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

9

Fakultet informacijskih tehnologija

[email protected]

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;

Page 72: Vjezbe 1-8

ProgramiranjeI_sylabus.doc

Uvod u programiranje::Vježbe

http://dl.fit.ba/

10

Fakultet informacijskih tehnologija

[email protected]

dobit ćete sljedeći ispis:

Ukoliko upotrijebite:

bool varijabla = 0;

cout<<boolalpha<<varijabla<<endl;

cout<<noboolalpha<<varijabla<<endl;

dobit ćete sljedeći ispis: