Professional Documents
Culture Documents
Visual Basic 2008 Seminar Ski
Visual Basic 2008 Seminar Ski
Predmet
VII PROGRAMSKI JEZICI I RAD ALATI
PROGRAMIRANJE U VISUAL BASIC-u
RIJEENI PRIMJERI
(seminarski rad)
Predmetni nastavnik
Prof. dr. Zoran Avramovi
Student
Drago Tomi
Index br. 30-09/VIT
Sadraj
1.
2.
3.
Glavna forma.........................................................................................................................1
Faktori broja, savreni brojevi...............................................................................................3
Operacije sa velikim prirodnim brojevima............................................................................4
3.1.
Runo sabiranje prirodnih brojeva.................................................................................6
3.2.
Runo oduzimanje prirodnih brojeva............................................................................7
3.3.
Runo mnoenje prirodnih brojeva...............................................................................8
4. Dijeljenje (N decimala)........................................................................................................10
5. Korjenovanje (N decimala)..................................................................................................12
6. Fibonaijevi brojevi.............................................................................................................17
7. Spirala..................................................................................................................................19
8. Grafik i osobine funkcija.....................................................................................................21
9. Sistem jednaina..................................................................................................................24
10.
Efikasnost razliitih algoritama sortiranja.......................................................................28
10.1.
Implementacija algoritama sortiranja......................................................................31
10.1.1. Bubble Sort..........................................................................................................31
10.1.2. Insertion Sort.......................................................................................................32
10.1.3. Selection Sort.......................................................................................................32
10.1.4. Shell Sort.............................................................................................................33
10.1.5. Quick Sort............................................................................................................34
10.1.6. Merge Sort...........................................................................................................35
11.
Iznos slovima...................................................................................................................36
12.
Tekst editor......................................................................................................................41
VB - Rijeeni primjeri
1. Glavna forma
Napraviti interfejs glavnu (roditeljsku) formu iz koje e biti mogue pozivati forme
potomke koji sadre zadatke navedene u sadraju. Roditeljska forma treba da sadri liniju sa
alatkama (komandna dugmad koja pozivaju ostale forme).
Rjeenje:
Objanjenja:
1. Linija alatki ToolStrip (tsAlati)
Svako dugme (ToolStripButton) na ovoj linij alatki prikazuje ikonu i tekst. Ikona
je png slika dimenzija 48 x 48 piksela. Svojstvo DisplayStyle je podeeno na
ImageAndText, a svojstvo ImageAlign je podeeno na MiddleLeft
2. MDI forma sa ubaenom slikom (BackgroundImage). Za sliku sam iskoristio
logo fakulteta kojeg sam modifikovao u programu SnagIt Editor a svojstvo
BackgroundImageLayout podesio na Tile. Svojstvo forme WindowsState sam
podesio na Maximized.
Public Class mdiGlavni
Private Sub tsbtnDijeljenjeN_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles tsbtnDijeljenjeN.Click
frmDijeljenjeN.MdiParent = Me
frmDijeljenjeN.Show()
frmDijeljenjeN.Focus()
End Sub
Private Sub tsbtnFibonaci_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tsbtnFibonaci.Click
frmFibonaci.MdiParent = Me
frmFibonaci.Show()
frmFibonaci.Focus()
End Sub
VB - Rijeeni primjeri
Private Sub tsbtnGrafF_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tsbtnGrafF.Click
frmGrafFunkcije.MdiParent = Me
frmGrafFunkcije.Show()
frmGrafFunkcije.Focus()
End Sub
Private Sub tsbtnKorijen_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tsbtnKorijen.Click
frmKorijen.MdiParent = Me
frmKorijen.Show()
frmKorijen.Focus()
End Sub
Private Sub tsbtnSistemJ_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tsbtnSistemJ.Click
frmSistemJednacina.MdiParent = Me
frmSistemJednacina.Show()
frmSistemJednacina.Focus()
End Sub
Private Sub tsbtnSlovima_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tsbtnSlovima.Click
frmSlovima.MdiParent = Me
frmSlovima.Show()
frmSlovima.Focus()
End Sub
Private Sub tsbtnSortiranje_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles tsbtnSortiranje.Click
frmSort.MdiParent = Me
frmSort.Show()
frmSort.Focus()
End Sub
Private Sub tsTekstEdit_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tsbtnTekstEdit.Click
frmTekstEditor.MdiParent = Me
frmTekstEditor.Show()
frmTekstEditor.Focus()
End Sub
Private Sub tsbtnVeliki_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tsbtnVeliki.Click
frmVelikBrojevi.MdiParent = Me
frmVelikBrojevi.Show()
frmVelikBrojevi.Focus()
End Sub
Private Sub tsbtnFaktoriBroja_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles tsbtnFaktoriBroja.Click
frmFaktoriBroja.MdiParent = Me
frmFaktoriBroja.Show()
frmFaktoriBroja.Focus()
End Sub
Private Sub tsbtnSpirala_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles tsbtnSpirala.Click
frmSpirala.MdiParent = Me
frmSpirala.Show()
frmSpirala.Focus()
End Sub
End Class
Drago Tomi, Apeiron BL
VB - Rijeeni primjeri
1. TextBox (txtOd)
2. TextBox (txtDo)
3. ListBox (lstFaktori) prikazuje sve brojeve iz zadatog opsega i njihove faktore.
Ako je broj djeljiv samo sa 1 i sa samim sobom prikazuje (prost broj)
4. ListBox (lstSavrseni) prikazuje pronaene savrene brojeve iz zadatog opsega.
5. Button (btnRacunaj) izvrava kd dogaaja Click
6. Button (btnIzlaz) zavrava i zatvara formu.
Public Class frmFaktoriBroja
Private Sub btnRacunaj_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnRacunaj.Click
Dim faktor, broj, prviBr, zadnjiBr, zbirFaktora As Integer
Dim prostBr As Boolean
Dim s As String
On Error GoTo errTrap
prviBr = CInt(txtOd.Text)
zadnjiBr = CInt(txtDo.Text)
If prviBr > 50000 Or zadnjiBr > 50000 Or _
prviBr < 1 Or zadnjiBr < 1 Then
MsgBox("Vrijednosti izvan dozvoljenih granica!")
Exit Sub
End If
If prviBr > zadnjiBr Then
MsgBox("Greka! Od broja > Do broja.")
End If
lstFaktori.Items.Clear()
lstSavrseni.Items.Clear()
For broj = prviBr To zadnjiBr
Drago Tomi, Apeiron BL
VB - Rijeeni primjeri
zbirFaktora = 0
prostBr = True
s = broj.ToString & " --> "
For faktor = 1 To broj \ 2
If faktor = 1 Then
s = s & faktor
zbirFaktora = zbirFaktora + faktor
Else
If broj Mod faktor = 0 Then
s = s & ", " & faktor
zbirFaktora = zbirFaktora + faktor
prostBr = False
End If
End If
Next
If prostBr Then s = s & " (prost broj)"
lstFaktori.Items.Add(s)
If broj = zbirFaktora Then
lstSavrseni.Items.Add(broj)
End If
Next
Exit Sub
errTrap:
VB - Rijeeni primjeri
1. TextBox (txtBroj1)
2. TextBox (txtBroj2)
3. TextBox (txtRezultat) prikazuje rezultat po izabranoj operaciji.
4. RadioButton (optSabiranje)
5. Radio Button (optOduzimanje)
6. RadioButton (optMnozenje)
7. Button (btnRacunaj) poziva funkciju u zavisnosti od odabrane operacije
(funkcije: SaberiStr, OduzmiStr, MnoziStr smjestene u zasebnom modulu
Funkcije.vb). Svojstvu AcceptButton forme dodijeljena vrijednost btnRacunaj
tako da kada korisnik pritisne Enter izvrava se dogaaj Click dugmeta
btnRacunaj
8. Button (btnReset) uklanja sadraj TextBox kontrola.
9. Button (btnIzlaz) zatvara prozor. Svojstvu CancelButton forme dodijeljena
vrijednost btnIzlaz tako da kada korisnik pritisne dugme Esc izvrava se dogaaj
dugmeta btnIzlaz.
Public Class frmVelikBrojevi
Private Sub btnRacunaj_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnRacunaj.Click
If optSabiranje.Checked = True Then
txtRezultat.Text = SaberiStr(txtBroj1.Text, txtBroj2.Text)
End If
If optOduzimanje.Checked = True Then
txtRezultat.Text = OduzmiStr(txtBroj1.Text, txtBroj2.Text)
End If
If optMnozenje.Checked = True Then
txtRezultat.Text = MnoziStr(txtBroj1.Text, txtBroj2.Text)
End If
End Sub
Private Sub txtBroj1_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtBroj1.KeyPress
If Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) Then
e.KeyChar = ""
End If
End Sub
Drago Tomi, Apeiron BL
VB - Rijeeni primjeri
Private Sub txtBroj2_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtBroj2.KeyPress
If Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) Then
e.KeyChar = ""
End If
End Sub
Private Sub btnReset_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnReset.Click
Dim Kontrola As Control
For Each Kontrola In Me.Controls
If Kontrola.GetType Is GetType(System.Windows.Forms.TextBox) Then
Kontrola.Text = ""
End If
Next
End Sub
Private Sub btnIzlaz_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnIzlaz.Click
Me.Close()
End Sub
End Class
3.1.
Napisati funkciju koja za argumente ima dva velika prirodna broja koji su predstavljeni kao
string i sabira ih.
Rjeenje:
Funkcija SaberiStr sabira dva velika prirodna broja po principu runog sabiranja.
Funkcija koristi dodatnu proceduru DodajVodeceNule iji je kod dat u sledeem zadatku.
Public Function SaberiStr(ByVal
ByVal
'funkcija sabira dva velika
'po metodi runog sabiranja
Dim A() As Short
Dim B() As Short
Dim i As Integer
Dim duz As Integer
Dim pisem As Short
Dim pamtim As Short
Dim sZbir As String
sA As String, _
sB As String) As String
prirodna broja pomou stringa
'Cifre prvog sabirka
'Cifre drugog sabirka
'Broja
'Broj cifara veeg broja
'
'
'Zbir dva velika broja
VB - Rijeeni primjeri
pamtim = 0
For i = duz - 1 To 0 Step -1
If A(i) + B(i) + pamtim <= 9 Then
pisem = A(i) + B(i) + pamtim
pamtim = 0
Else
pisem = A(i) + B(i) + pamtim - 10
pamtim = 1
End If
sZbir = pisem.ToString & sZbir
Next
If pamtim > 0 Then
sZbir = pamtim & sZbir
End If
Return sZbir
End Function
3.2.
Napisati funkciju koja za argumente ima dva velika prirodna broja koji su predstavljeni kao
string i oduzima prvi od drugog.
Rjeenje:
Funkcija OduzmiStr oduzima prvi broj od drugog po principu runog oduzimanja.
Funkcija koristi dvije pomone procedure DodajVodeceNule i UkloniVodeceNule
Public Function OduzmiStr(ByVal sA As String, ByVal sB As String) As String
'funkcija oduzima dva velika cijela broja pomou stringa
'po metodi runog oduzimanja
Dim A() As Short
'Cifre umanjenika
Dim B() As Short
'Cifre umanjioca
Dim i As Integer
'Broja
Dim duz As Integer
'Broj cifara veeg broja
Dim pisem As Short
'
Dim pamtim As Short
'
Dim bNegativan As Boolean
'Da li je umanjilac vei od umanjenika?
Dim sRazlika As String
'Razlika dva velika broja
'Vrijednost varijable duz je broj cifara veeg broja
duz = IIf(Len(sA) > Len(sB), Len(sA), Len(sB))
ReDim A(duz)
ReDim B(duz)
'Ako manji broj ima manje cifara dopii nule s lijeve strane.
DodajVodeceNule(sA, sB)
'provjeri da li je sA > sB
Select Case StrComp(sA, sB)
Case 1
bNegativan = False
Case 0
Return "0"
Case -1
bNegativan = True
End Select
'popuni nizove
For i = 0 To duz - 1
A(i) = CByte(Mid(IIf(bNegativan, sB, sA), i + 1, 1))
Drago Tomi, Apeiron BL
VB - Rijeeni primjeri
B(i) = CByte(Mid(IIf(bNegativan, sA, sB), i + 1, 1))
Next
sRazlika = ""
pamtim = 0
For i = duz - 1 To 0 Step -1
If A(i) - pamtim < 0 Then
'Drugim rijeima ako je A(i) = 0
pisem = 9 - B(i)
'0 - 1 = 9
pamtim = 1
Else
If A(i) - pamtim - B(i) < 0 Then
pisem = 10 + A(i) - pamtim - B(i)
pamtim = 1
Else
pisem = A(i) - pamtim - B(i)
pamtim = 0
End If
End If
sRazlika = pisem.ToString & sRazlika
Next
'Ako sa lijeve strane dobijene razlike ima nula ukloni ih
UkloniVodeceNule(sRazlika)
If bNegativan Then
sRazlika = "-" & sRazlika
End If
Return sRazlika
End Function
'Procedura: UkloniVodeceNule
'Argumenti: s (referenca na string)
'Opis: Iz stringa s uklanja sve nule sa lijeve strane
Public Sub UkloniVodeceNule(ByRef s As String)
While Len(s) > 1 And Mid(s, 1, 1) = "0"
s = Mid(s, 2)
End While
End Sub
'Procedura: DodajVodeceNule
'Argumenti: sA string, sB string
'Opis: Poredi dva stringa i onome kraem dodaje s lijeve strane
'
potreban broj nula da bi dobili dva stringa iste duine
Public Sub DodajVodeceNule(ByRef sA As String, ByRef sB As String)
Dim i As Integer
If Len(sA) > Len(sB) Then
For i = 1 To Len(sA) - Len(sB)
sB = "0" & sB
Next
Else
For i = 1 To Len(sB) - Len(sA)
sA = "0" & sA
Next
End If
End Sub
3.3.
Napisati funkciju koja mnoi dva prirodna broja po principu runog mnoenja (pogodno za
mnoenje velikih brojeva)
Drago Tomi, Apeiron BL
VB - Rijeeni primjeri
Rjeenje:
Funkcija MnoziStr mnoi dva broja koja su predstavljena kao stringovi kao to se
runo mnoi. U funkciji se koristi procedura UkloniVodeceNule koja je data u prethodnom
primjeru.
Public Function MnoziStr(ByVal sA As String, ByVal sB As String) As String
Dim i As Integer
'Broja
Dim j As Integer
'Broja
Dim A() As UShort
'Cifre prvog broja
Dim B() As UShort
'Cifre drugog broja
Dim C(,) As UShort
'Matrica umnoaka
Dim Rez() As UShort
'Cifre proizvoda
Dim duzA As UShort
'Broj cifara broja A
Dim duzB As UShort
'Broj cifara broja B
Dim pisem As UShort
'
Dim pamtim As UShort
'
Dim pom As UShort
'
Dim sRezultat As String 'Proizvod kao string
'
'
'
'
'
'
'
2589147 * 387
-----------0018124029
0207131760
+ 0776744100
-----------1001999889
duzA = Len(sA)
duzB = Len(sB)
ReDim
ReDim
ReDim
'
'
ReDim
A(duzA)
B(duzB)
C(duzB, duzA + duzB)
Rez(duzA + duzB)
'formiraj vektore A i B
For i = 0 To duzA - 1
A(i) = CUShort(Mid(sA, i + 1, 1))
Next
For i = 0 To duzB - 1
B(i) = CUShort(Mid(sB, i + 1, 1))
Next
For i = 0 To duzB - 1
For j = 0 To duzA + duzB - 1
C(i, j) = 0
Next
Next
For i = 0 To duzA + duzB - 1
Rez(i) = 0
Next
Dim uvuci As UShort = 0
'
'Runo mnoenje
For j = duzB - 1 To 0 Step -1
pamtim = 0
For i = (duzA - 1) To 0 Step -1
Drago Tomi, Apeiron BL
VB - Rijeeni primjeri
pom = A(i) * B(j) + pamtim
If pom > 9 Then
pisem = pom Mod 10
pamtim = pom \ 10
Else
pisem = pom
pamtim = 0
End If
C(duzB - 1 - j, duzB + i - uvuci) = pisem
Next
If pamtim > 0 Then
C(duzB - j - 1, duzB + i - uvuci) = pamtim
End If
uvuci += 1
Next
4. Dijeljenje (N decimala)
Napisati program koji dijeli dva prirodna broja. Kolinik ima proizvoljno zadat broj
decimalnih mjesta koji je manji ili jednak 1000.
Rjeenje:
10
VB - Rijeeni primjeri
nBrDecimala As UShort
nDijeljenik As UInteger
nDjelilac As UInteger
i As UShort
nKol As UInteger
nOst As UInteger
sKolicnik As String
nPomDijeljenik As UInteger
11
VB - Rijeeni primjeri
nDijeljenik = CUInt(txtDijeljenik.Text)
nBrDecimala = CUShort(txtBrDecimala.Text)
nKol = nDijeljenik \ nDjelilac
nOst = nDijeljenik Mod nDjelilac
sKolicnik = nKol.ToString & IIf(nBrDecimala = 0, "", ",")
For i = 1 To nBrDecimala
nPomDijeljenik = CUInt(nOst.ToString & "0")
nKol = nPomDijeljenik \ nDjelilac
nOst = nPomDijeljenik Mod nDjelilac
sKolicnik = sKolicnik & nKol.ToString
Next
rtbKolicnik.Text = sKolicnik
Exit Sub
errTrap:
End Class
5. Korjenovanje (N decimala)
Napisati program koji rauna kvadratni korijen pozitivnog realnog broja na proizvoljan broj
decimalnih mjesta.
12
VB - Rijeeni primjeri
Rjeenje:
Objanjenje:
1. Linija dobijena pomou PictureBox kontrole, tako to su podeena svojstva
Width na irinu forme, Height na 1 piksel i BackColor na Black.
2. ToolTip kontrola iji sadraj se dinamiki mijenja kako se mijenja potkorjena
veliina i broj decimala.
3. PictureBox kontrola. U MSPaint programu sam nacrtao izgled simbola za
korijen, uvezao sliku, koja se isto dinamiki proiri da natkrije potkorjenu
veliinu.
4. Labela iji sadraj se dinamiki mijenja kako se mijenja vrijednost u kontroli
txtBroj.
5. Labela lblKorijen koja prihvata rezultat korjenovanja.
Slijedi programski kod rjeenja:
Public Class frmKorijen
Dim sToolTip As String 'promjenljiva e se dinamiki mijenjati
'
kako se budu mijenjale vrijednosti
'
potkorjene veliine i broja decimala
13
VB - Rijeeni primjeri
dvojka As String
cifra As Integer
cifra1 As Integer
dupli As String
korijen As String
razlika As String
cilj As String
Next
'Ako nije unesen decimalni simbol
'Ako je broj cifara neparan dodaj nulu s lijeve strane
If Len(sBroj) Mod 2 = 1 Then
sBroj = "0" & sBroj
End If
'... dodaj zarez...
sBroj = sBroj & ","
'... i dodaj onoliko parova nula ("00")
'
koliko je zadato decimala
For i = 1 To nBrDecimala
sBroj = sBroj & "00"
Else
14
VB - Rijeeni primjeri
Next
End If
'Broj cijelih mjesta u rezultatu korjenovanja je...
brCijeli = Len(Mid(sBroj, 1, InStr(sBroj, ",") - 1)) \ 2
Dim sNiz As String
'Ukloni zarez ","
'
14,260000 --> 14260000
sNiz = Replace(sBroj, ",", "")
ReDim sGrupe(Len(sNiz) \ 2)
'Formiraj vektor iji su lanovi parovi cifara.
'sGrupe(0) = "14", sGrupe(1) = "26",
'sGrupe(2) = "00", sGrupe(3) = "00"
For i = 0 To Len(sNiz) \ 2 - 1
sGrupe(i) = Mid(sNiz, i * 2 + 1, 2)
Next
dvojka = sGrupe(0)
cifra1 = 0
'korijen = ""
'Odredi korijen prvog para
' sqrt(14) ~ 3
While cifra1 <= 9 And cifra1 ^ 2 <= CInt(dvojka)
cifra1 += 1
End While
cifra1 -= 1
korijen = korijen & CStr(cifra1)
'Odredi razliku
razlika = OduzmiStr(dvojka, MnoziStr(CStr(cifra1), CStr(cifra1)))
'Dupliraj korijen
dupli = MnoziStr("2", korijen)
For i = 1 To Len(sNiz) \ 2 - 1
'Uzmi sledeu grupu, dodaj je stringu razlika.
cilj = razlika & sGrupe(i)
cifra = 0
sTemp2 = cilj
'Pronai sledeu cifru poevi od nule:
'XX0 * 0 ili XX1 * 1 ili XX2 *2 ili XX3 * 3 ...
Do
sTemp1 = MnoziStr(dupli & CStr(cifra), CStr(cifra))
DodajVodeceNule(sTemp1, sTemp2) 'zbog poreenja StrComp
cifra = cifra + 1
'..vrti ukrug dok ne proba sve cifre 0-9 ili
'dok rezultat ne bude vei od traenog
Loop While cifra - 1 <= 9 And StrComp(sTemp1, sTemp2) <= 0
cifra -= 2 'umanji cifru za 2 jer je poveana za 2
'
unutar Do..Loop petlje
korijen = korijen & CStr(cifra) 'naenu cifru dodaj rezultatu..
sTemp1 = MnoziStr(dupli & CStr(cifra), CStr(cifra)) '..pomnoi..
razlika = OduzmiStr(sTemp2, sTemp1)
'..nai razliku..
dupli = MnoziStr("2", korijen)
'..korijen uduplaj..
Next
'..i kreni ponovo..
Dim rezultat As String
'konano ubaci zarez u dobijeni rezultat
'(izbroj ukupno brCijeli cifara, stavi zarez i dodaj ostatak)
Drago Tomi, Apeiron BL
15
VB - Rijeeni primjeri
rezultat = Mid(korijen, 1, brCijeli) & "," & _
Mid(korijen, brCijeli + 1)
Return rezultat
End Function
Private Sub txtBrDec_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtBrDec.KeyPress
If Not (Char.IsDigit(e.KeyChar)) And _
Not (Char.IsControl(e.KeyChar)) Then
e.KeyChar = ""
End If
End Sub
Procedura ToolTip() mijenja sadraj balonia sa tekstom koji se pojavljuje iznad slike
korijena sa vrijednou potkorjene veliine. Pozivom ove procedure u okviru drugih dogaaja
ostvaruje se dinaminost promjene.
Private Sub ToolTip()
sToolTip = "Izraunaj kvadratni korijen broja " & _
lblBroj.Text & vbCrLf & _
" na " & IIf(txtBrDec.Text = "", _
"Y", txtBrDec.Text) & " decimala!"
ToolTip1.SetToolTip(Me.lblBroj, sToolTip)
ToolTip1.SetToolTip(Me.picKorijen, sToolTip)
End Sub
Private Sub txtBroj_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles txtBroj.TextChanged
If txtBroj.Text = "" Then
lblBroj.Text = "X"
Else
lblBroj.Text = txtBroj.Text
End If
picKorijen.Width = 20 + lblBroj.Width
Call ToolTip()
End Sub
Private Sub txtBrDec_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles txtBrDec.TextChanged
Call ToolTip()
End Sub
Private Sub lblBroj_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles lblBroj.Click
Korjenuj()
End Sub
Private Sub picKorijen_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles picKorijen.Click
Korjenuj()
End Sub
Private Sub frmKorijen_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles Me.Load
Call ToolTip()
End Sub
16
VB - Rijeeni primjeri
End Class
6. Fibonaijevi brojevi
Zadatak: Ispisati lanove Fibonaijevog niza: F(n) = F(n-1) + F(n-2); F(0) = 0, F(1) = 1.
Uporediti brzinu generisanja Fibonaijevih brojeva metodom rekurzije i ne-rekurzivno.
(Primjer gdje rekurzivna metoda nije toliko efikasna.)
Rjeenje:
Izgled interfejsa
Fibonaijev niz su prirodni brojevi ija vrijednost zavisi od indeksa, tako n-ti lan je
suma dva prethodna, odnosno F(n) = F(n-1) + F(n-2). Prva dva lana niza su eksplicitno zadani,
tj. F(0) = 0 i F(1) = 1.
Pronai sve Fibonaijeve brojeve do n-tog indexa je lako uz upotrebu rekurzije,
meutim to nije najefikasnije rjeenje uopte, jer rekurzijom se mora svaki put iznova raunati
ve izraunate vrijednosti prethodnika. Efikasniji nain je ako bismo svakim prolazom
zapamtili ve izraunate vrijednosti to je prikazano nerekurzivnom procedurom.
Na kraju ispisa Fibonaijevih brojeva ispisuje se i broj rekurzija odnosno broj iteracija
kod nerekurzivnog metoda. Ukoliko je dolo do prekoraenja po tipu podataka Ulong na kraju
liste se upie Prekoraenje.
Slijedi kd rjeenja:
Public Class frmFibonaci
Dim nFibPoziv As ULong 'varijabla pamti broj poziva rekurzivne funkcije
Private Sub btnFibonaci_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFibonaci.Click
Dim i As Byte
Dim n As Byte
On Error GoTo errTrap 'izlaz u sluaju greke
n = CByte(txtIndex.Text)
If n > 35 Then
If MsgBox("Za ovu vrijednost raunanje predugo traje." & vbCrLf _
& "elite li da postavim indeks na 35?", _
MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then
n = 35
txtIndex.Text = 35
End If
End If
Drago Tomi, Apeiron BL
17
VB - Rijeeni primjeri
nFibPoziv = 0
lstFib.Items.Clear()
For i = 0 To n
'za svaki index se poziva rekurzivna funkcija Fibonacci(i)
lstFib.Items.Add("F(" & i & ") = " & Fibonacci(i))
Next
lstFib.Items.Add("Broj rekurzija: " & nFibPoziv)
Exit Sub
errTrap:
lstFib.Items.Add("Prekoraenje")
lstFib.Items.Add("Broj rekurzija: " & nFibPoziv)
End Sub
Private Sub btnFibonaci2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFibonaci2.Click
Dim Fib() As Ulong 'vektor koji pamti izraunate lanove
Dim i As Byte
Dim n As Byte
Dim nBrIteracija As ULong = 0
On Error GoTo errTrap
n = CByte(txtIndex.Text)
ReDim Fib(n)
lstFib2.Items.Clear()
For i = 0 To n
If i <= 1 Then
Fib(i) = i
Else
Fib(i) = Fib(i - 1) + Fib(i - 2)
End If
lstFib2.Items.Add("F(" & i & ") = " & Fib(i))
nBrIteracija += 1
Next
lstFib2.Items.Add("Broj iteracija: " & nBrIteracija)
Exit Sub
errTrap:
lstFib2.Items.Add("Prekoraenje")
lstFib2.Items.Add("Broj iteracija: " & nBrIteracija)
End Sub
Private Function Fibonacci(ByVal n As UInteger) As ULong
On Error GoTo errTrap
nFibPoziv = nFibPoziv + 1
If n <= 1 Then
Return n
Else
Return Fibonacci(n - 1) + Fibonacci(n - 2)
End If
Exit Function
errTrap:
MsgBox("Greka br. " & Err.Number & vbCrLf & _
"Opis: " & Err.Description)
End Function
Private Sub btnKraj_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnKraj.Click
Me.Close()
Drago Tomi, Apeiron BL
18
VB - Rijeeni primjeri
End Sub
Private Sub txtIndex_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtIndex.KeyPress
If Not (Char.IsDigit(e.KeyChar)) And _
Not (Char.IsControl(e.KeyChar)) Then
e.KeyChar = ""
End If
End Sub
End Class
7. Spirala
Dat je pravougaonik (matrica) m x n, 1 < (m,n) < 101. Potrebno je upisati brojeve od 1 do
m x n kreui se spiralno u pravcu kazaljke na satu poevi od gornjeg lijevog elementa.
Voditi rauna da se brojevi meusobno ne preklope. Spirala se kree od vanjskgo
pravougaonika ka unutranjem dok se ne ispiu svi brojevi.
Rjeenje:
19
VB - Rijeeni primjeri
'ispis pravougaonika
rtxtSpirala.Text = ""
For i = 0 To red - 1
For j = 0 To kol - 1
rtxtSpirala.AppendText(A(i, j))
'rtxtSpirala.Text = rtxtSpirala.Text & A(i, j)
Next
20
VB - Rijeeni primjeri
rtxtSpirala.AppendText(vbCrLf)
'rtxtSpirala.Text = rtxtSpirala.Text & vbCrLf
Next
Exit Sub
errTrap:
End Class
interfejsu
oznaeni
21
VB - Rijeeni primjeri
Slijedi kd rjeenja:
x As Single
y As Single
xSkala As Single
ySkala As Single
CrtajOse()
xSkala = 30
ySkala = 30
Select Case Funkcija
Case "y = x"
For x = -5 To 5 Step 0.005
y = x
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
Case "y = x^2"
For x = -5 To 5 Step 0.005
y = x ^ 2
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
Case "y = x^3"
For x = -5 To 5 Step 0.005
y = x ^ 3
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
Case "y = 1/x"
For x = -5 To 5 Step 0.005
y = 1 / x
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
Case "y = e^x"
For x = -5 To 5 Step 0.005
y = Math.Exp(x)
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
Case "y = ln(x)"
For x = 0.001 To 5 Step 0.001
y = Math.Log(x, Math.E)
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
22
VB - Rijeeni primjeri
Case "y = sin(x)"
For x = -5 To 5 Step 0.005
y = Math.Sin(x)
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
Case "y = cos(x)"
For x = -5 To 5 Step 0.005
y = Math.Cos(x)
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
Case "y = tg(x)"
For x = -5 To 5 Step 0.005
y = Math.Tan(x)
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
Case "y = ctg(x)"
For x = -5 To 5 Step 0.005
y = 1 / Math.Tan(x)
G.DrawEllipse(Pens.Yellow, xSkala * x + xc, _
yc - ySkala * y, 1, 1)
Next
Case Else
End Select
End Sub
Private Sub CrtajOse()
xc = picGraf.Width / 2
yc = picGraf.Height / 2
G = picGraf.CreateGraphics
G.DrawLine(Pens.Red, 0, yc, 2 * xc, yc)
G.DrawLine(Pens.Green, xc, 0, xc, yc * 2)
End Sub
Private Sub lstFunkcije_SelectedIndexChanged(ByVal sender As _
System.Object, ByVal e As System.EventArgs) Handles _
lstFunkcije.SelectedIndexChanged
Funkcija = lstFunkcije.Text
picGraf.Refresh()
On Error Resume Next
Select Case lstFunkcije.Text
Case "y = x"
rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\x.rtf")
Case "y = x^2"
rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\x2.rtf")
Case "y = x^3"
rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\x3.rtf")
Case "y = 1/x"
rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\1x.rtf")
Drago Tomi, Apeiron BL
23
VB - Rijeeni primjeri
9. Sistem jednaina
Rijeiti sistem n linearnih jednaina sa n nepoznatih metodom Gaus-Dordanove
eliminacije. Ograniiti na maksimalno 100 jednaina. Ostaviti mogunost runog unosa
koeficijenata i automatskog unosa generisanjem sluajnih brojeva.
Rjeenje:
24
VB - Rijeeni primjeri
koeficijenata, svi ostali svedu na nulu. Time se dobijaju tri jednaine, svaka sa po jednom
nepoznatom ije je rjeenje trivijalno.
Pri unosu koeficijenata jednaina treba paziti da koeficijent uz prvu nepoznatu prve
jednaine ne bude nula. U tom sluaju treba permutovati prvu jednainu sa nekom koja nema
nulu na mjestu prvog koeficijenta.
Ovde u rijeiti runo jedan sistem od 3 jednaine sa 3 nepoznate kako bi se stekao uvid
u nain rada programa.
x1 2 x2 x3 4
2 x1 0 x2 2 x3 16
2
2 i dodati drugoj
1
(3)
3 i dodati treoj
1
2 1
i dodati prvoj
4 2
8
2 i dodati treoj
4
1
i dodati prvoj
8
4 1
i dodati drugoj
8
2
3 x1 2 x2 3 x3 20
x1 2 x2 x3 4
0 x1 4 x2 4 x3 8
3 x1 2 x2 3 x3 20
x1 2 x2 x3 4
0 x1 4 x2 4 x3 8
0 x1 8 x2 0 x3 32
x1 0 x2 x3 8
0 x1 4 x2 4 x3 8
0 x1 8 x2 0 x3 32
x1 0 x2 x3 8
0 x1 4 x2 4 x3 8
0 x1 0 x2 8 x3 48
x1 0 x2 0 x3 2
0 x1 4 x2 4 x3 8
0 x1 0 x2 8 x3 48
x1 0 x2 0 x3 2
x1 2
x1 2
0 x1 4 x2 0 x3 16
4 x2 16
x2 4
0 x1 0 x2 8 x3 48
8 x3 48
x3 6
Dakle ako sistem ima rjeenje mogue ga je nai u konanom broju koraka. Da bi se
sistem od n jednaina sa n nepoznatih sveo na sistem od n jednaina sa po jednom nepoznatom
B1
potrebno je n n 1 koraka. Na kraju je potrebno jo n trivijalnih operacija: x1
,
A1,1
B
B
x2 2 , , xn n .
A2, 2
An ,n
U interfejsu sam koristio DataGridView kontrole da prikaem matricu koeficijenata, kao
i vektor rjeenja. Redovi i kolone DataGridView kontrole se formiraju tek nakon to se zada
broj jednaina. Dozvoljeno je programom unijeti najvie 100 jednaina sa 100 nepoznatih mada
se to moe izmijeniti po potrebi.
25
VB - Rijeeni primjeri
Dim X(100) As Double
Dim bAuto As Boolean
Dim n As Integer
Private Sub OdDo(ByVal bVisible As Boolean)
If bVisible Then
pOdDo.Visible = True
txtOd.Text = -100
txtDo.Text = 100
Else
pOdDo.Visible = False
txtOd.Text = ""
txtDo.Text = ""
End If
End Sub
Private Sub optRucno_CheckedChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles optRucno.CheckedChanged
OdDo(Not optRucno.Checked)
bAuto = Not optRucno.Checked
End Sub
Private Sub optAuto_CheckedChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles optAuto.CheckedChanged
OdDo(optAuto.Checked)
bAuto = optAuto.Checked
End Sub
Private Sub btnUnos_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnUnos.Click
Dim i As Integer
If Not IsNumeric(txtBrojJednacina.Text) Then
MsgBox("Morate unijeti prirodan broj < 100")
Call Reset()
txtBrojJednacina.Focus()
Exit Sub
End If
If Val(txtBrojJednacina.Text) > 100 Then
MsgBox("Morate unijeti prirodan broj <= 100!")
Exit Sub
End If
n = CInt(txtBrojJednacina.Text)
grdUnos.Columns.Clear()
For i = 1 To n
grdUnos.Columns.Add("X" & i, "X" & i)
grdUnos.Columns("X" & i).Width = 80
grdUnos.Rows.Add()
Next
grdUnos.Columns.Add("desna", "=")
grdUnos.Columns("desna").Width = 120
grdUnos.Columns("desna").DefaultCellStyle.BackColor = Color.Azure
grdUnos.Focus()
If bAuto Then
Generator(CSng(txtOd.Text), CSng(txtDo.Text), n)
Drago Tomi, Apeiron BL
26
VB - Rijeeni primjeri
End If
End Sub
Private Sub PrihvatPodataka()
Dim i As Integer
Dim j As Integer
' Podatke iz tabele uitaj u A(n,n) niz
For i = 0 To n - 1
For j = 0 To n - 1
A(i, j) = grdUnos.Rows.Item(i).Cells(j).Value
Next
Next
' Desne strane jednaina uitaj u B(n) niz
For i = 0 To n - 1
B(i) = grdUnos.Rows.Item(i).Cells("desna").Value
Next
End Sub
Private Sub btnObrada_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnObrada.Click
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim s As Double
PrihvatPodataka()
' (1) A11*X1 + A12*X2 + A13*X3 = B1
' (2) A21*X1 + A22*X2 + A23*X3 = B2 | (1) * (-A21/A11) + (2)
' (3) A31*X1 + A32*X2 + A33*X3 = B3 | (1) * (-A31/A11) + (3)
'
For i = 0 To n - 1
For j = 0 To n - 1
'Ako je element na glavnoj dijagonali- preskoi
If i = j Then GoTo skok
s = -A(j, i) / A(i, i)
For k = 0 To n - 1
'Pomnoi svaki lan i-te jednaine sa -Aji/Aii
'te dodaj j-toj jednaini. Time e se k-ti lan
'j-te jednaine dovesti na nulu
A(j, k) = A(j, k) + s * A(i, k)
Next k
B(j) = B(j) + s * B(i)
skok:
Next j
Next i
grdRezultat.Columns.Clear()
For i = 0 To n - 1
X(i) = B(i) / A(i, i)
grdRezultat.Columns.Add("X" & i + 1, "X" & i + 1 & " =")
Next i
grdRezultat.Rows.Add()
For i = 0 To n - 1
grdRezultat.Rows.Item(0).Cells(i).Value = X(i)
Next
End Sub
27
VB - Rijeeni primjeri
Private Sub btnReset_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnReset.Click
Reset()
End Sub
Private Sub Reset()
grdUnos.Columns.Clear()
grdRezultat.Columns.Clear()
txtBrojJednacina.Text = ""
optRucno.Checked = True
End Sub
Private Sub btnKraj_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnKraj.Click
Close()
End Sub
Private Sub Generator(ByVal brOd As Double, ByVal brDo As Double, _
ByVal n As Integer)
Dim i As Integer
Dim j As Integer
Dim Koeficijent As Double
Randomize()
For i = 0 To n - 1
For j = 0 To n
Koeficijent = CInt(-brDo * Rnd() + brDo * Rnd())
grdUnos.Rows.Item(i).Cells(j).Value = Koeficijent
Next
Next
End Sub
Private Sub txtDo_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles txtDo.TextChanged
txtOd.Text = "-" + txtDo.Text
End Sub
End Class
10.
Napisati program za uporednu analizu razliitih datih algoritama za sortiranje niza sluajno
generisanih prirodnih brojeva. Algoritmi su: Bubble Sort, Selection Sort, Insertion Sort,
Quick Sort, Shell Sort, Merge Sort. Pokazatelji za uporeivanje su broj poreenja i broj
zamjena mjesta lanova niza.
Rjeenje
Na nterfejsu (slika nie) su brojevima oznaene sledee kontrole:
1. MaskedTextBox kontrola (mskBr): Korisnik treba da upie broj lanova niza.
Ogranien je unos na 99999.
2. Button kontrola (btnUpis): Poziva proceduru za generisanje sluajnih brojeva u
opsegu 0 do (broj lanova +100) i upis tih brojeva u lstNesort ListBox kontrolu.
3. ListBox kontrola (lstNesort): Prikazuje sluajno generisane prirodne brojeve.
28
VB - Rijeeni primjeri
29
VB - Rijeeni primjeri
For i = 0 To nBrojClanova - 1
A(i) = Math.Floor(Rnd() * (nBrojClanova + 100))
lstNesort.Items.Add(A(i))
Next
lstMetoda.Focus()
End Sub
Private Sub btnSort_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnSort.Click
Sortiraj()
End Sub
Private Sub Sortiraj()
Dim i As Integer
If lstNesort.Items.Count = 0 Then
MsgBox("Niste unijeli niz!")
mskBr.Focus()
Exit Sub
End If
For i = 0 To nBrojClanova
B(i) = A(i) 'uva se izvorni poredak u nizu A,
'
niz B postaje radna verzija
Next
BrojPoredjenja = 0
BrojZamjena = 0
'reset brojaa
'reset brojaa
30
VB - Rijeeni primjeri
10.1.1.Bubble Sort
Bubble sort je jednostavan algoritam za sortiranje. Radi na principu ponavljanja
prolaska kroz niz koji se sortira, poreenja susjednih lanova i zamjene mjesta ako su pogreno
poredani. Prolasci kroz niz se ponavljaju dok vie nije potrebno vriti zamjenu. Efikasnija
Drago Tomi, Apeiron BL
31
VB - Rijeeni primjeri
varijanta ovog algoritma je kad nije potrebno svaki put prolaziti kroz itav niz nego samo do
sortiranog dijela jer pri svakom sledeem prolasku sortirani dio niza se poveava za jedan.
Public Sub BubbleSort(ByRef Niz() As Integer, ByVal brClanova As Integer)
Dim i As Integer
Dim j As Integer
For i = 0 To brClanova - 2
For j = brClanova - 1 To i + 1 Step -1
If Niz(j) < Niz(j - 1) Then
Zamijeni(Niz(j), Niz(j - 1))
BrojZamjena = BrojZamjena + 1
End If
BrojPoredjenja = BrojPoredjenja + 1
Next
Next
End Sub
10.1.2.Insertion Sort
Neka je a0, an-1 niz koji treba sortirati. Na poetku i poslije svake iteracije niz se
sastoji od dva dijela: prvi dio je ve sortiran, drugi dio nesortiran. Na samom poetku samo je
element a0 u sortiranom dijelu. Uzima se prvi element iz nesortiranog dijela, poredi se kreui
se unazad sa elementima iz sortiranog dijela i svaki put kad se u sortiranom dijelu pronae
element koji je vei pomjeri se za jedno mjesto desno.
Da bi se ubacio element ai, poredi se sa elementima ai-1, ai-2, itd. Kad se pronae element
aj, aj ai, ai se umetne iza njega. Ako nije pronaen nijedan takav element onda se ai ubacuje na
poetak niza.
Public Sub InsertSort(ByRef Niz() As Integer, ByVal brClanova As Integer)
Dim i As Integer
Dim j As Integer
Dim bUmetni As Boolean
Dim temp As Integer
For i = 1 To brClanova - 1
temp = Niz(i)
j = i
bUmetni = False
Do
If Niz(j - 1) > temp Then
Niz(j) = Niz(j - 1) : BrojZamjena += 1
j = j - 1
If j = 0 Then bUmetni = True
Else
bUmetni = True
End If
BrojPoredjenja += 1
Loop Until (bUmetni)
Niz(j) = temp
Next
End Sub
10.1.3.Selection Sort
Algoritam radi na sledeem principu:
1. Nai najmanju vrijednost u nizu,
Drago Tomi, Apeiron BL
32
VB - Rijeeni primjeri
10.1.4.Shell Sort
Shell sort je jedan od najstarijih algoritama za sortiranje, nazvan po njegovom
izumitelju Donald L. Shell (1959). To je brz, lako razumljiv algoritam i lak za implementaciju.
Algoritam u toku viestrukih prolazaka kroz niz sortira manje dijelove koristei metodu
Insertion sort. Ti dijelovi postaju sve vei dok na kraju ne budu svi elementi datog niza
podvrgnuti istoj Insertion sort metodi. Meutim do tog trenutka vei dio niza je ve sortiran.
Kod Insertion sort metode inkrement odnosno veliina koraka kojim se prolazi kroz listu
je 1, dok je kod Shell sort metode taj korak promjenjiv. U prvom ciklusu korak je jednak
polovini ukupnog broja lanova niza, zatim se smanjuje na etvrtinu, pa na osminu itd. dok na
kraju ne bude 1. Npr kod niza od 20 lanova, u prvom ciklusu inkrement je 10, zatim 5, pa 2 i
na kraju 1. U prvom ciklusu se vri poreenje izmeu 10. i 1. lana niza, pa izmeu 11. i 2.
lana, itd. dok se ne uporede 20. i 10. lan. Svaki put moe da doe do zamjene mjeste ako
poredak nije odgovarajui. U sledeem ciklusu porede se 5. i 1. lan, pa 6. i 2., zatim 7. i 3. itd.
Tek kad se taj skup povea na vie od dva elementa moemo govoriti o klasinoj Insertion sort
33
VB - Rijeeni primjeri
metodi nad manjim skupom. Npr u poslednjem koraku drugog ciklusa u navedenom primjeru
elementi nad kojima se primjenjuje Insertion sort metoda su: 20, 15, 10, i 5.
Public Sub ShellSort(ByRef Niz() As Integer, ByVal brClanova As Integer)
Dim inc As Integer
Dim i As Integer
Dim j As Integer
Dim temp As Integer
Dim bUmetni As Boolean
inc = brClanova \ 2
While inc > 0
For i = inc To brClanova - 1
temp = Niz(i)
j = i
bUmetni = False
Do
If Niz(j - inc) > temp Then
Niz(j) = Niz(j - inc) : BrojZamjena += 1
j = j - inc
If j < inc Then bUmetni = True
Else
bUmetni = True
End If
BrojPoredjenja += 1
Loop Until bUmetni
Niz(j) = temp
Next
inc = inc \ 2
End While
End Sub
10.1.5.Quick Sort
Quick sort je brz algoritam za sortiranje. To je rekurzivan metod za sortiranje i odvija se
po sledeim koracima kako je i predstavljeno programskim kodom:
1. Izaberi jedan element iz liste koji se naziva pivot. U ovoj implementaciji pivot je
sredinji element posmatranog dijela liste.
2. Preuredi listu tako da svi elementi ija je vrijednost manja od pivota dou prije,
a elementi sa veom vrijednou od pivota dou poslije pivota. Nakon to se
izvri ova podjela pivot je na svojoj konanoj poziciji. Ovo se zove operacija
podjele (engl. partition).
3. Rekurzivno sortiraj pod-listu manjih elemenata i pod-listu veih elemenata
Public Sub QSort(ByRef Niz() As Integer, ByVal lijevo As Integer, _
ByVal desno As Integer)
Dim index As Integer = Podjela(Niz, lijevo, desno)
If lijevo < index - 1 Then
QSort(Niz, lijevo, index - 1)
End If
If index < desno Then
QSort(Niz, index, desno)
End If
Drago Tomi, Apeiron BL
34
VB - Rijeeni primjeri
End Sub
Private Function Podjela(ByRef Niz() As Integer, _
ByVal lGranica As Integer, _
ByVal dGranica As Integer) As Integer
Dim i As Integer = lGranica
Dim j As Integer = dGranica
Dim pivot As Integer = Niz((lGranica + dGranica) \ 2)
While i <= j
While Niz(i) < pivot
BrojPoredjenja += 1
i = i + 1
End While
BrojPoredjenja += 1
While Niz(j) > pivot
BrojPoredjenja += 1
j = j - 1
End While
BrojPoredjenja += 1
If i <= j Then
Zamijeni(Niz(i), Niz(j))
BrojZamjena = BrojZamjena + 1
i = i + 1
j = j - 1
End If
End While
Return i
End Function
10.1.6.Merge Sort
Merge Sort je rekurzivna procedura za sortiranje. Da bi sortirali niz od n elemenata,
izvodimo sledea tri koraka po redu:
1. Sortiraj lijevu polovinu niza.
2. Sortiraj desnu polovinu niza
3. Spoji (merge) sortirane polovine.
Public Sub MergeSort(ByRef Niz() As Integer, ByRef Temp() As Integer, _
ByVal lijevo As Integer, ByVal desno As Integer)
Dim sredina As Integer
If lijevo < desno Then
sredina = (lijevo + desno) \ 2
MergeSort(Niz, Temp, lijevo, sredina)
MergeSort(Niz, Temp, sredina + 1, desno)
Merge(Niz, Temp, lijevo, sredina + 1, desno)
End If
End Sub
Public Sub Merge(ByRef
ByVal
ByVal
Dim i, lijevoKraj,
lijevoKraj = sredina - 1
Drago Tomi, Apeiron BL
35
VB - Rijeeni primjeri
tmpPoz = lijevo
brojElem = desno - lijevo + 1
While lijevo <= lijevoKraj And sredina <= desno
If Niz(lijevo) <= Niz(sredina) Then
Temp(tmpPoz) = Niz(lijevo)
BrojZamjena += 1
tmpPoz = tmpPoz + 1
lijevo = lijevo + 1
Else
Temp(tmpPoz) = Niz(sredina)
BrojZamjena += 1
tmpPoz = tmpPoz + 1
sredina = sredina + 1
End If
BrojPoredjenja += 1
End While
While lijevo <= lijevoKraj
Temp(tmpPoz) = Niz(lijevo)
lijevo = lijevo + 1
tmpPoz = tmpPoz + 1
End While
While sredina <= desno
Temp(tmpPoz) = Niz(sredina)
sredina = sredina + 1
tmpPoz = tmpPoz + 1
End While
For i = 0 To brojElem - 1
Niz(desno) = Temp(desno)
desno = desno - 1
Next
End Sub
11.
Iznos slovima
36
VB - Rijeeni primjeri
37
VB - Rijeeni primjeri
'Ako cijeli dio iznosa ima vie od 15 cifara
'upozori i vrati prazan string
If Len(Mid(sIznos, 1, InStr(sIznos, ",") - 1)) > 15 Then
MsgBox("Maksimalno 15-cifren broj!")
Return ""
End If
'Ako je cijeli dio nula...
If Math.Floor(Val(sIznos)) = 0 Then
sSlovima = sSlovima & "nula "
End If
'Koliko ima grupa po tri cifre (zaokrueno navie)
brojTrojki = Math.Ceiling(Len(Mid(sIznos, 1, _
InStr(sIznos, ",") - 1)) / 3)
'Dopuni nulama do pune trojke.
'Npr. broj 2536,87 napii kao 002536,87
Dim nFali As Byte
nFali = 3 - (Len(Mid(sIznos, 1, InStr(sIznos, ",") - 1)) Mod 3)
Select Case nFali
Case 1
sIznos = "0" & sIznos
Case 2
sIznos = "00" & sIznos
End Select
'Svaka grupa od tri cifre se posebno obrauje i u zavisnosti od
'poloaja dodaje se na kraju oznaka grupe:
'hiljada, milion, milijarda...
iTrojke = brojTrojki
Do
sTrojka = Mid(sIznos, ((brojTrojki - iTrojke) * 3 + 1), 3)
sCifraJedinica = Mid(sTrojka, 3, 1)
sCifraDesetica = Mid(sTrojka, 2, 1)
sCifraStotica = Mid(sTrojka, 1, 1)
If sCifraStotica & sCifraDesetica & sCifraJedinica _
= "000" Then GoTo okruglo
Select Case sCifraStotica
Case "1"
sSlovima = sSlovima & "sto "
Case "2"
sSlovima = sSlovima & "dvjesto "
Case "3"
sSlovima = sSlovima & "tristo "
Case "4"
sSlovima = sSlovima & "etristo "
Case "5"
sSlovima = sSlovima & "petsto "
Case "6"
sSlovima = sSlovima & "esto "
Case "7"
sSlovima = sSlovima & "sedamsto "
Case "8"
sSlovima = sSlovima & "osamsto "
Case "9"
sSlovima = sSlovima & "devetsto "
End Select
Select Case sCifraDesetica
Case "2"
sSlovima = sSlovima & "dvadeset "
Case "3"
Drago Tomi, Apeiron BL
38
VB - Rijeeni primjeri
sSlovima
Case "4"
sSlovima
Case "5"
sSlovima
Case "6"
sSlovima
Case "7"
sSlovima
Case "8"
sSlovima
Case "9"
sSlovima
End Select
39
VB - Rijeeni primjeri
Case 1, 2, 4
sSlovima = sSlovima & "dvije "
Case 3, 5
sSlovima = sSlovima & "dva "
End Select
Case "3"
sSlovima = sSlovima & "tri "
Case "4"
sSlovima = sSlovima & "etiri "
Case "5"
sSlovima = sSlovima & "pet "
Case "6"
sSlovima = sSlovima & "est "
Case "7"
sSlovima = sSlovima & "sedam "
Case "8"
sSlovima = sSlovima & "osam "
Case "9"
sSlovima = sSlovima & "devet "
End Select
'Na kraju dodaj vrijednost grupe:
'hiljada, miliona, milijardi...
Select Case iTrojke
Case 2 'hiljade
Select Case sCifraJedinica
Case "0", "1", "5", "6", "7", "8", "9"
sSlovima = sSlovima & "hiljada "
Case "2", "3", "4"
sSlovima = sSlovima & "hiljade "
End Select
Case 3 'milioni
Select Case sCifraJedinica
Case "1"
sSlovima = sSlovima & "milion "
Case "0", "2", "3", "4", "5", "6", "7", "8", "9"
sSlovima = sSlovima & "miliona "
End Select
Case 4 'milijarde
Select Case sCifraJedinica
Case "1"
sSlovima = sSlovima & "milijarda "
Case "2", "3", "4"
sSlovima = sSlovima & "milijarde "
Case "0", "5", "6", "7", "8", "9"
sSlovima = sSlovima & "milijardi "
End Select
Case 5 'bilioni
Select Case sCifraJedinica
Case "1"
sSlovima = sSlovima & "bilion "
Case "0", "2", "3", "4", "5", "6", "7", "8", "9"
sSlovima = sSlovima & "biliona "
End Select
End Select
End If
okruglo:
iTrojke -= 1
Loop While iTrojke >= 1
sSlovima = sSlovima & "KM i " & Mid(sIznos, InStr(sIznos, ",") + 1) _
40
VB - Rijeeni primjeri
& "/" & (10 ^ (Len(Mid(sIznos, _
InStr(sIznos, ",") + 1)))).ToString
sSlovima = UCase(sSlovima)
Return sSlovima
End Function
End Class
12.
Tekst editor
Napisati program za ureivanje teksta. Koristiti meni, alatnu traku i kontekst meni.
Program treba da ima sledee mogunosti:
Rjeenje:
Dokument:
, Ureivanje:
, Format:
41
VB - Rijeeni primjeri
Call AkoNijeSacuvan()
End If
rtbTekst.Text = ""
rtbTekst.Modified = False
sNaziv = ""
Me.Text = FORMA
End Sub
Private Sub AkoNijeSacuvan()
If MsgBox("Dokument nije sauvan." & vbCrLf & _
"elite li sauvati promjene?", MsgBoxStyle.YesNo) = _
MsgBoxResult.Yes Then
Call SnimiDok()
End If
End Sub
Private Sub OtvoriDok()
On Error GoTo errTrap
If rtbTekst.Modified Then
Call AkoNijeSacuvan()
End If
dlgOpen.Title = "Otvori"
dlgOpen.Filter = "Rich Text Format (*.rtf) | *.rtf"
If dlgOpen.ShowDialog() = Windows.Forms.DialogResult.OK Then
rtbTekst.LoadFile(dlgOpen.FileName)
rtbTekst.Modified = False
sNaziv = dlgOpen.FileName
Me.Text = FORMA & sNaziv
End If
Exit Sub
errTrap:
MsgBox("Greka br. " & Err.Number & vbCrLf & _
"Opis: " & Err.Description)
End Sub
Private Sub SnimiDokKao()
On Error GoTo errTrap
dlgSave.Title = "Sauvaj kao..."
dlgSave.Filter = "Rich Text Format (*.rtf) | *.rtf"
If dlgSave.ShowDialog() = Windows.Forms.DialogResult.OK Then
rtbTekst.SaveFile(dlgSave.FileName, _
RichTextBoxStreamType.RichText)
rtbTekst.Modified = False
sNaziv = dlgSave.FileName
Me.Text = FORMA & sNaziv
End If
Exit Sub
errTrap:
MsgBox("Greka br. " & Err.Number & vbCrLf & _
"Opis: " & Err.Description)
End Sub
Private Sub PostaviFont()
If Not rtbTekst.SelectionFont Is Nothing Then
dlgFont.Font = rtbTekst.SelectionFont
Else
dlgFont.Font = Nothing
End If
dlgFont.ShowApply = True
If dlgFont.ShowDialog() = DialogResult.OK Then
rtbTekst.SelectionFont = dlgFont.Font
End If
Drago Tomi, Apeiron BL
42
VB - Rijeeni primjeri
End Sub
Private Sub SnimiDok()
If sNaziv <> "" Then
rtbTekst.SaveFile(sNaziv)
rtbTekst.Modified = False
Else
Call SnimiDokKao()
End If
End Sub
Private Sub btnFont_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnFont.Click
Call PostaviFont()
End Sub
Private Sub btnBullets_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnBullets.Click
If rtbTekst.SelectionBullet = False Then
rtbTekst.SelectionBullet = True
Else
rtbTekst.SelectionBullet = False
End If
End Sub
Private Sub mnuDokNovi_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuDokNovi.Click
Call Novi()
End Sub
Private Sub mnuDokSacuvaj_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuDokSacuvajKao.Click
Call SnimiDokKao()
End Sub
Private Sub mnuDokOtvori_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuDokOtvori.Click
Call OtvoriDok()
End Sub
Private Sub mnuDokZatvori_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuDokZatvori.Click
Me.Close()
End Sub
Private Sub mnuEditUndo_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuEditUndo.Click
rtbTekst.Undo()
End Sub
Private Sub mnuEditRedo_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuEditRedo.Click
rtbTekst.Redo()
End Sub
Private Sub mnuEditIsijeci_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuEditIsijeci.Click
rtbTekst.Cut()
End Sub
43
VB - Rijeeni primjeri
Private Sub mnuEditKopiraj_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuEditKopiraj.Click
rtbTekst.Copy()
End Sub
Private Sub mnuEditZalijepi_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuEditZalijepi.Click
rtbTekst.Paste()
End Sub
Private Sub cmnCut_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmnCut.Click
rtbTekst.Cut()
End Sub
Private Sub cmnCopy_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmnCopy.Click
rtbTekst.Copy()
End Sub
Private Sub cmnPaste_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles cmnPaste.Click
rtbTekst.Paste()
End Sub
Private Sub mnuFormatFont_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuFormatFont.Click
Call PostaviFont()
End Sub
Private Sub mnuFormatBullets_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles mnuFormatBullets.Click
If rtbTekst.SelectionBullet = False Then
rtbTekst.SelectionBullet = True
Else
rtbTekst.SelectionBullet = False
End If
End Sub
Private Sub btnNovi_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnNovi.Click
Call Novi()
End Sub
Private Sub btnOtvori_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnOtvori.Click
Call OtvoriDok()
End Sub
Private Sub btnSnimi_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnSnimi.Click
Call SnimiDok()
End Sub
Private Sub TekstEditor_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
rtbTekst.SelectionFont = New Font("Times New Roman", 12, _
FontStyle.Italic)
rtbTekst.Modified = False
sNaziv = ""
End Sub
44
VB - Rijeeni primjeri
Private Sub rtbTekst_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles rtbTekst.TextChanged
rtbTekst.Modified = True
End Sub
Private Sub dlgFont_Apply(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles dlgFont.Apply
rtbTekst.SelectionFont = dlgFont.Font
End Sub
Private Sub TekstEditor_FormClosing(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles MyBase.FormClosing
Call AkoNijeSacuvan()
End Sub
End Class
45