Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Silmukka- & ehtolauseongelma

Silmu [25.01.2007 14:24:12]

#

Hei,

Täytenä noviisina olen pian esittämäni "ongelman" kanssa nyt sen verran monta päivää, että suomalaisen miehenkin on nöyrryttävä ja kysyttävä apua itseään osaavammilta. Ongelma on siis seuraavanlainen.

Oletetaan, että on 4 ravilähtöä, joissa jokaisessa juoksee 16 hevosta. Jokaisessa lähdössä on siis 16 mahdollista voittajaa, eli kun lähtöjä on 4, niin mahdollisia yhdistelmiä on 16 x 16 x 16 x 16 = 65 536.

Jokaiselle hevoselle on saatavissa peliprosentti, joista voidaan laskea ~kerroin yhdistelmälle, eli jos ensimmäisen lähdön voittajaa on pelattu 50%, toisen 50%, kolmannen 50% ja neljännen 50%, niin kerroin = 1 / (0,5x0,5x0,5x0,5). (laskettaisiin näin jos palautusprosentti olisi 100, tässä leikitään, että on...)

Olen siis toteuttamassa hommaa textboxeilla, siten että ensimmäisen lähdön sisältämät 16 textboxia on nimetty kaikki nimellä L1 ja niille on annettu indexit 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ja 16, sen mukaan, että minkä hevosen peliprosentti mihinkin textboxiin syötetään., eli ensimmäisessä lähdössä hevosen numero 1 peliprosentti syötetään textboxiin L1(1).Text ja niin edelleen. Sama homma lähtöjen 2, 3 ja 4 kanssa, sillä erotuksella, että nämä ovat nimetty L2, L3 ja L4. Indexit menevät samalla tavalla kuin ensimmäisessä lähdössä.

Ongelma on, että minkälaisella silmukalla/ehtolausehässäkällä saan ohjelman käymään läpi kaikki nämä 65 536 yhdistelmää? Koitettu on jos jonkin näköistä systeemiä, enemmän tai vähemmän huonolla menestyksellä.

Jos jollekin jäi vielä epäselväksi niin selvennetään esimerkillä missä olisi vain 3 lähtöä ja kaikissa 3 hevosta.

L1(1) - L2(1) - L3(1)
L1(2) - L2(2) - L3(2)
L1(3) - L2(3) - L3(3)

Tässä mahdollisia yhdistelmiä on siis 3 x 3 x 3 = 27:

L1(1) x L2(1) x L3(1)
L1(1) x L2(1) x L3(2)
L1(1) x L2(1) x L3(3)
L1(1) x L2(2) x L3(1)
L1(1) x L2(2) x L3(2)
L1(1) x L2(2) x L3(3)
L1(1) x L2(3) x L3(1)
L1(1) x L2(3) x L3(2)
L1(1) x L2(3) x L3(3)
L1(2) x L2(1) x L3(1)
L1(2) x L2(1) x L3(2)
L1(2) x L2(1) x L3(3)
L1(2) x L2(2) x L3(1)
L1(2) x L2(2) x L3(2)
L1(2) x L2(2) x L3(3)
L1(2) x L2(3) x L3(1)
L1(2) x L2(3) x L3(2)
L1(2) x L2(3) x L3(3)
L1(3) x L2(1) x L3(1)
L1(3) x L2(1) x L3(2)
L1(3) x L2(1) x L3(3)
L1(3) x L2(2) x L3(1)
L1(3) x L2(2) x L3(2)
L1(3) x L2(2) x L3(3)
L1(3) x L2(3) x L3(1)
L1(3) x L2(3) x L3(2)
L1(3) x L2(3) x L3(3)

Ehdotuksia? Kiitos jo etukäteen auttamaan vaivautuville.

Antti Laaksonen [25.01.2007 15:14:02]

#

Jos lähtöjä on aina neljä, helppo ratkaisu on käyttää neljää sisäkkäistä For-silmukkaa, joista jokainen käy läpi luvut ykkösestä kuuteentoista. Silmukkojen sisällä muuttujista pystyy sitten katsomaan, mikä hevonen voitti minkäkin lähdön muodostetussa yhdistelmässä.

Dim a As Integer, b As Integer
Dim c As Integer, d As Integer

For a = 1 To 16
    For b = 1 To 16
        For c = 1 To 16
            For d = 1 To 16
                ' ensimmäisen lähdön voittaa a
                ' toisen lähdön voittaa b
                ' kolmannen lähdön voittaa c
                ' neljännen lähdön voittaa d
            Next
        Next
    Next
Next

Jos lähtöjen määrä vaihtelee, koodista tulee monimutkaisempi, mutta ymmärsin, että ohjelmassasi näin ei ole.

Silmu [25.01.2007 16:29:51]

#

Kiitos.

Täytyypä koittaa heti kun töistä kotiin selviytyy. Näyttää juuri sopivan yksinkertaiselta. Joskus olen tuon homman onnistunut tekemään, mutta tuolloin tuli kirjoitettua useampi 100 riviä koodia pelkästään tuon homman tekemiseen...

Silmu [25.01.2007 18:01:08]

#

Hei vielä,

Jos yksi lisäkysymys sallitaan, niin mihin kohtaan tuota silmukkaa print-rimpsu pitää sijoittaa, että ohjelma tulostaa kulloinkin käsiteltävänä olevan yhdistelmän?

Siis tyyliin:

Dim a As Integer, b As Integer
Dim c As Integer, d As Integer

For a = 1 To 16
    For b = 1 To 16
        For c = 1 To 16
            For d = 1 To 16
              print a + "-" + b + "-" + c + "-" + d
            Next
        Next
    Next
Next

Tuohonko?

Megant [25.01.2007 18:03:01]

#

Juuri siihen.

Vastaus

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

Tietoa sivustosta