Tarkoitus olisi lajitella taulukko:
Sub lajittele()
'Määritellään apumuuttuja muuttuja
Dim apu As Integer
Dim i As Integer
Dim j As Integer
For i = 0 To 9
'Sisimmäinen silmukka vertaa taulukon 1.arvoa
'taulukon toisiin arvoihin ennen kuin i saa arvon 1
For j = i + 1 To 9
If lblLuku(j) > lblLuku(i) Then
apu = lblLuku(i)
lblLuku(i) = lblLuku(j)
lblLuku(j) = apu
End If
Next
Next
End SubTarkoitus on siis laittaa luvut suuruusjärjestykseen suurimmasta pienimpään. Jos luvut on labeleissa, vertailu tapahtuu merkkijonoina. Ehkä varmempi on vertailla taulukon lukuja keskenään eikä labelien sisältöä.
Vika taitaa olla kutsussa!
Pääohjelmassa:
Dim lblLuku(10) As Integer 'tai muu tyyppi
....
lajittele lblLuku()
Aliohjelmassa:
Sub lajittele(ByRef lblLuku() As Integer)
...
End Sub
lblLuku pitää olla samaa tyyppiä kuin aliohjelmaassa määritellään.
ByRef kertoo että aliohjelmassa tehdyt muutokset muuttujaan näkyy pääohjelmassa (byVal toimii myös kun on array tyyppi)
Val(lblLuku(i).caption) muuttaa tekstin ensin luvuksi.
Tässä koko höskä:
moduulissa määritellään taulukko ja arvotaan kokonaislukuja 10 kpl:
Option Explicit Public satuluku(9) As Integer Public lblLuku(9) As Integer
Sitten on aliohjelmat: arvo satunnasluvut, tulosta luvut, lajitte luvut sekä minimi ja maksimi. Muut toimivat paitsi ei lajittelu:
Option Explicit
Sub lajittele()
'Määritellään apumuuttuja muuttuja
Dim apu As Integer
Dim i As Integer
Dim j As Integer
For i = 0 To 9
'Sisimmäinen silmukka vertaa taulukon 1.arvoa
'taulukon toisiin arvoihin ennen kuin i saa arvon 1
For j = i + 1 To 9
If lblLuku(j) > lblLuku(i) Then
apu = lblLuku(i)
lblLuku(i) = lblLuku(j)
lblLuku(j) = apu
End If
Next
Next
End Sub
Public Function arvo()
'Määritellään muuttujat
Dim i As Integer
Dim luku As Integer
Randomize 'Kutsutaan satunnaisluku generaattoria
For i = 0 To 9
'Arpoo luvun ja sijoittaa sen taulukkoon arpa
luku = Int(Rnd * 100)
satuluku(i) = luku
Next
End Function
Sub cmdArvo_Click()
'Kutsutaan arvonta aliohjelmaa
Call arvo
End Sub
Sub suurin()
'Määritellään apumuuttuja muuttuja
Dim apu As Integer
Dim i As Integer
'Otetetaan, että 1. solussa on suurin numero
apu = lblLuku(0)
For i = 1 To 9
If lblLuku(i) > apu Then
apu = lblLuku(i)
End If
Next
lblSuurin.Caption = apu
End Sub
Sub pienin()
'Määritellään apumuuttuja muuttuja
Dim apu As Integer
Dim i As Integer
'Oletetaan, että 1. solussa on pienin luku
apu = lblLuku(0)
For i = 1 To 9
If lblLuku(i) < apu Then
apu = lblLuku(i)
End If
Next
lblPienin.Caption = apu
End Sub
Private Sub cmdLajittele_Click()
'Kutsutaan aliohjelmaa lafittele
Call lajittele
End Sub
Private Sub cmdMM_Click()
'Kutsutaan aliohjelmia
Call pienin
Call suurin
End Sub
Private Sub cmdTulosta_Click()
'Kutsutaan tulosta aliohjmaa
Dim i As Integer
For i = 0 To 9
lblLuku(i) = satuluku(i)
Next
End Sublaita arvotut luvut letteloruutuun (ListBox), jonka Sorted = True
Samallailla satunnaisesti toimii oikein...
Onko sulla VB vai VB.NET. Jos VB, pitäisi tämän kyllä toimia
List1.Sorted = True For I = 0 To 9 J = Int(100*rnd) List1.AddItem J Next For I = 0 To 9 lblLuku(I) = List1.List(9 - I) Next
Tossa on nyt juuri tuo merkkijonojen vertailu. Jos luku on pienempi kuin 10 on lisättävä etunolla.
If J < 10 Then List1.AddItem "0" + Cstr(J)
joo...ja mulla on VB ... mutta ohjelman pitäisi toimia, niin että ensin arvotaan luvut, sitten tuolostetaan luvut, minkä jälkeen vasta tapahtuu lajittelu, viimeiseksi tulostetaan maksimi ja minimi arvot.
En ole kokeillut koodiasi mutta kyllä se logiikaltaan on oikein ja pitäisi toimia lajittelun osalta. Lopussa tuo tulostaohjelma palauttaa kuitenkin alkuperäiset arvot, siis lajittelemattomat. Sen tarkoitusta en ymmärrä.
Viimeksi on kirjoitettu se aliohjelma, joka tulostaa lajittelemattomat luvut. Sen jälkeen luvut pitäisi lajitella... ja joskus onnistuu joskus ei
Kyllä ohjelma toimii. Eihän sinulla ole samalla nimellä labeleitä ja muuttujia?
Juuri tuossa se vika on. Määrittele lajitelluille luvuille toinen nimi, siis eri kuin tulostuksessa käytetyille labeleille.
Auttakaahan vielä...
Olen nyt muuttanut moduliin Public Luvut(9) As Integer (eri nimen) ja tehnyt muutokset lajittelualiohjelmaan. Mutta mihin ja miten pannaan niiden yhteystieto, että lajittelu toimisi?
Esim tuohon arvontaan:
For i = 0 To 9
'Arpoo luvun ja sijoittaa sen taulukkoon arpa
luku = Int(Rnd * 100)
satuluku(i) = luku
Luvut(i) = luku
Next
Kiitos! Heti ymmärrän kun kaksi päivää selitetään!!!
Aihe on jo aika vanha, joten et voi enää vastata siihen.