For Schleife mit mehreren Bedingungen

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    For Schleife mit mehreren Bedingungen

    Hallo,
    ich habe da ein kleines Problem.

    Folgender Code:

    VB.NET-Quellcode

    1. For i = 5000 To 35000 Step 3000
    2. If (i <= 12000) Then
    3. i = i * 0.12
    4. lblAusgabe.Text = (i & " Test")
    5. ElseIf (i >= 12000) Then
    6. i = i * 0.15
    7. ElseIf (i >= 20000) Then
    8. i = i * 0.2
    9. ElseIf (i >= 30000) Then
    10. i = i * 0.25
    11. Else
    12. End If
    13. lblAusgabe.Text = (i)
    14. Next i



    Ich möchte lediglich das er ab 5000 Euro in 3000 Schritten bis 35000 Euro die Rechnung in der i steht ausführt und dann am Ende ausgibt in den Label der in der Form Anwendung drin ist.

    Also sollten von 5000 bis 35000 mehrere Ausgaben stattfinden in der jeweiligen Rechnung.

    Habe auch eine Select Case versucht, vergeblich.

    Wäre super wenn mir da jemand behilflich wäre, da ich nicht weiter komme. Danke!

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Habe es nun so:

    VB.NET-Quellcode

    1. For i = 5000 To 35000 Step 3000
    2. If (i <= 12000) Then
    3. i = i * 0.12
    4. ElseIf (i >= 30000) Then
    5. i = i * 0.25
    6. ElseIf (i >= 20000) Then
    7. i = i * 0.2
    8. ElseIf (i >= 12000) Then
    9. i = i * 0.15
    10. Else
    11. End If
    12. lblAusgabe.Text = (i)
    13. Next i


    Also umgedreht die Reihenfolge?
    Das Problem ist aber das die Forms anwendung beim drücken des Buttons einfach sich aufhängt, ich vermut endlosschleife?





    EDIT:

    Nächste Lösung:

    VB.NET-Quellcode

    1. For i = 5000 To 35000 Step 3000
    2. If (i <= 12000) Then
    3. i = i * 0.12
    4. ElseIf (i >= 12000 And i <= 20000) Then
    5. i = i * 0.15
    6. ElseIf (i >= 20000 And i <= 30000) Then
    7. i = i * 0.2
    8. ElseIf (i >= 30000 And i <= 35000) Then
    9. i = i * 0.25
    10. Else
    11. End If
    12. lblAusgabe.Text = (i)
    13. Next i


    Die Form hängt aber und er zeigt nichts an.
    Das Problem ist, dass du i innerhalb der Schleife veränderst, so dass du nie auf 35000 kommst.
    Speichere das Ergebnis in einer Variablen zwischen und nimm nicht den Schleifenzähler dafür.

    Wenn du die Schleife im Debugger durchgesteppt hättest, wäre das sicher ganz schnell aufgefallen.

    Außerdem wird das Label immer nur den letzten Wert anzeigen.
    Schreib einfach mal in Prosa nieder, was du erreichen möchtest und setze es dann erst in Code um.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Wie soll ich das außerhalb der Schleife deklarieren?

    Ich komme nicht mehr mit...
    Ich möchte lediglich das ein paar Zeilen ausgegeben werden, wo einfach die If verzweigungen und das jeweilige ergebnis der rechnung angezeigt wird.
    muss ich mehrere labels machen?

    kann mir da mal einer helfen...
    Schau, ich möchte beispielsweise das die For Schleife von 5000 bis 35000 in 3000er Schritten hochzählt und folgende Faktoren berücksichtigt bei der Ausgabe.

    Sobald die Schleife bei kleiner 12000 ist, soll sie den Wert der schleife mit 0,12 multiplizieren und dies ausgeben in der Form
    Dann nochmal... Sobald die Schleifenzahl größer als 12000 ist bis 20000 dann soll sie die Schleifenzahl mit 0.15 multiplizieren und ausgeben

    Und dann nochmal das gleiche... Wenn die Schleifenzahl größer als 20000 ist aber nicht größer als 30000 soll sie mit 0,2 mutliplizieren und diese ausgeben...

    Ich denke es ist leicht umsetzen und ich habe einen Logikfehler drin...

    Er gibt mir zurzeit gar nix aus, die Formanwendung hängt einfach wenn ich auf Berechnen drücke.. Da muss ein Fehler drin sein...
    Wie würdet ihr das mit der For Schleife lösen?
    @Parmaster 2. stimmt zwar, aber int sollte problemlos in string umgewandelt werden

    du solltest es einfach so machen wie angesprochen, außerhalb deiner Schleife eine variable deklarieren und diese dann in der schleife setzt:

    VB.NET-Quellcode

    1. Dim variable As Integer
    2. For i = 5000 To 35000 Step 3000
    3. If (i <= 12000) Then
    4. variable = i * 0.12
    5. ElseIf (i >= 12000 And i <= 20000) Then
    6. variable = i * 0.15
    7. ElseIf (i >= 20000 And i <= 30000) Then
    8. variable = i * 0.2
    9. ElseIf (i >= 30000 And i <= 35000) Then
    10. variable = i * 0.25
    11. End If
    12. lblAusgabe.Text = CStr(variable )
    13. Next i
    Jo schon, soll man aber nicht machen, da Option Strict Off.

    Und in deinem Code ist auch noch der logische Fehler, dass die Variable variable immer kleiner wird anstatt größer.


    EDIT:

    hier mal mein Code. Das Sleep ist nur drin um zu sehen welche Werte zwischenzeitlich angenommen werden.

    VB.NET-Quellcode

    1. Dim zaehler As Int32
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. For i = 5000 To 35000 Step 3000
    4. zaehler = i
    5. If (i <= 12000) Then
    6. zaehler = zaehler * 0.12
    7. ElseIf (i >= 12000 And i <= 20000) Then
    8. zaehler = zaehler * 0.15
    9. ElseIf (i >= 20000 And i <= 30000) Then
    10. zaehler = zaehler * 0.2
    11. ElseIf (i >= 30000 And i <= 35000) Then
    12. zaehler = zaehler * 0.25
    13. Else
    14. End If
    15. lblAusgabe.Text = Convert.ToString(zaehler)
    16. lblAusgabe.Update()
    17. Threading.Thread.Sleep(2000)
    18. Next
    19. End Sub
    @Parmaster: wieso weist du auf Option Strict On hin und willst dann noch im selben Post eine Gleitkommazahl in einen Integer schreiben? :D

    @programmofficer: das Label ist das falsche Control, um mehrere Ergebnisse anzuzeigen, denn es kann nur einen String anzeigen und der sollte designmäßig auch nicht zu groß und zeilenübergreifend werden. Dein Ansatz führt ja nur dazu, dass das Ergebnis des letzten Schleifendurchlaufes sofort überschrieben wird und du am Ende nur das letzte Ergebnis im Label hast.

    Der richtige Ansatz sollte also sein, die Ergebnisse jedes Durchlaufes in einer Auflistung (Array, List, IEnumerable) zu speichern und diese am Ende im richtigen Control ausgeben zu lassen, zB. im Datagridview.
    CStr(), Convert.ToString() seriously?
    wenn ich nicht irre haben selbst die primitiven Datentypen in .Net eine Funktion namens .ToString().
    etwas wie 1.ToString() sollte demnach problemlos Funktionieren.

    Parmaster schrieb:

    Und in deinem Code ist auch noch der logische Fehler, dass die Variable variable immer kleiner wird anstatt größer.

    Du und @Goldwing Studios machen exakt das selbe. Nur dass du einen Schritt mehr drin hast.
    ebenso wird sich der User freuen wenn seine Form im dauerfreeze ist, da du sie mehrfach für 2 sek schlafen lässt.

    Interessant wäre in diesem Fall sicherlich auch eine ListBox die per Items.Add() dann die werte untereinander auflistet.
    @Counterbug

    da hast du recht, war natürlich blöd von mir.

    @EaranMaleasi

    Ist doch egal ob man es so oder so macht.

    Und wo machen wir beide exakt das selbe?

    Und dass das Label nicht dafür geeignet ist, ist wohl klar, und genau deshalb ist das Sleep drin, nur um zu zeigen das sich zwischenzeitlich auch die Werte ändern. Steht aber auch exakt so oben.