Guthaben abziehen nach beliebiger Zeit!

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Cheffboss.

    Guthaben abziehen nach beliebiger Zeit!

    Moin! :)
    Ich habe ein Programm in dem der User Guthaben aufladen kann.
    Das Guthaben wird dann jede Sekunde abgezogen.
    Im meinen Code gibt es folgende Zeilen.
    Die Variable „Minuten“ und die Variable „JedeSekunde“.
    Für 60 Minuten, habe ich den passenden Code geschrieben, ebenfalls für 30 Minuten.
    Es fehlt nun noch der Code für 1 Minute.
    Mein Wunsch wäre, dass jede beliebige Zeit einstellbar ist.
    Da der User später die Surfkosten selber bestimmen soll. :!:
    Wer Sieht im Code eine Mathematische Lösung um das Problem schnell zu beheben? :?:
    Freue mich auf eure Hilfe!
    BIG THX

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim guthaben As Decimal = CDec(1.0) ' 1 Euro
    4. Dim JedeSekunde As Decimal : Dim Minuten As Decimal
    5. Private Sub ZeitenBerechnen()
    6. ' Wichtig...
    7. Const wert As String = "60min" '<--- (HIER ÄNDERN)
    8. Select Case wert
    9. Case "60min" ' OK?
    10. Minuten = 60 ' 60 Minuten
    11. JedeSekunde = CDec((0.0001)) * 1 ' * 1 Stunde
    12. Case "30min" ' OK?
    13. Minuten = 30 ' 30 Minuten
    14. JedeSekunde = CDec((0.0001 / 2)) ' / ½ Stunden
    15. Case "1min" ' ?
    16. ' Wer kann mir weiter helfen?
    17. ' usw...
    18. End Select
    19. ' Werteberechnen...
    20. Dim Surfzeit As String = (guthaben * CDec(Minuten)).ToString("0#.#0")
    21. guthaben -= Decimal.Parse(JedeSekunde.ToString)
    22. ' Anzeigen...
    23. Me.Text = String.Format("Surfzeit:{0}{1} min", vbNewLine, Surfzeit)
    24. End Sub
    25. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    26. ZeitenBerechnen()
    27. End Sub
    28. End Class


    *Codepassagen wiederhergestellt* ~NoFear23m
    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Nofear23m“ ()

    Cheffboss schrieb:

    Da der User später die Surfkosten selber bestimmen soll.
    Null! Ich will gar nix zahlen!

    Surfzeit in Minuten = Guthaben in Euro : Kosten pro Minute in Euro*
    gilt effektiv immer - naja, außer bei Flatrate

    Was soll denn JedeSekunde darstellen? Kosten pro Sekunde? Dann sollte sie auch so heißen. Ich korrigiere. Sie sollte z.B. KostenProSekundeInEuro heißen. Oder KostenProSekundeInCent. Aber abhängig vom Namen muss dann natürlich korrekt gerechnet werden.

    ##########

    * und damit gilt nach Gleichungsumstellung: Kosten pro Minute in Euro = Startguthaben in Euro : Surfzeit in Minuten
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Cheffboss schrieb:

    VB.NET-Quellcode

    1. Dim guthaben As Decimal = CDec(1.0) ' 1 Euro
    machst Du

    VB.NET-Quellcode

    1. Dim guthaben As Decimal = 1.0D ' 1 Euro
    usw.
    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!
    @VaporiZed
    Jede Sekunde wird das Guthaben abgezogen.
    Stimmt, die Variable JedeSekunde habe ich schlecht benannt.
    Habe den Code nun verbessert.

    @RodFromGermany
    Bedeutet das 1.0D ein Convert in Decimal?
    Da mir dies noch nicht bekannt ist.

    @an alle
    Ich habe im Anhang ein Screenshot hochgeladen.
    Man sieht eine Windows-Form in dieser man einen beliebigen Betrag, für eine Surfsitzung angeben kann.
    Im diesem Beispiel 1 Stunde, für einen Euro.
    Da ich leider den Rechenweg nicht kenne.
    Würde ich mich sehr freuen wenn ein Mathe Genie, mir helfen kann.
    Im meinen Code sieht man, was ich bereits verzweifelt versucht habe.

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. SurfgebührenFestlegen(Me.NumericUpDown1.Value) ' Gebühren pro Stunde....
    5. End Sub
    6. Dim KostenProSekundeInCent As Decimal : Dim Minuten As Decimal
    7. Private Sub SurfgebührenFestlegen(wert As Decimal)
    8. Minuten = wert * 60 ' beliebge Minuten
    9. KostenProSekundeInCent = CDec((0.0001)) '* ? ' * ? <---- BUG!?
    10. End Sub
    11. End Class


    vb-paradise.de/index.php/Attac…0e762dfd469070a7dc6812a36

    *Codepassagen wiederhergestellt* ~NoFear23m
    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Nofear23m“ ()

    Cheffboss schrieb:

    Bedeutet das 1.0D ein Convert in Decimal?
    Nein, das ist eine Ansage an den Compiler: "Hey, das hier ist ne Decimalzahl." Damit machst Du dem Compiler klar, was Du meinst. (Übrigens wird dann bei mir 1.0D gleich in 1D umgewandelt, aber egal.)
    Bezüglich Rechenweg: WTF?!? Das hatten wir doch schon im anderen Thread. Eine Stunde hat wieviele Sekunden? Richtig! 3600. Daher Surfkosten pro Stunde geteilt durch Sekunden pro Stunde = Surfkosten pro Sekunde. Also 1 € pro Stunde : 3600 Sekunden pro Stunde = 1 € : 3600 Sekunden = 100 Cent:3600 Sekunden = 1:36 Cent pro Sekunde = 0,02777777... Cent pro Sekunde.
    Und jetzt ersetzt Du den 1 € bzw. die 100 Cent durch Deinen SurfkostenpreisProStunde und fertig.

    btw. was ist vale

    Cheffboss schrieb:

    Private Sub SurfgebührenFestlegen(vale As Decimal)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Noch eine Warnung:
    Ein Timer mit Einsekunden-Tick ist OK für die Anzeige der Verbrauchskosten.
    Aber viel zu ungenau, um in die Berechnung einzufließen.

    Deshalb: Die Startzeit merken und bei jeder Berechnung die seither vergangene Zeit heranziehen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Cheffboss schrieb:

    Bedeutet das 1.0D ein Convert in Decimal?
    Gugst Du hier: docs.microsoft.com/de-de/dotne…ata-types/type-characters
    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!
    Ich habe den Code nun soweit.
    Das Guthaben wird abgezogen.
    Weiß jemand wie man die übrige Surfzeit anzeigen lassen kann? ?(

    edit1: code verbessert

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Dim guthaben As Decimal = 1D
    4. Dim KostenProSekundeInCent As Decimal
    5. Private Sub ZeitenBerechnen()
    6. 'Surfkosten pro Stunde geteilt durch Sekunden pro Stunde
    7. KostenProSekundeInCent = Me.NumericUpDown1.Value / 3600
    8. ' Werteberechnen...
    9. Dim Surfzeit As Decimal = guthaben * Me.NumericUpDown1.Value * 60
    10. ' Betrag abziehen...
    11. guthaben -= KostenProSekundeInCent
    12. ' Anzeigen...
    13. Me.Text = String.Format("Surfzeit:{0}{1} min", Environment.NewLine, Surfzeit.ToString("0#.#0"))
    14. End Sub
    15. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    16. Timer1.Interval = 1000
    17. Timer1.Enabled = True
    18. End Sub
    19. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    20. ZeitenBerechnen()
    21. End Sub
    22. Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
    23. MessageBox.Show(guthaben.ToString)
    24. End Sub
    25. End Class


    *Codepassagen wiederhergestellt* ~NoFear23m
    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Nofear23m“ ()

    Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden. Stichwort MsgBox und vbNewLine.
    guthaben -= Decimal.Parse(KostenProSekundeInCent.ToString) :?: KostenProSekundeInCent ist doch schon vom Typ Decimal, was soll also der Blödsinn?
    Was meinst Du mit <--- BUG!? Wäre produktiver, wenn Du mehr Infos darüber gibst, was da Deines Erachtens ein Bug ist.
    Wieso ist Surfzeit ein String? Das Ding ist das Ergebnis einer Berechnung! Schön formatieren kann man später bei der Textausgabe ne Zahl immer noch.
    Z#18: Arbeite mit interpolierten Strings: Me.Text = $"Surfzeit:{Environment.NewLine}{Surfzeit} min")
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Danke, für deine Hilfe. :thumbup:
    Habe den Code nun verbessert.

    @an alle
    Nun zum Bug:
    Wenn ich in die Textbox1 eine 1.00 eintrage, für eine Stunde.
    Wird die Surfzeit richtig abgezogen.
    Wenn ich aber nun im Textfeld eine 2.00 eingebe.
    Zeigt es dann zum Beispiel 119,07min an, und überspringt einige Zahlen.
    Wenn ich aber nun 0,01 eingebe, bleibt die Surfzeit stehen.
    Bei 00,60min, und es passiert nix. :!:
    Das Guthaben wird aber weiter abgezogen.
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Dann musst Du Deinen Code mal durchsteppen und halt den Variablen Deine Testwerte zuweisen, mit denen Du dann weiterrechnest.
    Debuggen, Fehler finden und beseitigen
    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!
    Hatte ich schon mal erwähnt, dass es Blödsinn ist, die Surfzeit aus dem Guthaben zu berechnen, wenn das Guthaben sich im ungenauen Sekundentakt des Timers reduziert?

    Das einzige was genau ist, ist die Surfzeit.
    Nämlich die vergangene Zeit seit Programmstart.

    Und daraus muss sich das Guthaben berechnen, nicht umgekehrt.

    Aber du darfst das auch gerne ignorieren.
    Nochmals weise ich nicht darauf hin.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @an alle
    Jetzt könnte ich das Problem endlich lösen.
    Lösung Siehe im Code unten.
    Nochmals Vielen Dank, für eure Hilfe. :thumbup:

    VB.NET-Quellcode

    1. ' Restliches Guthaben in verbleibende Zeit umwandeln...
    2. Dim dtRestlicheZeit As DateTime
    3. dtRestlicheZeit = dtRestlicheZeit.AddSeconds(guthaben / (Me.NumericUpDown1.Value / 3600))
    4. Me.Label2.Text = dtRestlicheZeit.ToLongTimeString

    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Cheffboss“ ()

    @Cheffboss bitte darum das Toteditieren zu unterlassen damit andere später auch den Verlauf (auch Code zählt da dazu) nachvollziehen können.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##