waarom slaat vb dit stuk code over?

Status
Niet open voor verdere reacties.

SvenAPV

Nieuwe gebruiker
Lid geworden
2 jul 2009
Berichten
3
hey,

ik ben op dit moment bezig met een klein programma dat priemgetallen uitrekend
ik programeer pas een maand (geleerd op school) dus echt goed ben ik er nog niet in

ik heb in dat programma een loop in een loop zitten, die 2e loop slaat hij over:confused:

het programma zou uiteindelijk dit moeten doen:
- voer het aantal priemgetallen in dat je wilt weten (in te voeren in txtAantal)
- programma berekend de eerste (aantal) priemgetallen en schrijft ze in een listbox (lstPriem)

ik weet nog niet of wat in de loop staat klopt aangezien die nog niet uitgevoerd is, maar daar wil ik zelf achter komen, het gaat mij alleen om het fijt dat hij dat stuk overslaat

dit is de code:
Code:
Private Sub cmdBereken_Click()
'declaratie
    Dim Aantal As Integer
    Dim Priemgetallen As Integer
    Dim Controle1 As Double
    Dim Controle2 As Double
    Dim i As Integer
    Dim Getal As Integer
    Dim Priem As Boolean

'lees Aantal
    Aantal = CInt(txtAantal.Text)

'gegevens vaststellen
    lstPriem.Clear
    Getal = 3
    Priemgetallen = 1
    lstPriem.AddItem (2)
    Priem = True
    
'bereken priemgetallen
    While Priemgetallen < Aantal
        
        'DE VOLGENDE STAP MAAKT HIJ NIET
        For i = 2 To i = Getal - 1 Step 1
            
            Controle1 = Getal / i

            'controleer of het getal een geheel getal of een getal met decimalen is
            Controle2 = CInt(Controle1)
            Controle2 = Val(Controle2)

            If Controle1 = Controle2 Then
                Priem = False
            End If
        Next i
        
        If Priem = True Then
            lstPriem.AddItem (Getal)
            Priemgetallen = Priemgetallen + 1
        End If
        
        Getal = Getal + 1
        Priem = True
    Wend
    
End Sub

bij de text in hoofdletters slaat het programma een stuk over tot dat die loop afgelopen is (dus t/m "Next i")

weet iemand wat ik fout doe en hoe ik het op moet lossen?

alvast bedankt,
Sven
 
Zonder een oplossing te geven, alleen hetgeen mij opvalt aan jou code:

Code:
   For i = 2 To i = Getal - 1 Step 1
i = getal -1 zou ik in een aparte variable zetten.

Verder:
Variabele Getal is gelijk aan 3.
Je maakt dus een loop waarin je zegt: Zolang i gelijk is aan 2 tot en met Getal - 1 (= ook 2??). Van 2 tot 2 stap 1. Erm?

Kan je me deze dingen uitleggen?

Zqwiqly.
 
De verbeterde versie van While...Wend is Do ... Loop
Maar in dit geval overbodig
behalve de priem-test zijn deze 5 regels voldoende (i = integer, c0 is string)


Code:
        For i = 1 To 10^20
           If Priem = True Then c0 =c0 & priem & "|"
           if ubound(split(c0,"|"))> val(txtAantal.Text) then exit for
        Next
        lstPriem.list=split(c0,"|")
 
Laatst bewerkt:
@ Zqwiqly:
ik zal het proberen zo duidelijk mogenlijk uit te leggen:

het programma kijkt hoeveel priemgetallen je wilt hebben, laten we zeggen dat je er 4 wilt.
2 is een priemgetal
het eerst volgende getal om te controleren is 3

de 1e loop
Code:
while Priemgetallen < Aantal
kijkt alleen hoeveel priemgetallen er al gevonden zijn en stopt als er genoeg (in dit geval dus 4) gevonden zijn

de loop daarin (wordt overgeslagen, maar zou dit moeten doen):
het getal na 2 (3 dus) controleren of het deelbaar is door een getal tussen 2 en zichzelf-1 (in dit geval dus alleen of hij deelbaar is door 2) dat geeft als code:
Code:
for i=2 to Getal-1
3/2 (Getal/i)
daarna gaat hij controleren of de uitkomst van 3/2 een decimaal getal is of een geheel getal
is het een geheel getal, dan is het geen priemgetal want dan is hij ook deelbaar door iets anders.
in dit geval 3/2=1.5
dat is dus een decimaal getal
dat betekend: Priem = False
normaal gaat hij dan kijken of het getal deelbaar is door het volgende getal (next i) maar omdat dat 3 zou zijn en dat is meer dan Getal-1 (2)
dus Priemgetallen= Priemgetallen+1 (=2)
en Getallen = Getallen+1 (=4)

nu gaat hij hetzelfde doen voor het getal 4 (dit is geen priemgetal
net zo lang totdat hij 4 priemgetallen gevonden heeft

ik hoop dat dit duidelijk genoeg was, ik denk niet dat ik het beter kan uitleggen:confused:

@ snb :
ziet er veel simpeler uit
maar ik begrijp er niet veel van om heel eerlijk te zijn:eek: zou je het uit kunnen leggen?
 
probleem is opgelost
ik heb
Code:
for i = 2 to i = Getal - 1 step 1
veranderd in
Code:
for i = 2 to Getal - 1
en nu werkt het foutloos:D
 
Uitleg van

Code:
[COLOR="Blue"]1[/COLOR]  For i = 1 To 10^20
[COLOR="blue"]2 [/COLOR]  If Priem = True Then c0 =c0 & i & "|"
[COLOR="blue"]3[/COLOR]   if ubound(split(c0,"|"))> val(txtAantal.Text) then exit for
[COLOR="blue"]4[/COLOR] Next
[COLOR="blue"]5[/COLOR] lstPriem.list=split(c0,"|")

Mij lijkt de combinatie van een do...loop en for...next lus teveel van het goede. Kies voor 1 van beide methodes.
Via een If...Then regel kan de lus beëindigd worden.
Om het aantal 'hulp'variabelen te beperken geef ik de voorkeur aan de For... Next methode.
Voor de liefhebbers van het declareren van variabelen: c0 is een string, i een Integer.
In deze code heb ik me niet beziggehouden met test (funktie) of een getal een priemgetal is of niet.

1 Begin de teller (i) bij 1 en eindig als 10 tot de macht 20 is bereikt (deze waarde is natuulijk zelf te kiezen).
2 Als uit de test 'priem' blijkt dat de waarde van i een priemgetal is, voeg dan die waarde van i toe aan de tekstreeks 'c0'; daarin komen alle priemgetallen, gescheiden door een pipeline (|).
3 als het aantal getallen in de tekstreeks c0 groter is dan de waarde die in het veld txtAantal is opgegeven, dient de lus te worden gestopt.
Het aantal getallen in de tekstreeks wordt achterhaald door de tekstreeks te splitsen (split) met het scheidingsteken | naar een matrixvariabele en daarvan de bovengrens (ubound) te bepalen. Ubound komt overeen met het aantal getallen in c0 +1 , omdat de ondergrens van een gesplitste tekstreeks 0 is.
4 als de lus is verlaten wordt de eenvoudigste en snelste manier gebruikt om een listbox (maar dit geldt ook voor een combobox) te vullen: met de eigenschap 'List'.
De inhoud van een listbox of combobox bestaat altijd uit een eendimensionele matrix. Die maak je simpel met de methode 'split'.
De tekstreeks c0 wordt zo in 1 keer geconverteerd naar een eendimensionele matrix en tegelijkertijd als eigenschap van de listbox ingesteld. Op deze manier is het 'leegmaken' van de listbox (.clear) ook overbodig.
Deze 4e regel doet dus 3 dingen tegelijkertijd:
- leegt de listbox
- converteert de tekstreeks in een eendimensionele matrix
- plaatst de matrix in de eigenschap list van de listbox
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan