PIA Podloge Za Vjezbe 2011 v1
-
Upload
iva-waya-vasiljev -
Category
Documents
-
view
96 -
download
21
description
Transcript of PIA Podloge Za Vjezbe 2011 v1
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 1
S v e u č i l i š t e u Z a g r e b u
F a k u l t e t s t r o j a r s t v a i b r o d o g r a d n j e
Katedra za konstruiranje i razvoj proizvoda
N. Bojčetić, N. Pavković, R. Todić, D. Deković, D. Marjanović, D. Rohde
PROGRAMIRANJE I ALGORITMI Podloge za vježbe – programiranje
Visual Basic
Zagreb, 2006.
Programiranje i algoritmi – podloge za vježbe
2 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
PREDGOVOR
Ove podloge namijenjene su studentima Fakulteta strojarstva i brodogradnje kao pomoćna literatura za praćenje vježbi iz kolegija PROGRAMIRANJE I ALGORITMI i kolegija PRIMJENA RAČUNALA B. Gradivo je izloženo redoslijedom kojim se obrađuje na vježbama. Temeljni koncepti programiranja obrađuju se na predavanjima u satnicom dopuštenom okviru. Pretpostavka uspješnog savladavanja kolegija je redovito praćenje nastave i samostalan rad na računalu. Vježbe se održavaju na računalima u PC učionicama CADLab -a.
Podloge nikako ne mogu biti zamjena za proučavanje originalnih priručnika i druge literature. Pisanje podloga za kolegij koji obrađuje materiju koja je tako podložna brzim promjenama kao računalstvo, nezahvalan je posao. Sjena zastarijevanja nadvila se nad rukopis onog trenutka kada je započela priprema teksta. Ipak vjerujemo da će podloge omogućiti studentima lakše savladavanje prvih koraka računalstva na Fakultetu strojarstva i brodogradnje Sveučilišta u Zagrebu. U CADLab -u instalirana računalna i programska oprema, razvojni alati, CAD/CAE aplikacije, pristup Internetu, te podrška asistenata i demonstratora omogućuju studentima FSB-a usvajanje znanja potrebnih svakom inženjeru. Stoga očekujemo da će studenti koristiti računala u svakodnevnom radu i izvan kolegija Katedre za osnove konstruiranja.
Autori
U Zagrebu, Listopad 2006.
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 3
Sadržaj
Visual Basic je program kontroliran (pokretan) događajima – "event driven". Događaji se mogu pojaviti zahvaljujući akciji korisnika kao što je klik mišem ili odabir stavke iz izbornika ili kao rezultat akcije nekog drugog prozora.
Slika 1. Program pokretan događajima (event driven)
U "proceduralnim" programima sam program kontrolira redoslijed izvođenja pojedinih dijelova programskog kôda. Izvođenje počinje prvom "izvršnom" naredbom i slijedi unaprijed određene putanje.
U programu upravljanom događajima programski kôd ne slijedi unaprijed određene putanje, već se izvode različiti dijelovi programskog koda kao odgovori na događaje. Događaji mogu biti pokrenuti akcijom korisnika, porukama sustava ili drugih programa te samog programa. Redoslijed tih događaja određuje putanju kojom će programski kôd biti izveden.
Budući da se ne može predvidjeti redoslijed događaja (pa niti koji će se događaji "dogoditi", a koji ne), programski kôd mora uzeti u obzir neke pretpostavke o "općem stanju" (sučelja i podataka) kada se počne izvoditi – npr. sadrži li polje za upis podatka neku vrijednost ili ne i sl.
Riješeni primjeri zadataka sadrže i dijagram toka – grafički prikaz algoritma. Standardni elementi dijagrama toka razvijeni su prvenstveno za proceduralne programske jezike, stoga ne sadrže sve elemente potrebne za prikaz situacija koje mogu nastupiti u programima upravljanim događajima. Stoga u pojedinim primjerima dijagram toka ne odgovara u potpunosti algoritmu primjenjenom u programskom kodu. Za svaki primjer razlike će biti posebno objašnjene na vježbama.
Programiranje i algoritmi – podloge za vježbe
4 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
1. Opis radnog okružja Microsoft Visual Studio 2005
Nakon pokretanja programskog paketa Microsoft Visual Studio i odabira rada sa Visual Basic-om, pojavljuje se slijedeći prozor (slika2):
Slika 2: Početak rada sa Visual Basic-om
Između dvije ponuđene opcije u prozoru "Recent projects" za kreiranje novog projekta potrebno je odabrati Create, a za otvaranje već postojećeg Open.
Prilikom odabira novog projekta prikazuje se dijaloški okvir prikazan na slici 3 u kojem je potrebno odabrati tip Visual Basic projekta iz liste vrsta projekata, te iz liste predložaka aplikaciju za Windows operativni sustav (Windows Application).
Program nudi predefinirano ime WindowsApplication1 koje se može promijeniti po želji pod uvjetom da nema praznih mjesta u imenu. Također se nudi i predefinirana lokacija za njegovu pohranu koju pomoću padajuće liste ili naredbenog gumba Browse odabire korisnik.
Kreiranje novih projekata
Otvaranje postojećih projekata
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 5
Slika 3. Dijaloški okvir za otvaranje novog projekta
Prozor sa programskim rješenjima (Solution Explorer) prikazuje naziv rješenja (Solution; grupa projekata), naziv trenutnog projekta (Project) i sve forme i module unutar projekta. Na početku prema slici 4 postoji samo jedna forma naziva Form1, zatim datoteka nazvana AssemblyInfo.vb koja je dio metapodataka koji će se prevesti u aktivni sklop (Assembly), te čvor referenci (References). U čvoru se nalaze sve reference koje su na početku dostupne unutar projekta.
Slika 4 Pretraživač programskih rješenja
Odabir vrste projekta
Odabir predloška
Upis imena novog projekta
Programiranje i algoritmi – podloge za vježbe
6 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
2. Izrada korisničkog sučelja aplikacije u Visual Basic-u
Prvi korak u kreiranju aplikacije Visual Basicom je stvaranje sučelja aplikacije. Forme i kontrole su osnovni elementi sučelja - objekti koji imaju svojstva i događaje koji određuju njihovo ponašanje i interakciju s korisnikom. Postavljanjem svojstava formi i kontrola te pisanjem Visual Basic programskog koda koji će odgovarati na događaje, objekti se prilagođavaju zahtjevima aplikacije. Kontrole su objekti koji su sadržani u objektima forme. Svaki tip kontrole ima svoj skup svojstava, metoda i događaja koje ga čine prikladnim određenoj namjeni.
Kreiranje forme za interakciju korisnika i programa izvodi se u prozoru pod opcijom Form1.vb[Design]. Kontrole smještamo na formu dvoklikom (double click) lijeve tipke miša na odabrano ime kontrole na traci s alatima (Toolbox) ili pritiskom na lijevu tipku i odvlačenjem na formu (drag and drop).
Kontrolu koja je inicijano smještena na formu moguće je pomicati po formi klikom i držanjem lijeve tipke miša iznad nje. Veličina kontrole mijenja se pomicanjem hvatača u obliku bijelih kvadratića (slika 5).
Slika 5 Naredbeni gumb Button1 na formi Form1
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 7
Slika 6. Prozor s osobinama za naredbeni gumb Button1
Osobine smještaja kontrole na formi i njena veličina osim mišem mogu se mijenjati i u prozoru s osobinama (Properties) u kojem se nalaze i ostale osobine kao što su naziv (Name) odabranog objekta ili kontrole koja će se koristiti u programskom kodu, tekst na gumbu (Text), poravnavanje teksta (TextAlign) itd.
Prilikom zadavanja osobina naziva (Name) mogu se postaviti slijedeća pravila: naziv ne smije imati prazna mjesta, moraju se koristiti slova engleske abecede, ne smiju se koristiti rezervirane riječi programskog jezika, te neslužbeno korištenje prefiksa od tri slova za oznaku vrste objekta. Za naredbeni gumb to je cmd te se na njega doda proizvoljni naziv s velikim početnim slovom.
Prilikom kreiranja forme i smještanja objekata na formu, automatski se generira programski kôd (Windows Form Designer generated code) u kojem je zapisan kôd za vrijednosti osobina objekata.
Programiranje i algoritmi – podloge za vježbe
8 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
3. Imenovanje i tipovi varijabli u Visual Basic-u
Prilikom deklariranja varijabli moraju se poštivati slijedeća pravila za naziv:
• mora počinjati slovom abecede
• može sadržavati samo slova, brojeve i znak _
• ne može sadržavati točku
• ne smije biti duži od 255 znakova
• mora biti jedinstven u dijelu programa u kojem se nalazi varijabla.
Tablica 1. Vrste (tipovi) podataka u Visual Basic-u
VRSTA VELIČINA RASPON VRIJEDNOSTI
Boolean 4 Byte-ova True ili False
Byte 1 Byte 0–255 unsigned
Char 2 Byte-a 0–65,535 unsigned
Date 8 Byte-ova 1/1/1 CE to 12/31/9999
Decimal 12 Byte-ova +/–79228162514264337593543950335 bez decimalnog
zareza;
+/–7.9228162514264337593543950335 s 28
decimalnih mjesta iza zareza; najmanji broj različit od
nule je
+/–0.0000000000000000000000000001
Double 8 Byte-ova –1.79769313486231 E308 do –4.94065645841247 E-
324 za negativne vrijednosti 4.94065645841247 E-324
do 1.79769313486232 E308 za pozitivne vrijednosti
Integer 4 Byte-a –2147483648 to 2147483647
Long 8 Byte-ova –9223372036854775808 do 9223372036854775807
Object 4 Byte-a Sve vrste objekata
Short 2 Byte-a –32768 to 32767
Single 4 Byte-a –3.402823 E38 do –1.401298 E-45 za negativne
vrijednosti;
1.401298 E-45 do 3.402823 E38 za pozitivne vrijednostI
String 10 Byte-ova
(+ znakova u stringu * 2)
od 0 do otprilike 2 milijarde Unicode znakova
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 9
Često se javlja potreba da se u tijeku izvođenja programa izvrši konverzija iz jednog tipa varijable u drugi – npr. tekst u brojčanu vrijednost i obrnuto. Neke od funkcija konverzije navedene su tablici 2:
Tablica 2. Funkcije pretvorbe
FUNKCIJA PRETVORBA U TIP
CDbl Double
CInt Integer
CLng Long
CSng Single
CStr String (tekst)
CVar Variable
Programiranje i algoritmi – podloge za vježbe
10 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
4. Primjer uporabe uvjetnog grananja
Napisati program za unos tri broja, određivanje najvećeg te izračunavanje razlike između najvećeg i zbroja ostala dva broja. Ovaj primjer uvod je u uporabu naredbe (kontrolne strukture) uvjetnog grananja. Dijagram toka prikazan je na slici 7.
START
A, B, C
Razlika
END
NE
NEDA
B > AANDB > C
A > BANDA > C
Razlika = A - (B + C)
DA
Razlika = B - (A + C) Razlika = C - (A + B)
Slika 7. Dijagram toka
Ulazni podaci: vrijednosti tri broja
Izlazni podatak: razlika najvećeg broja i zbroja preostala dva
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 11
Dijagram toka započinje simbolom "START" koji predstavlja aktiviranje programskog koda. Slijedeći simbol ( ) prikazuje učitavanje vrijednosti tri broja, odnosno unos od strane korisnika programa. Operacija učitavanja zapravo dodjeljuje upisane vrijednosti varijablama A, B i C. Varijable su područja memorije koje rezervira program i u koje se pohranjuju podaci tijekom korištenja programa. Tip varijable (cjelobrojna, realna, tekstualna, itd.) ne prikazuje se u dijagramu toka.
Nakon toga potrebno je ustanoviti koji od učitana tri broja ima najveću vrijednost. U ovom primjeru koristimo ispitivanje dva logička uvjeta, na temelju čega izvodimo zaključak. Ovakav pristup bio bi vrlo neefikasan za traženje maksimalne vrijednosti u većem nizu brojeva, no za tri vrijednosti je zadovoljavajući. Ispitivanje logičkog uvjeta prikazuje se u dijagramu toka simbolom ili .
Prvo ispitujemo da li je vrijednost varijable A istovremeno veća i od B i od C. Kada treba ispitati dva ili više povezanih logičkih uvjeta, oni se povezuju operatorima logičke konjukcije ili disjunkcije (AND ili OR). Ako je odgovor na pitanje prvog uvjeta istinit, znači da je varijabla A najveća, pa varijabla Razlika poprima vrijednost prema izrazu (formuli) A – (B + C). Ako prvi uvjet nije ispunjen – prelazi se na ispitivanje slijedećeg uvjeta - da li je vrijednost varijable B istovremeno veća i od A i od C. Ako je drugi uvjet ispunjen, vrijednost varijable Razlika računa se prema formuli B – (A + C). Ako ni drugi uvjet nije ispunjen, preostaje još samo mogućnost da varijabla C ima najveću vrijednost, pa se varijabla Razlika računa prema izrazu C – (A + B). Nakon ispitivanja uvjeta i izračuna vrijednosti razlike sve tri grane dijagrama toka spajaju se u čvorištu u jednu, nakon čega slijedi ispis vrijednosti varijable Razlika (u dijagramu toka simbol predstavlja ispis) i program završava (simbol "END").
Kako je već prije navedeno, standardni elementi dijagrama toka razvijeni su prvenstveno za proceduralne programske jezike, stoga ne sadrže sve elemente potrebne za prikaz situacija koje mogu nastupiti u programima upravljanim događajima. U programu upravljanom događajima programski kôd ne slijedi unaprijed određene putanje, već se izvode različiti dijelovi programskog koda kao odgovori na događaje. Događaji mogu biti pokrenuti akcijom korisnika, porukama sustava ili drugih programa te samog programa. Redoslijed tih događaja određuje putanju kojom će programski kôd biti izveden. Zbog navedenih razloga prethodno obrazloženi dijagram toka u ovom primjeru, kao i u svim preostalim primjerima u ovim skriptama ne odgovara u potpunosti programskom rješenju postavljenog zadatka u Visual Basic-u. Dijagrami tokova dani su uz svaki zadatak prvenstveno radi grafičkih prikaza algoritama koji su primjenjeni pri rješavanju zadataka. Najveće razlike između dijagrama toka i programskog rješenja većinom su u načinu manipulacije sa ulaznim i izlaznim podacima. Koncepcija kreiranja sučelja i manipulacije s podacima u Visual Basic-u omogućuju kreiranje ogromnog broja različitih varijanti programskog rješenja koje se temelje na istom osnovnom algoritmu.
Programsko rješenje prikazanog algoritma u Visual Basic-u zamišljeno je na slijedeći način: korisnik unosi brojeve u tri okvira s tekstom, te nakon unosa aktivira gumb koji pokreće proceduru za izračunavanje traženog izlaznog podatka (razlike). U četvrtom okviru procedura ispisuje izračunatu razliku. Pritiskom na gumb za novi niz obrisali bi se svi okviri s tekstom i program bi se pripremio za novi unos.
Programiranje i algoritmi – podloge za vježbe
12 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Forma se sastoji od slijedećih objekata: 3 okvira s tekstom za unos tri ulazna podatka, jednog okvira s tekstom za ispis razlike (izlaznog podatka), 4 pripadna natpisa, te naredbenog gumba koji pokreće proceduru za izračun i naredbenog gumba koji pokreće proceduru za novi unos podataka.
Konačni izgled forme je prikazan na slici 8.
Slika 8. Konačni izgled forme
Tablica 3. Vrijednosti osobina za kontrole na formi:
INCIJALNI NAZIV OBJEKTA (NAME)
NOVI NAZIV (NAME)
NOVI TEKST
Button1 cmdIzracunaj Izračunaj
Button2 cmdNovi Novi unos
TextBox1 txtA
TextBox2 txtB
TextBox3 txtC
TextBox4 txtRazlika
Label1 lblBroj_A Broj A:
Label2 lblBroj_B Broj B:
Label3 lblBroj_C Broj C:
Label4 lblRazlika Razlika:
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 13
Za svaki događaj, u našem slučaju za pritisak na gumb, potrebno je dodati pripadajući programski kôd. Prozor s programskim kôdom otvara se dvoklikom na objekt s forme ili odabirom opcije View code u prozoru s rješenjima (Solution Explorer).
Varijable se prije uporabe deklariraju. Globalne varijable su postojane, traju koliko i program i zadržavaju vrijednosti od jednog poziva funkcije do drugog. Lokalne varijable su deklarirane unutar funkcije (ili bloka) i traju samo dok se funkcija (blok) izvodi.
Programski kôd započinje deklariranjem globalnih varijabli A, B, C i Razlika kao tipa Double tj. realni brojevi dvostruke preciznosti. Globalne varijable deklariramo u klasi Form1: Public Class Form1
Inherits System.Windows.Forms.Form
Dim A, B, C, Razlika As Double
Inicijalno su vrijednosti brojčanih varijabli nakon deklariranja jednake 0, no moguće ih je i definirati tako da na početku imaju neku konkretnu vrijednost npr: Dim X as Integer = 12
Dvoklikom na objekt cmdIzracunaj, Visual Basic automatski kreira početni kôd za potprogram događaja cmdIzracunaj_Click() tj. aktiviranje naredbenog gumba cmdIzracunaj: Private Sub cmdIzracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzracunaj.Click
End Sub
Između Private Sub cmd_Izracunaj i End Sub upisuje se programski kôd koji se izvršava nakon aktiviranja gumba od strane korisnika.
Kada je korisnik unio brojeve u okvire s tekstom, u potprogramu za događaj cmdIzracunaj_Click postavljaju se vrijednosti varijabli A, B i C na vrijednosti unesene u okvre s tekstom txtA, txtB i txtC prema: Private Sub cmdIzracunaj_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles cmdIzracunaj.Click
A = CDbl(txtA.Text)
B = CDbl(txtB.Text)
C = CDbl(txtC.Text)
Tekst unesen u okvir s tekstom txtA prikazan je izrazom txtA.Text. Vrijednosti osobina zapisuju se u obliku objekt.osobina. Nakon upisanog imena objekta i točke, Visual Basic nudi popis osobina koju možemo automatski upisati odabirom i pritiskom tipke Tab (slika 9).
Programiranje i algoritmi – podloge za vježbe
14 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Slika 9.Automatski upis osobine
Funkcija CDbl označava pretvorbu (eng. converting) tekstualne vrijednosti u numeričku vrijednost tipa Double. Prema dijagramu toka potrebno je ispitati da li je vrijednost varijable A istovremeno veća i od varijable B i od varijable C. Za tu svrhu koristi se naredba uvjetnog grananja (odn. logičke usporedbe) koja određuje koji će se dio programskog koda izvršiti ovisno o istinitosti ispitanog uvjeta. Općeniti zapis sintakse:
If uvjet_1 Then blok_naredbi_1 Elseif uvjet_2 blok_naredbi_2 Else blok_naredbi_3 Endif
Potrebno je ispitati da li su zadovoljena dva uvjeta istovremeno, pa u takvom slučaju takve uvjete treba povezati tzv. logičkim operatorom konjukcije (And). Svaki od dva povezana uvjeta koristi operator usporedbe označen simbolom >.
If A > B And A > C Then
End If
Tablica 4. Popis operatora usporedbe
OPERATOR VRSTA USPOREDBE
= Jednakost
< Manje od
<= Manje ili jednako
> Veće od
>= Veće ili jednako
<> Nejednakost
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 15
Ovisnost rezultata logičkih operacija o vrijednostima operanada obično se prikazuje tzv. tablicom "istinitosti" za logičke operatore (A i B su operandi – logičke varijable):
A B A AND B A OR B istina istina istina istina istina laž laž istina laž istina laž istina laž laž laž laž
Ako su oba uvjeta zadovoljena izračunava se i dodjeljuje vrijednost varijabli Razlika prema izrazu A – (B + C) gdje naredba Razlika = A – (B + C) ne predstavlja matematičku jednadžbu već dodjeljivanje (pridruživanje), što znači da lijeva strana od znaka jednakosti poprima vrijednost desne strane. Zatim se izlazi iz strukture, odn. nastavlja se sa slijedećom naredbom iza rezervirane riječi EndIf. Ako jedan ili oba uvjeta nisu zadovoljeni, unutar strukture naredbe uvjetnog grananja prelazi se na ispitivanje slijedećeg uvjeta iza rezervirane riječi ElseIf (da li je varijabla B istovremeno veća od varijabli A i C). If A > B And A > C Then
Razlika = A - (B + C)
ElseIf B > A And B > C Then
Razlika = B - (A + C)
End If
Ako je taj uvjet ispunjen, izračunava se i dodjeljuje vrijednost varijabli Razlika prema izrazu B – (A + C). Ako niti taj uvjet nije ispunjen onda preostaje samo mogućnost da je vrijednost varijable C najveća – vrijednost varijable razlika tada se izračunava prema naredbi koja slijedi iza rezervirane riječi Else.
Cjelokupni programski kôd naredbe uvjetnog grananja If…Then…Else za ovaj primjer je: If A > B And A > C Then
Razlika = A - (B + C)
ElseIf B > A And B > C Then
Razlika = B - (A + C)
Else
Razlika = C - (A + B)
End If
Ovdje je važno uočiti i razumjeti da će se, ovisno o vrijednostima varijabli A, B i C uvijek izvršiti jedna i samo jedna od triju naredbi za dodjeljivanje vrijednosti varijabli Razlika, a nakon toga izvođenje programa se nastavlja sa prvom slijedećom naredbom iza rezerviranje riječi End If koja označava kraj strukture uvjetnog grananja.
Programiranje i algoritmi – podloge za vježbe
16 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Na kraju potprograma ispisuje se vrijednost varijable Razlika u okvir s tekstom txtRazlika. txtRazlika.Text = Razlika
Potprogram cmdNovi_Click za novi unos vraća osobine objekata na početne vrijednosti. Cjelokupni programski kôd rješenja zadatka je slijedeći: Public Class Form1
Inherits System.Windows.Forms.Form
Dim A, B, C, Razlika As Double
Private Sub cmdIzracunaj_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles cmdIzracunaj.Click
A = CDbl(txtA.Text)
B = CDbl(txtB.Text)
C = CDbl(txtC.Text)
If A > B And A > C Then
Razlika = A - (B + C)
ElseIf B > A And B > C Then
Razlika = B - (A + C)
Else
Razlika = C - (A + B)
End If
txtRazlika.Text = Razlika
End Sub
Private Sub cmdNovi_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles cmdNovi.Click
txtA.Text = ""
txtB.Text = ""
txtC.Text = ""
txtRazlika.Text = ""
End Sub
End Class
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 17
Slika 10. Izbornik Debug
Da bi se program pokrenuo, prvo je potrebno izvršiti prevođenje u strojni jezik. Proces prevođenja pokrećemo klikom na gumb Start u traci s alatima, pritiskom F5 na tipkovnici ili pod opcijom Debug →Start u standardnoj traci (slika 10). Ako nema sintaksnih grešaka, odmah nakon prevođenja programa program će se i pokrenuti, tj. prikazati će se forma na ekranu u obliku novog aktivnog prozora. Primjer ispisa na formi nakon korištenja programa prikazan je na slici 11.
Slika 11. Ispis na formi nakon izvođenja programa
Prilikom osmišljavanja i pisanja programskog koda dolazi do pogrešaka koje se odražavaju na rad programa, tj. čine da program ne radi kako je zamišljeno. Općenito, greške mogu biti:
• sintaksne – pogreške kod pisanja, npr. krivo napisana varijabla ili rezervirana programska riječ,
• greške prilikom rada (runtime error) – nema sintaksne greške već se greška događa prilikom izvršavanja programskog koda npr. kada se želi izvršiti objekt bez prethodnog instanciranja. Prilikom takve greške program može zaustaviti rad.
• logičke greške najteže se otkrivaju, a javljaju se kao rezultat logičkih grešaka u algoritmima aplikacije.
Programiranje i algoritmi – podloge za vježbe
18 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
5. Zbroj niza vrijednosti
Napisati program za unos niza brojeva i izračunavanje aritmetičke sredine. Ovaj primjer prikazuje jedan od najjednostavnijih algoritama – zbrajanje niza vrijednosti.
Aritmetička sredina računa se prema jednadžbi: ⎟⎠
⎞⎜⎝
⎛= ∑
=
n
iix
nx
1
1
START
Sredina
END
Sredina = Zbroj / n
Zbroj = Zbroj + x
x
n = n + 1Pon
avlja
nje
ucita
vanj
a i
zbra
janj
a ko
je k
oris
nik
real
izira
pon
ovni
m p
oziv
om
proc
edur
e
Korisnik odlucuje o tijeku izvršavanja
preko sucelja
Slika 12. Dijagram toka
Na početku nema niti jednog unesenog broja tako da je varijabla n jednaka nuli. Korisnik unosi broj x, a varijabla Zbroj se uvećava za vrijednost varijable x. Nakon toga se i varijabla n uvećava za jedan (zato što smo unijeli 1 broj) izrazom n = n + 1, tj. iz 0 se mijenja u 1. Ponavljajući ovaj postupak unošenjem različitih brojeva preko varijable x, mijenjaju se varijable Zbroj i n. Aritmetička sredina cijelog niza definirana je varijablom Sredina koja će imati vrijednost Sredina = Zbroj / n. Na kraju programa ispisuje se vrijednost aritmetičke sredine.
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 19
Jedna od mogućih izvedbi ovog dijagrama toka u Visual Basic-u i korištenja od strane korisnika bila bi da korisnik unosi pojedini broj u jedan okvir s tekstom, te nakon unosa aktivira gumb za potvrdu. U drugom okviru bi se ispisivalo koliko je brojeva dosad uneseno, a aktiviranjem gumba za izračunavanje srednje vrijednosti u trećem bi se okviru ispisivala aritmetička sredina. Pritiskom na gumb za novi niz praznili bi se okviri s tekstom i program bi se pripremio za novi unos. Konačni izgled forme prikazan je na slici 13:
Slika 13. Konačni izgled forme
Vrijednosti osobina objekata koje treba promijeniti u okviru s osobinama (Properties) prikazane su u tablici 6:
Tablica 5. Izmijenjene vrijednosti osobina za objekte
INCIJALNI NAZIV OBJEKTA (NAME)
NOVI NAZIV (NAME)
NOVI TEKST
Button1 cmdUnesi Unesi
Button2 cmdIzracunaj Izračunaj
Button3 cmdNovi_niz Novi niz
TextBox1 txtUnos
TextBox2 txtVelicina
TextBox3 txtSredina
Label1 lblUpisite Upišite broj:
Label2 lblVelicina Veličina niza:
Label3 lblSredina Arit. sredina:
Programiranje i algoritmi – podloge za vježbe
20 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Početnu vrijednost za okvir s veličinom niza treba postaviti na 0.
Varijabli x pridodaje se brojčana vrijednost unesena u okvir s tekstom txtUnos, a varijabli Zbroj vrijednost varijable x: x = Val(txtUnos.Text)
Zbroj = Zbroj + x
Funkcija Val() pretvara unesene znakove u broj čiji je tip deklariran varijablom (Integer, Double…).
Zatim se dodaje programski kôd za ispis veličine niza, tj. za ispis vrijednosti varijable n u okvir s tekstom txtVelicina txtVelicina.Text() = n
U ovom slučaju varijable Zbroj i n su globalne jer se koriste i u potprogramu za izračunavanje aritmetičke sredine (Sredina = Zbroj / n), dok je varijabla x lokalna.
Lokalna varijabla x deklarira se u potprogramu cmdUnesi_Click kao realni broj prema shemi: Dim x As Double
Globalne varijable deklariramo u klasi Form1: Public Class Form1
Inherits System.Windows.Forms.Form
Dim n As Integer
Dim Zbroj As Double
Vrijednost varijable n biti će cjelobrojni, a varijable Zbroj realni broj.
Varijabla n (veličina niza) inicijalno ima vrijednost 0, što odgovara programu jer pri pokretanju programa nije unesen niti jedan broj. Nakon unosa i aktiviranja događaja cmdUnesi_Click varijabla n mora se uvećati za 1 n = n + 1
i prikazati u okviru s tekstom txtVelicina prema kodu: txtVelicina.Text() = n
Nakon unosa vrijednosti u varijablu x znakove upisane od strane korisnika u okvir s tekstom txtUnos je potrebno obrisati tj. dodijeliti osobini Text vrijednost praznog stringa prema: txtUnos.Text = ""
Cjelokupni programski kôd za ovaj događaj kao i za cijeli program nalazi se na kraju odjeljka.
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 21
U programskom kodu potprograma događaja cmdIzracunaj_Click, za izračun i ispis aritmetičke sredine varijabla Sredina poprima vrijednost kvocijenta ukupnog zbroja niza i veličine niza tj. Zbroj / n. Prethodno je potrebno lokalno deklarirati varijablu Sredina. Dim Sredina As Double
Sredina = Zbroj / n
Tako izračunatu vrijednost varijable Sredina potrebno je ispisati u okvir s tekstom txtSredina. txtSredina.Text = Str(Sredina)
U programskom kodu potprograma događaja cmdNovi_niz_Click, radi pripreme programa za novi unos i izračun sredine, vrijednosti globalnih varijabli n i Zbroj potrebno je vratiti na 0. n = 0
Zbroj = 0
Okvire s tekstom potrebno je postaviti na početne vrijednosti osobina prema: txtVelicina.Text = "0"
txtUnos.Text = ""
txtSredina.Text = ""
Cjelokupni kôd programa je kako slijedi:
Public Class Form1
Inherits System.Windows.Forms.Form
Dim n As Integer
Dim Zbroj As Double
Private Sub cmdUnesi_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdUnesi.Click
Dim x As Double
x = Val(txtUnos.Text)
Zbroj = Zbroj + x
n = n + 1
txtVelicina.Text() = n
txtUnos.Text = ""
End Sub
Programiranje i algoritmi – podloge za vježbe
22 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Private Sub cmdIzracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzracunaj.Click
Dim Sredina As Double
Sredina = Zbroj / n
txtSredina.Text = Str(Sredina)
End Sub
Private Sub cmdNovi_niz_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdNovi_niz.Click
n = 0
Zbroj = 0
End Sub
End Class
Slika 14. Rad programa
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 23
6. Izračun faktorijela (primjena petlje s brojačem)
Napisati program za učitavanje niza pozitivnih cijelih brojeva te izračun zbroja faktorijela elemenata tog niza koji su manji od 10. Formula za izračun faktorijela broja x:
( ) ( ) xxxx ∗−∗−∗∗∗∗∗= 124321! K
Slika 15. Dijagram toka
Programiranje i algoritmi – podloge za vježbe
24 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Prema dijagramu toka prikazanom na slici 15 potrebno je unijeti broj x i provjeriti da li je on manji od 10. Ako nije, program ga ne uzima u obzir te se dalje nastavlja s unosom drugih brojeva. Ako je x manji od 10 potrebno je izračunati njegov faktorijel (umnožak broja i svih njegovih prethodnika počevši od 1, npr faktorijel od 3 je umnožak 1 * 2 * 3 = 6) pomoću petlje koja povećava vrijednost varijable brojača i za 1 dok ne poprimi vrijednost broja x. Nova vrijednost varijable Faktorijel formira se tako da je pomnožimo s vrijednošću varijable i (Faktorijel = Faktorijel * i). Kada varijabla i poprimi vrijednost x izlazi se iz petlje i izračunata vrijednost faktorijela se pribraja vrijednosti varijable Zbroj prema izrazu Zbroj = Zbroj + Faktorijel. Vrijednost varijable Zbroj ispisuje se na formi.
Na formi se nalaze okvir s tekstom txtUnos za unos brojeva, okvir s tekstom txtZbroj za ispis zbroja faktorijela, naredbeni gumb cmdIzracunaj za potvrdu unosa izračun sume i dodavanje unesenog broja na popis. Forma još sadrži okvir s popisom lstLista te pripadne natpise.
Slika 16. Konačni izgled forme
Varijable Faktorijel i Zbroj su globalne varijable, a x i i lokalne unutar potprograma za događaj cmdIzracunaj_Click. Public Class Form1
Inherits System.Windows.Forms.Form
Dim Faktorijel, Zbroj As Double
Private Sub cmdIzracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzracunaj.Click
Dim x, i As Integer
Nakon unosa broja i pritiska na naredbeni gumb vrijednost varijable x poprima vrijednost teksta unesenog u okvir s tekstom txtUnos tipa Integer. Vrijednost osobine Text za okvir txtUnos se nakon toga vraća na početnu vrijednost.
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 25
x = CInt(txtUnos.Text)
txtUnos.Text = ""
Vrijednost varijable x mora biti manja od 10. Ako korisnik nije unio takav broj, program ne smije izračunavati faktorijel i zbroj. Stoga se postavlja uvjet preko strukture odluke If…Then: If x < 10 Then
End If
Ako je uvjet zadovoljen izvršava se programski kôd (unutar strukture odluke) za ispis varijable x na popis lstLista preko osobine Items.Add, te se vrijednost varijable Faktorijel postavlja na vrijednost 1. lstLista.Items.Add(x)
Faktorijel = 1
Izračunavanje faktorijela za broj x izvodi se preko For...Next petlje. For petlja izvršava programski kôd određeni broj puta prema općenitom zapisu:
For brojač = početak To kraj [Step korak] [naredbe] Next
Brojač je brojčana varijabla koja se koristi za praćenje iteracija unutar petlje. Brojač počinje od vrijednost početak, vrijednost kraj je maksimalna vrijednost brojača na kojoj se petlja zaustavlja. Step predstavlja korak za povećavanje brojača (predefinirana vrijednost je 1, a može biti i negativna)
U ovom primjeru brojač će biti varijabla i kojoj je početna vrijednost 1, a kraj vrijednost varijable x (korak povećanja će ostati predefiniran, tj. 1). Unutar petlje varijabla Faktorijel poprimat će vrijednost umnoška vlastite vrijednosti i varijable brojača i. Npr u prvoj iteraciji petlje vrijednost umnoška će biti 1*1=1, u drugoj, 1*2=2, u trećoj 2*3=6 itd. dok i ne poprimi vrijednost varijable x. For i = 1 To x
Faktorijel = Faktorijel * i
Next i
Nakon izlaska iz petlje dobivena vrijednost varijable Faktorijel pribraja se ukupnom zbroju faktorijela svih brojeva (varijabla Zbroj) koji treba ispisati. Cjelokupni programski kôd je: Public Class Form1
Inherits System.Windows.Forms.Form
Dim Faktorijel, Zbroj As Double
Programiranje i algoritmi – podloge za vježbe
26 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Private Sub cmdIzracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzracunaj.Click
Dim x, i As Integer
x = CInt(txtUnos.Text)
txtUnos.Text = ""
If x < 10 Then
lstLista.Items.Add(x)
Faktorijel = 1
For i = 1 To x
Faktorijel = Faktorijel * i
Next i
Zbroj = Zbroj + Faktorijel
End If
txtZbroj.Text = Zbroj
End Sub
End Class
Slika 17. Rad programa
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 27
7. Zbroj članova reda - uporaba petlje sa logičkim uvjetom
Program služi za izračunavanje i ispisivanje zbroja članova reda, te potrebnog broja članova reda n za zadanu točnost.
START
Tocnost
Zbroj, Velicina
END
i = i + 1
i = 1x = 1
Zbroj = Zbroj + x
Tocnost > 0AND
Tocnost <= 1
NE DA
x > Tocnost
x = (-1) ^ (i + 1) / (2 * i – 1)
Velicina = i - 1
DANE
Slika 18. Dijagram toka
Programiranje i algoritmi – podloge za vježbe
28 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Potrebno je odrediti broj članova reda tako da apsolutna vrijednost posljednjeg člana reda bude manja od učitane vrijednosti ε, gdje je 0 < ε ≤ 1. Formula reda glasi:
f(n) = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ....... ± 1/ ( 2n - 1 ) gdje je n=1,2,3...
Prema dijagramu toka na slici 18 korisnik unosi točnost ε koju će predstavljati varijabla Tocnost. Ako usporedba unesene vrijednosti pokazuje da točnost nije veća od 0 i manja ili jednaka 1 program traži novi unos. Ako je uvjet zadovoljen postavlja se početni član reda x = 1 i brojač varijabla i = 1. Nakon usporedbe s varijablom Tocnost vrijednost varijable Zbroj se uvećava za vrijednost varijable člana x. Brojač varijabla i se uvećava za 1 te se kreira novi član reda prema formuli: x = (-1) ^ (i + 1) / (2 * i – 1). Tako izračunat član x uspoređuje se s vrijednošću varijable i postupak se ponavlja dok vrijednost varijable x ne postane manja od vrijednosti varijable Tocnost. Tada se ispisuje ukupni zbroj (Zbroj) i veličina reda članova (Velicina) te program završava.
Izgled forme je prema slici 19 s okvirima s tekstom txtTocnost, txtVelicina i txtZbroj te naredbenim gumbom cmdIzracunaj.
Slika 19. Izgled forme
Cijeli kôd za ovaj program smjestit će se unutar potprograma cmdIzracunaj_Click. Varijable Tocnost, x i Zbroj su tipa Double, a Velicina i i su Integer. Brojčane varijable se ne moraju nužno deklarirati s početnom vrijednosti 0. Prema formuli reda varijabla i počinje s 1 stoga će se deklarirati s početnom vrijednosti 1 prema izrazu: Dim i As Integer = 1
Vrijednost varijable Tocnost dobije se iz unosa u okvir s tekstom txtTocnost, a ako je ta vrijednost manja od 0 ili veća ili jednaka 1 prilikom rada programa prikazat će se okvir s porukom (Message Box) koji će upozoriti korisnika na pogrešan unos te izaći iz potprograma funkcijom Exit Sub prema: Tocnost = CDbl(txtTocnost.Text)
If Tocnost < 0 Or Tocnost >= 1 Then
MsgBox("Broj mora biti pozitivan i manji od 1")
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 29
Exit Sub
End If
Opći zapis izraza za okvir s porukom je:
MsgBox(poruka, [vrsta], [naslov])
pri čemu je poruka izraz tipa String, zapisuje se između navodnika, a prikazuje se korisniku u okviru s tekstom. Izrazi u uglatim zagradama nisu obavezni. Vrsta se odnosi na stil okvira s porukom, a naslov je tekst ispisan na traci s naslovom (Title bar) okvira. U ovom primjeru poruka je "Broj mora biti pozitivan i manji od 1", vrsta je predefinirana tj. MsgboxStyle.DefaultButton1 i ima jedan OK gumb za potvrdu (slika 20).
Slika 20. Okvir s porukom
Ako je zadovoljen uvjet za vrijednost varijable Tocnost, prelazimo na izračun broja x i ukupnog zbroja preko While petlje. While petlja se koristi za izvršavanje programskog koda više puta bez prethodnog znanja broja potrebnih iteracija. Petlja traje dok je uvjet istinit (True). Postoji više izvedbi ove petlje, a opći zapis je:
Do [{While | Until} uvjet] [naredbe] Loop
Kod Do While petlje provjerava se da li je uvjet istinit te se izvršavaju izrazi programskog koda uključujući prvu iteraciju. Petlja završava kada uvjet poprimi vrijednost False. Do Until petlja završava kada uvjet poprimi vrijednost True.
U ovom primjeru izračunavat će se x i Zbroj sve dok je apsolutna vrijednost varijable x veća od zadane točnosti prema izrazu: Math.Abs(x) > Tocnost
Funkcija Math koristi se za matematičke funkcije (sin, cos, tan, log…), a u ovom primjeru za izračun apsolutne vrijednosti koristit će se funkcija Abs. Unutar petlje izračunavat će se pojedini članovi i njihov ukupni zbroj, te će se uvećavati varijabla i za novu iteraciju i brojač članova reda. Do While Math.Abs(x) > Tocnost
Programiranje i algoritmi – podloge za vježbe
30 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
x = (-1) ^ (i + 1) / (2 * i - 1)
Zbroj = Zbroj + x
i = i + 1
Velicina = Velicina + 1
Loop
Kada uvjet više nije ispunjen izlazi se iz petlje i ispisuje zbroj i veličina reda u predviđene okvire. Private Sub cmdIzracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzracunaj.Click
Dim Velicina As Integer
Dim i As Integer = 1
Dim x, Tocnost, Zbroj As Double
Tocnost = CDbl(txtTocnost.Text)
If Tocnost < 0 Or Tocnost >= 1 Then
MsgBox("Broj mora biti pozitivan i manji od 1")
Exit Sub
End If
x = 1
Do While Math.Abs(x) > Tocnost
x = (-1) ^ (i + 1) / (2 * i - 1)
Zbroj = Zbroj + x
i = i + 1
Velicina = Velicina + 1
Loop
txtVelicina.Text = Velicina
txtZbroj.Text = Zbroj
End Sub
Slika 21. Rad programa
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 31
8. Uporaba strukture jednodimenzionalnog polja
Program služi za unos niza brojeva i izračun aritmetičke sredine: ⎟⎠
⎞⎜⎝
⎛= ∑
=
n
iix
nx
1
1
START
A (i)
Sredina
END
i = 1, n
Zbroj = Zbroj + A(i)
Sredina = Zbroj / n
i = 1, n
n
Slika 22. Dijagram toka
Program ima istu funkciju kao i program opisan u zadatku 2 osim što će se brojevi unositi u polje (array).
Prema dijagramu prikazanom na slici 22 brojevi se unose u jednodimenzionalno polje A. Polja omogućuju višestruku pohranu istog tipa podataka bez kreiranja posebnih varijabli za svaki od podataka. Svi podaci su na taj način pohranjeni pod istim imenom, a manipulacija s pojedinim podatkom izvodi se preko indeksa polja. Jednodimenzionalno polje možemo zamisliti kao redak s podacima gdje je svaki podatak smješten u svoj stupac. Primjer polja A s 5 elemenata koji su cijeli brojevi:
Programiranje i algoritmi – podloge za vježbe
32 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
indeks 0 1 2 3 4 A(indeks) 12 238 17 89 975
Indeks za polje A predstavlja u ovom primjeru varijabla i. Za razliku od zadatka 2 gdje se nakon svakog unosa izračunavao zbroj, u ovom primjeru najprije će se unijeti svi brojevi u polje. Zatim će se varijabli Zbroj dodavati vrijednosti elemenata polja A pomoću petlje s brojačem i. Petlja će najprije varijabli Zbroj dodati A(0), pa na izračunatu vrijednost dalje dodavati A(1), A(2) itd. sve do A(n). Na izalsku iz petlje varijabla Zbroj imati će vrijednost sume svih elemenata polja A. Nakon petlje slijedi izačunavanje i ispis vrijednosti aritmetičke sredine.
Slika 23. Konačni izgled forme
Polje se deklarira na isti način kao i varijabla uz razliku što se u zagradama definira maksimalni broj elemenata. Polje A() imati će maksimalno 100 elementa pa se deklarira (globalno) prema: Dim A(100) As Single
Polje A(100) deklarirali smo kao Single, stoga će i zbroj njegovih elementa (varijabla Zbroj) biti Single. Deklariranje različitih varijabli istog tipa možemo skratiti odvajajući varijable zarezom: Dim A(100), Zbroj As Single
Brojevi se unose u polje preko događaja cmdUnesi_Click prema: txtUnos.Focus()
i = i + 1
A(i) = CInt(txtUnos.Text)
txtVelicina.Text() = i
txtUnos.Text = ""
gdje preko osobine Focus okvir txtUnos postaje aktivan za upis.
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 33
Zbroj se izračunava u potprogramu cmdIzracunaj_Click dodavajući pojedini član A(k) For…Next petljom s brojačem varijablom k prema: Dim Sredina As Single
Dim k As Integer
For k = 1 To i
Zbroj = Zbroj + A(k)
Next k
Sredina = Zbroj / i
txtSredina.Text = Str(Sredina)
gdje brojač k poprima vrijednosti od 1 do i.
Cjelokupni programski kod: Public Class Form1
Inherits System.Windows.Forms.Form
Dim i As Integer
Dim A(100), Zbroj As Single
Private Sub cmdUnesi_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdUnesi.Click
txtUnos.Focus()
i = i + 1
A(i) = CInt(txtUnos.Text)
txtVelicina.Text() = i
txtUnos.Text = ""
End Sub
Private Sub cmdIzracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzracunaj.Click
Dim Sredina As Single
Dim k As Integer
For k = 1 To i
Zbroj = Zbroj + A(k)
Next k
Sredina = Zbroj / i
txtSredina.Text = Str(Sredina)
End Sub
Programiranje i algoritmi – podloge za vježbe
34 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Private Sub cmdNovi_niz_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdNovi_niz.Click
txtUnos.Focus()
i = 0
Zbroj = 0
txtVelicina.Text = "0"
txtUnos.Text = ""
txtSredina.Text = ""
End Sub
End Class
Slika 24. Rad programa
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 35
9. Određivanje minimuma i maksimuma unutar niza vrijednosti
Program služi za unos niza brojeva u polje i ispis brojeva koji imaju najveću i najmanju vrijednost.
START
A(i)
END
Da
Max = A (1)Min = A (1)
j = 1, i
A(j) > Max
MinMax
Max = A(j)A(j) < Min
Ne
NeDa
Min = A(j)
i = i + 1
Uci
tava
nje
clan
ova
polja
uz
asto
pnim
poz
ivan
jem
pro
cedu
re
Slika 25. Dijagram toka
Programiranje i algoritmi – podloge za vježbe
36 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Prema dijagramu na slici 25 brojevi se unose u polje A. Nakon unosa, varijable koje predstavljaju najveći i najmanji broj poprimaju vrijednost prvog člana polja A(1). Usporedbom svakog člana polja s trenutnim uspostavljaju se novi minimalni i maksimalni broj.
Slika 26. Konačni izgled forme
Programski kôd za događaj cmdUnos_Click je: i += 1
A(i) = CDbl(txtUnos.Text)
lstLista.Items.Add(txtUnos.Text)
txtUnos.Text = ""
txtUnos.Focus()
Svakim unosom broja u polje A(i) iz okvira s tekstom txtUnos, potvrdom na gumb cmdUnesi uvećava se varijabla i za jedan tj. i = i + 1. Visual Basic omogućava pisanje ovog izraza u obliku i += 1. Uneseni brojevi unose se u popis lstLista. Nakon početnog definiranja, varijable Min i Max poprimaju vrijednosti prvog člana polja A(1). For…Next petlja svaki element polja uspoređuje s vrijednostima varijabli Min i Max preko If…Then struktura odluke. For j = 1 To i
If A(j) < Min Then
Min = A(j)
End If
If A(j) > Max Then
Max = A(j)
End If
Next j
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 37
Ako je zadovoljen uvjet da je vrijednost elementa A(j) manja od vrijednosti varijable Min tada je A(j) najmanji element i Min poprima vrijednost tog elementa. Na isti način, ako je vrijednost elementa A(j) veća od vrijednosti varijable Max, tada Max poprima vrijednost A(j). Programski kôd je kako slijedi: Public Class Form1
Inherits System.Windows.Forms.Form
Dim A(100), Min, Max As Double
Dim i As Integer
Private Sub cmdUnos_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdUnos.Click
i += 1
A(i) = CDbl(txtUnos.Text)
lstLista.Items.Add(txtUnos.Text)
txtUnos.Text = ""
txtUnos.Focus()
End Sub
Private Sub cmdIzracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzracunaj.Click
Dim j As Integer
Min = A(1)
Max = A(1)
For j = 1 To i
If A(j) < Min Then
Min = A(j)
End If
If A(j) > Max Then
Max = A(j)
End If
Next j
txtMin.Text = Min
txtMax.Text = Max
End Sub
End Class
Programiranje i algoritmi – podloge za vježbe
38 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Slika 27. Rad programa
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 39
10. Manipulacija sa indeksom polja
Program služi za unos brojeva u polje A i kreiranje i ispis novog polja B s elementima koji će biti ispisani obrnutim redoslijedom od unosa u polje A.
Program formira polje B tako da indeks j poprima vrijednosti i – j - 1, gdje je i ukupni broj članova polja A. Tako da imamo npr. za polja od 5 elemenata:
B(0) B(1) B(2) B(3) B(4)
A(4) A(3) A(2) A(1) A(0)
Element B(0) mora poprimiti vrijednost elementa A(4) preko formule: B(j)=A(i – j - 1) za i = 5, B(0) = A(5 – 0 - 1).
Slika 28. Konačni izgled forme
Potprogramom događaja cmdUnesi_Click unose se brojevi preko okvira teksta uz koji se nalazi natpis lblUnos i ispisujemo ih u popis lstListaA prema: Private Sub cmdUnos_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdUnos.Click
A(i) = CInt(txtUnos.Text)
lstListaA.Items.Add(A(i))
txtUnos.Text = ""
txtUnos.Focus()
i += 1
lblUnos.Text = "Unesite " + CStr(i + 1) + ". član:"
End Sub
Osobinom Text postavlja se tekst natpisa lblUnos mijenjajući redni broj člana: lblUnos.Text = "Unesite " + CStr(i + 1) + ". član:"
Programiranje i algoritmi – podloge za vježbe
40 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Dijelovi natpisa stavljaju se u navodnike i vežu znakom +, a promjenjivi dio rednog broja pretvara se u String i poprima vrijednost i + 1. Unutar potprograma za događaj cmdIzracunaj_Click brišu se sve stavke popisa lstListaB za novi ispis pomoću osobine Items.Clear. Unutar For…Next petlje formira se novo polje i ispisuje u popis. Ukupni programski kôd je: Public Class Form1
Inherits System.Windows.Forms.Form
Dim A(100), B(100), i As Integer
Private Sub cmdUnos_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdUnos.Click
A(i) = CInt(txtUnos.Text)
lstListaA.Items.Add(A(i))
txtUnos.Text = ""
txtUnos.Focus()
i += 1
lblUnos.Text = "Unesite " + CStr(i + 1) + ". član:"
End Sub
Private Sub cmdIzracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzracunaj.Click
Dim j As Integer
lstListaB.Items.Clear()
For j = 0 To i - 1
B(j) = A(i - j - 1)
lstListaB.Items.Add(B(j))
Next j
End Sub
End Class
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 41
11. Ugnježđenje petlji na primjeru "bubble" sort algoritma
Napisati program koji će učitati polje cjelobrojnih brojeva i sortirati ih po rastućem redoslijedu "bubble sort" metodom.
START
N
i = 1, N
A(i)
i = 1, n - 1
j = 1, n - i
A(j) > A(j+1)
temp = A(j)A(j) = A(j+1)
A(j+1) = temp
A(i)
END
DA
NE
i = 1, n
Slika 29. Dijagram toka
Programiranje i algoritmi – podloge za vježbe
42 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Nakon što su uneseni brojevi u polje A, preko unutrašnje petlje s brojačem j uspoređuju se susjedni članovi polja i zamjenjuju mjesta ako je zadovoljen uvjet da je predhodnik veći od slijedbenika (A(j) > A(j+1)). Zamjena se vrši tako da varijabla spremnik Temp poprima vrijednost predhodnika A(j), a predhodnik A(j) poprima vrijednost slijedbenika A(j+1). Nakon toga slijedbenik A(j+1) poprima vrijednost varijable Temp tj. A(j) (slika 30).
A(j)
6
A(j+1)
3
Temp
6
Temp = A(j)
A(j)
6
A(j+1)
3
Temp
INICIJALNO STANJE
A(j)
3
A(j+1)
3
Temp
6
A(j) = A(j+1)
A(j)
3
A(j+1)
6
Temp
6
A(j+1)= Temp
1
2
3
4
Slika 30. Zamjena vrijednosti susjednih članova polja
PRIMJER "bubble sort" algoritma:
broj članova niza: n = 4, članovi niza: 7, 2, 6, 1
7 > 2 2, 7, 6, 1 j = 17 > 6 2, 6, 7, 1 3 usporedbe 7 > 1 2, 6, 1, 7 i = 1, n – 1
ukupno 3 prolaza kroz podatke = 2 < 6 2, 6, 1, 7 j = 2 = broj clanova niza - 16 > 1 2, 1, 6, 7 2 usporedbe
i = 1, n – 2 vanjska petlja: j = 1, n - 1
j = 3 2 > 1 1, 2, 6, 7 1 usporedba
i = 1, n – 3 Nakon prvog prolaza kroz vanjsku petlju najveći broj sigurno dolazi na zadnje mjesto (npr. kao broj 7 na slici 31). Unutrašnja petlja (brojač j) mora imati broj prolaza za jedan manje za svaki novi prolaz kroz vanjsku petlju (brojač i), zato što u svakom prolazu kroz vanjsku petlju jedan broj zauzima svoje pravo mjesto. Brojač unutrašnje petlje stoga poprima vrijednosti od 1 do n – brojač vanjske petlje (u ovom primjeru n-i). Broj prolaza kroz vanjsku petlju jednak je broju članova niza umanjenom za 1.
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 43
Forma prema slici 31 sadrži gumbe za unos broja u polje, sortiranje i izlaz, okvir s tekstom za unos, dva popisa za nesortirani i sortirani niz te pripadajuće natpise.
Slika 31. Konačni izgled forme
Dim A(100), n As Integer
Private Sub cmdUnesi_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdUnesi.Click
LstNesortirano.Items.Add(txtUnos.Text)
n = n + 1
a(n) = CInt(TxtUnos.Text)
lblPolje.Text = "A(" + CStr(n) + "):"
txtUnos.Text() = ""
txtUnos.Focus()
End Sub
Private Sub cmdSortiraj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdSortiraj.Click
Dim i, j, Temp As Integer
For i = 1 To n - 1
For j = 1 To n - i
If a(j) > a(j + 1) Then
Temp = a(j)
a(j) = a(j + 1)
a(j + 1) = Temp
End If
Next j
Next i
Programiranje i algoritmi – podloge za vježbe
44 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
lstSortirano.Items.Clear()
For i = 1 To n
lstSortirano.Items.Add(a(i))
Next i
End Sub
Private Sub cmdIzlaz_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzlaz.Click
End
End Sub
End Class
Slika 32. Rad programa
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 45
12. Uporaba dvodimenzionalnog polja za spremanje matrice i rad sa matricom
Napisati program za unos realnih brojeva u kvadratnu matricu te ispis koliko se u njoj nalazi nula, pozitivnih i negativnih brojeva.
1.1 1.2 1.3 1.4 ... 1.n-1 1.n
2.1 2.2 2.3 ... ... 2.n-1 2.n
3.1 3.2 3.3 ... ... ... ...
4.1 ... ... ... ... ... ...
... ... ... ... n-2.n-2 ... n-2.n
n-1.1 n-1.2 ... ... ... n-1.n-1 n-1.n
n.1 n.2 ... ... n.n-2 n.n-1 n.n
Slika 33. Kvadratna martica
Za razliku od niza, matrica se prikazuje kao polje s dvije dimenzije, a sastoji se od elemenata smještenih u obliku tablice. Svaki element matrice ima redni broj retka i redni broj stupca u kojem se nalazi. (slika 33). Kvadratna matrica ima isti broj redaka i stupaca.
Dijagram toka prikazan na slici 34. sastoji se od unosa broja redaka i stupaca u varijablu n, unosa elemenata u dvodimenzionalno polje A(i,j) gdje i označava broj retka, a j broj stupca u kojem se nalazi element. Varijable i i j u dijagramu su cjelobrojni brojevi (0,1,2,3...n) Prvo se unose elementi jednog retka (varijabla i je konstantna dok se vrijednost varijable j povećava za 1), zatim drugog itd. Nakon svakog unosa, element matrice A(i,j) se uspoređuje s nulom, te ovisno da li je veći, manji ili jednak nuli povećavaju se vrijednosti varijabli Broj_poz, Broj_neg ili Broj_nula za jedan.
Programiranje i algoritmi – podloge za vježbe
46 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
START
n
i = 1, n
j = 1, n
A(i, j)
A(i, j) > 0
Broj_poz = Broj_poz + 1
A(i, j) < 0
Broj_neg = Broj_neg + 1
Broj_nula = Broj_nula+ 1
Broj_poz, Broj_neg, Broj_nula
END
DA NE
DA NE
Slika 34. Dijagram toka
Slika 35 Konačni izgled forme
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 47
Za razliku od prethodnih primjera, aktiviranjem gumba cmdNova prvo će se definirati koliko matrica ima stupaca i redaka (n) te će se stoga unositi samo n x n brojeva. Unos se izvodi preko okvira za unos (Input Box). Općeniti izraz je:
InputBox(poruka, [naslov], [predefinirani_unos])
Izrazi u zagradama nisu obavezni. Poruka je tekst namijenjen korisniku za opis unosa, naslov je tekst prikazan u naslovnoj traci dok je predefinirani_unos skup znakova automatski unesen u okvir za unos, a ako korisnik nije zadovoljan s njim može ga obrisati i ponoviti unos.
U ovom primjeru vrijednost varijable n se unosi uporabom okvira za unos (slika 36) na slijedeći način: n = InputBox("Unesite broj redaka i stupaca matrice", "Velicina matrice")
Slika 36
Uporabom vanjske (indeks i) petlje za retke i unutrašnje (indeks j) za stupce omogućuje se popunjavanje polja. For i = 1 To n
For j = 1 To n
Next j
Next i
Unutar te petlje unosi se programski kôd za unos vrijednosti u polje A(i,j) preko okvira za unos (slika 37) i ispis na popis lstMatrica.
Slika 37
For i = 1 To n
For j = 1 To n
A(i, j) = InputBox("Unesite broj za element u " + CStr(i) +
". retku i " + CStr(j) + ". stupcu")
lstMatrica.Items.Add(CStr(i) + "." + CStr(j) + " = " + CStr(a(i, j)))
Next j
Next i
Programiranje i algoritmi – podloge za vježbe
48 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Uneseni element polja uspoređuje se s 0 i prema ispunjenju zadanog uvjeta povećava se vrijednost varijablama poz, neg, i nula te se nakon završetka obje petlje ispisuju njihove vrijednosti u okvire s tekstom. Cijeli programski kôd slijedi: Private Sub cmdNova_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdNova.Click
Dim n, i, j, m, k, poz, neg, nula As Integer
Dim A(100, 100) As Double
n = InputBox("Unesite broj redaka i stupaca kvadratne matrice",_
+ "Velicina matrice")
For i = 1 To n
For j = 1 To n
A(i, j) = InputBox("Unesite broj za element u " + CStr(i) _
+ ". retku i " + CStr(j) + ". stupcu")
lstMatrica.Items.Add(CStr(i) + "." + CStr(j) + " = " _
+ CStr(a(i, j)))
If A(i, j) > 0 Then
poz += 1
ElseIf A(i, j) < 0 Then
neg += 1
Else
nula += 1
End If
Next j
Next i
txtPoz.Text = poz
txtNeg.Text = neg
txtNula.Text = nula
End Sub
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 49
13. Artitmetička sredina redaka matrice
Napisati program za unos brojeva u pravokutnu matricu te za izračun i ispis aritmetičke sredine za svaki pojedini redak.
Pravokutna matrica ima m redaka i n stupaca (slika 38), a zapisuje se u dvodimenzionalno polje A(i,j).
Prema dijagramu prikazanom na slici 39. nakon unosa u polje, unutar petlje za stupce s brojačem j ,koja se nalazi u petlji za retke, formira se ukupni zbroj elemenata pojedinog retka. Izlaskom iz petlje za stupce izračunati zbroj dijeli se s brojem stupaca n, ispisuje izračunata sredina te se prijelazi na slijedeći redak (novi korak petlje za retke).
Slika 38. Pravokutna matrica
START
m, n
i = 1, n
j = 1, m
A(i, j)
i = 1, n
Zbroj = 0
j = 1, m
Zbroj = Zbroj + A(i, j)
Sredina = Zbroj / m
Sredina
END
Slika 39. Dijagram toka
1.1 1.2 1.3 ... 1.n-1 1.n
2.1 2.2 2.3 ... 2.n-1 2.n
3.1 3.2 3.3 ... ... ...
... ... ... ... ... ...
... ... ... ... ... m-2.n
m-1.1 m-1.2 ... ... m-1.n-1 m-1.n
m.1 m.2 ... m.n-2 m.n-1 m.n
Programiranje i algoritmi – podloge za vježbe
50 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Članovi polja A(i,j) ispisuju se u popis lstMatrica, a izračunate sredine u popis lstRedci (slika 40).
Slika 40. Konačni izgled forme
Prvo se unose brojevi redaka i stupaca pravokutne matrice u varijable m i n iz okvira za unos prema: n = InputBox("Unesite broj redaka matrice", "Broj redaka")
m = InputBox("Unesite broj stupaca matrice", "Broj stupaca")
Vanjska For petlja za retke s brojačem varijablom i i unutrašnja za stupce s brojačem varijablom j koriste se za unos elementa u polje A(i, j) i ispis u popis lstMatrica prema: For i = 1 To n
For j = 1 To m
A(i, j) = InputBox("Unesite broj za element u " + CStr(i) +
". retku i " + CStr(j) + ". stupcu")
lstMatrica.Items.Add(CStr(i) + "." + CStr(j) + " = " +
CStr(a(i, j)))
Next j
Next i
Nakon unosa elemenata matrice preko vanjske i unutrašnje petlje izračunava se vrijednost varijable Zbroj. Za svaki novi izračun aritmetičke sredine retka vrijednost varijable Zbroj se postavlja na 0.
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 51
For i = 1 To n
Zbroj = 0
For j = 1 To m
Zbroj = Zbroj + A(i, j)
Next j
Next i
Nakon petlje za stupce izračunava se vrijednost varijable Sredina i dodaje u popis lstRedci prema: Sredina = Zbroj / m
lstRedci.Items.Add(CStr(i) + ". redak = " + CStr(Sredina))
Ukupni programski kôd je: Private Sub cmdNova_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdNova.Click
Dim i, j, m, n, k, l As Integer
Dim a(100, 100), Zbroj, Sredina As Double
lstMatrica.Items.Clear()
lstRedci.Items.Clear()
n = InputBox("Unesite broj redaka matrice", "Broj redaka")
m = InputBox("Unesite broj stupaca matrice", "Broj stupaca")
For i = 1 To n
For j = 1 To m
a(i, j) = InputBox("Unesite broj za element u " + CStr(i) +
". retku i " + CStr(j) + ". stupcu")
lstMatrica.Items.Add(CStr(i) + "." + CStr(j) + " = " +
CStr(a(i, j)))
Next j
Next i
For i = 1 To n
Zbroj = 0
For j = 1 To m
Zbroj = Zbroj + A(i, j)
Next j
Sredina = Zbroj / m
lstRedci.Items.Add(CStr(i) + ". redak = " + CStr(Sredina))
Next i
End Sub
Programiranje i algoritmi – podloge za vježbe
52 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Slika 41. Rad programa
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 53
14. Najveći parni broj na gl. dijagonali matrice
Program služi za unos brojeva u kvadratnu matricu te izračun i ispis najvećeg parnog broja na glavnoj dijagonali. Glavna dijagonala je skup elemenata prikazan na slici 43. Karakterizira je jednakost indeksa za redak i stupac tj i = j.
1.1 1.2 1.3 1.4 ... 1.n-1 1.n
2.1 2.2 2.3 ... ... 2.n-1 2.n
3.1 3.2 3.3 ... ... ... ...
... ... ... ... ... ... ...
... ... ... ... n-2.n-2 ... n-2.n
n-1.1 n-1.2 ... ... ... n-1.n-1 n-1.n
n.1 n.2 ... ... n.n-2 n.n-1 n.n
Glavnadijagonala
Slika 42. Glavna dijagonala kvadratne matrice
Prema dijagramu prikazanom na slici 44 program unosi brojeve kao elemente polja A(i,j). Zatim se provjerava istinitost uvjeta da je element na glavnoj dijagonali parni broj, te ako jest element se unosi u novo polje B(k). Da bi formirali novo polje, prije dodjeljivanja vrijednosti svakog novog člana polja potrebno je povećati vrijednost varijable koja će biti indeks tog polja za 1. Najvećim brojem (Max) se proglašava prvi element tako formiranog polja i uspoređuje se s ostatkom elemenata. Ako je za pojedini element istinit uvjet da je veći od Max, varijabla Max poprima vrijednost tog elementa.
Djeljivost nekog broja s drugim brojem provjeravamao tako da izračunavamo ostatak kod dijeljenja. Dakle ako želimo provjeriti da li je broj x djeljiv sa y korisiti ćemo funkciju koja kao vrijednost vraća ostatak od dijeljenja x sa y. U Visual Basic-u takva funkcija se zove Mod, a sintaksa je slijedeća:
Izraz x Mod y daje vrijednost ostatka od dijeljenja x sa y. Dakle ako želimo provjeriti da li npr. varijabla A sadrži paran broj, ispitati ćemo sliedeći uvjet:
If A Mod 2 = 0
Ako je uvjet istinit, vrijednost je parna, a ako nije onda je vrijednost neparna. Na isti način provjeravamo i djeljivost sa drugim brojevima.
Programiranje i algoritmi – podloge za vježbe
54 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
START
n
i = 1, n
j = 1, n
A(i, j)
Max
END
i = 1, n
Max = B(1)
DA
NE
A(i, i) Mod 2 = 0
k = k + 1B(k) = A(i, i)
i = 1, k
B(i) > Max
Max = B(i)
DA
NE
Slika 43. Dijagram toka
Slika 44. Konačni izgled forme
Private Sub cmdNova_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdNova.Click
Dim n As Integer
Dim i, j, k, A(100, 100), B(100), Max As Integer
n = InputBox("Unesite broj redaka i stupaca kvadratne matrice",
"Velicina matrice")
For i = 1 To n
For j = 1 To n
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 55
A(i, j) = InputBox("Unesite broj za element u " + CStr(i) +
". retku i " + CStr(j) + ". stupcu")
lstMatrica.Items.Add(CStr(i) + "." + CStr(j) + " = " +
CStr(A(i, j)))
Next j
Next i
For i = 1 To n
If A(i, i) Mod 2 = 0 Then
k = k + 1
B(k) = A(i, i)
End If
Next i
Max = B (1)
For i = 1 To k
If B(i) > Max Then
Max = B(i)
End If
Next i
txtMax.Text = Max
End Sub
Programiranje i algoritmi – podloge za vježbe
56 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
15. Zbroj elemenata matrice manjih od prvo unesenog
Program služi za unos brojeva u pravokutnu matricu, te ispis zbroja svih elemenata matrice koji su manji od prvo unesenog.
START
M, N
i = 1, N
j = 1, M
A(i, j)
Zbroj
END
Zbroj = Zbroj+ A(i, j)
A(i, j) < A(1,1) DANE
Slika 45. Dijagram toka
Private Sub cmdNova_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdNova.Click
Dim i, j, m, n, k, l As Integer
Dim a(100, 100), Zbroj As Double
lstMatrica.Items.Clear()
n = InputBox("Unesite broj redaka matrice", "Velicina matrice")
m = InputBox("Unesite broj stupaca matrice", "Velicina matrice")
For i = 1 To n
For j = 1 To m
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 57
a(i, j) = InputBox("Unesite broj za element u " + CStr(i) +
". retku i " + CStr(j) + ". stupcu")
lstMatrica.Items.Add(CStr(i) + "." + CStr(j) + " = " +
CStr(a(i, j)))
If a(i, j) < a(1, 1) Then
Zbroj = Zbroj + a(i, j)
End If
Next j
Next i
txtZbroj.Text = Zbroj
End Sub
Slika 46 Rad programa
Programiranje i algoritmi – podloge za vježbe
58 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
16. Zbroj elemenata matrice iznad i ispod gl. dijagonale
Napisati program za ispis zbroja svih elemenata koji se nalaze iznad i zbroja svih elementa koji se nalaze ispod glavne dijagonale kvadratne matrice.
Kao što je prikazano na slici 49 elementi iznad glavne dijagonale imaju veći indeks stupca od indeksa retka dok za elemente ispod glavne dijagonale vrijedi suprotno: indeks retka je veći od indeksa stupca.
Slika 47. Glavna dijagonala kvadratne matrice
START
N
i = 1, N
j = 1, N
A(i, j)
i < j
Zbroj_iznad = Zbroj_iznad + A(i,j)i > j
Zbroj_ispod = Zbroj_ispod + A(i,j)
Zbroj_iznad, Zbroj_ispod
END
DANE
DA
Slika 48. Dijagram toka
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 59
Private Sub cmdNova_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdNova.Click
Dim n As Integer
Dim i, j, m, k, x, y As Integer
Dim a(100, 100), Zbroj_iznad, Zbroj_ispod As Double
n = InputBox("Unesite broj redaka i stupaca kvadratne matrice",
"Velicina matrice")
For i = 1 To n
For j = 1 To n
a(i, j) = InputBox("Unesite broj za element u " + CStr(i) +
". retku i " + CStr(j) + ". stupcu")
lstMatrica.Items.Add(CStr(i) + "." + CStr(j) + " = " +
CStr(a(i, j)))
If i < j Then
Zbroj_iznad = Zbroj_iznad + a(i, j)
End If
If i > j Then
Zbroj_ispod = Zbroj_ispod + a(i, j)
End If
Next j
Next i
txtIznad.Text = Zbroj_iznad
txtIspod.Text = Zbroj_ispod
End Sub
Programiranje i algoritmi – podloge za vježbe
60 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
17. Iteracija
Potrebno je napraviti program za određivanje visine h do koje je spremnik u obliku kugle radijusa R ispunjen tekućinom za zadani volumen V uz zadanu točnost ε ( izracunatizadani VV −=ε ). Volumen kuglina odsječka računa se po formuli:
)3(31 2 hRhV −= π . Potrebno je pretpostaviti početno rješenje (h = R), provjeriti točnost
te korigirati po potrebi (iteracija).
Δ X1
y1 = f (X)
Δ X1Δ X1
Δ X2 Δ X2
Δ X1 Δ X1
Δ X2
y2 = f (X)
x, y1=Y2
(X-ε, X+ε)
Xo
(Y- ε , Y+ ε )
Slika 49. Prikaz metode iteracije
Private Sub cmdizracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdizracunaj.Click
Dim R, V_zadani, V_izracunati, Eps, dH1, dH2, H As Double
Dim a As Boolean
Const Pi As Double = 3.1416
R = CDbl(txtRadijus.Text)
V_zadani = CDbl(txtVolumen.Text)
Eps = CDbl(txtTocnost.Text)
H = R
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 61
dH1 = R / 10
dH2 = R / 10
a = True
Do While a
V_izracunati = 1 / 3 * H ^ 2 * Pi * (3 * R - H)
If Math.Abs(V_zadani - V_izracunati) < Eps Then
txtVisina.Text = H
Exit Sub
End If
If (V_izracunati > V_zadani) Then
H = H - dH2
dH1 = dH2 / 2
Else
H = H + dH1
dH2 = dH1 / 2
End If
Loop
End Sub
Private Sub cmdIzlaz_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmdIzlaz.Click
End
End Sub
End Class
Programiranje i algoritmi – podloge za vježbe
62 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
18. Bisekcija
Napisati program koji će odrediti nultočku funkcije f(x) = 0 u intervalu [x1, x2] uz određenu točnost ε, metodom bisekcije. Za izračunavanje vrijednosti funkcije f(x) načiniti funkcijski potprogram.
Algoritam • Učitati granice intervala x1 i x2 te traženu točnost ε. • Provjeriti da li funkcija u zadanom intervalu mijenja predznak:
0)()( 21 <⋅ xfxf . Ako ne, ispisati poruku i zaustaviti program.
• Petlja koja se prekida kada se zadovolji jedan od uvjeta: ε
ε
≤−
≤
12
0 )(
xx
xf
• Izračunati međutočku: 2
210
xxx
+=
• Provjeriti uvjete. Ako su zadovoljeni ispisati vrijednost nultočke. • Provjeriti u kojoj polovici inetervala funkcija mijenja predznak:
0201 0)()( xxxfxf =→<⋅
0120 0)()( xxxfxf =→<⋅
• Ponovo izračunati međutočku s novim vrijednostima x1 i x2
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 63
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim x1, x2, x, x0, eps As Double
Dim a As Boolean
x1 = CDbl(TextBox1.Text)
x2 = CDbl(TextBox2.Text)
eps = CDbl(TextBox3.Text)
If fun(x1) * fun(x2) > 0 Then
MsgBox("funkcija ne mijenja predznak na zadanom intervalu")
Exit Sub
End If
a = True
Do While a
x0 = (x1 + x2) / 2
ListBox1.Items.Add(x1)
ListBox2.Items.Add(x2)
If Math.Abs(x2 - x1) <= eps Or Math.Abs(fun(x0)) <= eps Then
TextBox4.Text = CStr(x0)
Exit Sub
End If
If fun(x1) * fun(x0) < 0 Then
x2 = x0
Else
x1 = x0
End If
Loop
End Sub
Private Function fun(ByVal x)
fun = x ^ 3 - 2
End Function
End Class
Programiranje i algoritmi – podloge za vježbe
64 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
19. Učitavanje podataka iz datoteke
Promjeri i duljine segmenata vratila zapisani su u ASCII datoteci, tako da je u jednom retku zapisan prvo promjer pa onda duljina određenog segmenta, odvojeni zarezom. Potrebno je napraviti program koji će učitati promjere i duljine segmenata vratila i izračunati i ispisati težinu vratila.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim n As Integer 'broj segmenata vratila
Dim i, j As Integer, filein As Single
Dim v_seg, suma, r, tezina As Single
Dim d(100), l(100) As Single
FileOpen(1, "C:\nastava\programiranje i algoritmi\vratilo.txt", _
OpenMode.Input)
Do Until EOF(1)
i = i + 1
Input(1, filein)
d(i) = filein
ListBox1.Items.Add(d(i))
Input(1, filein)
l(i) = filein
ListBox2.Items.Add(l(i))
Loop
FileClose(1)
n = i
For j = 1 To n
r = d(j) / 2000
v_seg = r ^ 2 * 3.1415926 * l(j) / 1000
suma = suma + v_seg
Next j
tezina = suma * 7850
txtbrseg.Text = CInt(n)
txttezina.Text = CSng(tezina)
End Sub
End Class
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 65
Programiranje i algoritmi – podloge za vježbe
66 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
20. Izračunavanje vrijednosti integrala
Napisati program koji će izračunavati vrijednost određenog integrala
∫b
a
dxxf )( po Simpsonovoj formuli:
( )nnn
b
a
yyyyyyyhdxxf +++++++≈ −−∫ 123210 424243
)( K
Napomena: n (broj podjela intervala) mora biti paran broj
n
abh −=
Ulazni podaci su a, b i n, a program treba ispisati izračunatu vrijednost integrala. Za računanje vrijednosti funkcije f(x) pozivati funkcijski potprogram. Program testirati za funkciju f(x) = sin(x).
y0
y1
y2
y3yn-2
yn-1
yn
y = f(x)y
xa x1 x2xn-2 xn-1 bx3 h0
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim a, b, suma, integral, h, x, y, y0, yn As Double
Dim n, i, m As Integer
a = CDbl(TextBox1.Text)
b = CDbl(TextBox2.Text)
n = CInt(TextBox3.Text)
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 67
If n Mod 2 <> 0 Then
MsgBox("broj podjela nije paran !")
Exit Sub
End If
h = (b - a) / n
y0 = fun(a)
yn = fun(b)
x = a
For i = 1 To n - 1
If i Mod 2 = 0 Then
m = 2
Else
m = 4
End If
x = x + h
y = fun(x)
ListBox1.Items.Add(x)
ListBox2.Items.Add(y)
suma = suma + y * m
ListBox3.Items.Add(suma)
Next i
integral = (h / 3) * (suma + y0 + yn)
TextBox4.Text = CStr(integral)
End Sub
Private Function fun(ByVal x)
fun = Math.Sin(x)
End Function
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
ListBox1.Items.Clear()
ListBox2.Items.Clear()
ListBox3.Items.Clear()
TextBox1.Clear()
TextBox2.Clear()
TextBox3.Clear()
TextBox4.Clear()
End Sub
End Class
Programiranje i algoritmi – podloge za vježbe
68 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 69
21. Uporaba strukture stoga za izračunavanje vrijednosti izraza
Napisati program koji će izračunavati vrijednost aritmetičkog izraza učitanog kao niz znakova (string). Ograničenja: izraz sadrži samo jednoznamenkaste cijele brojeve i operatore zbrajanja, oduzimanja, množenja i dijeljenja. Izraz se upisuje transformiran u "reverznu poljsku notaciju" (operatori su iza operanada).
Upotrijebiti algoritam evaluacije izraza korištenjem strukture stoga (stack).
Algoritam evaluacije izraza uz primjer:
Izraz: 5 6 2 + * 8 4 / - ) 5 * ( 6 + 2 ) – 8 / 4
)1038-940,2/840,8,44740,812640*55,8+45,6,2235,662551stogsimbol 1. Dodaj “)” na kraj izraza
2. “skeniraj” (“parsiraj”) izraz s lijeva na desno i ponavljaj korake 3 i 4 dok se ne dostigne “)” (oznaka kraja izraza)
3. Ako je pronađen operand, stavi ga na stog
4. Ako je pronađen operator “o”:i. Uzmi dva elementa sa vrha stoga (A
je na vrhu, a B ispod njega)ii. Izračunaj B “o” Aiii. Stavi rezultat na stog
5. Vrijednost izraza jednaka je elementu na vrhu stoga
Programiranje i algoritmi – podloge za vježbe
70 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim izraz, simbol, stanje_stoga As String
Dim indeks, kod, op1, op2, i, k, ls As Integer
Dim mr, rezultat As Single
' deklaracija objekta "stog" kao nove instance klase "stack"
Dim stog As New System.Collections.Stack
izraz = TextBox1.Text
izraz = izraz + ")"
indeks = 0 ' uzmi prvi znak iz izraza
simbol = izraz.Substring(indeks, 1)
Do Until simbol = ")"
kod = Asc(simbol) 'odredi ASCII kod znaka
' da li je simbol operand, tj. znamenka?
If kod >= 48 And kod <= 57 Then
stog.Push(simbol) ' ako jest, stavi ga na stog
' da li je simbol operator?
ElseIf simbol="+" Or simbol="-" Or simbol="*" Or simbol="/" Then
op1 = CSng(stog.Pop) ' uzmi element sa vrha stoga
op2 = CSng(stog.Pop) ' uzmi slijedeći element sa vrha stoga
Select Case simbol 'primjeni operator i rez. vrati na stog
Case "+" mr = op2 + op1 Case "-" mr = op2 - op1 Case "*" mr = op2 * op1 Case "/" mr = op2 / op1 End Select
stog.Push(mr)
' da li je simbol različit od "praznine"?
ElseIf simbol <> " " Then
MsgBox("izraz sadrži nedozvoljeni simbol!")
Exit Sub
End If
ListBox1.Items.Add(simbol)
' prikazi stanje stoga u listbox-u
Dim polje As Object() = stog.ToArray
k = stog.Count
stanje_stoga = ""
For i = k - 1 To 0 Step -1
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 71
stanje_stoga = stanje_stoga + CStr(polje(i)) + " ,"
Next i
ls = Len(stanje_stoga)
stanje_stoga = stanje_stoga.Substring(0, ls - 1)
ListBox2.Items.Add(stanje_stoga)
' uzmi slijedeci znak iz izraza
indeks = indeks + 1
simbol = izraz.Substring(indeks, 1)
Loop
rezultat = CSng(stog.Pop) ' uzmi rezultat izraza sa vrha stoga
TextBox2.Text = CStr(rezultat)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
TextBox1.Text = "" TextBox2.Text = "" ListBox1.Items.Clear() ListBox2.Items.Clear() End Sub
End Class
Programiranje i algoritmi – podloge za vježbe
72 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
22. Određivanje jednadžbe pravca regresije
U ASCII datoteci zapisane su x i y koordinate za n točaka dobivenih mjerenjima u nekom pokusu. Potrebno je napisati program koji će učitati koordinate točaka iz datoteke, te odrediti i ispisati jednadžbu pravca regresije za zadane točke.
pravac regresije : y = a + b x, gdje je:
∑
∑
=
=
−
−= n
ii
n
iii
xnx
yxnyxb
1
22
1 xbya −=
∑=
=n
iix
nx
1
1 ∑=
=n
iiy
ny
1
1
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 73
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim a, b, x(100), y(100), sumax, sumay, suma_xy, sumax2, xp, yp As
Single
Dim i, n, j As Integer
FileOpen(1, "d:\nastava\programiranje i algoritmi\regresija.txt",
OpenMode.Input)
Do Until EOF(1)
i = i + 1
Input(1, x(i))
ListBox1.Items.Add(x(i))
Input(1, y(i))
ListBox2.Items.Add(y(i))
Loop
n = i
FileClose(1)
For j = 1 To n
sumax = sumax + x(j)
sumay = sumay + y(j)
suma_xy = suma_xy + x(i) * y(i)
sumax2 = sumax2 + x(i) ^ 2
Next j
xp = sumax / n
yp = sumay / n
b = (suma_xy - n * xp * yp) / (sumax2 - n * xp ^ 2)
a = yp - b * xp
TextBox1.Text = "y = " + CStr(a) + " + " + CStr(b) + " x"
End Sub
Programiranje i algoritmi – podloge za vježbe
74 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
23. "Optimiranje" nosača
Na raspolaganju su čelične trake d x b. Od tih čeličnih traka treba napraviti "I" nosač. Iz konstrukcijskih razloga u srednjeoj traci je na jednom mjestu provrt promjera h2. Od svih nosača koji zadovoljavaju uvjete treba odabrati onaj najmanje površine.
Nosač se sastavlja od dva tipa trake, jedan se koristi za pojase, a druga za rebro. Debljina trake "d" kreće se od 4 do 16 mm, a širina trake "b" izvodi se iz slijedećih dimenzija:
10, 12, 14, 15, 16, 18, 20, 22, 24, 25, 26, 28, 30, 32, 34, 35, 36, 38.
Zadan je moment savijanja nosača M,
dopušteno naprezanje σdopi promjer provrta h2.
Program treba ispisati slijedeće dimenizije za odabranu varijantu nosača:
b, b1, h1, h, A (površina presjeka)
Pri tome trebaju biti zadovoljeni slijedeći uvjeti:
σ < σdop
h1 > h2 + 5
Naprezanje se računa pomoću izraza:
hhhbhhbW
WM
6)()( 3
2311
31
3 −+−==σ
Napomena: polje vrijednosti širina trake treba učitati iz datoteke!
Programiranje i algoritmi – podloge za vježbe
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 75
Private Sub cmd_izracunaj_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles cmd_izracunaj.Click
Dim ms, sig, sigdo As Double
Dim h2, b, b1, h, h1, A, Am, bm, bm1, hm, hm1, W As Double
Dim bb(100) As Integer
Dim filein, n, i, j, k, m As Integer
Dim flag As Boolean
'ucitavanje iz datoteke:
FileOpen(1, "d:\nastava\programiranje i algoritmi\test.txt",
OpenMode.Input)
Do Until EOF(1)
n = n + 1
Input(1, filein)
bb(n) = filein
Loop
FileClose(1)
ms = CDbl(moment.Text)
sigdo = CDbl(sigdop.Text)
h2 = CDbl(provrt.Text)
flag = True
'generiranje kombinacija :
For i = 4 To 15
For j = 1 To 18
For k = 4 To 15
For m = 1 To 18
b = bb(j)
b1 = k
h1 = bb(m)
h = h1 + 2 * i
If (h1 > h2) Then
W=(b*(h^3-h1^3) + b1*(h1^3-h2^3)) / (6*h)
sig = ms / W
If (sig < sigdo) Then
A = b * (h - h1) + b1 * (h1 - h2)
If flag Then
'pronadjena prva varijanta koja odgovara,
'inicijalizacija minimuma:
Am = A
bm = b
bm1 = b1
hm = h
hm1 = h1
Programiranje i algoritmi – podloge za vježbe
76 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
flag = False
End If
If A < Am Then
Am = A
bm = b
bm1 = b1
hm = h
hm1 = h1
End If
End If
End If
Next m
Next k
Next j
Next i
sirina_b.Text = CDbl(bm)
sirina_b1.Text = CDbl(bm1)
visina_h.Text = CDbl(hm)
visina_h1.Text = CDbl(hm1)
povrsina_A.Text = CDbl(Am)
End Sub
Programiranje Uvod u računala – podloge za vježbe
CADLab, Katedra za osnove konstruiranja, FSB Zagreb 77
24. Primjeri zadataka
24.1 Zadatak 1 Potrebno je napraviti program koji će učitati niz cijelih brojeva, te ispisati koji su brojevi djeljivi s 3 i 7.
24.2 Zadatak 2 Potrebno je napraviti program za ispis svih brojeva većih od 10 koji se nalaze iznad sporedne dijagonale kvadratne matrice.
24.3 Zadatak 3 Potrebno je napraviti program koji će za niz realnih vrijednosti x ispisati vrijednosti funkcije prema formuli: 432 23 +++= xxxy .
24.4 Zadatak 4 Potrebno je napraviti program za ustanovljavanje da li je trokut jednakostraničan, jednakokračan ili raznostraničan. U koordinatnom sustavu trokut je definiran s tri koordinate njegovih vrhova: ),( 111 yxP , ),( 222 yxP i ),( 333 yxP . Formula za izračunavanje
udaljenosti između vrhova trokuta glasi: 22 )()( jijiij yyxxP −+−= .