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 Sub
Tarkoitus 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 Sub
laita 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.