Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Tallennus taulukkoon ym. (VB)

NixDu [27.02.2007 15:04:17]

#

Joo eli en löytänyt tähän vinkkiä täältä vaikka kokeilin ettiä.

Eli mulla on ohjelma joka arpoo tiedostojen määrästä riippuvan numeron.
Seuraavaksi mun pitäis saada että se tallentaa sen arvotun numeron jonnekin, esim. taulukkoon. Ja nyt en osaa sit ettiä tyhjää kohtaa taulusta saati sitten lukea sitä sieltä.

'Arvotaan tiedostoista joku tiedosto
Dim arvonta As Integer
Randomize()
arvonta = Int(Rnd() * maara) + 1

'Tässä luetaan arvottu numero talteen ja tarkistetaan onko arvottu numero jo käytetty
Dim taulu(maara) As String
Dim i As Integer
i = i + 1
taulu(i) = arvonta

Ei voi muistaa tarkemmin...

Antti Laaksonen [27.02.2007 15:29:28]

#

Pitääkö ohjelman siis arpoa joukko numeroita tietyltä väliltä? Pitääkö ohjelman arpoa vain muutama numero vai esim. valita kaikki numerot satunnaisessa järjestyksessä? Mitä ohjelma tekee numeroille loppujen lopuksi?

NixDu [27.02.2007 17:08:45]

#

Siis ohjelma laskee ensin kaikki tiedostot tietystä kansiosta ja arpoo numeron jonku numeron tiedostojen määrästä ja lukee tiedoston sisällön textboxiin. Sen jälkeen ku käyttäjä painaa nappia uudestaan se arpoo uuden numeron, ja nyt haluan tähän väliin tarkistuksen onko jo numero aikasemmin arvottu. Ja jos on arvottu niin se arpoo uuden numeron ja sit ku kaikki numerot on käytetty loppuu ohjelma...

Oon tehny muut paitsi tuon että se tarkistaa onko jo numero arvottu ennen.

Tuohon maara muuttujaan on jo laskettu tiedostojen määrä ja arvonta onnistuu "1 - maaran" väliltä.

Toivottavasti selvensi.

Ja vielä sen ku aloittaa uuden "pelin" niin tietenki noi taulukot / arvonnat nollataan...

Antti Laaksonen [27.02.2007 17:28:17]

#

Joo, nyt kaikki alkaa olla selvää. Tässä esimerkki:

Dim arvottu() As Boolean
Dim amaara As Integer
Dim tmaara As Integer

Private Sub Command1_Click()
    Dim uusi As Integer
    If amaara = tmaara Then
        MsgBox "Kaikki on jo arvottu!"
        End
    End If
    Do
        uusi = Int(Rnd * tmaara) + 1
    Loop While arvottu(uusi)
    arvottu(uusi) = True
    amaara = amaara + 1
    Print uusi
End Sub

Private Sub Form_Load()
    tmaara = 10
    ReDim arvottu(tmaara) As Boolean
    Randomize Timer
End Sub

Tämä ohjelma tulostaa luvut 1 - 10 ikkunaan arvotussa järjestyksessä, yhden luvun kerrallaan, kun käyttäjä painaa nappia. Taulukossa arvottu pidetään kirjaa arvotuista luvuista ja muuttuja amaara kertoo, montako lukua on jo arvottu. Ohjelman alussa pannaan muuttujaan tmaara suurin luku (pienin on aina 1) ja alustetaan taulukko vastaavasti. Sitten kun uusi luku pitää arpoa, uusia lukuja arvotaan niin kauan, kunnes löytyy sellainen, jota ei ole vielä merkitty taulukkoon.

NixDu [27.02.2007 18:08:04]

#

Selitys kuulosti hyvältä, mut oon vähän heikoilla vielä ohjelmoinnissa niin en oikein saa tuota koodin pätkää liitettyä mun koodiin...

Eli mie haluaisin vain tietää miten tallennan mun arvotut numerot talteen ettei tulisi sama numero enää toista kertaa. Ja kun uusi peli tai ohjelma käynistetään uudestaan niin alkaisi arvonta tietenki alusta.

Ohjelma voisi jo valmiiksi arpoa kaikkiin tauluihin jonku numeron ja sitten sieltä ottaa joka taulu vaikka järjestyksessä ja lukea numero taulusta.

Arvottu numero tulee tiedosto nimen perään josta ohjelma tietää minkä tiedoston se aukaisee.

Saan kyllä taulun tehtyä, mutta se ei tallenna sinne numeroa kuin seuraavaan arvontaan asti. Eli arvon joka tauluun yhden numeron Do untilin sisällä niin se pyyhkii edellisen taulun numeron nollaksi kun looppi menee alkuun...

NixDu [27.02.2007 21:42:54]

#

Jahas... Enää ei voinut muokata tuota edellista tekstiä... Eli sain tuon koodin tungettua tuonne mun koodin sekaan, mutta se ei toimi... Se ei arvo yhtäkään koodia vaan iskee heti tuon messageboxin ja lopettaa ohjelman siihen ilman mitään erroreita. Ja kun pikkasen muokkasin sitä lisää niin se alkaa arpoo niitä, mutta sit iskee erroria loopissa, enkä tajua siitä mitään...

BadSource [28.02.2007 10:28:49]

#

Alla Antin koodi kommentein. Hieman solveltamalla tuo pitäisi olla selvää pässin lihaa, kun vaan tietää missä yhteydessä ja missä järjestyksessä mitäkin pitää tapahtua/tehdä.

Private arvottu() As Boolean
Private amaara As Integer 'arvottuja lukuja
Private tmaara As Integer 'tiedostomäärä

Private Sub Command1_Click()
    Dim uusi As Integer
    'Jos tmaaraa ei ole alustettu, niin koodin ajo loppuu heti seuraavaassa tarkistuksessa,
    'siksi alustus on laitettu Form_Loadiin
    If amaara = tmaara Then
        MsgBox "Kaikki on jo arvottu!"
        End
    End If
    Do 'arvotaan lukuja
        uusi = Int(Rnd * tmaara) + 1 'arvotaan uusi luku
        'Tässä loopissa pyöritään niin kauan, että kohdalle osuu luku, jota ei ole vielä arvotto.
        'Tarkistus arvotttu()-taulukosta, eli onko edellä arvotun arvon kohdalla True vai False.
        'Kun taulukko luotiin, niin se sai oletuksena jokaiseen soluunsa arvon False.
    Loop While arvottu(uusi) 'tarkistetaan onko solun arvo True vai False. Falsella ulos
    arvottu(uusi) = True 'uusi arvo, joten poistetaan se taulukon vapaista
    amaara = amaara + 1 'kirjataan ylös löytynyt uusi arvo
    Print uusi 'tulostetaan Formille arvottu arvo
End Sub

'Ohjelma lukee käynnistyessään Form_Loadin, joten tarpeellisten muuttujien
'alustus on hyvä hoitaa siellä. Tässä tapauksessa tmaara ja arvottu()-taulukko.
Private Sub Form_Load()
    tmaara = 10 'tässä määritetään montako tiedostoa kansiossa on
    ReDim arvottu(tmaara) As Boolean 'luodaan boolean tyyppinen taulukko arvoille. Solujen arvot oletuksena False.
    Randomize Timer 'alustetaan muuttujageneraattori Timerista saatavalla arvolla
End Sub

Vastaus

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

Tietoa sivustosta