Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Mikä vika koodissa?

Sivun loppuun

Liisapu [01.02.2004 11:44:00]

#

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

setä [01.02.2004 11:57:07]

#

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öä.

tnb [01.02.2004 12:15:51]

#

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)

tnb [01.02.2004 12:18:29]

#

Val(lblLuku(i).caption) muuttaa tekstin ensin luvuksi.

Liisapu [01.02.2004 12:46:21]

#

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

setä [01.02.2004 13:35:55]

#

laita arvotut luvut letteloruutuun (ListBox), jonka Sorted = True

Liisapu [01.02.2004 14:02:08]

#

Samallailla satunnaisesti toimii oikein...

setä [01.02.2004 15:41:12]

#

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

setä [01.02.2004 16:25:07]

#

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)

Liisapu [01.02.2004 20:12:03]

#

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.

setä [01.02.2004 21:07:49]

#

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ä.

Liisapu [01.02.2004 21:33:55]

#

Viimeksi on kirjoitettu se aliohjelma, joka tulostaa lajittelemattomat luvut. Sen jälkeen luvut pitäisi lajitella... ja joskus onnistuu joskus ei

tnb [01.02.2004 21:46:46]

#

Kyllä ohjelma toimii. Eihän sinulla ole samalla nimellä labeleitä ja muuttujia?

setä [01.02.2004 22:16:32]

#

Juuri tuossa se vika on. Määrittele lajitelluille luvuille toinen nimi, siis eri kuin tulostuksessa käytetyille labeleille.

Liisapu [02.02.2004 17:10:03]

#

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?

setä [02.02.2004 17:50:16]

#

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

Liisapu [02.02.2004 18:29:47]

#

Kiitos! Heti ymmärrän kun kaksi päivää selitetään!!!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta