Toon posts:

[VB.NET] Arrays / bijhouden hoeveel keer een getal voorkomt*

Pagina: 1
Acties:
  • 312 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo allemaal,

Ik ben opzoek naar iemand die me kan helpen met het werken met arrays in visual basic. Ik zit namelijk met een opdracht die bijna af is, alleen zit ik nu vast...

Ik heb een programmaatje die twee dobbelstenen gooit. Je kan invoeren hoe vaak je gooit met twee dobbelstenen. Eenmaal gegooid kan je door twee knoppen opvragen welk getal hoe vaak is gegooid en welk getal het meest is gegooid. Hieronder volgt het script:

------------------------------------------------------------------------------------------------------------------------------------------------
' 1 Overal op te vragen
Dim Tabel() As Short

' 2 Exit knop
Private Sub CmdExit_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdExit.Click
Dim Msg As Object
Msg = "Weet u zeker dat u wilt afsluiten?"
If MsgBox(Msg, MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Afsluiten") = MsgBoxResult.Yes Then
End
End If
End Sub

' 3 Alleen Cijfers mogelijk!!!
Private Sub Cijfer()
Dim alert As Object
If Not IsNumeric(TxtInv.Text) Then
alert = MsgBox("Voer een getal in", MsgBoxStyle.OkOnly, "Foutieve Invoer")
TxtInv.Text = ""
End If
End Sub

' 4 Invoerveld
Private Sub TxtInv_TextChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles TxtInv.TextChanged
Cijfer()
If TxtInv.Enabled Then
CmdGooi.Enabled = True
End If
End Sub

' 5 Gooi knop + berekening
Private Sub CmdGooi_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdGooi.Click

' 6 Randomize Functie
Dim Getal1, Getal2 As Integer
Dim Teller As Integer
ReDim Tabel(CInt(TxtInv.Text) - 1)

' 7 For Next Statement
For Teller = 1 To CInt(TxtInv.Text)

Randomize()
Getal1 = Int((6 * Rnd()) + 1)
Getal2 = Int((6 * Rnd()) + 1)
Tabel(Teller - 1) = Getal1 + Getal2

Next Teller


' 8 Activeer frame, frameobjecten en zet de focus in het uitvoerveld
Frame.Enabled = True
InvText.Enabled = True
TxtUitv.Enabled = True
TxtUitv.Focus()
End Sub

' 9 Getal keuze invoeren voor aantal keer gegooid of meest gegooid
Private Sub TxtUitv_TextChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles TxtUitv.TextChanged
Cijfer()
If TxtUitv.Enabled Then
Cmdagooi.Enabled = True
Cmdmgooi.Enabled = True
End If
End Sub
.................................................................................................................................................
' 10 Aantal keer gegooid
Private Sub Cmdagooi_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Cmdagooi.Click

'declareer een variabele AantalMalen waar je het aantal malen dat een bepaalt getal is gegooid, in opslaat


'Loop door de tabel en hoog AantalMalen telkens met 1 op indien de waarde uit de tabel
'overeenkomt met de waarde die de gebruiker heeft opgegeven.



'toon een melding aan de gebruiker


.................................................................................................................................................
End Sub

' 11 Meest gegooide getal
Private Sub Cmdmgooi_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Cmdmgooi.Click
' nog niet gescript
End Sub
End Class
------------------------------------------------------------------------------------------------------------------------------------------------

Het gaat vooral om wat hierboven vetgedrukt staat waar ik op vast loop. Ik weet niet hoe ik verder moet door gegevens uit de array te halen. Ik zou het relaxt vinden als iemand mij kon helpen met het afmaken van dit script.

PS: mocht je wat meer informatie nodig hebben dan hoor ik het graag...

Greetz,

Tweakerseeker

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Het is niet de bedoeling dat anderen de code voor jou gaan afwerken.
Zowiezo is het niet nodig om alle code te posten, enkel het relevante deel is voldoende. Post ook code tussen [ code ] tags.

Dit gaat hier ook niet over VB, maar over VB.NET, wat toch weer heel wat anders is (en het is helemaal geen 'scripting').

Hoe je door een tabel loopt, en de gegevens daarin uitleest, kan je toch makkelijk terugvinden in iedere cursus/tutorial/boek die handelt over programmeren in VB.NET. Zoek even naar het stukje arrays en collections.
klik
klik
klik
klik
klik

Je zou ook eens naar de Collection - classes in .NET kunnen kijken. Zo zou je bv een Dictionary kunnen gebruiken, waarbij je in die dictionary een entry maakt voor ieder getal dat je kan gooien, en per 'entry' hou je dan bij hoeveel keer dat dit getal gegooid werd. Op die manier hoef je niet iedere keer door een array te loopen.
C#:
1
2
3
4
5
Dictionary<int, int> aantalGegooid = new Dictionary<int, int>();
for( int i = 1; i <= 6; i++ )
{
    aantalGegooid.Add (i, 0);
}

Als de gebruiker dan 4 gegooid heeft, dan kan je dit doen:
C#:
1
aantalGegooid[4] += 1;

Om dan te weten welk getal het meest gegooid werd, zal je door die Dictionary moeten loopen, en checken wat het hoogste is
C#:
1
2
3
4
5
6
7
8
9
10
11
int hoogsteAantalKeer = 0;
int getalMeestGegooid = 0;
foreach( DictionaryEntry de in aantalGegooid )
{
    if( de.Value > hoogsteAantalKeer )
    {
        getalMeestGegooid = de.Key;
        hoogsteAantalKeer = de.Value;
    }
}
Console.WriteLine (getalMeestGegooid + " werd " + hoogsteAantalKeer + " gegooid");


Zo, ik denk dat je met deze 'tips' toch al wel wat verder moet kunnen. De code is in C# / pseudo-code.

https://fgheysels.github.io/


  • Ciqniz
  • Registratie: Oktober 2002
  • Laatst online: 07-09-2023

Ciqniz

On the move...

Er staat ergens in je code

Visual Basic .NET:
1
2
3
Dim msg As Object
msg = "bla"
MsgBox(msg,args)


Dat is wel heeel erg slecht. Kun je daar niet gewoon beter string van maken ipv object?
Zo maar het eerste wat mij opviel, maar goed...

btw:
Visual Basic .NET:
1
2
3
4
5
6
7
Private Sub Cijfer()
Dim alert As Object
If Not IsNumeric(TxtInv.Text) Then
alert = MsgBox("Voer een getal in", MsgBoxStyle.OkOnly, "Foutieve Invoer")
TxtInv.Text = ""
End If
End Sub


waar in hemelsnaam gaat de waarde alert heen (die je ook weer als object hebt gedeclareerd!)??? TxtInv.Text laat je lekker leeg...

[ Voor 42% gewijzigd door Ciqniz op 17-06-2007 22:21 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:39

gorgi_19

Kruimeltjes zijn weer op :9

En waarom werk je uberhaupt in .Net als je zo ongeveer nog alle VB6 elementen gebruikt die er alleen nog inzitten vanwege compatilibiteit? Denk aan zaken als vervangers door TryParse en String.Empty

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Hi all,

Thanks voor jullie commentaar en hulp...ik ga het vanavond na het werk gelijk uitproberen. Dat ik niet goed ben in VB.Net is een feit! Ik snap er ook de ballen van, maar probeer het in iedergeval. Ik ben zelf meer van het action scripten in Flash, maar dat is andere koek...

Wat ik allemaal op school heb geleerd voor VB.NET is bar en bar slecht. Je krijgt eerst een paar eenvoudige opdrachten die elk mens wel kan volgen, vervolgens deze opdracht. We begonnen in Visual Basic 6 terwijl er nu Visual studio is, vandaar de VB.NET 6 codering

Anyway ik ben jullie die hulp hebben aangeboden allen dankbaar!!!

Groeten,

Tweakerseeker

Verwijderd

Topicstarter
Weet iemand of er ook een andere manier is om bij het gooien van twee dobbelstenen het meest gegooide getal op te vragen uit de array?

Greetz,

Tweakerseeker

  • user109731
  • Registratie: Maart 2004
  • Niet online
Verwijderd schreef op zaterdag 23 juni 2007 @ 20:03:
Weet iemand of er ook een andere manier is om bij het gooien van twee dobbelstenen het meest gegooide getal op te vragen uit de array?

Greetz,

Tweakerseeker
Whoami's oplossing hierboven lijkt mij wel netjes, waarom kun je dat niet gebruiken? Er zijn vast nog tientallen (mogelijk slechtere) manieren te bedenken, het is dus handig om aan te geven wat je precies zoekt :)

Twee dobbelstenen is eigenlijk hetzelfde als 1, maar dan met 36 in plaats van 6 mogelijke worpen...

[ Voor 17% gewijzigd door user109731 op 23-06-2007 20:50 ]


  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 23:45

Klippy

Still Game

JanDM schreef op zaterdag 23 juni 2007 @ 20:48:
[...]


Twee dobbelstenen is eigenlijk hetzelfde als 1, maar dan met 36 in plaats van 6 mogelijke worpen...
Volgens mij is het gewoon 1-12 bij 2 dobbelstenen. Zo ver als "1 en 5" zijn het meest gegooid hoeft hij denk ik niet te gaan.

Gewoon een array van lengte 12 zou ik doen. Je kan ook als je het heel simpel wil doen een array maken van 12x 0 en dan bij elke worp iets als
code:
1
aGegooigd[waarde] += 1


Bij het opvragen kan je dan ook gewoon een .NET functie gebruiken als Sort.
En dan iets als:
code:
1
2
3
4
5
6
7
Dim gesorteerdArray(12) as Integer

gesorteerdArray = aGegooid

Array.Sort( gesorteerdArray )

Meestgegooid = gesorteerdArray[12]


Waarom moeilijk doen :P
Ik programmeer toruwens zelden in VB, hou daar niet van, dus de code zal niet helemaal correct zijn, maar je snapt het idee wel denk ik.

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • Alex Picard
  • Registratie: November 2005
  • Laatst online: 19-11 00:56
'declareer een variabele AantalMalen waar je het aantal malen dat een bepaalt getal is gegooid, in opslaat


'Loop door de tabel en hoog AantalMalen telkens met 1 op indien de waarde uit de tabel
'overeenkomt met de waarde die de gebruiker heeft opgegeven.


'toon een melding aan de gebruiker
Aangezien ik zelf programmeeronderwijs geef, herken ik dit als een practicumopdracht. Het gaat hier heel simpel om het werken met arrays. Ingewikkelde oplossingen aandragen met dictionaries en sort is dus niet de bedoeling.

Bij mijn weten is er een policy dat er niet geholpen wordt met dit soort huiswerkopdrachten op het forum...

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:39

gorgi_19

Kruimeltjes zijn weer op :9

Alex Picard schreef op zondag 24 juni 2007 @ 00:18:
Aangezien ik zelf programmeeronderwijs geef, herken ik dit als een practicumopdracht. Het gaat hier heel simpel om het werken met arrays. Ingewikkelde oplossingen aandragen met dictionaries en sort is dus niet de bedoeling.
Neemt niet weg dat ze best bruikbaar kunnen zijn? En zeker een sorteerfunctionaliteit lijkt me nu niet echt bijster ingewikkeld. Dictionary eveneens niet. Daarnaast: Als dit een VB.Net opdracht is en er worden zaken als CInt, Dim Msg As Object en Rnd gebruikt, dan schort er wel meer aan de opleiding c.q. opdracht.
Bij mijn weten is er een policy dat er niet geholpen wordt met dit soort huiswerkopdrachten op het forum...
Dat zie je dan toch verkeerd. We gaan geen huiswerk maken voor iemand; als iemand een huiswerkprobleem volgens de policy post (inclusief eigen werkzaamheid, zoeken, etc.) en er vervolgens niet uitkomen, kan dat best.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Alex Picard schreef op zondag 24 juni 2007 @ 00:18:
[...]


Aangezien ik zelf programmeeronderwijs geef, herken ik dit als een practicumopdracht. Het gaat hier heel simpel om het werken met arrays. Ingewikkelde oplossingen aandragen met dictionaries en sort is dus niet de bedoeling.
Ingewikkeld is het niet. Ik geef wel toe dat het belangrijk is dat je als student de principes leert, dat je weet wat arrays zijn, e.d.
Echter, ik vind ook dat je -als student- de vrijheid moet krijgen om de andere mogelijkheden (die misschien wel een betere oplossing bieden) moet kunnen ontdekken. Ik vind dat de studenten moeten gestimuleerd worden om betere oplossingen te vinden ipv hetgeen de opdracht voorschrijft. (Misschien wel nadat ze aangetoond hebben dat ze het principe van arrays verstaan & onder de knie hebben). Laat hen die MSDN induiken; en kijken wat de alternatieven zijn. Later, in een praktijk-stuatie zullen ze dat nl. ook moeten doen, zullen ze ook moeten zoeken wat de beste oplossing/implementatie is, e.d.
Student zijn is, wat mij betreft, meer dan binnen de lijntjes van de voorgeschreven opdracht blijven.
Bij mijn weten is er een policy dat er niet geholpen wordt met dit soort huiswerkopdrachten op het forum...
Bij mijn weten moet je dan de FAQ eens van nader bij bekijken. :)

[ Voor 34% gewijzigd door whoami op 24-06-2007 10:59 ]

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Om nog eens over m'n oplossing met die Dictionary terug te komen; kijk ook eens in de MSDN naar de ListDictionary & de HybridDictionary classes. Alhoewel Dictionary best een oplossing kan bieden, kunnen die 2 andere classes best een betere performance bieden voor deze opgave.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:39

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op zondag 24 juni 2007 @ 11:02:
Om nog eens over m'n oplossing met die Dictionary terug te komen; kijk ook eens in de MSDN naar de ListDictionary & de HybridDictionary classes. Alhoewel Dictionary best een oplossing kan bieden, kunnen die 2 andere classes best een betere performance bieden voor deze opgave.
Zullen die een betere performance kennen dan een List(Of Integer), waarin je de index 'misbruikt' als de dobbelsteenwaarde? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Neen. :+
En dan kan je idd evengoed een gewone array gebruiken, waarbij je de index ook misbruikt als dobbelsteenwaarde; alleen: de index begint vanaf 0, en dat maakt de boel er niet duidelijker op.
Maar het kan; al hou ik er niet van.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:39

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op zondag 24 juni 2007 @ 11:10:
Neen. :+
En dan kan je idd evengoed een gewone array gebruiken, waarbij je de index ook misbruikt als dobbelsteenwaarde; alleen: de index begint vanaf 0, en dat maakt de boel er niet duidelijker op.
Net even gekeken met Reflector, maar intern gebruikt een List(Of T) ook gewoon een array van T voor opslag, dus het maakt idd geen ruk uit :P
Maar het kan; al hou ik er niet van.
Je kan idd ook een eigen class bakken, die intern een array gebruikt waarin je waarden kan toevoegen en uitlezen en de hoogste waarde pakt. :) Heb je dat probleem niet voor de 'buitenwereld' :)
Je krijgt dan iets als:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 Public Class DiceList

        Private _currentAchievements As List(Of Integer)

        ''' <summary>
        ''' Constructor
        ''' </summary>
        ''' <param name="numberOfDices">The number of dices used. Maximum 3, minimum of 1</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal numberOfDices As Integer)

            If numberOfDices > 3 Or numberOfDices <= 0 Then

                Throw New ArgumentOutOfRangeException("numberOfDices")

            End If

            Dim highestNumber As Integer = Convert.ToInt32(6 * numberOfDices)
            Me._currentAchievements = New List(Of Integer)

            For I As Integer = 0 To highestNumber 

                Me._currentAchievements.Insert(I, 0)

            Next

        End Sub

        ''' <summary>
        ''' Adds 1 to the score achieved
        ''' </summary>
        ''' <param name="value">The value that was rolled with the dice</param>
        ''' <remarks></remarks>
        Public Sub AddRollingOfDice(ByVal value As Integer)

            Me._currentAchievements(value) += 1

        End Sub

        ''' <summary>
        ''' Returns the current number a value was rolled
        ''' </summary>
        ''' <param name="value">The requested value</param>
        ''' <returns>Integer value the the number of times a value was rolled</returns>
        ''' <remarks></remarks>
        Public Function NumberOfTimesRolled(ByVal value As Integer) As Integer

            If value > Me._currentAchievements.Count Then Throw New ArgumentOutOfRangeException("value")

            Return Me._currentAchievements.Item(value)

        End Function

        ''' <summary>
        ''' Returns the highest value that was rolled.
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property HighestRoll() As Integer
            Get
                Dim retHighestTimes As Integer = 0
                Dim retHighestRoll As Integer = -1

                Dim numberOfElements As Integer = Me._currentAchievements.Count - 1
                For I As Integer = 1 To numberOfElements

                    If Me._currentAchievements(I) > retHighestTimes Then

                        retHighestTimes = Me._currentAchievements(I)
                        retHighestRoll = I

                    End If

                Next

                Return retHighestRoll

            End Get
        End Property

    End Class

[ Voor 66% gewijzigd door gorgi_19 op 24-06-2007 11:41 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Alex Picard
  • Registratie: November 2005
  • Laatst online: 19-11 00:56
gorgi_19 schreef op zondag 24 juni 2007 @ 09:08:
[...]

Neemt niet weg dat ze best bruikbaar kunnen zijn? En zeker een sorteerfunctionaliteit lijkt me nu niet echt bijster ingewikkeld. Dictionary eveneens niet. Daarnaast: Als dit een VB.Net opdracht is en er worden zaken als CInt, Dim Msg As Object en Rnd gebruikt, dan schort er wel meer aan de opleiding c.q. opdracht.
De kwaliteit van de opleiding van de TS lijkt inderdaad enigzins discutabel. Maar laten we daar niet verder op ingaan (bezuinigingen in het onderwijs, personeelstekorten, al het geld gaat naar de bestuurslagen etc.).
[...]

Dat zie je dan toch verkeerd. We gaan geen huiswerk maken voor iemand; als iemand een huiswerkprobleem volgens de policy post (inclusief eigen werkzaamheid, zoeken, etc.) en er vervolgens niet uitkomen, kan dat best.
Thanks for correcting me O-)

Maar weer ontopic: Ik denk dat de TS zijn opdracht nu wel kan afmaken, er staat inmiddels al een paar keer verklapt wat de bedoeling is.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:39

gorgi_19

Kruimeltjes zijn weer op :9

Alex Picard schreef op zondag 24 juni 2007 @ 12:14:
Thanks for correcting me O-)

Maar weer ontopic: Ik denk dat de TS zijn opdracht nu wel kan afmaken, er staat inmiddels al een paar keer verklapt wat de bedoeling is.
D'r blijft nog genoeg over voor hem; zo is het theoretisch gezien in zijn oplossing ook nog mogelijk dat er 7 gegooid gaat worden :+

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
gorgi_19 schreef op zondag 24 juni 2007 @ 12:20:
[...]

D'r blijft nog genoeg over voor hem; zo is het theoretisch gezien in zijn oplossing ook nog mogelijk dat er 7 gegooid gaat worden :+
Probeer dat dan nog maar eens te reproduceren als je het al een keer ziet ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1