Kann man eine Select Case Anweisung mit mehreren Bedingungen anwenden ?

  • VB6

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Kann man eine Select Case Anweisung mit mehreren Bedingungen anwenden ?

    Hey,

    ich habe so ein Aufgabenzettel von der Schule bekommen, in dem wir ein Programm erstellen sollen, welches den Verbrauch eines Autos, den Rechnungspreis für das Getankte Benzin und die Gefahrenen Kilometer ausrechnet. Bei einem bestimmten Verbrauch auf 100 Liter gewährt der Staat einen Abschlag oder er nimmt einen Zuschlag. ( Schön wäre es :D)

    Eingabedaten sind :
    Kilometerstand alt
    Kilometerstand neu
    Benzinpreis pro Liter
    Getankte Literzahl

    Ausgabedaten sind :
    Gefahrenen Kilometer
    Verbrauch pro 100km
    Rechnungspreis ohne ZU/Abschlag
    Rechnungspreis mit ZU/Abschlag

    Nun wollte ich mal fragen, ob das geht, wenn ich die Abfrage über den Verbrauch in eine SELECT CASE Anweisung schreibe ? Die im folgenen Code hat immer nur den ersten Fall gewählt.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim sngKilometerstandAlt As Single
    3. Dim sngKilometerstandNeu As Single
    4. Dim sngPreisProLiter As Single
    5. Dim sngGetankteLiter As Single
    6. Dim sngGefahreneKilometer As Single
    7. Dim sngVerbrauchAuf100Km As Single
    8. Dim sngRechnungspreisOhne As Single
    9. Dim sngRechnungspreis As Single
    10. Dim sngRechnungspreisMit As Single
    11. Private Sub cmdBerechnen_Click()
    12. sngKilometerstandAlt = CSng(txtKilometerstandAlt.Text)
    13. sngKilometerstandNeu = CSng(txtKilometerstandNeu.Text)
    14. sngPreisProLiter = CSng(txtBenzinpreisProLiter.Text)
    15. sngGetankteLiter = CSng(txtGetankteLiter.Text)
    16. sngRechnungspreisOhne = sngPreisProLiter * sngGetankteLiter
    17. sngGefahreneKilometer = sngKilometerstandNeu - sngKilometerstandAlt
    18. sngVerbrauchAuf100Km = sngGetankteLiter * 100 / sngGefahreneKilometer
    19. If sngVerbrauchAuf100Km < 5 Then
    20. sngRechnungspreis = sngRechnungspreisOhne * 20 / 100
    21. sngRechnungspreisMit = sngRechnungspreisOhne - sngRechnungspreis
    22. ElseIf sngVerbrauchAuf100Km >= 5 And sngVerbrauchAuf100Km <= 7 Then
    23. sngRechnungspreis = sngRechnungspreisOhne * 10 / 100
    24. sngRechnungspreisMit = sngRechnungspreisOhne - sngRechnungspreis
    25. ElseIf sngVerbrauchAuf100Km >= 9 And sngVerbrauchAuf100Km <= 11 Then
    26. sngRechnungspreis = sngRechnungspreisOhne * 10 / 100
    27. sngRechnungspreisMit = sngRechnungspreisOhne + sngRechnungspreis
    28. Else
    29. sngRechnungspreis = sngRechnungspreisOhne * 20 / 100
    30. sngRechnungspreisMit = sngRechnungspreisOhne + sngRechnungspreis
    31. End If
    32. ' Select Case sngVerbrauchAuf100Km
    33. ' Case Is < 5
    34. ' sngRechnungspreis = sngRechnungspreisOhne * 20 / 100
    35. ' sngRechnungspreisMit = sngRechnungspreisOhne - sngRechnungspreis
    36. ' Case Is >= 5 <= 7
    37. ' sngRechnungspreis = sngRechnungspreisOhne * 10 / 100
    38. ' sngRechnungspreisMit = sngRechnungspreisOhne - sngRechnungspreis
    39. ' Case Is >= 9 <= 11
    40. ' sngRechnungspreis = sngRechnungspreisOhne * 10 / 100
    41. ' sngRechnungspreisMit = sngRechnungspreisOhne + sngRechnungspreis
    42. ' Case Is > 11
    43. ' sngRechnungspreis = sngRechnungspreisOhne * 20 / 100
    44. ' sngRechnungspreisMit = sngRechnungspreisOhne + sngRechnungspreis
    45. ' End Select
    46. txtGefahreneKilometer.Text = Format(sngGefahreneKilometer, "0.00 KM")
    47. txtVerbrauchAuf100Km.Text = Format(sngVerbrauchAuf100Km, "0.00 l")
    48. txtRechnungspreisOhne.Text = Format(sngRechnungspreisOhne, "0.00 €")
    49. txtRechnungspreisMit.Text = Format(sngRechnungspreisMit, "0.00 €")
    50. End Sub

    Dennis336 schrieb:

    Nun wollte ich mal fragen, ob das geht, wenn ich die Abfrage über den Verbrauch in eine SELECT CASE Anweisung schreibe ?
    dassis eine gute Idee.
    Dabei musste aber die reihenfolge der Cases richtig anlegen. Also bei Case Is < Wert müssen die kleinsten Werte zuerst abgeprüft werden. Und Werte, die größer sind als alles vorgesehene können als letztes mit
    Case Else behandelt werden.
    Hallo Dennis336,
    das geht mit to:

    Visual Basic-Quellcode

    1. Select Case sngVerbrauchAuf100Km
    2. Case Is < 5
    3. sngRechnungspreis = sngRechnungspreisOhne * 20 / 100
    4. sngRechnungspreisMit = sngRechnungspreisOhne - sngRechnungspreis
    5. Case 5 To 7
    6. sngRechnungspreis = sngRechnungspreisOhne * 10 / 100
    7. sngRechnungspreisMit = sngRechnungspreisOhne - sngRechnungspreis
    8. Case 9 To 11
    9. sngRechnungspreis = sngRechnungspreisOhne * 10 / 100
    10. sngRechnungspreisMit = sngRechnungspreisOhne + sngRechnungspreis
    11. Case Is > 11
    12. sngRechnungspreis = sngRechnungspreisOhne * 20 / 100
    13. sngRechnungspreisMit = sngRechnungspreisOhne + sngRechnungspreis
    14. Case Else
    15. MsgBox "Fehler", vbExclamation + vbOKOnly
    16. End Select
    Gruss,

    Neptun
    jo, select case bietet viele Möglichkeiten, die man auch noch bunt miteinander kombinieren kann.

    imo am einfachsten ist jedoch nachwievor, wennman sich auf nur ein Prinzip beschränkt, nämlich Case Is < / Case Is <=.

    Damit kannman den gesamten Bereich abdecken, und zwar ohne Überlappungen oder Lücken.

    Etwa in Neptuns Sample werden Verbräuche zw. 7 und 9 Litern als Fehler eingestuft, was glaub nicht Sinn der Sache ist.
    @ErfinderDesRades :
    Etwa in Neptuns Sample werden Verbräuche zw. 7 und 9 Litern als Fehler eingestuft, was glaub nicht Sinn der Sache ist.

    Das stimmt nicht. Der Code ist korrekt. Wenn das nicht funktionieren würde,
    wäre diese Art der Abfrage unbrauchbar. Es kann höchstens sein, dass
    der getestete Wert ungenau ist und intern z.B. als 6,99999... abgelegt ist.
    Wenn also 6,99999.. als 7 interpretiert werden soll, kann man die Werte
    mit Round runden, oder einen genaueren Variablentyp verwenden z.B. Double.
    Vergleich mit Runden geht so:

    Visual Basic-Quellcode

    1. Select Case Round(sngVerbrauchAuf100Km, 3)
    Gruss,

    Neptun

    Neptun schrieb:


    Visual Basic-Quellcode

    1. Case 5 To 7
    2. sngRechnungspreis = sngRechnungspreisOhne * 10 / 100
    3. sngRechnungspreisMit = sngRechnungspreisOhne - sngRechnungspreis
    4. Case 9 To 11
    5. sngRechnungspreis = sngRechnungspreisOhne * 10 / 100
    6. sngRechnungspreisMit = sngRechnungspreisOhne + sngRechnungspreis


    Du hast vergessen den Bereich von 7 bis 9 zu deklarieren, deswegen würde das Programm im "Case Else" landen.
    Bei solchen Sachen ist es immer gut, den Code mal durchzusteppen und sich davon zu überzeugen, dass der Code arbeitet, wie er soll.
    Also: Eine Testprozedur bauen, die den zu testenden Code mit hinreichend vielen Möglichkeiten aufruft, so dass Du Dich von der Richtigkeit Deines Codes überzeugen kannst.
    Dann fällt Dir nämlich sofort auf, was @sonne75: geschrieben hat.
    Für Testzwecke ist dann im Else-Zweig mindestens ein Haltepunkt, besser eine Exception, angesagt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!