Professional Documents
Culture Documents
S v e u i l i t e
Z a g r e b u
Fakultet
strojarstva
brodogradnje
PROGRAMIRANJE I ALGORITMI
Podloge za vjebe programiranje
Visual Basic
Zagreb, 2006.
PREDGOVOR
Ove podloge namijenjene su studentima Fakulteta strojarstva i brodogradnje kao pomona literatura za praenje vjebi iz kolegija PROGRAMIRANJE I ALGORITMI i kolegija PRIMJENA RAUNALA B. Gradivo je izloeno redoslijedom kojim se obrauje na vjebama. Temeljni koncepti programiranja obrauju se na predavanjima u satnicom doputenom okviru. Pretpostavka uspjenog savladavanja kolegija je redovito praenje nastave i samostalan rad na raunalu. Vjebe se odravaju na raunalima u PC uionicama CADLab -a. Podloge nikako ne mogu biti zamjena za prouavanje originalnih prirunika i druge literature. Pisanje podloga za kolegij koji obrauje materiju koja je tako podlona brzim promjenama kao raunalstvo, nezahvalan je posao. Sjena zastarijevanja nadvila se nad rukopis onog trenutka kada je zapoela priprema teksta. Ipak vjerujemo da e podloge omoguiti studentima lake savladavanje prvih koraka raunalstva na Fakultetu strojarstva i brodogradnje Sveuilita u Zagrebu. U CADLab -u instalirana raunalna i programska oprema, razvojni alati, CAD/CAE aplikacije, pristup Internetu, te podrka asistenata i demonstratora omoguuju studentima FSB-a usvajanje znanja potrebnih svakom inenjeru. Stoga oekujemo da e studenti koristiti raunala u svakodnevnom radu i izvan kolegija Katedre za osnove konstruiranja.
Sadraj
Visual Basic je program kontroliran (pokretan) dogaajima "event driven". Dogaaji se mogu pojaviti zahvaljujui akciji korisnika kao to je klik miem ili odabir stavke iz izbornika ili kao rezultat akcije nekog drugog prozora.
U "proceduralnim" programima sam program kontrolira redoslijed izvoenja pojedinih dijelova programskog kda. Izvoenje poinje prvom "izvrnom" naredbom i slijedi unaprijed odreene putanje. U programu upravljanom dogaajima programski kd ne slijedi unaprijed odreene putanje, ve se izvode razliiti dijelovi programskog koda kao odgovori na dogaaje. Dogaaji mogu biti pokrenuti akcijom korisnika, porukama sustava ili drugih programa te samog programa. Redoslijed tih dogaaja odreuje putanju kojom e programski kd biti izveden. Budui da se ne moe predvidjeti redoslijed dogaaja (pa niti koji e se dogaaji "dogoditi", a koji ne), programski kd mora uzeti u obzir neke pretpostavke o "opem stanju" (suelja i podataka) kada se pone izvoditi npr. sadri li polje za upis podatka neku vrijednost ili ne i sl. Rijeeni primjeri zadataka sadre i dijagram toka grafiki prikaz algoritma. Standardni elementi dijagrama toka razvijeni su prvenstveno za proceduralne programske jezike, stoga ne sadre sve elemente potrebne za prikaz situacija koje mogu nastupiti u programima upravljanim dogaajima. Stoga u pojedinim primjerima dijagram toka ne odgovara u potpunosti algoritmu primjenjenom u programskom kodu. Za svaki primjer razlike e biti posebno objanjene na vjebama.
1.
Nakon pokretanja programskog paketa Microsoft Visual Studio i odabira rada sa Visual Basic-om, pojavljuje se slijedei prozor (slika2):
Izmeu dvije ponuene opcije u prozoru "Recent projects" za kreiranje novog projekta potrebno je odabrati Create, a za otvaranje ve postojeeg Open. Prilikom odabira novog projekta prikazuje se dijaloki okvir prikazan na slici 3 u kojem je potrebno odabrati tip Visual Basic projekta iz liste vrsta projekata, te iz liste predloaka aplikaciju za Windows operativni sustav (Windows Application). Program nudi predefinirano ime WindowsApplication1 koje se moe promijeniti po elji pod uvjetom da nema praznih mjesta u imenu. Takoer se nudi i predefinirana lokacija za njegovu pohranu koju pomou padajue liste ili naredbenog gumba Browse odabire korisnik.
Odabir predloka
Prozor sa programskim rjeenjima (Solution Explorer) prikazuje naziv rjeenja (Solution; grupa projekata), naziv trenutnog projekta (Project) i sve forme i module unutar projekta. Na poetku 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 poetku dostupne unutar projekta.
2.
Prvi korak u kreiranju aplikacije Visual Basicom je stvaranje suelja aplikacije. Forme i kontrole su osnovni elementi suelja - objekti koji imaju svojstva i dogaaje koji odreuju njihovo ponaanje i interakciju s korisnikom. Postavljanjem svojstava formi i kontrola te pisanjem Visual Basic programskog koda koji e odgovarati na dogaaje, objekti se prilagoavaju zahtjevima aplikacije. Kontrole su objekti koji su sadrani u objektima forme. Svaki tip kontrole ima svoj skup svojstava, metoda i dogaaja koje ga ine prikladnim odreenoj namjeni.
Kreiranje forme za interakciju korisnika i programa izvodi se u prozoru pod opcijom Form1.vb[Design]. Kontrole smjetamo na formu dvoklikom (double click) lijeve tipke mia na odabrano ime kontrole na traci s alatima (Toolbox) ili pritiskom na lijevu tipku i odvlaenjem na formu (drag and drop). Kontrolu koja je inicijano smjetena na formu mogue je pomicati po formi klikom i dranjem lijeve tipke mia iznad nje. Veliina kontrole mijenja se pomicanjem hvataa u obliku bijelih kvadratia (slika 5).
Osobine smjetaja kontrole na formi i njena veliina osim miem 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 slijedea pravila: naziv ne smije imati prazna mjesta, moraju se koristiti slova engleske abecede, ne smiju se koristiti rezervirane rijei programskog jezika, te neslubeno koritenje prefiksa od tri slova za oznaku vrste objekta. Za naredbeni gumb to je cmd te se na njega doda proizvoljni naziv s velikim poetnim slovom.
Prilikom kreiranja forme i smjetanja objekata na formu, automatski se generira programski kd (Windows Form Designer generated code) u kojem je zapisan kd za vrijednosti osobina objekata.
3.
Prilikom deklariranja varijabli moraju se potivati slijedea pravila za naziv: mora poinjati slovom abecede moe sadravati samo slova, brojeve i znak _ ne moe sadravati toku ne smije biti dui od 255 znakova mora biti jedinstven u dijelu programa u kojem se nalazi varijabla.
Tablica 1. Vrste (tipovi) podataka u Visual Basic-u VRSTA Boolean Byte Char Date Decimal VELIINA 4 Byte-ova 1 Byte 2 Byte-a 8 Byte-ova 12 Byte-ova RASPON VRIJEDNOSTI True ili False 0255 unsigned 065,535 unsigned 1/1/1 CE to 12/31/9999 +/79228162514264337593543950335 bez decimalnog zareza; +/7.9228162514264337593543950335 s 28 decimalnih mjesta iza zareza; najmanji broj razliit od nule je +/0.0000000000000000000000000001 Double 8 Byte-ova 1.79769313486231 E308 do 4.94065645841247 E324 za negativne vrijednosti 4.94065645841247 E-324 do 1.79769313486232 E308 za pozitivne vrijednosti Integer Long Object Short Single 4 Byte-a 8 Byte-ova 4 Byte-a 2 Byte-a 4 Byte-a 2147483648 to 2147483647 9223372036854775808 do 9223372036854775807 Sve vrste objekata 32768 to 32767 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
esto se javlja potreba da se u tijeku izvoenja programa izvri konverzija iz jednog tipa varijable u drugi npr. tekst u brojanu vrijednost i obrnuto. Neke od funkcija konverzije navedene su tablici 2:
Tablica 2. Funkcije pretvorbe FUNKCIJA CDbl CInt CLng CSng CStr CVar PRETVORBA U TIP Double Integer Long Single String (tekst) Variable
4.
Napisati program za unos tri broja, odreivanje najveeg te izraunavanje razlike izmeu najveeg 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
DA
NE
DA Razlika = A - (B + C)
NE
Razlika = B - (A + C)
Razlika = C - (A + B)
Razlika
END
Ulazni podaci: vrijednosti tri broja Izlazni podatak: razlika najveeg broja i zbroja preostala dva
10
Dijagram toka zapoinje simbolom "START" koji predstavlja aktiviranje programskog koda. Slijedei simbol ( ) prikazuje uitavanje vrijednosti tri broja, odnosno unos od strane korisnika programa. Operacija uitavanja zapravo dodjeljuje upisane vrijednosti varijablama A, B i C. Varijable su podruja memorije koje rezervira program i u koje se pohranjuju podaci tijekom koritenja programa. Tip varijable (cjelobrojna, realna, tekstualna, itd.) ne prikazuje se u dijagramu toka. Nakon toga potrebno je ustanoviti koji od uitana tri broja ima najveu vrijednost. U ovom primjeru koristimo ispitivanje dva logika uvjeta, na temelju ega izvodimo zakljuak. Ovakav pristup bio bi vrlo neefikasan za traenje maksimalne vrijednosti u veem nizu brojeva, no za tri vrijednosti je zadovoljavajui. Ispitivanje logikog uvjeta prikazuje se u dijagramu toka simbolom ili . Prvo ispitujemo da li je vrijednost varijable A istovremeno vea i od B i od C. Kada treba ispitati dva ili vie povezanih logikih uvjeta, oni se povezuju operatorima logike konjukcije ili disjunkcije (AND ili OR). Ako je odgovor na pitanje prvog uvjeta istinit, znai da je varijabla A najvea, pa varijabla Razlika poprima vrijednost prema izrazu (formuli) A (B + C). Ako prvi uvjet nije ispunjen prelazi se na ispitivanje slijedeeg uvjeta - da li je vrijednost varijable B istovremeno vea i od A i od C. Ako je drugi uvjet ispunjen, vrijednost varijable Razlika rauna se prema formuli B (A + C). Ako ni drugi uvjet nije ispunjen, preostaje jo samo mogunost da varijabla C ima najveu vrijednost, pa se varijabla Razlika rauna prema izrazu C (A + B). Nakon ispitivanja uvjeta i izrauna vrijednosti razlike sve tri grane dijagrama toka spajaju se u voritu u jednu, nakon ega slijedi ispis vrijednosti varijable Razlika (u dijagramu toka simbol predstavlja ispis) i program zavrava (simbol "END").
Kako je ve prije navedeno, standardni elementi dijagrama toka razvijeni su prvenstveno za proceduralne programske jezike, stoga ne sadre sve elemente potrebne za prikaz situacija koje mogu nastupiti u programima upravljanim dogaajima. U programu upravljanom dogaajima programski kd ne slijedi unaprijed odreene putanje, ve se izvode razliiti dijelovi programskog koda kao odgovori na dogaaje. Dogaaji mogu biti pokrenuti akcijom korisnika, porukama sustava ili drugih programa te samog programa. Redoslijed tih dogaaja odreuje putanju kojom e programski kd biti izveden. Zbog navedenih razloga prethodno obrazloeni dijagram toka u ovom primjeru, kao i u svim preostalim primjerima u ovim skriptama ne odgovara u potpunosti programskom rjeenju postavljenog zadatka u Visual Basic-u. Dijagrami tokova dani su uz svaki zadatak prvenstveno radi grafikih prikaza algoritama koji su primjenjeni pri rjeavanju zadataka. Najvee razlike izmeu dijagrama toka i programskog rjeenja veinom su u nainu manipulacije sa ulaznim i izlaznim podacima. Koncepcija kreiranja suelja i manipulacije s podacima u Visual Basic-u omoguuju kreiranje ogromnog broja razliitih varijanti programskog rjeenja koje se temelje na istom osnovnom algoritmu.
Programsko rjeenje prikazanog algoritma u Visual Basic-u zamiljeno je na slijedei nain: korisnik unosi brojeve u tri okvira s tekstom, te nakon unosa aktivira gumb koji pokree proceduru za izraunavanje traenog izlaznog podatka (razlike). U etvrtom okviru procedura ispisuje izraunatu razliku. Pritiskom na gumb za novi niz obrisali bi se svi okviri s tekstom i program bi se pripremio za novi unos.
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 11
Forma se sastoji od slijedeih 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 pokree proceduru za izraun i naredbenog gumba koji pokree proceduru za novi unos podataka. Konani izgled forme je prikazan na slici 8.
Tablica 3. Vrijednosti osobina za kontrole na formi: INCIJALNI NAZIV OBJEKTA (NAME) Button1 Button2 TextBox1 TextBox2 TextBox3 TextBox4 Label1 Label2 Label3 Label4 NOVI NAZIV (NAME) cmdIzracunaj cmdNovi txtA txtB txtC txtRazlika lblBroj_A lblBroj_B lblBroj_C lblRazlika Broj A: Broj B: Broj C: Razlika: Izraunaj Novi unos NOVI TEKST
12
Za svaki dogaaj, u naem sluaju za pritisak na gumb, potrebno je dodati pripadajui programski kd. Prozor s programskim kdom otvara se dvoklikom na objekt s forme ili odabirom opcije View code u prozoru s rjeenjima (Solution Explorer). Varijable se prije uporabe deklariraju. Globalne varijable su postojane, traju koliko i program i zadravaju vrijednosti od jednog poziva funkcije do drugog. Lokalne varijable su deklarirane unutar funkcije (ili bloka) i traju samo dok se funkcija (blok) izvodi. Programski kd zapoinje 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 brojanih varijabli nakon deklariranja jednake 0, no mogue ih je i definirati tako da na poetku imaju neku konkretnu vrijednost npr: Dim X as Integer = 12
Dvoklikom na objekt cmdIzracunaj, Visual Basic automatski kreira poetni kd za potprogram dogaaja 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
Izmeu Private Sub cmd_Izracunaj i End Sub upisuje se programski kd koji se izvrava nakon aktiviranja gumba od strane korisnika. Kada je korisnik unio brojeve u okvire s tekstom, u potprogramu za dogaaj 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 toke, Visual Basic nudi popis osobina koju moemo automatski upisati odabirom i pritiskom tipke Tab (slika 9).
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 13
Funkcija CDbl oznaava pretvorbu (eng. converting) tekstualne vrijednosti u numeriku vrijednost tipa Double. Prema dijagramu toka potrebno je ispitati da li je vrijednost varijable A istovremeno vea i od varijable B i od varijable C. Za tu svrhu koristi se naredba uvjetnog grananja (odn. logike usporedbe) koja odreuje koji e se dio programskog koda izvriti ovisno o istinitosti ispitanog uvjeta. Openiti 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 sluaju takve uvjete treba povezati tzv. logikim operatorom konjukcije (And). Svaki od dva povezana uvjeta koristi operator usporedbe oznaen simbolom >.
If A > B And A > C Then End If
Tablica 4. Popis operatora usporedbe OPERATOR VRSTA USPOREDBE Jednakost Manje od Manje ili jednako Vee od Vee ili jednako Nejednakost
14
Ovisnost rezultata logikih operacija o vrijednostima operanada obino se prikazuje tzv. tablicom "istinitosti" za logike operatore (A i B su operandi logike varijable): A istina istina la la B istina la istina la A AND B istina la la la A OR B istina istina istina la
Ako su oba uvjeta zadovoljena izraunava se i dodjeljuje vrijednost varijabli Razlika prema izrazu A (B + C) gdje naredba Razlika = A (B + C) ne predstavlja matematiku jednadbu ve dodjeljivanje (pridruivanje), to znai da lijeva strana od znaka jednakosti poprima vrijednost desne strane. Zatim se izlazi iz strukture, odn. nastavlja se sa slijedeom naredbom iza rezervirane rijei EndIf. Ako jedan ili oba uvjeta nisu zadovoljeni, unutar strukture naredbe uvjetnog grananja prelazi se na ispitivanje slijedeeg uvjeta iza rezervirane rijei ElseIf (da li je varijabla B istovremeno vea 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, izraunava se i dodjeljuje vrijednost varijabli Razlika prema izrazu B (A + C). Ako niti taj uvjet nije ispunjen onda preostaje samo mogunost da je vrijednost varijable C najvea vrijednost varijable razlika tada se izraunava prema naredbi koja slijedi iza rezervirane rijei Else. Cjelokupni programski kd naredbe uvjetnog grananja IfThenElse 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 vano uoiti i razumjeti da e se, ovisno o vrijednostima varijabli A, B i C uvijek izvriti jedna i samo jedna od triju naredbi za dodjeljivanje vrijednosti varijabli Razlika, a nakon toga izvoenje programa se nastavlja sa prvom slijedeom naredbom iza rezerviranje rijei End If koja oznaava kraj strukture uvjetnog grananja.
15
Potprogram cmdNovi_Click za novi unos vraa osobine objekata na poetne vrijednosti. Cjelokupni programski kd rjeenja zadatka je slijedei:
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
16
Da bi se program pokrenuo, prvo je potrebno izvriti prevoenje u strojni jezik. Proces prevoenja pokreemo 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 greaka, odmah nakon prevoenja programa program e se i pokrenuti, tj. prikazati e se forma na ekranu u obliku novog aktivnog prozora. Primjer ispisa na formi nakon koritenja programa prikazan je na slici 11.
Prilikom osmiljavanja i pisanja programskog koda dolazi do pogreaka koje se odraavaju na rad programa, tj. ine da program ne radi kako je zamiljeno. Openito, greke mogu biti: sintaksne pogreke kod pisanja, npr. krivo napisana varijabla ili rezervirana programska rije, greke prilikom rada (runtime error) nema sintaksne greke ve se greka dogaa prilikom izvravanja programskog koda npr. kada se eli izvriti objekt bez prethodnog instanciranja. Prilikom takve greke program moe zaustaviti rad. logike greke najtee se otkrivaju, a javljaju se kao rezultat logikih greaka u algoritmima aplikacije.
17
5.
Napisati program za unos niza brojeva i izraunavanje aritmetike sredine. Ovaj primjer prikazuje jedan od najjednostavnijih algoritama zbrajanje niza vrijednosti. Aritmetika sredina rauna se prema jednadbi: x = 1 n xi n i =1
START
Zbroj = Zbroj + x
n=n+1
Sredina = Zbroj / n
Sredina
END
Slika 12. Dijagram toka
Na poetku nema niti jednog unesenog broja tako da je varijabla n jednaka nuli. Korisnik unosi broj x, a varijabla Zbroj se uveava za vrijednost varijable x. Nakon toga se i varijabla n uveava za jedan (zato to smo unijeli 1 broj) izrazom n = n + 1, tj. iz 0 se mijenja u 1. Ponavljajui ovaj postupak unoenjem razliitih brojeva preko varijable x, mijenjaju se varijable Zbroj i n. Aritmetika sredina cijelog niza definirana je varijablom Sredina koja e imati vrijednost Sredina = Zbroj / n. Na kraju programa ispisuje se vrijednost aritmetike sredine.
18
Jedna od moguih izvedbi ovog dijagrama toka u Visual Basic-u i koritenja 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 izraunavanje srednje vrijednosti u treem bi se okviru ispisivala aritmetika sredina. Pritiskom na gumb za novi niz praznili bi se okviri s tekstom i program bi se pripremio za novi unos. Konani izgled forme prikazan je na slici 13:
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) Button1 Button2 Button3 TextBox1 TextBox2 TextBox3 Label1 Label2 Label3 NOVI NAZIV (NAME) cmdUnesi cmdIzracunaj cmdNovi_niz txtUnos txtVelicina txtSredina lblUpisite lblVelicina lblSredina Upiite broj: Veliina niza: Arit. sredina: Unesi Izraunaj Novi niz NOVI TEKST
19
Poetnu vrijednost za okvir s veliinom niza treba postaviti na 0. Varijabli x pridodaje se brojana 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 kd za ispis veliine niza, tj. za ispis vrijednosti varijable n u okvir s tekstom txtVelicina
txtVelicina.Text() = n
U ovom sluaju varijable Zbroj i n su globalne jer se koriste i u potprogramu za izraunavanje aritmetike 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
Vrijednost varijable n biti e cjelobrojni, a varijable Zbroj realni broj. Varijabla n (veliina niza) inicijalno ima vrijednost 0, to odgovara programu jer pri pokretanju programa nije unesen niti jedan broj. Nakon unosa i aktiviranja dogaaja cmdUnesi_Click varijabla n mora se uveati za 1
n = n + 1
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 kd za ovaj dogaaj kao i za cijeli program nalazi se na kraju odjeljka.
20
U programskom kodu potprograma dogaaja cmdIzracunaj_Click, za izraun i ispis aritmetike sredine varijabla Sredina poprima vrijednost kvocijenta ukupnog zbroja niza i veliine niza tj. Zbroj / n. Prethodno je potrebno lokalno deklarirati varijablu Sredina.
Dim Sredina As Double Sredina = Zbroj / n
Tako izraunatu vrijednost varijable Sredina potrebno je ispisati u okvir s tekstom txtSredina.
txtSredina.Text = Str(Sredina)
U programskom kodu potprograma dogaaja cmdNovi_niz_Click, radi pripreme programa za novi unos i izraun sredine, vrijednosti globalnih varijabli n i Zbroj potrebno je vratiti na 0.
n = 0 Zbroj = 0
21
Programiranje i algoritmi podloge za vjebe 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
22
6.
(primjena
petlje
Napisati program za uitavanje niza pozitivnih cijelih brojeva te izraun zbroja faktorijela elemenata tog niza koji su manji od 10. Formula za izraun faktorijela broja x:
x! = 1 2 3 4 K ( x 2 ) ( x 1) x
23
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 izraunati njegov faktorijel (umnoak broja i svih njegovih prethodnika poevi od 1, npr faktorijel od 3 je umnoak 1 * 2 * 3 = 6) pomou petlje koja poveava vrijednost varijable brojaa i za 1 dok ne poprimi vrijednost broja x. Nova vrijednost varijable Faktorijel formira se tako da je pomnoimo s vrijednou varijable i (Faktorijel = Faktorijel * i). Kada varijabla i poprimi vrijednost x izlazi se iz petlje i izraunata 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 izraun sume i dodavanje unesenog broja na popis. Forma jo sadri okvir s popisom lstLista te pripadne natpise.
Varijable Faktorijel i Zbroj su globalne varijable, a x i i lokalne unutar potprograma za dogaaj 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 vraa na poetnu vrijednost.
24 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Vrijednost varijable x mora biti manja od 10. Ako korisnik nije unio takav broj, program ne smije izraunavati faktorijel i zbroj. Stoga se postavlja uvjet preko strukture odluke IfThen:
If x < 10 Then End If
Ako je uvjet zadovoljen izvrava se programski kd (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
Izraunavanje faktorijela za broj x izvodi se preko For...Next petlje. For petlja izvrava programski kd odreeni broj puta prema openitom zapisu: For broja = poetak To kraj [Step korak] [naredbe] Next Broja je brojana varijabla koja se koristi za praenje iteracija unutar petlje. Broja poinje od vrijednost poetak, vrijednost kraj je maksimalna vrijednost brojaa na kojoj se petlja zaustavlja. Step predstavlja korak za poveavanje brojaa (predefinirana vrijednost je 1, a moe biti i negativna) U ovom primjeru broja e biti varijabla i kojoj je poetna vrijednost 1, a kraj vrijednost varijable x (korak poveanja e ostati predefiniran, tj. 1). Unutar petlje varijabla Faktorijel poprimat e vrijednost umnoka vlastite vrijednosti i varijable brojaa i. Npr u prvoj iteraciji petlje vrijednost umnoka e biti 1*1=1, u drugoj, 1*2=2, u treoj 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 kd je:
Public Class Form1 Inherits System.Windows.Forms.Form Dim Faktorijel, Zbroj As Double
25
Programiranje i algoritmi podloge za vjebe 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
26
7.
uporaba
petlje
sa
Program slui za izraunavanje i ispisivanje zbroja lanova reda, te potrebnog broja lanova reda n za zadanu tonost.
START
Tocnost
NE
DA
i=1 x=1
NE
x > Tocnost
DA
Zbroj = Zbroj + x
i=i+1
x = (-1) ^ (i + 1) / (2 * i 1)
Velicina = i - 1
Zbroj, Velicina
END
Slika 18. Dijagram toka CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 27
Potrebno je odrediti broj lanova reda tako da apsolutna vrijednost posljednjeg lana reda bude manja od uitane vrijednosti , gdje je 0 < 1. Formula reda glasi:
gdje je n=1,2,3...
Prema dijagramu toka na slici 18 korisnik unosi tonost koju e predstavljati varijabla Tocnost. Ako usporedba unesene vrijednosti pokazuje da tonost nije vea od 0 i manja ili jednaka 1 program trai novi unos. Ako je uvjet zadovoljen postavlja se poetni lan reda x = 1 i broja varijabla i = 1. Nakon usporedbe s varijablom Tocnost vrijednost varijable Zbroj se uveava za vrijednost varijable lana x. Broja varijabla i se uveava za 1 te se kreira novi lan reda prema formuli: x = (-1) ^ (i + 1) / (2 * i 1). Tako izraunat lan x usporeuje se s vrijednou varijable i postupak se ponavlja dok vrijednost varijable x ne postane manja od vrijednosti varijable Tocnost. Tada se ispisuje ukupni zbroj (Zbroj) i veliina reda lanova (Velicina) te program zavrava. Izgled forme je prema slici 19 s okvirima s tekstom txtTocnost, txtVelicina i txtZbroj te naredbenim gumbom cmdIzracunaj.
Cijeli kd za ovaj program smjestit e se unutar potprograma cmdIzracunaj_Click. Varijable Tocnost, x i Zbroj su tipa Double, a Velicina i i su Integer. Brojane varijable se ne moraju nuno deklarirati s poetnom vrijednosti 0. Prema formuli reda varijabla i poinje s 1 stoga e se deklarirati s poetnom 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 vea ili jednaka 1 prilikom rada programa prikazat e se okvir s porukom (Message Box) koji e upozoriti korisnika na pogrean unos te izai 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") 28 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Opi zapis izraza za okvir s porukom je: MsgBox(poruka, [vrsta], [naslov]) pri emu je poruka izraz tipa String, zapisuje se izmeu 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).
Ako je zadovoljen uvjet za vrijednost varijable Tocnost, prelazimo na izraun broja x i ukupnog zbroja preko While petlje. While petlja se koristi za izvravanje programskog koda vie puta bez prethodnog znanja broja potrebnih iteracija. Petlja traje dok je uvjet istinit (True). Postoji vie izvedbi ove petlje, a opi zapis je: Do [{While | Until} uvjet] [naredbe] Loop Kod Do While petlje provjerava se da li je uvjet istinit te se izvravaju izrazi programskog koda ukljuujui prvu iteraciju. Petlja zavrava kada uvjet poprimi vrijednost False. Do Until petlja zavrava kada uvjet poprimi vrijednost True. U ovom primjeru izraunavat e se x i Zbroj sve dok je apsolutna vrijednost varijable x vea od zadane tonosti prema izrazu: Math.Abs(x) > Tocnost Funkcija Math koristi se za matematike funkcije (sin, cos, tan, log), a u ovom primjeru za izraun apsolutne vrijednosti koristit e se funkcija Abs. Unutar petlje izraunavat e se pojedini lanovi i njihov ukupni zbroj, te e se uveavati varijabla i za novu iteraciju i broja lanova reda.
Do While Math.Abs(x) > Tocnost CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 29
Programiranje i algoritmi podloge za vjebe x = (-1) ^ (i + 1) / (2 * i - 1) Zbroj = Zbroj + x i = i + 1 Velicina = Velicina + 1 Loop
Kada uvjet vie nije ispunjen izlazi se iz petlje i ispisuje zbroj i veliina reda u predviene 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
30
8.
Uporaba polja
strukture
jednodimenzionalnog
x=
1 n xi n i =1
START
i = 1, n
A (i)
i = 1, n
Sredina = Zbroj / n
Sredina
END
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 omoguuju viestruku pohranu istog tipa podataka bez kreiranja posebnih varijabli za svaki od podataka. Svi podaci su na taj nain pohranjeni pod istim imenom, a manipulacija s pojedinim podatkom izvodi se preko indeksa polja. Jednodimenzionalno polje moemo zamisliti kao redak s podacima gdje je svaki podatak smjeten u svoj stupac. Primjer polja A s 5 elemenata koji su cijeli brojevi:
CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 31
indeks A(indeks)
0 12
1 238
2 17
3 89
4 975
Indeks za polje A predstavlja u ovom primjeru varijabla i. Za razliku od zadatka 2 gdje se nakon svakog unosa izraunavao zbroj, u ovom primjeru najprije e se unijeti svi brojevi u polje. Zatim e se varijabli Zbroj dodavati vrijednosti elemenata polja A pomou petlje s brojaem i. Petlja e najprije varijabli Zbroj dodati A(0), pa na izraunatu 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 izaunavanje i ispis vrijednosti aritmetike sredine.
Polje se deklarira na isti nain 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 razliitih varijabli istog tipa moemo skratiti odvajajui varijable zarezom:
Dim A(100), Zbroj As Single
Zbroj se izraunava u potprogramu cmdIzracunaj_Click dodavajui pojedini lan A(k) ForNext petljom s brojaem 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)
33
Programiranje i algoritmi podloge za vjebe 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
34
9.
Program slui za unos niza brojeva u polje i ispis brojeva koji imaju najveu i najmanju vrijednost.
START
Ucitavanje clanova polja uzastopnim pozivanjem procedure
i=i+1
A(i)
j = 1, i
Da
Ne
Max = A(j)
Da Min = A(j)
35
Prema dijagramu na slici 25 brojevi se unose u polje A. Nakon unosa, varijable koje predstavljaju najvei i najmanji broj poprimaju vrijednost prvog lana polja A(1). Usporedbom svakog lana polja s trenutnim uspostavljaju se novi minimalni i maksimalni broj.
Svakim unosom broja u polje A(i) iz okvira s tekstom txtUnos, potvrdom na gumb cmdUnesi uveava se varijabla i za jedan tj. i = i + 1. Visual Basic omoguava pisanje ovog izraza u obliku i += 1. Uneseni brojevi unose se u popis lstLista. Nakon poetnog definiranja, varijable Min i Max poprimaju vrijednosti prvog lana polja A(1). ForNext petlja svaki element polja usporeuje s vrijednostima varijabli Min i Max preko IfThen 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
36
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 nain, ako je vrijednost elementa A(j) vea od vrijednosti varijable Max, tada Max poprima vrijednost A(j). Programski kd 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
37
38
Potprogramom dogaaja 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 mijenjajui redni broj lana:
lblUnos.Text = "Unesite " + CStr(i + 1) + ". lan:"
39
Dijelovi natpisa stavljaju se u navodnike i veu znakom +, a promjenjivi dio rednog broja pretvara se u String i poprima vrijednost i + 1. Unutar potprograma za dogaaj cmdIzracunaj_Click briu se sve stavke popisa lstListaB za novi ispis pomou osobine Items.Clear. Unutar ForNext petlje formira se novo polje i ispisuje u popis. Ukupni programski kd 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
40
i = 1, N
A(i)
i = 1, n - 1
j = 1, n - i
NE
i = 1, n
A(i)
END
41
Nakon to su uneseni brojevi u polje A, preko unutranje petlje s brojaem j usporeuju se susjedni lanovi polja i zamjenjuju mjesta ako je zadovoljen uvjet da je predhodnik vei od slijedbenika (A(j) > A(j+1)). Zamjena se vri 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).
1
INICIJALNO STANJE
A(j)
A(j+1)
6
Temp
3
A(j) = A(j+1)
A(j)
A(j+1)
3
Temp
2
Temp = A(j)
A(j)
A(j+1)
6
Temp
4
A(j+1)= Temp
A(j)
A(j+1)
3
Temp
6
Slika 30. Zamjena vrijednosti susjednih lanova polja
2, 7, 6, 1 2, 6, 7, 1 2, 6, 1, 7 2, 6, 1, 7 2, 1, 6, 7
j=1 3 usporedbe i = 1, n 1 j=2 2 usporedbe i = 1, n 2 j=3 1 usporedba i = 1, n 3 ukupno 3 prolaza kroz podatke = = broj clanova niza - 1 vanjska petlja: j = 1, n - 1
2>1
1, 2, 6, 7
Nakon prvog prolaza kroz vanjsku petlju najvei broj sigurno dolazi na zadnje mjesto (npr. kao broj 7 na slici 31). Unutranja 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 unutranje petlje stoga poprima vrijednosti od 1 do n broja vanjske petlje (u ovom primjeru ni). Broj prolaza kroz vanjsku petlju jednak je broju lanova niza umanjenom za 1.
42 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Forma prema slici 31 sadri gumbe za unos broja u polje, sortiranje i izlaz, okvir s tekstom za unos, dva popisa za nesortirani i sortirani niz te pripadajue natpise.
Slika 31. Konani 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 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 43
Programiranje i algoritmi podloge za vjebe 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
44
za
Napisati program za unos realnih brojeva u kvadratnu matricu te ispis koliko se u njoj nalazi nula, pozitivnih i negativnih brojeva.
1.1 2.1 3.1 4.1 ... n-1.1 n.1 1.2 2.2 3.2 ... ... n-1.2 n.2 1.3 2.3 3.3 ... ... ... ... 1.4 ... ... ... ... ... ... ... ... ... ... 1.n-1 2.n-1 ... ... ... 1.n 2.n ... ... n-2.n n-1.n n.n
n-2.n-2
... n.n-2
n-1.n-1
n.n-1
Za razliku od niza, matrica se prikazuje kao polje s dvije dimenzije, a sastoji se od elemenata smjetenih 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 oznaava 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 poveava za 1), zatim drugog itd. Nakon svakog unosa, element matrice A(i,j) se usporeuje s nulom, te ovisno da li je vei, manji ili jednak nuli poveavaju se vrijednosti varijabli Broj_poz, Broj_neg ili Broj_nula za jedan.
45
n i = 1, n j = 1, n
A(i, j)
DA
A(i, j) > 0
NE
Broj_poz = Broj_poz + 1
DA
A(i, j) < 0
NE Broj_nula = Broj_nula+ 1
Broj_neg = Broj_neg + 1
Slika 35 Konani izgled forme 46 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
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). Openiti 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 moe ga obrisati i ponoviti unos. U ovom primjeru vrijednost varijable n se unosi uporabom okvira za unos (slika 36) na slijedei nain:
n = InputBox("Unesite broj redaka i stupaca matrice", "Velicina matrice")
Slika 36
Uporabom vanjske (indeks i) petlje za retke i unutranje (indeks j) za stupce omoguuje se popunjavanje polja.
For i = 1 To n For j = 1 To n Next j Next i
Unutar te petlje unosi se programski kd 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 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 47
Uneseni element polja usporeuje se s 0 i prema ispunjenju zadanog uvjeta poveava se vrijednost varijablama poz, neg, i nula te se nakon zavretka obje petlje ispisuju njihove vrijednosti u okvire s tekstom. Cijeli programski kd 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
48
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 brojaem j ,koja se nalazi u petlji za retke, formira se ukupni zbroj elemenata pojedinog retka. Izlaskom iz petlje za stupce izraunati zbroj dijeli se s brojem stupaca n, ispisuje izraunata sredina te se prijelazi na slijedei redak (novi korak petlje za retke).
m-2.n
m-1.n-1
m-1.n
m.1
m.2
m.n-1
m.n
i = 1, n
A(i, j)
END
Slika 39. Dijagram toka CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 49
lanovi polja A(i,j) ispisuju se u popis lstMatrica, a izraunate sredine u popis lstRedci (slika 40).
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 brojaem varijablom i i unutranja za stupce s brojaem 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 unutranje petlje izraunava se vrijednost varijable Zbroj. Za svaki novi izraun aritmetike sredine retka vrijednost varijable Zbroj se postavlja na 0.
50 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Programiranje i algoritmi podloge za vjebe 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 izraunava se vrijednost varijable Sredina i dodaje u popis lstRedci prema:
Sredina = Zbroj / m lstRedci.Items.Add(CStr(i) + ". redak = " + CStr(Sredina))
51
52
n-2.n-2
... n.n-2
n-1.n-1
n.n-1
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 poveati vrijednost varijable koja e biti indeks tog polja za 1. Najveim brojem (Max) se proglaava prvi element tako formiranog polja i usporeuje se s ostatkom elemenata. Ako je za pojedini element istinit uvjet da je vei od Max, varijabla Max poprima vrijednost tog elementa. Djeljivost nekog broja s drugim brojem provjeravamao tako da izraunavamo ostatak kod dijeljenja. Dakle ako elimo provjeriti da li je broj x djeljiv sa y korisiti emo funkciju koja kao vrijednost vraa ostatak od dijeljenja x sa y. U Visual Basic-u takva funkcija se zove Mod, a sintaksa je slijedea: Izraz x Mod y daje vrijednost ostatka od dijeljenja x sa y. Dakle ako elimo provjeriti da li npr. varijabla A sadri paran broj, ispitati emo sliedei uvjet: If A Mod 2 = 0 Ako je uvjet istinit, vrijednost je parna, a ako nije onda je vrijednost neparna. Na isti nain provjeravamo i djeljivost sa drugim brojevima.
53
A(i, j)
Max = B(i) NE i = 1, n
A(i, i) Mod 2 = 0 NE
Max
END
Slika 44. Konani 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
54
Programiranje i algoritmi podloge za vjebe 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
55
i = 1, N
j = 1, M
A(i, j)
NE
Zbroj END
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 56 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Programiranje i algoritmi podloge za vjebe 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
57
NE i>j
i<j DA
Slika 48. Dijagram toka 58 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Programiranje i algoritmi podloge za vjebe 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
59
17. Iteracija
Potrebno je napraviti program za odreivanje visine h do koje je spremnik u obliku kugle radijusa R ispunjen tekuinom za zadani volumen V uz zadanu tonost ( = Vzadani Vizracunati ). Volumen kuglina odsjeka rauna se po formuli:
1 V = h 2 (3R h) . Potrebno je pretpostaviti poetno rjeenje (h = R), provjeriti tonost 3 te korigirati po potrebi (iteracija).
(X-, X+)
y1 = f (X)
x, y1=Y2
(Y-,
Y+)
y2 = f (X)
Xo X1 X1
X2 X1 X1 X2 X2 X1
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 60 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Programiranje i algoritmi podloge za vjebe 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
61
18. Bisekcija
Napisati program koji e odrediti nultoku funkcije f(x) = 0 u intervalu [x1, x2] uz odreenu tonost , metodom bisekcije. Za izraunavanje vrijednosti funkcije f(x) nainiti funkcijski potprogram.
Algoritam
Uitati granice intervala x1 i x2 te traenu tonost . Provjeriti da li funkcija u zadanom intervalu mijenja f ( x1 ) f ( x 2 ) < 0 . Ako ne, ispisati poruku i zaustaviti program. Petlja koja se prekida kada se zadovolji jedan od uvjeta: Izraunati meutoku: x0 =
predznak:
f ( x0 ) x 2 x1
x1 + x 2 2 Provjeriti uvjete. Ako su zadovoljeni ispisati vrijednost nultoke. Provjeriti u kojoj polovici inetervala funkcija mijenja predznak:
62
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
63
64
65
f ( x) dx
a b a
po Simpsonovoj formuli:
h + 4 y1 + 2 y2 + 4 y3 + K + 2 yn 2 + 4 yn 1 + yn )
f ( x) dx 3 ( y
h= ba n
Ulazni podaci su a, b i n, a program treba ispisati izraunatu vrijednost integrala. Za raunanje vrijednosti funkcije f(x) pozivati funkcijski potprogram. Program testirati za funkciju f(x) = sin(x).
y
y3
x1
x2
x3
xn-2
xn-1 b
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) 66 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Programiranje i algoritmi podloge za vjebe 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
67
68
Izraz: 5 6 2 + * 8 4 / - )
1 2 3 4 5 6 7 8 9 10
5*(6+2)8/4
Dodaj ) na kraj izraza skeniraj (parsiraj) izraz s lijeva na desno i ponavljaj korake 3 i 4 dok se ne dostigne ) (oznaka kraja izraza) Ako je pronaen operand, stavi ga na stog Ako je pronaen operator o:
simbol 5 6 2 + * 12 4 / )
1. 2.
3. 4.
i. ii. iii.
Uzmi dva elementa sa vrha stoga (A je na vrhu, a B ispod njega) Izraunaj B o A Stavi rezultat na stog
5.
69
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 slijedei element sa vrha stoga Select Case simbol Case "+" mr = Case "-" mr = Case "*" mr = Case "/" mr = End Select 'primjeni operator i rez. vrati na stog
stog.Push(mr) ' da li je simbol razliit od "praznine"? ElseIf simbol <> " " Then MsgBox("izraz sadri 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 70 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb
Programiranje i algoritmi podloge za vjebe 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) 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 ' uzmi rezultat izraza sa vrha stoga TextBox2.Text = CStr(rezultat)
71
b=
x y
i =1 n i
nx y
x
i =1
a = y b x
nx
2
2 i
x=
1 n xi n i =1
y=
1 n yi n i =1
72
Programiranje i algoritmi podloge za vjebe 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
73
dopi
promjer provrta
<
dop
M W
W=
74
Programiranje i algoritmi podloge za vjebe 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 CADLab, Katedra za konstruiranje i razvoj proizvoda, FSB Zagreb 75
Programiranje i algoritmi podloge za vjebe 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
76
Programiranje
24.2 Zadatak 2
Potrebno je napraviti program za ispis svih brojeva veih 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: y = x 3 + 2 x 2 + 3x + 4 .
24.4 Zadatak 4
Potrebno je napraviti program za ustanovljavanje da li je trokut jednakostranian, jednakokraan ili raznostranian. U koordinatnom sustavu trokut je definiran s tri koordinate njegovih vrhova: P1 ( x1 , y1 ) , P2 ( x 2 , y 2 ) i P3 ( x3 , y 3 ) . Formula za izraunavanje udaljenosti izmeu vrhova trokuta glasi: Pij = ( xi x j ) 2 + ( y i y j ) 2 .
77