visual basic 2008 seminar ski

57
PANEVROPSKI UNIVERZITET APEIRON FAKULTET INFORMACIONIH TEHNOLOGIJA Studij učenja na daljinu Smjer „Inženjering informacionih tehnologija” Predmet VIŠI PROGRAMSKI JEZICI I RAD ALATI – PROGRAMIRANJE U VISUAL BASIC-u „RIJEŠENI PRIMJERI” (seminarski rad) Predmetni nastavnik Prof. dr. Zoran Avramović

Upload: dtomic

Post on 08-Apr-2015

1.339 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Visual Basic 2008 Seminar Ski

PANEVROPSKI UNIVERZITET APEIRONFAKULTET INFORMACIONIH TEHNOLOGIJA

Studij učenja na daljinuSmjer „Inženjering informacionih tehnologija”

PredmetVIŠI PROGRAMSKI JEZICI I RAD ALATI –

PROGRAMIRANJE U VISUAL BASIC-u

„RIJEŠENI PRIMJERI”(seminarski rad)

Predmetni nastavnikProf. dr. Zoran Avramović

StudentDrago Tomić

Index br. 30-09/VIT

Banja Luka, mart 2010.

Page 2: Visual Basic 2008 Seminar Ski

Sadržaj

1. Glavna forma.........................................................................................................................12. Faktori broja, savršeni brojevi...............................................................................................33. Operacije sa velikim prirodnim brojevima............................................................................4

3.1. Ručno sabiranje prirodnih brojeva.................................................................................63.2. Ručno oduzimanje prirodnih brojeva............................................................................73.3. Ručno množenje prirodnih brojeva................................................................................8

4. Dijeljenje (N decimala)........................................................................................................105. Korjenovanje (N decimala)..................................................................................................126. Fibonačijevi brojevi.............................................................................................................177. Spirala..................................................................................................................................198. Grafik i osobine funkcija.....................................................................................................219. Sistem jednačina..................................................................................................................2410. Efikasnost različitih algoritama sortiranja.......................................................................28

10.1. Implementacija algoritama sortiranja......................................................................3110.1.1. Bubble Sort..........................................................................................................3110.1.2. Insertion Sort.......................................................................................................3210.1.3. Selection Sort.......................................................................................................3210.1.4. Shell Sort.............................................................................................................3310.1.5. Quick Sort............................................................................................................3410.1.6. Merge Sort...........................................................................................................35

11. Iznos slovima...................................................................................................................3612. Tekst editor......................................................................................................................41

Page 3: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

1. Glavna forma

Napraviti interfejs – glavnu (roditeljsku) formu iz koje će biti moguće pozivati forme potomke koji sadrže zadatke navedene u sadržaju. Roditeljska forma treba da sadrži liniju sa alatkama (komandna dugmad koja pozivaju ostale forme).

Rješenje:

Objašnjenja:

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 podešeno na ImageAndText, a svojstvo ImageAlign je podešeno na MiddleLeft

2. MDI forma sa ubačenom 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 1

Page 4: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 SubEnd Class

Drago Tomić, Apeiron BL 2

Page 5: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

2. Faktori broja, savršeni brojevi

Za sve prirodne brojeve iz zadatog opsega pronaći sve djelioce (faktore), ako ih nema konstatovati da je to prost broj i posebno izdvojiti savršene brojeve (svi brojevi koji su jednaki zbiru svojih faktora). Ograničiti unos na maksimalno 50 000.

Rješenje:

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 pronađene savršene brojeve iz zadatog opsega.

5. Button (btnRacunaj) – izvršava kôd događaja Click

6. Button (btnIzlaz) – završava 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("Greška! Od broja > Do broja.") End If

lstFaktori.Items.Clear() lstSavrseni.Items.Clear() For broj = prviBr To zadnjiBr

Drago Tomić, Apeiron BL 3

Page 6: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 SuberrTrap: MsgBox("Greška 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 aritmetičke operacije sabiranje, oduzimanje i množenje velikih prirodnih brojeva za koje ne postoji implementacija u programskom jeziku.

Rješenje:

Drago Tomić, Apeiron BL 4

Page 7: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 izvršava se događaj Click dugmeta btnRacunaj

8. Button (btnReset) – uklanja sadržaj TextBox kontrola.

9. Button (btnIzlaz) – zatvara prozor. Svojstvu CancelButton forme dodijeljena vrijednost btnIzlaz tako da kada korisnik pritisne dugme Esc izvršava se događaj 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 5

Page 8: Visual Basic 2008 Seminar Ski

VB - Riješeni 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. Ručno sabiranje prirodnih brojeva

Napisati funkciju koja za argumente ima dva velika prirodna broja koji su predstavljeni kao string i sabira ih.

Rješenje:

Funkcija SaberiStr sabira dva velika prirodna broja po principu ručnog sabiranja. Funkcija koristi dodatnu proceduru DodajVodeceNule čiji je kod dat u sledećem zadatku.

Public Function SaberiStr(ByVal sA As String, _ ByVal sB As String) As String 'funkcija sabira dva velika prirodna broja pomoću stringa 'po metodi ručnog sabiranja Dim A() As Short 'Cifre prvog sabirka Dim B() As Short 'Cifre drugog sabirka Dim i As Integer 'Brojač Dim duz As Integer 'Broj cifara većeg broja Dim pisem As Short ' Dim pamtim As Short ' Dim sZbir As String 'Zbir dva velika broja

'Vrijednost varijable duz je broj cifara većeg broja duz = IIf(Len(sA) > Len(sB), Len(sA), Len(sB))

ReDim A(duz) ReDim B(duz)

'Ako manji broj ima manje cifara dopiši 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 6

Page 9: Visual Basic 2008 Seminar Ski

VB - Riješeni 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. Ručno oduzimanje prirodnih brojeva

Napisati funkciju koja za argumente ima dva velika prirodna broja koji su predstavljeni kao string i oduzima prvi od drugog.

Rješenje:

Funkcija OduzmiStr oduzima prvi broj od drugog po principu ručnog oduzimanja. Funkcija koristi dvije pomoćne procedure DodajVodeceNule i UkloniVodeceNule

Public Function OduzmiStr(ByVal sA As String, ByVal sB As String) As String 'funkcija oduzima dva velika cijela broja pomoću stringa 'po metodi ručnog oduzimanja Dim A() As Short 'Cifre umanjenika Dim B() As Short 'Cifre umanjioca Dim i As Integer 'Brojač Dim duz As Integer 'Broj cifara većeg broja Dim pisem As Short ' Dim pamtim As Short ' Dim bNegativan As Boolean 'Da li je umanjilac veći od umanjenika? Dim sRazlika As String 'Razlika dva velika broja

'Vrijednost varijable duz je broj cifara većeg broja duz = IIf(Len(sA) > Len(sB), Len(sA), Len(sB))

ReDim A(duz) ReDim B(duz)

'Ako manji broj ima manje cifara dopiši 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 7

Page 10: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 riječima 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 'Ako je razlika negativna sRazlika = "-" & sRazlika 'dodaj ispred znak "minus" End If

Return sRazlika

End Function

'Procedura: UkloniVodeceNule'Argumenti: s (referenca na string)'Opis: Iz stringa s uklanja sve nule sa lijeve stranePublic Sub UkloniVodeceNule(ByRef s As String) While Len(s) > 1 And Mid(s, 1, 1) = "0" s = Mid(s, 2) End WhileEnd Sub

'Procedura: DodajVodeceNule'Argumenti: sA string, sB string'Opis: Poredi dva stringa i onome kraćem dodaje s lijeve strane' potreban broj nula da bi dobili dva stringa iste dužinePublic 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 IfEnd Sub

3.3. Ručno množenje prirodnih brojeva

Napisati funkciju koja množi dva prirodna broja po principu ručnog množenja (pogodno za množenje velikih brojeva)

Drago Tomić, Apeiron BL 8

Page 11: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

Rješenje:

Funkcija MnoziStr množi dva broja koja su predstavljena kao stringovi kao što se ručno množi. 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 umnožaka 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 2589147 * 387 ' ----------- ------------ ' 0000000000 | 0018124029 ' 0000000000 | <-C 0207131760 ' 0000000000 | + 0776744100 ' ----------- ------------ ' 0000000000 <-Rez 1001999889

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

ReDim A(duzA) ReDim B(duzB) ReDim C(duzB, duzA + duzB) 'Broj redova je duzina broja A ' Broj kolona je zbir duzina ' broja A i B zbog smicanja ReDim 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 sledeći red se uvlači ' za jedno mjesto

'Ručno množenje For j = duzB - 1 To 0 Step -1 pamtim = 0 For i = (duzA - 1) To 0 Step -1

Drago Tomić, Apeiron BL 9

Page 12: Visual Basic 2008 Seminar Ski

VB - Riješeni 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. Količnik ima proizvoljno zadat broj decimalnih mjesta koji je manji ili jednak 1000.

Rješenje:

Drago Tomić, Apeiron BL 10

Page 13: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

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

Dim nBrDecimala As UShort Dim nDijeljenik As UInteger Dim nDjelilac As UInteger Dim i As UShort Dim nKol As UInteger Dim nOst As UInteger Dim sKolicnik As String Dim 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 veći 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

Page 14: Visual Basic 2008 Seminar Ski

VB - Riješeni 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("Greška 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 vraća 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 računa kvadratni korijen pozitivnog realnog broja na proizvoljan broj decimalnih mjesta.

Drago Tomić, Apeiron BL 12

Page 15: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

Rješenje:

Izgled korisničkog interfejsa

Objašnjenje:

1. Linija dobijena pomoću PictureBox kontrole, tako što su podešena svojstva Width na širinu forme, Height na 1 piksel i BackColor na Black.

2. ToolTip kontrola čiji sadržaj se dinamički mijenja kako se mijenja potkorjena veličina i broj decimala.

3. PictureBox kontrola. U MSPaint programu sam nacrtao izgled simbola za korijen, uvezao sliku, koja se isto dinamički proširi da natkrije potkorjenu veličinu.

4. Labela čiji sadržaj se dinamički mijenja kako se mijenja vrijednost u kontroli txtBroj.

5. Labela lblKorijen koja prihvata rezultat korjenovanja.

Slijedi programski kod rješenja:

Public Class frmKorijen Dim sToolTip As String 'promjenljiva će se dinamički mijenjati ' kako se budu mijenjale vrijednosti ' potkorjene veličine i broja decimala

Procedura Korjenuj() provjerava validnost unijetih vrijednosti i poziva funkciju KvKorijen(<potkorjena veličina>, <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

Page 16: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 dvojka As String Dim cifra As Integer Dim cifra1 As Integer Dim dupli As String Dim korijen As String Dim razlika As String Dim cilj As String

Dim sTemp1 As String Dim sTemp2 As String

'Ako je broj decimalni zamijeni decimalnu tačku 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 parova cifara iza decimalnog simbola 'mora biti jednak broju decimala na koje se 'želi dobiti rezultat korjenovanja. 'Npr. ako korjenujemo broj 14,26 na 3 decimale onda: ' 14,26 --> 14,260000 For i = 1 To nBrDecimala - _ (Len(Mid(sBroj, InStr(sBroj, ",") + 1)) \ 2) sBroj = sBroj & "00" Next Else '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"

Drago Tomić, Apeiron BL 14

Page 17: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 sledeću grupu, dodaj je stringu razlika. cilj = razlika & sGrupe(i) cifra = 0 sTemp2 = cilj 'Pronađi sledeću cifru počevši 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 poređenja StrComp cifra = cifra + 1 '..vrti ukrug dok ne probaš sve cifre 0-9 ili 'dok rezultat ne bude veći od traženog Loop While cifra - 1 <= 9 And StrComp(sTemp1, sTemp2) <= 0 cifra -= 2 'umanji cifru za 2 jer je povećana za 2 ' unutar Do..Loop petlje korijen = korijen & CStr(cifra) 'nađenu cifru dodaj rezultatu.. sTemp1 = MnoziStr(dupli & CStr(cifra), CStr(cifra)) '..pomnoži.. razlika = OduzmiStr(sTemp2, sTemp1) '..nađi razliku.. dupli = MnoziStr("2", korijen) '..korijen uduplaj.. Next '..i kreni ponovo..

Dim rezultat As String 'konačno ubaci zarez u dobijeni rezultat '(izbroj ukupno brCijeli cifara, stavi zarez i dodaj ostatak)

Drago Tomić, Apeiron BL 15

Page 18: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 sadržaj balončića sa tekstom koji se pojavljuje iznad slike korijena sa vrijednošću potkorjene veličine. Pozivom ove procedure u okviru drugih događaja ostvaruje se dinamičnost promjene. Private Sub ToolTip() sToolTip = "Izračunaj 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

Page 19: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

End Class

6. Fibonačijevi brojevi

Zadatak: Ispisati članove Fibonačijevog niza: F(n) = F(n-1) + F(n-2); F(0) = 0, F(1) = 1. Uporediti brzinu generisanja Fibonačijevih brojeva metodom rekurzije i ne-rekurzivno. (Primjer gdje rekurzivna metoda nije toliko efikasna.)

Rješenje:

Izgled interfejsa

Fibonačijev 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.

Pronaći sve Fibonačijeve brojeve do n-tog indexa je lako uz upotrebu rekurzije, međutim to nije najefikasnije rješenje uopšte, jer rekurzijom se mora svaki put iznova računati već izračunate vrijednosti prethodnika. Efikasniji način je ako bismo svakim prolazom zapamtili već izračunate vrijednosti što je prikazano nerekurzivnom procedurom.

Na kraju ispisa Fibonačijevih brojeva ispisuje se i broj rekurzija odnosno broj iteracija kod nerekurzivnog metoda. Ukoliko je došlo do prekoračenja po tipu podataka Ulong na kraju liste se upiše Prekoračenje.

Slijedi kôd rješenja:

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 slučaju greške

n = CByte(txtIndex.Text) If n > 35 Then If MsgBox("Za ovu vrijednost računanje 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

Page 20: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 SuberrTrap: lstFib.Items.Add("Prekoračenje") 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 izračunate č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("Prekoračenje") 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 FunctionerrTrap: MsgBox("Greška 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

Page 21: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 krećući se spiralno u pravcu kazaljke na satu počevši od gornjeg lijevog elementa. Voditi računa da se brojevi međusobno ne preklope. Spirala se kreće od vanjskgo pravougaonika ka unutrašnjem dok se ne ispišu svi brojevi.

Rješenje:

1. TextBox (txtKol) – broj kolona matrice.

2. TextBox (txtRed) – broj redova matrice.

3. Button (btnFormiraj) – poziva proceduru događaja 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

Page 22: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 ograničenja 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 Whileizlaz: '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

Page 23: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

rtxtSpirala.AppendText(vbCrLf) 'rtxtSpirala.Text = rtxtSpirala.Text & vbCrLf Next

Exit SuberrTrap: MsgBox("Greška 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 područje, područje vrijednosti, prvi izvod i integral) te za svaku iscrtati grafik. Osobine funkcije pročitati iz eksternog fajla, a grafik nacrtati za relevantan opseg vrijednosti.

Rješenje:

Na prikazanom interfejsu označeni elementi su sledeći:

1. Kontrola ListBox sa datom listom funkcija.

2. Kontrola PictureBox u kojoj se iscrtava grafik odabrane funkcije.

3. Kontrola RichTextBox u koju se učitavaju osobine odabrane funkc. Iz eksternog rtf fajla.

Ovim primjerom sam želio predstaviti rad sa eksternim fajlovima kao i neke mogućnosti PictureBox kontrole, odnosno kolekcije Graphics.

Drago Tomić, Apeiron BL 21

Page 24: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

Slijedi kôd rješenja: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 x As Single Dim y As Single Dim xSkala As Single Dim 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

Page 25: Visual Basic 2008 Seminar Ski

VB - Riješeni 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

Page 26: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 jednačina

Riješiti sistem n linearnih jednačina sa n nepoznatih metodom Gaus-Džordanove eliminacije. Ograničiti na maksimalno 100 jednačina. Ostaviti mogućnost ručnog unosa koeficijenata i automatskog unosa generisanjem slučajnih brojeva.

Rješenje:

Gaus-Džordanova eliminacija sastoji se u primjeni elementarnih operacija množenja i sabiranja jednačina sa ciljem da se, osim članova koji leže na glavnoj dijagonali matrice

Drago Tomić, Apeiron BL 24

Page 27: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

koeficijenata, svi ostali svedu na nulu. Time se dobijaju tri jednačine, svaka sa po jednom nepoznatom čije je rješenje trivijalno.

Pri unosu koeficijenata jednačina treba paziti da koeficijent uz prvu nepoznatu prve jednačine ne bude nula. U tom slučaju treba permutovati prvu jednačinu sa nekom koja nema nulu na mjestu prvog koeficijenta.

Ovde ću riješiti ručno jedan sistem od 3 jednačine sa 3 nepoznate kako bi se stekao uvid u način rada programa.

Pomnožiti prvu jednačinu sa i dodati drugoj

Pomnožiti prvu jednačinu sa i dodati trećoj

Pomnožiti drugu jednačinu sa i dodati prvoj

Pomnožiti drugu jednačinu sa i dodati trećoj

Pomnožiti treću jednačinu sa i dodati prvoj

Pomnožiti treću jednačinu sa i dodati drugoj

Dakle ako sistem ima rješenje moguće ga je naći u konačnom broju koraka. Da bi se sistem od n jednačina sa n nepoznatih sveo na sistem od n jednačina sa po jednom nepoznatom

potrebno je koraka. Na kraju je potrebno još n trivijalnih operacija: ,

, …, .

U interfejsu sam koristio DataGridView kontrole da prikažem matricu koeficijenata, kao i vektor rješenja. Redovi i kolone DataGridView kontrole se formiraju tek nakon što se zada broj jednačina. Dozvoljeno je programom unijeti najviše 100 jednačina sa 100 nepoznatih mada se to može izmijeniti po potrebi.

Public Class frmSistemJednacina Dim A(100, 100) As Double Dim B(100) As Double

Drago Tomić, Apeiron BL 25

Page 28: Visual Basic 2008 Seminar Ski

VB - Riješeni 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

Page 29: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

End If End Sub

Private Sub PrihvatPodataka() Dim i As Integer Dim j As Integer

' Podatke iz tabele učitaj 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 jednačina učitaj 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- preskoči If i = j Then GoTo skok

s = -A(j, i) / A(i, i) 'vrijednost kojom se množi

For k = 0 To n - 1 'Pomnoži svaki član i-te jednačine sa -Aji/Aii 'te dodaj j-toj jednačini. Time će se k-ti član 'j-te jednačine 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

Page 30: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 različitih algoritama sortiranja

Napisati program za uporednu analizu različitih datih algoritama za sortiranje niza slučajno generisanih prirodnih brojeva. Algoritmi su: Bubble Sort, Selection Sort, Insertion Sort, Quick Sort, Shell Sort, Merge Sort. Pokazatelji za upoređivanje su broj poređenja i broj zamjena mjesta članova niza.

Rješenje

Na nterfejsu (slika niže) su brojevima označene sledeće kontrole:

1. MaskedTextBox kontrola (mskBr): Korisnik treba da upiše broj članova niza. Ograničen je unos na 99999.

2. Button kontrola (btnUpis): Poziva proceduru za generisanje slučajnih brojeva u opsegu 0 do (broj članova +100) i upis tih brojeva u lstNesort ListBox kontrolu.

3. ListBox kontrola (lstNesort): Prikazuje slučajno generisane prirodne brojeve.

Drago Tomić, Apeiron BL 28

Page 31: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

4. ListBox kontrola (lstMetoda): Prikazuje popis datih metoda za sortiranje. Sortiranje će se vršiti po izabranoj metodi.

5. Button kontrola (btnSort): Poziva izabranu proceduru za sortiranje.

6. Button kontrola (btnReset): Briše unijete vrijednosti iz kontrola 1, 3, 7 i 8.

7. ListView kontrola (lvStatistika): Prikazuje statističke pokazatelje izabrane metode sortiranja – broj poređenja i broj zamjena.

8. ListBox kontrola (lstSort): Prikazuje sortirani niz

Slijedi kod rješenja:

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

'Generiše slučajne brojeve Randomize()

Drago Tomić, Apeiron BL 29

Page 32: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 'reset brojača BrojZamjena = 0 'reset brojača

Select Case lstMetoda.Text 'Sve procedure koje se nadalje pozivaju se nalaze u 'posebnom modulu Sortiranje.vb. Svaka procedura na svoj 'način sortira generisani niz i izračunava 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 statističke 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 možda 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

Page 33: Visual Basic 2008 Seminar Ski

VB - Riješeni 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. Većina 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, poređenja susjednih članova i zamjene mjesta ako su pogrešno poredani. Prolasci kroz niz se ponavljaju dok više nije potrebno vršiti zamjenu. Efikasnija

Drago Tomić, Apeiron BL 31

Page 34: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

varijanta ovog algoritma je kad nije potrebno svaki put prolaziti kroz čitav niz nego samo do sortiranog dijela jer pri svakom sledećem prolasku sortirani dio niza se povećava 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 početku i poslije svake iteracije niz se sastoji od dva dijela: prvi dio je već sortiran, drugi dio nesortiran. Na samom početku samo je element a0 u sortiranom dijelu. Uzima se prvi element iz nesortiranog dijela, poredi se krećući se unazad sa elementima iz sortiranog dijela i svaki put kad se u sortiranom dijelu pronađe element koji je veći pomjeri se za jedno mjesto desno.

Da bi se ubacio element ai, poredi se sa elementima ai-1, ai-2, itd. Kad se pronađe element aj, aj ai, ai se umetne iza njega. Ako nije pronađen nijedan takav element onda se ai ubacuje na početak 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 sledećem principu:

1. Nađi najmanju vrijednost u nizu,

Drago Tomić, Apeiron BL 32

Page 35: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

2. Zamijeni taj element sa elementom na prvoj poziciji,

3. Ponavljaj ove korake za ostatak niza (počinjući od drugog člana i svaki sledeći put od sledećeg)

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 pronalaženje najmanjeg člana preostalog dijela niza smjestio u posebnu funkciju koja vraća indeks nađenog č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 višestrukih prolazaka kroz niz sortira manje dijelove koristeći metodu Insertion sort. Ti dijelovi postaju sve veći dok na kraju ne budu svi elementi datog niza podvrgnuti čistoj Insertion sort metodi. Međutim do tog trenutka veći dio niza je već sortiran.

Kod Insertion sort metode inkrement odnosno veličina 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 vrši poređenje između 10. i 1. člana niza, pa između 11. i 2. člana, itd. dok se ne uporede 20. i 10. član. Svaki put može da dođe do zamjene mjeste ako poredak nije odgovarajući. U sledećem ciklusu porede se 5. i 1. član, pa 6. i 2., zatim 7. i 3. itd. Tek kad se taj skup poveća na više od dva elementa možemo govoriti o klasičnoj Insertion sort

Drago Tomić, Apeiron BL 33

Page 36: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 sledećim koracima kako je i predstavljeno programskim kodom:

1. Izaberi jedan element iz liste koji se naziva pivot. U ovoj implementaciji pivot je središnji element posmatranog dijela liste.

2. Preuredi listu tako da svi elementi čija je vrijednost manja od pivota dođu prije, a elementi sa većom vrijednošću od pivota dođu poslije pivota. Nakon što se izvrši ova podjela pivot je na svojoj konačnoj poziciji. Ovo se zove operacija podjele (engl. partition).

3. Rekurzivno sortiraj pod-listu manjih elemenata i pod-listu većih 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

Page 37: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 sledeća 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 Niz() As Integer, ByRef Temp() As Integer, _ ByVal lijevo As Integer, ByVal sredina As Integer, _ ByVal desno As Integer) Dim i, lijevoKraj, brojElem, tmpPoz As Integer

lijevoKraj = sredina - 1

Drago Tomić, Apeiron BL 35

Page 38: Visual Basic 2008 Seminar Ski

VB - Riješeni 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. Ograničiti 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). Takođe obratiti pažnju na padeže, npr. 7 000 sedam hiljada, 2 000 dvije hiljade (nepravilno je “dva hiljada”).

Rješenje:

1. TextBox kontrola (txtIznos). Napisao sam validaciju unosa. Moguće 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

Page 39: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

3. Button kontrola (btnSlovima). Reaguje na događaj 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 'grupe od po tri cifre Dim iTrojke As Byte 'pozicija trojke Dim sTrojka As String '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 tačku 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 vodeće 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

Page 40: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

'Ako cijeli dio iznosa ima više 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 (zaokruženo naviše) brojTrojki = Math.Ceiling(Len(Mid(sIznos, 1, _ InStr(sIznos, ",") - 1)) / 3)

'Dopuni nulama do pune trojke. 'Npr. broj 2536,87 napiši 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 obrađuje i u zavisnosti od 'položaja 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

Page 41: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

sSlovima = sSlovima & "trideset " Case "4" sSlovima = sSlovima & "četrdeset " Case "5" sSlovima = sSlovima & "pedeset " Case "6" sSlovima = sSlovima & "šezdeset " Case "7" sSlovima = sSlovima & "sedamdeset " Case "8" sSlovima = sSlovima & "osamdeset " Case "9" sSlovima = sSlovima & "devedeset " End Select

If sCifraDesetica = "1" Then Select Case sCifraJedinica Case "0" sSlovima = sSlovima & "deset " Case "1" sSlovima = sSlovima & "jedanaest " Case "2" sSlovima = sSlovima & "dvanaest " Case "3" sSlovima = sSlovima & "trinaest " Case "4" sSlovima = sSlovima & "četrnaest " Case "5" sSlovima = sSlovima & "petnaest " Case "6" sSlovima = sSlovima & "šesnaest " Case "7" sSlovima = sSlovima & "sedamnaest " Case "8" sSlovima = sSlovima & "osamnaest " Case "9" sSlovima = sSlovima & "devetnaest " End Select

'Dodaj vrijednost grupe Select Case iTrojke Case 5 sSlovima = sSlovima & "biliona " Case 4 sSlovima = sSlovima & "milijardi " Case 3 sSlovima = sSlovima & "miliona " Case 2 sSlovima = sSlovima & "hiljada " End Select End If

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

Page 42: Visual Basic 2008 Seminar Ski

VB - Riješeni 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 Ifokruglo: iTrojke -= 1 Loop While iTrojke >= 1 sSlovima = sSlovima & "KM i " & Mid(sIznos, InStr(sIznos, ",") + 1) _

Drago Tomić, Apeiron BL 40

Page 43: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

& "/" & (10 ^ (Len(Mid(sIznos, _ InStr(sIznos, ",") + 1)))).ToString sSlovima = UCase(sSlovima) Return sSlovima End Function

End Class

12. Tekst editor

Napisati program za uređivanje teksta. Koristiti meni, alatnu traku i kontekst meni. Program treba da ima sledeće mogućnosti:

Kreiranje novog i otvaranje postojećeg dokumenta u rtf formatu,

Snimanje, dosnimavanje i snimanje dokumenta pod drugim imenom.

Kopiranje, isijecanje i lijepljenje sadržaja clipboard-a (iz menija i iz kontekst menija).

Definisanje atributa fonta nad izabranim dijelom teksta,

Prikaz liste (bullets).

Rješenje:

Sadžaj meni linija:

Dokument: , Uređivanje: , Format:

Public Class frmTekstEditor

Dim sNaziv As String Const FORMA As String = "Tekst Editor: "

Private Sub Novi() If rtbTekst.Modified Then Call AkoNijeSacuvan()

Drago Tomić, Apeiron BL 41

Page 44: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

End If

rtbTekst.Text = "" rtbTekst.Modified = False sNaziv = "" Me.Text = FORMA End Sub

Private Sub AkoNijeSacuvan() If MsgBox("Dokument nije sačuvan." & vbCrLf & _ "Želite li sačuvati 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 SuberrTrap: MsgBox("Greška br. " & Err.Number & vbCrLf & _ "Opis: " & Err.Description) End Sub

Private Sub SnimiDokKao() On Error GoTo errTrap dlgSave.Title = "Sačuvaj 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 SuberrTrap: MsgBox("Greška 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 End Sub

Drago Tomić, Apeiron BL 42

Page 45: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

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

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

Drago Tomić, Apeiron BL 43

Page 46: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

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

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

Drago Tomić, Apeiron BL 44

Page 47: Visual Basic 2008 Seminar Ski

VB - Riješeni primjeri

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