Probleem For-lus

Status
Niet open voor verdere reacties.

gast0187

Gebruiker
Lid geworden
4 nov 2012
Berichten
266
Hallo,

Mijn programmaatje werkt maar de resultaten worden omgekeerd weergegeven. (geen rekening gehouden met kleur, lettertype hieronder!)

vb. 10 hindernissen en 5 als gewicht voor 1 zakje goud in gram

Foute uitkomst(ik krijg dit):
Zakjes verdiend hindernis 5: 1
Zakjes verdiend hindernis 4: 2
Zakjes verdiend hindernis 3: 4
Zakjes verdiend hindernis 2: 8
Zakjes verdiend hindernis 1: 16

MAAR .....

MOET worden:

Zakjes verdiend hindernis 5: 16
Zakjes verdiend hindernis 4: 8
Zakjes verdiend hindernis 3: 4
Zakjes verdiend hindernis 2: 2
Zakjes verdiend hindernis 1: 1

Vind iemand de fout ???

Mijn code :

Code:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Aantalhindernissen As Integer = Integer.Parse(txtAantalhindernissen.Text)
        Dim Gewicht1zakjeGoud As Integer = Integer.Parse(txtGewicht1zakjeGoud.Text)
        Dim Aantalzakjes As Integer = 1
        Dim Totaalaantalzakjes As Integer
        Dim Eindgewicht As Double
        Dim zakjes As String = ""
        Dim verdiendezakjes As String = ""

        txtEindgewichtzakjes.Visible = True

        For i As Integer = Aantalhindernissen To Aantalzakjes Step -1
            'For i As Integer = 1 To Aantalhindernissen
            zakjes = Aantalzakjes
            verdiendezakjes += ("Zakjes verdiend hindernis " & i & ": " & zakjes & vbNewLine)
            Totaalaantalzakjes += Aantalzakjes
            Aantalzakjes = Aantalzakjes * 2
        Next

        Eindgewicht = (Totaalaantalzakjes * Gewicht1zakjeGoud) / 1000

        txtEindgewichtzakjes.Text = "Het eindgewicht bedraagt: " & Eindgewicht & " KG" & vbNewLine & "Het totale aantal zakjes bedraagt " & Totaalaantalzakjes

        MessageBox.Show("Aantal hindernissen: " & Aantalhindernissen & vbNewLine & "Basisgewicht van één hoopje: " & Gewicht1zakjeGoud & vbNewLine & verdiendezakjes.ToString)
    End Sub
End Class

Alvast op voorhand bedankt.
 
Laatst bewerkt:
Dit lijkt mij logischer:

[CPP]Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Aantalhindernissen As Integer = Integer.Parse(txtAantalhindernissen.Text)
Dim Gewicht1zakjeGoud As Integer = Integer.Parse(txtGewicht1zakjeGoud.Text)
Dim Aantalzakjes As Integer = 1
Dim Totaalaantalzakjes As Integer
Dim Eindgewicht As Double
Dim zakjes As String = ""
Dim verdiendezakjes As String = ""

txtEindgewichtzakjes.Visible = True

For i As Integer = 0 To Aantalhindernissen Step 1
zakjes = Aantalzakjes
verdiendezakjes += ("Zakjes verdiend hindernis " & i & ": " & zakjes & vbNewLine)
Totaalaantalzakjes += Aantalzakjes
Aantalzakjes = Aantalzakjes * 2
Next

Eindgewicht = (Totaalaantalzakjes * Gewicht1zakjeGoud) / 1000

txtEindgewichtzakjes.Text = "Het eindgewicht bedraagt: " & Eindgewicht & " KG" & vbNewLine & "Het totale aantal zakjes bedraagt " & Totaalaantalzakjes

MessageBox.Show("Aantal hindernissen: " & Aantalhindernissen & vbNewLine & "Basisgewicht van één hoopje: " & Gewicht1zakjeGoud & vbNewLine & verdiendezakjes.ToString)
End Sub
End Class[/CPP]

Hier zit de verandering: "For i As Integer = 0 To Aantalhindernissen Step 1". Maar ik weet niet of je zo wel uitkomt. Het is even snel uit de losse pols veranderd...

Het is ook niet helemaal duidelijk wat de code moet doen. Dat maakt het voor ons ook moeilijker om een goede verbetering te geven.

MartinJM
 
Laatst bewerkt:
Jouw aanpassing werkt niet.

Even ter verduidelijking:

bij hindernis 1 heb je 1 zakje en dat moet bij hindernis 2 dan 2 (het moet telkens verdubbelen)

ook nog sreenshot van de FOUTE uitkomst:

Bekijk bijlage 169535

Mvg gast0187
 
Laatst bewerkt:
Hoi,

Hier is een werkende code:
[CPP]Dim HindernissenInput As String = TxtHindernissen.Text
Dim GewichtInput As String = TxtGram.Text

If Not IsNumeric(HindernissenInput) And Not IsNumeric(GewichtInput) And Not HindernissenInput = Nothing And Not GewichtInput = Nothing Then
MsgBox("Er moeten getallen ingevoerd worden.")
Exit Sub
End If

Dim Hindernissen As Integer = CInt(HindernissenInput)
Dim Gram As Double = CDbl(GewichtInput)
Dim TotaalGewicht As Double = 0
Dim EindTekst As String = Nothing

EindTekst &= "Aantal hindernissen: " & Hindernissen & vbNewLine
EindTekst &= "Gewicht van 1 hoopje goud: " & Gram & "gr." & vbNewLine

For i As Integer = 1 To Hindernissen Step 1
EindTekst &= "Hindernis " & i & " brengt " & 2 ^ i & " goud op." & vbNewLine
TotaalGewicht += Gram * (2 ^ i)
Next

EindTekst &= vbNewLine & "Totaal gewicht: " & TotaalGewicht

MsgBox(EindTekst)[/CPP]

Je hoeft alleen aan de bovenkant de namen van de textboxen aan te passen. Dan zou de hele code moeten werken.

MartinJM
 
ik krijg verschillende errors.

Maar kan je dit gewoon niet oplossen door de for-lus aan te passen mijn lus loopt goed, maar deze 2(kolom v zakes) moet omgekeerd
kan je dat niet in de for-lus aanpassen?

dit stukje aanpassen :

Code:
For i As Integer = Aantalhindernissen To Aantalzakjes Step -1
            'For i As Integer = 1 To Aantalhindernissen
            zakjes = Aantalzakjes
            verdiendezakjes += ("Zakjes verdiend hindernis " & i & ": " & zakjes & vbNewLine)
            Totaalaantalzakjes += Aantalzakjes
            Aantalzakjes = Aantalzakjes * 2
        Next

het is zakjes dat omgekeerd moet staan.(zakjes is de waarde van het groen/rode tekst (post #1) hierboven, moet wel het groene zijn!)

De bedoeling is in bijlage zie je de form en je ziet dus dat ik een foto heb hé op die foto staat een tekstbox die niet visible is.
en als ik op de knop 'Bereken Assets' druk komt die zichtbaar met het resultaat totale zakjes(Niet aantal zakjes per specifieke hindernis hier!)
en het gewicht van alle zakjes samen.(in KG)
(oorspronkelijk gewicht ingegeven in gram, omzetting is goed, code getest)

In jouw code is dat allemaal bij eindresultaat,

Dit stuk onder de tekstbox doet hij goed, het zijn de exact juiste waarden dus dwz bepaalde berekeningen in mijn for lus doet hij dus wel degelijk goed.

Er hoeft ook geen foutmelding voor als men geen getallen ingeeft, ik ga er vanuit dat de gebruiker effectief getallen ingeeft.

Mvg gast0187
 
Laatst bewerkt:
Er hoeft ook geen foutmelding voor als men geen getallen ingeeft, ik ga er vanuit dat de gebruiker effectief getallen ingeeft.

Je moet als developer je software altijd 'foolproof' maken.

Verder is het zo dat het aantal zakjes exponentieel groeit?

nZakjes = 2 ^ nHindernis
 
Idd, het aantal zakjes groeit exponentieel.
maar eerst moet het van hindernis 5 worden weergegeven met grootste aantal zakjes dus naar laagste tot hindernis 1.

Over foolproof --> Dit programma is gemaakt om alleen ik te gebruiken en niet door anderen(ik zet deze niet online of wat dan ook?), en aangezien ik de enige gebruiker ben ga ik alle velden correct invullen.
 
Maar dan is het toch niet moeilijk?

[cpp]Dim nHindernis = 5
Dim outp As String = ""
For i As Integer = nHindernis - 1 To 0 Step -1
outp &= "Hindernis " & i.ToString() & ":" & (2 ^ i).ToString() & vbNewLine
Next[/cpp]
 
Nu krijg ik dit:

Zakjes verdiend hindernis 4: 16
Zakjes verdiend hindernis 3: 8
Zakjes verdiend hindernis 2: 4
Zakjes verdiend hindernis 1: 2
Zakjes verdiend hindernis 0: 1

Ik wil:

Zakjes verdiend hindernis 5: 16
Zakjes verdiend hindernis 4: 8
Zakjes verdiend hindernis 3: 4
Zakjes verdiend hindernis 2: 2
Zakjes verdiend hindernis 1: 1

Nieuwe code:

Code:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Aantalhindernissen As Integer = Integer.Parse(txtAantalhindernissen.Text)
        Dim Gewicht1zakjeGoud As Integer = Integer.Parse(txtGewicht1zakjeGoud.Text)
        Dim Aantalzakjes As Integer = 1
        Dim Totaalaantalzakjes As Integer
        Dim Eindgewicht As Double
        Dim verdiendezakjes As String = ""

        txtEindgewichtzakjes.Visible = True

        For i As Integer = Aantalhindernissen - 1 To 0 Step -1
            'For i As Integer = 1 To Aantalhindernissen
            verdiendezakjes += ("Zakjes verdiend hindernis " & i.ToString() & ":" & (2 ^ i).ToString() & vbNewLine)
            Totaalaantalzakjes += Aantalzakjes
        Next

        Eindgewicht = (Totaalaantalzakjes * Gewicht1zakjeGoud) / 1000

        txtEindgewichtzakjes.Text = "Het eindgewicht bedraagt: " & Eindgewicht & " KG" & vbNewLine & "Het totale aantal zakjes bedraagt " & Totaalaantalzakjes

        MessageBox.Show("Aantal hindernissen: " & Aantalhindernissen & vbNewLine & "Basisgewicht van één hoopje: " & Gewicht1zakjeGoud & vbNewLine & verdiendezakjes.ToString)
    End Sub
End Class
 
Laatst bewerkt:
Verander dit:
[cpp]outp &= "Hindernis " & i.ToString() & ":" & (2 ^ i).ToString() & vbNewLine[/cpp]

naar:
[cpp]outp &= "Hindernis " & (i + 1).ToString & ":" & (2 ^ (i)).ToString() & vbNewLine[/cpp]
 
Laatst bewerkt:
Nu krijg ik dit:

Zakjes verdiend hindernis 5: 32
Zakjes verdiend hindernis 4: 16
Zakjes verdiend hindernis 3: 8
Zakjes verdiend hindernis 2: 4
Zakjes verdiend hindernis 1: 2
 
Dan doe je iets verkeerd.
Dit werkt gewoon bij mij:

[cpp]Dim nHindernis = 5
Dim outp As String = ""
For i As Integer = nHindernis - 1 To 0 Step -1
outp &= "Hindernis " & (i + 1).ToString & ": " & (2 ^ (i)).ToString() & vbNewLine
Next
MsgBox(outp)[/cpp]
 
Je hebt gelijk , Bedankt.

Maar nu ontstaat er een ander probleem,

nu kloppen het totale gewicht(in KG), en het totale aantal zakjes niet meer.

Code:
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Aantalhindernissen As Integer = Integer.Parse(txtAantalhindernissen.Text)
        Dim Gewicht1zakjeGoud As Integer = Integer.Parse(txtGewicht1zakjeGoud.Text)
        Dim Aantalzakjes As Integer = 1
        Dim Totaalaantalzakjes As Integer
        Dim Eindgewicht As Double
        Dim verdiendezakjes As String = ""

        txtEindgewichtzakjes.Visible = True

        For i As Integer = Aantalhindernissen - 1 To 0 Step -1
            'For i As Integer = 1 To Aantalhindernissen
            verdiendezakjes += ("Zakjes verdiend hindernis " & (i + 1).ToString & ": " & (2 ^ (i)).ToString() & vbNewLine)
            Totaalaantalzakjes += Aantalzakjes
        Next

        Eindgewicht = (Totaalaantalzakjes * Gewicht1zakjeGoud) / 1000

        txtEindgewichtzakjes.Text = "Het eindgewicht bedraagt: " & Eindgewicht & " KG" & vbNewLine & "Het totale aantal zakjes bedraagt " & Totaalaantalzakjes

        MessageBox.Show("Aantal hindernissen: " & Aantalhindernissen & vbNewLine & "Basisgewicht van één hoopje: " & Gewicht1zakjeGoud & vbNewLine & verdiendezakjes.ToString)
    End Sub
End Class

Mvg gast0187
 
Gebruik deze code:
[CPP]Dim nHindernis = 5
Dim outp As String = ""
For i As Integer = nHindernis To 1 Step -1
outp &= "Hindernis " & i.ToString() & ":" & (2 ^ i).ToString() & vbNewLine
Next[/CPP]

Het is JoZ' code, maar dan een beetje aangepast...

MartinJM
 
Probleem opgelost:

ik heb er dit van gemaakt:

Code:
For i As Integer = Aantalhindernissen - 1 To 0 Step -1
            Aantalzakjes = (2 ^ (i))
            verdiendezakjes += ("Zakjes verdiend hindernis " & (i + 1).ToString & ": " & Aantalzakjes.ToString & vbNewLine)
            Totaalaantalzakjes += Aantalzakjes
        Next
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan