You are on page 1of 47

PANEVROPSKI UNIVERZITET APEIRON

FAKULTET INFORMACIONIH TEHNOLOGIJA

Studij uenja na daljinu


Smjer Inenjering informacionih tehnologija

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

Banja Luka, mart 2010.

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

Drago Tomi, Apeiron BL

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

2. Faktori broja, savreni brojevi


Za sve prirodne brojeve iz zadatog opsega pronai sve djelioce (faktore), ako ih nema
konstatovati da je to prost broj i posebno izdvojiti savrene brojeve (svi brojevi koji su
jednaki zbiru svojih faktora). Ograniiti unos na maksimalno 50 000.
Rjeenje:

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:

MsgBox("Greka br. " & Err.Number & vbCrLf & _


"Opis: " & Err.Description)
End Sub
Private Sub btnIzlaz_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnIzlaz.Click
Me.Close()
End Sub
Private Sub txtOd_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtOd.KeyPress
If Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) Then
e.KeyChar = ""
End If
End Sub
Private Sub txtDo_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtDo.KeyPress
If Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) Then
e.KeyChar = ""
End If
End Sub
End Class

3. Operacije sa velikim prirodnim brojevima


Napisati program koji radi osnovne aritmetike operacije sabiranje, oduzimanje i mnoenje
velikih prirodnih brojeva za koje ne postoji implementacija u programskom jeziku.
Rjeenje:

Drago Tomi, Apeiron BL

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.

Runo sabiranje prirodnih brojeva

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

'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)
'popuni nizove
For i = 0 To duz - 1
A(i) = CByte(Mid(sA, i + 1, 1))
B(i) = CByte(Mid(sB, i + 1, 1))
Next
sZbir = ""
Drago Tomi, Apeiron BL

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.

Runo oduzimanje prirodnih brojeva

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

'Ako je razlika negativna


'dodaj ispred znak "minus"

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.

Runo mnoenje prirodnih brojeva

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

A-> 2589147 * 387 <-B


----------0000000000
|
0000000000
| <-C
0000000000
|
----------0000000000
<-Rez

2589147 * 387
-----------0018124029
0207131760
+ 0776744100
-----------1001999889

duzA = Len(sA)
duzB = Len(sB)
ReDim
ReDim
ReDim
'
'
ReDim

A(duzA)
B(duzB)
C(duzB, duzA + duzB)

'Broj redova je duzina broja A


Broj kolona je zbir duzina
broja A i B zbog smicanja
'

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
'

'Svaki sledei red se uvlai


za jedno mjesto

'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

'Saberi po kolonama matrice


pamtim = 0
For j = duzA + duzB - 1 To 0 Step -1
pom = 0
For i = 0 To duzB - 1
pom = pom + C(i, j)
Next
pom = pom + pamtim
If pom > 9 Then
pisem = pom Mod 10
pamtim = pom \ 10
Else
pisem = pom
pamtim = 0
End If
Rez(j) = pisem
Next
'Vrati rezultat u obliku stringa
sRezultat = ""
For i = 0 To duzA + duzB - 1
sRezultat = sRezultat & CStr(Rez(i))
Next
UkloniVodeceNule(sRezultat)
Return sRezultat
End Function

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:

Drago Tomi, Apeiron BL

10

VB - Rijeeni primjeri

Public Class frmDijeljenjeN


Private Sub btnDijeli_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnDijeli.Click
Dim
Dim
Dim
Dim
Dim
Dim
Dim
Dim

nBrDecimala As UShort
nDijeljenik As UInteger
nDjelilac As UInteger
i As UShort
nKol As UInteger
nOst As UInteger
sKolicnik As String
nPomDijeljenik As UInteger

'Provjeri da li su unijete vrijednosti


If Len(txtDijeljenik.Text) = 0 Then
MsgBox("Unesite dijeljenik!")
txtDijeljenik.Focus()
txtDijeljenik.SelectAll()
Exit Sub
End If
If Len(txtDjelilac.Text) = 0 Then
MsgBox("Unesite djelilac!")
txtDjelilac.Focus()
txtDjelilac.SelectAll()
Exit Sub
End If
If Len(txtBrDecimala.Text) = 0 Then
MsgBox("Unesite broj decimala!")
txtBrDecimala.Focus()
txtBrDecimala.SelectAll()
Exit Sub
End If
'Broj decimala ne smije biti vei od 1000
If Val(txtBrDecimala.Text) > 1000 Then
MsgBox("Broj decimala mora biti manji ili jednak 1000")
txtBrDecimala.Focus()
txtBrDecimala.SelectAll()
Exit Sub
End If
On Error GoTo errTrap
nDjelilac = CUInt(txtDjelilac.Text)
Drago Tomi, Apeiron BL

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:

MsgBox("Greka br. " & Err.Number & vbCrLf & _


"Opis: " & Err.Description)
End Sub
'Funkcija JeCifra
'Argumenti: sZnak - karakter koji korisnik unese sa tastature
'Namjena: Ako korisnik ne unese cifru niti kontrolni znak
'
funkcija vraa prazan string.
Private Function JeCifra(ByVal sZnak As Char) As Char
If Not Char.IsDigit(sZnak) And Not Char.IsControl(sZnak) Then
sZnak = ""
End If
JeCifra = sZnak
End Function
Private Sub txtDijeljenik_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtDijeljenik.KeyPress
e.KeyChar = JeCifra(e.KeyChar)
End Sub
Private Sub txtDjelilac_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtDjelilac.KeyPress
e.KeyChar = JeCifra(e.KeyChar)
End Sub
Private Sub txtBrDecimala_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtBrDecimala.KeyPress
e.KeyChar = JeCifra(e.KeyChar)
End Sub

End Class

5. Korjenovanje (N decimala)
Napisati program koji rauna kvadratni korijen pozitivnog realnog broja na proizvoljan broj
decimalnih mjesta.

Drago Tomi, Apeiron BL

12

VB - Rijeeni primjeri

Rjeenje:

Izgled korisnikog interfejsa

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

Procedura Korjenuj() provjerava validnost unijetih vrijednosti i poziva funkciju


KvKorijen(<potkorjena veliina>, <broj decimala)). Kreirao sam posebnu proceduru jer je
trebam pozivati sa dva mjesta: klikom na kontrole picKorijen i lblBroj.
Private Sub Korjenuj()
If Not IsNumeric(txtBroj.Text) Or Not IsNumeric(txtBrDec.Text) Then
MsgBox("Neispravan unos!")
txtBroj.Focus()
Exit Sub
End If
If Val(txtBrDec.Text) > 1000 Then
MsgBox("Broj decimala mora biti manji od 1000.")
txtBrDec.Focus()
Exit Sub
End If
Me.Cursor = Cursors.WaitCursor
lblKorijen.Text = KvKorijen(CDbl(txtBroj.Text), _
CUShort(txtBrDec.Text))
Me.Cursor = Cursors.Default
End Sub
Drago Tomi, Apeiron BL

13

VB - Rijeeni primjeri

Funkcija KvKorijen koristi funkcije OduzmiStr i MnoziStr koje su ranije opisane u


zadacima 3.2 i 3.3 respektivno.
Private Function KvKorijen(ByVal dblBroj As Double, _
ByVal nBrDecimala As UShort) As String
Dim sGrupe() As String
Dim brCijeli As Byte
Dim sBroj As String
Dim i As Integer
Dim
Dim
Dim
Dim
Dim
Dim
Dim

dvojka As String
cifra As Integer
cifra1 As Integer
dupli As String
korijen As String
razlika As String
cilj As String

Dim sTemp1 As String


Dim sTemp2 As String
'Ako je broj decimalni zamijeni decimalnu taku decimalnim zarezom
sBroj = Replace(CStr(dblBroj), ".", ",")
'Ako je unesen decimalni simbol...
If InStr(sBroj, ",") > 0 Then
'Ako je broj cifara u cjelobrojnom dijelu neparan
'dodaj s lijeve strane jo jednu nulu.
'
2,561 -> 02,561
If Len(Mid(sBroj, 1, InStr(sBroj, ",") - 1)) Mod 2 = 1 Then
sBroj = "0" & sBroj
End If
'Ako je neparan broj cifara poslije decimalnog simbola
'dodaj jo jednu nulu
'
0,231 -> 0,2310
If Len(Mid(sBroj, InStr(sBroj, ",") + 1)) Mod 2 = 1 Then
sBroj = sBroj & "0"
End If
'Broj
'mora
'eli
'Npr.
'
For i

parova cifara iza decimalnog simbola


biti jednak broju decimala na koje se
dobiti rezultat korjenovanja.
ako korjenujemo broj 14,26 na 3 decimale onda:
14,26 --> 14,260000
= 1 To nBrDecimala - _
(Len(Mid(sBroj, InStr(sBroj, ",") + 1)) \ 2)
sBroj = sBroj & "00"

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

Drago Tomi, Apeiron BL

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

Drago Tomi, Apeiron BL

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:

1. TextBox (txtKol) broj kolona matrice.


2. TextBox (txtRed) broj redova matrice.
3. Button (btnFormiraj) poziva proceduru dogaaja klik komandnog dugmeta
(formira matricu i ispisuje je).
4. RichTextBox (rtxtSpirala) prikazuje matricu spiralno ispisanih brojeva.
Public Class frmSpirala
Private Sub btnFormiraj_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnFormiraj.Click
Dim red, kol, i, j, k, _
DesnoLimit, LijevoLimit, _
DoljeLimit, GoreLimit, _
max, prostor As Integer
Dim A(,) As String
Drago Tomi, Apeiron BL

19

VB - Rijeeni primjeri

On Error GoTo errTrap


red = CInt(txtRed.Text)
kol = CInt(txtKol.Text)
max = red * kol
If red < 2 Or red > 100 Or kol < 2 Or kol > 100 Then
MsgBox("Podatak izvan dozvoljenih granica!")
Exit Sub
End If
prostor = Len(max.ToString) + 1
ReDim A(red, kol)
'postavi prvobitna ogranienja
DesnoLimit = kol - 1
LijevoLimit = 0
GoreLimit = 0
DoljeLimit = red - 1
k = 1
While k <= max
'kretanje nadesno
For j = LijevoLimit To DesnoLimit
A(GoreLimit, j) = Clan(k.ToString, prostor)
k += 1
Next
If k > max Then GoTo izlaz
GoreLimit += 1
'kretanje nadolje
For i = GoreLimit To DoljeLimit
A(i, DesnoLimit) = Clan(k.ToString, prostor)
k += 1
Next
If k > max Then GoTo izlaz
DesnoLimit -= 1
'kretanje nalijevo
For j = DesnoLimit To LijevoLimit Step -1
A(DoljeLimit, j) = Clan(k.ToString, prostor)
k += 1
Next
If k > max Then GoTo izlaz
DoljeLimit -= 1
'kretanje nagore
For i = DoljeLimit To GoreLimit Step -1
A(i, LijevoLimit) = Clan(k.ToString, prostor)
k += 1
Next
If k > max Then GoTo izlaz
LijevoLimit += 1
End While
izlaz:

'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

Drago Tomi, Apeiron BL

20

VB - Rijeeni primjeri
rtxtSpirala.AppendText(vbCrLf)
'rtxtSpirala.Text = rtxtSpirala.Text & vbCrLf

Next

Exit Sub
errTrap:

MsgBox("Greka br. " & Err.Number & vbCrLf & _


"Opis: " & Err.Description)
End Sub
Private Function Clan(ByVal broj As String, _
ByVal BrojMjesta As Integer) As String
Dim i As Integer
For i = 1 To BrojMjesta - Len(broj)
broj = " " & broj
Next
Return broj
End Function
Private Sub txtKol_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtKol.KeyPress
If Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) Then
e.KeyChar = ""
End If
End Sub
Private Sub txtRed_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles txtRed.KeyPress
If Not IsNumeric(e.KeyChar) And Not Char.IsControl(e.KeyChar) Then
e.KeyChar = ""
End If
End Sub

End Class

8. Grafik i osobine funkcija


Za date funkcije prikazati osnovne osobine (definiciono podruje, podruje vrijednosti, prvi
izvod i integral) te za svaku iscrtati grafik. Osobine funkcije proitati iz eksternog fajla, a
grafik nacrtati za relevantan opseg vrijednosti.
Rjeenje:
Na prikazanom
elementi su sledei:

interfejsu

oznaeni

1. Kontrola ListBox sa datom listom


funkcija.
2. Kontrola PictureBox u kojoj se
iscrtava grafik odabrane funkcije.
3. Kontrola RichTextBox u koju se
uitavaju osobine odabrane funkc.
Iz eksternog rtf fajla.
Ovim primjerom sam elio predstaviti rad
sa eksternim fajlovima kao i neke mogunosti
PictureBox
kontrole,
odnosno
kolekcije
Graphics.
Drago Tomi, Apeiron BL

21

VB - Rijeeni primjeri

Slijedi kd rjeenja:

Public Class frmGrafFunkcije


Dim xc As Single
Dim yc As Single
Dim G As Graphics
Dim Funkcija As String
Private Sub btnCrtaj_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnCrtaj.Click
Dim
Dim
Dim
Dim

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

Drago Tomi, Apeiron BL

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

Case "y = e^x"


rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\ex.rtf")
Case "y = ln(x)"
rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\lnx.rtf")
Case "y = sin(x)"
rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\sinx.rtf")
Case "y = cos(x)"
rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\cosx.rtf")
Case "y = tg(x)"
rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\tgx.rtf")
Case "y = ctg(x)"
rtbFunkcija.LoadFile(My.Application.Info.DirectoryPath & _
"\Dokumenti\ctgx.rtf")
End Select
End Sub
End Class

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:

Gaus-Dordanova eliminacija sastoji se u primjeni elementarnih operacija mnoenja i


sabiranja jednaina sa ciljem da se, osim lanova koji lee na glavnoj dijagonali matrice
Drago Tomi, Apeiron BL

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

Pomnoiti prvu jednainu sa

2
2 i dodati drugoj
1

Pomnoiti prvu jednainu sa

(3)
3 i dodati treoj
1

Pomnoiti drugu jednainu sa

2 1

i dodati prvoj
4 2

Pomnoiti drugu jednainu sa

8
2 i dodati treoj
4

Pomnoiti treu jednainu sa

1
i dodati prvoj
8

Pomnoiti treu jednainu sa

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.

Public Class frmSistemJednacina


Dim A(100, 100) As Double
Dim B(100) As Double
Drago Tomi, Apeiron BL

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)

'vrijednost kojom se mnoi

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

Drago Tomi, Apeiron BL

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.

Efikasnost razliitih algoritama sortiranja

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.

Drago Tomi, Apeiron BL

28

VB - Rijeeni primjeri

4. ListBox kontrola (lstMetoda): Prikazuje popis datih metoda za sortiranje.


Sortiranje e se vriti po izabranoj metodi.
5. Button kontrola (btnSort): Poziva izabranu proceduru za sortiranje.
6. Button kontrola (btnReset): Brie unijete vrijednosti iz kontrola 1, 3, 7 i 8.
7. ListView kontrola (lvStatistika): Prikazuje statistike pokazatelje izabrane
metode sortiranja broj poreenja i broj zamjena.
8. ListBox kontrola (lstSort): Prikazuje sortirani niz

Slijedi kod rjeenja:


Public Class frmSort
Private Sub btnUpis_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles btnUpis.Click
Upis()
End Sub
Private Sub Upis()
Dim i As Integer
If Not IsNumeric(mskBr.Text) Or Val(mskBr.Text) < 1 Then
MsgBox("Unsesite vrijednost od 1 do 99999")
mskBr.Focus()
Exit Sub
End If
nBrojClanova = CUInt(mskBr.Text)
ReDim A(nBrojClanova)
ReDim B(nBrojClanova)
ReDim Pom(nBrojClanova)
lstNesort.Items.Clear()
'Generie sluajne brojeve
Randomize()
Drago Tomi, Apeiron BL

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

Select Case lstMetoda.Text


'Sve procedure koje se nadalje pozivaju se nalaze u
'posebnom modulu Sortiranje.vb. Svaka procedura na svoj
'nain sortira generisani niz i izraunava globalne
'varijable BrojPoredjenja i BrojZamjena koje su deklarisane
'unutar modula Sortiranje.vb
Case "Bubble sort"
BubbleSort(B, nBrojClanova)
Case "Selection sort"
SelectSort(B, nBrojClanova)
Case "Insertion sort"
InsertSort(B, nBrojClanova)
Case "Quick sort"
QSort(B, 0, nBrojClanova - 1)
Case "Shell sort"
ShellSort(B, nBrojClanova)
Case "Merge sort"
MergeSort(B, Pom, 0, nBrojClanova - 1)
End Select
'Upisati statistike pokazatelje
Dim LI As New ListViewItem
LI.Text = lstMetoda.Text
LI.SubItems.Add(BrojPoredjenja)
LI.SubItems.Add(BrojZamjena)
lvStatistika.Items.Add(LI)
'Ukloniti stavka iz kontrole ListView (lstSort)
'jer moda je bila popunjena
lstSort.Items.Clear()
'Upisati nove stavke - sortiran niz
For i = 0 To nBrojClanova - 1
lstSort.Items.Add(B(i))
Next
End Sub
Drago Tomi, Apeiron BL

30

VB - Rijeeni primjeri

Private Sub frmSort_Load(ByVal sender As System.Object, _


ByVal e As System.EventArgs) Handles MyBase.Load
'popuni listbox metodama sortiranja
With lstMetoda.Items
.Add("Bubble sort")
.Add("Selection sort")
.Add("Insertion sort")
.Add("Quick sort")
.Add("Shell sort")
.Add("Merge sort")
End With
lstMetoda.Text = "Bubble sort" 'default metoda
End Sub
Private Sub btnReset_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnReset.Click
mskBr.Text = ""
lstNesort.Items.Clear()
lstSort.Items.Clear()
lvStatistika.Items.Clear()
mskBr.Focus()
End Sub
Private Sub lstMetoda_KeyUp(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles lstMetoda.KeyUp
'ako korisnik pritisne Enter
If e.KeyCode = Keys.Enter Then
Sortiraj()
End If
End Sub
Private Sub mskBr_KeyUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles mskBr.KeyUp
'ako korisnik pritisne Enter
If e.KeyCode = Keys.Enter Then
Upis()
End If
End Sub
End Class

10.1. Implementacija algoritama sortiranja


Dati su kratki opisi i programski kod datih metoda sortiranja. Veina ovih procedura
koristi (poziva) proceduru za zamjenu mjesta koja slijedi:
Public Sub Zamijeni(ByRef prvi As Integer, ByRef drugi As Integer)
Dim pomocni As Integer = prvi
prvi = drugi
drugi = pomocni
End Sub

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

2. Zamijeni taj element sa elementom na prvoj poziciji,


3. Ponavljaj ove korake za ostatak niza (poinjui od drugog lana i svaki sledei
put od sledeeg)
Efektivno, niz je podijeljen u dva dijela, podniz koji je ve sortiran na lijevoj strani i
drugi podniz koji jo nije sortiran na desnoj strani.
U implementaciji sam dio koda za pronalaenje najmanjeg lana preostalog dijela niza
smjestio u posebnu funkciju koja vraa indeks naenog lana.
Public Sub SelectSort(ByRef Niz() As Integer, ByVal brClanova As Integer)
Dim i As Integer
Dim j As Integer
For i = 0 To brClanova - 2
j = NadjiMin(Niz, i, brClanova)
Zamijeni(Niz(i), Niz(j))
BrojZamjena += 1
Next
End Sub
Public Function NadjiMin(ByVal Niz() As Integer, _
ByVal IndexOd As Integer, _
ByVal brClanova As Integer) As Integer
Dim i As Integer
Dim min As Integer
Dim IndexMin As Integer
min = Niz(IndexOd)
IndexMin = IndexOd
For i = IndexOd + 1 To brClanova - 1
If Niz(i) < min Then
min = Niz(i)
IndexMin = i
End If
BrojPoredjenja += 1
Next
Return IndexMin
End Function

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

Drago Tomi, Apeiron BL

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,

Niz() As Integer, ByRef Temp() As Integer, _


lijevo As Integer, ByVal sredina As Integer, _
desno As Integer)
brojElem, tmpPoz As Integer

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

Napisati program koji e zadati iznos u KM ispisati slovima. Ograniiti se na maksimalno


15 cifara u cjelobrojnom dijelu (999 999 999 999 999.99 KM devetsto devedeset devet
biliona devetsto devedeset devet milijardi devetsto devedeset devet miliona devetsto
devedeset devet hiljada devetsto devedeset devet KM i 99/100). Takoe obratiti panju na
padee, npr. 7 000 sedam hiljada, 2 000 dvije hiljade (nepravilno je dva hiljada).
Rjeenje:

1. TextBox kontrola (txtIznos). Napisao sam validaciju unosa. Mogue je unijeti


broj (ne i slovo) i maksimalno 15-cifren broj. Validacija se radi nakon unosa,
prije poziva funkcije IznosSlovima.
2. Label kontrola (lblSlovima) prikazuje iznos slovima.

Drago Tomi, Apeiron BL

36

VB - Rijeeni primjeri

3. Button kontrola (btnSlovima). Reaguje na dogaaj Click pri emu provjerava


unijeti iznos i ako je valjan poziva funkciju IznosSlovima.
Public Class frmSlovima
Private Sub btnSlovima_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnSlovima.Click
'ako nije broj
If Not IsNumeric(txtIznos.Text) Then
MsgBox("Niste unijeli valjan iznos!")
txtIznos.Focus()
txtIznos.SelectAll()
Exit Sub
End If
lblSlovima.Text = IznosSlovima(txtIznos.Text)
If lblSlovima.Text = "" Then
txtIznos.Focus()
txtIznos.SelectAll()
End If
End Sub
Public Function IznosSlovima(ByVal sIznos As String) As String
Dim sSlovima As String = ""
Dim brojTrojki As Byte
Dim iTrojke As Byte
Dim sTrojka As String

'grupe od po tri cifre


'pozicija trojke
'tri cifre iz grupe kao string

Dim sCifraJedinica As String


Dim sCifraDesetica As String
Dim sCifraStotica As String
'ako je argument prazan string...
If sIznos = "" Then
Return ""
End If
'decimalnu taku zamijeni zarezom
sIznos = Replace(sIznos, ".", ",")
'Ako nema decimalnog znaka (cijeli broj),
'dodaj ga i dodaj dvije nule na kraju...
If InStr(sIznos, ",") = 0 Then
sIznos = sIznos & ",00"
End If
'ako nema vodee nule - dodaj je
If Mid(sIznos, 1, 1) = "," Then
txtIznos.Text = "0" & txtIznos.Text
End If
'Ako ima manje od 2 decimalna mjesta
'popuni nulama
Select Case Len(Mid(sIznos, InStr(sIznos, ",") + 1))
Case 0
sIznos = sIznos & "00"
Case 1
sIznos = sIznos & "0"
End Select
Drago Tomi, Apeiron BL

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

= sSlovima & "trideset "


= sSlovima & "etrdeset "
= sSlovima & "pedeset "
= sSlovima & "ezdeset "
= sSlovima & "sedamdeset "
= sSlovima & "osamdeset "
= sSlovima & "devedeset "

If sCifraDesetica = "1" Then


Select Case sCifraJedinica
Case "0"
sSlovima = sSlovima
Case "1"
sSlovima = sSlovima
Case "2"
sSlovima = sSlovima
Case "3"
sSlovima = sSlovima
Case "4"
sSlovima = sSlovima
Case "5"
sSlovima = sSlovima
Case "6"
sSlovima = sSlovima
Case "7"
sSlovima = sSlovima
Case "8"
sSlovima = sSlovima
Case "9"
sSlovima = sSlovima
End Select
'Dodaj vrijednost grupe
Select Case iTrojke
Case 5
sSlovima = sSlovima
Case 4
sSlovima = sSlovima
Case 3
sSlovima = sSlovima
Case 2
sSlovima = sSlovima
End Select
End If

& "deset "


& "jedanaest "
& "dvanaest "
& "trinaest "
& "etrnaest "
& "petnaest "
& "esnaest "
& "sedamnaest "
& "osamnaest "
& "devetnaest "

& "biliona "


& "milijardi "
& "miliona "
& "hiljada "

If sCifraDesetica <> "1" Then


Select Case sCifraJedinica
Case "1"
Select Case iTrojke
Case 1, 2, 4
sSlovima = sSlovima & "jedna "
Case 3, 5
sSlovima = sSlovima & "jedan "
End Select
Case "2"
Select Case iTrojke
Drago Tomi, Apeiron BL

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

Drago Tomi, Apeiron BL

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:

Kreiranje novog i otvaranje postojeeg dokumenta u rtf formatu,

Snimanje, dosnimavanje i snimanje dokumenta pod drugim imenom.

Kopiranje, isijecanje i lijepljenje sadraja clipboard-a (iz menija i iz kontekst menija).

Definisanje atributa fonta nad izabranim dijelom teksta,

Prikaz liste (bullets).

Rjeenje:

Sadaj meni linija:

Dokument:

, Ureivanje:

, Format:

Public Class frmTekstEditor


Dim sNaziv As String
Const FORMA As String = "Tekst Editor: "
Private Sub Novi()
If rtbTekst.Modified Then
Drago Tomi, Apeiron BL

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

Drago Tomi, Apeiron BL

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

Drago Tomi, Apeiron BL

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

Drago Tomi, Apeiron BL

45

You might also like