Parkschein Automat
lima-city → Forum → Programmiersprachen → Basic
aufrufen
betrag
cent
code
einwurf
endlosschleife
funktion
geld
jemand
parkschein
passieren
problem
rechnung
schleife
schleifen
text
textfeld
url
warten
zahl
-
Hallo Leute, ich bin leider völlig durcheinander gekommen mit einem Projekt. Und zwar sollte man eine Parkuhr Programmieren (wir haben den Münzeinwurf als Textfeld dargestellt)
Dazu hab ich mir folgende Funktion geschrieben:
Function Rechnung() If IsNumeric(txt_einwurf.Text) Then txt_restgeld.Text = Val(txt_kosten.Text) - Val(txt_einwurf.Text) If txt_restgeld.Text = 0 Then MsgBox("Ihr Parkschein wird gedruckt.", MsgBoxStyle.OkOnly, "Bitte warten...") txt_restgeld.Text = "" ElseIf txt_restgeld.Text > 0 Then MsgBox("Bitte mehr Geld einwerfen.", MsgBoxStyle.OkOnly, "Fehler...") txt_zws.Text = txt_restgeld.Text txt_einwurf.Text = "" txt_restgeld.Text = "" txt_restgeld.Text = Val(txt_zws.Text) - Val(txt_einwurf.Text) If txt_restgeld.Text = 0 Then MsgBox("Ihr Parkschein wird gedruckt", MsgBoxStyle.OkOnly, "Bitte warten...") End If End If End If End Function
Diese sagt aus, wenn der Text numerisch ist, dann ist das Restgeld gleich die kosten minus den einwurf. Wenn null dann wird Parkschein gedruckt (funzt) wenn zu wenig Geld dann bitte mehr geld einwerfen, das restgeld zwischenspeichern in eine unsichtbare Textbox, den Einwurf und das Restgeld leeren(funzt nicht) und neu berechnen (funzt wiederum). Wenn dann 0 Dann drucke parkschein (funzt dementsprechend auch nicht).
Das ganze sollte mit If anweisungen und nicht mit For oder While schleifen realisiert werden und ist in VB geschrieben.
Kann mir jemand helfen, das ist der reinste Schrott den ich da proggt habe -.- -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
kill-a-teddy schrieb:
Ganzs ohne Schleife wirst du da ja wohl nicht zurecht kommen, da ja solange Geld nachgeworfen werden muss bis der eingeworfene Betrag >= Rechnungsbetrag, Übrigens ist auch ein in VB ja afair immernoch zugelassenes GoTo (sollte imho verboten werden) durchaus in der Lage eine manuelle Schleife zu erzeugen. Kannst du den Grund benennen warum keine Schleife verwendet werden soll?
Das ganze sollte mit If anweisungen und nicht mit For oder While schleifen realisiert werden und ist in VB geschrieben. -
Hi Kill-a-tedy,
Kann mir jemand helfen, das ist der reinste Schrott den ich da proggt habe -.-
... und nicht nur das, auch Deine Beschreibung, was Du eingentlich willst scheint mir etwas wirr zu sein.
Ich mache mal folgende Annahmen, da Du das ja leider weder formuliert oder als Code mitgeschickt hast:
Der Anwender kann den Einwurfbetrag in das Textfeld txt.einwurf schreiben und klickt dann auf einen Knopf "Zahlen" oder sowas in der Art. Dadurch wird dann Deine Funktion "Rechnung" aufgerufen. Wenn noch ein Betrag nach zu zahlen ist, dann muss wieder ein Wert eingetragen werden und "Rechnung" erneut ausgeführt. Was Du mit dem Zwischenspeicherfeld willst, weiß ich nicht, Der Code muss dann so aussehen:
Function Rechnung() If IsNumeric(txt_einwurf.Text) Then txt_restgetld.Text = Val(txt_kosten.Text) - Val(txt_einwurf.Text) If txt_restgeld.Text = 0 Then MsgBox("Ihr Parkschein wird gedruckt.", MsgBoxStyle.OkOnly, "Bitte warten...") txt_restgeld.Text = "" ElseIf txt_restgeld.Text > 0 Then MsgBox("Bitte mehr Geld einwerfen.", MsgBoxStyle.OkOnly, "Fehler...") End If Else ' Hier muss dann noch die Logik rein für Geld rausgeben, falls zuviel eingezahlt wurde, oder willst Du das dann behalten? End If End If End Function
Liebe Grüße
BigBaer -
bigbaer schrieb:
Was Du mit dem Zwischenspeicherfeld willst, weiß ich nicht, Der Code muss dann so aussehen: [...]
Das ist ja nicht anderes, als das was ich sowieso schon hatte. Das Problem bleibt und zwar, dass es eine Endlos-Ausgabe sein könnte... Hat jemand z.B. 10 Euro und will die nur in 1 Cent stücken bezahlen, dann hat er nach dem 1. Cent entweder die Schleife neu angefangen oder bekommt sein Parkticket schon.. -
Irgendwie hat dein Programm noch keinen wirklichen Sinn. Wenn ich das recht verstehe, wird die Funktion aufgerufen, wenn du auf einen Button klickts? Dann brauchst du doch eh keine Schleifen und das Restgeld kannst du auch stehen lassen, das zu leeren ist eigentlich recht doof. Ansonsten könntest du das Restgeld auch einfach in einer Variablen zwischenspeichern und immer nur ausgeben, das trennt dann auch Ausgabe von Programmlogik (sowieso zu empfehlen).
Und noch ne andere Sache: Weißt du nicht was Variablen sind? Warum nutzt du Textfelder um Werte zu speichern? Das ist ziemlich... bescheuert?
Gruß
aliendwarf -
Das hatte ich vorher (Dim Restgeld As Integer = txt_restgeld.text) und danach dann restgeld.text geleert, aber das Problem bleibt ja immernoch gleich...
Wenn ihr zu einem Parkschein Automat geht und dort steht ihr müsst 50 Cent einwerfen. Dann habt ihr es bestimmt nicht immer Parat und macht es klein, ihr werft einmal 20 Cent rein, dann berechnet der neu und es steht nur noch 30 Cent da. Dann werft ihr nochmal 20 Cent und es steht 10 Cent da, welche ihr dann auch einwerft. Das Restgeld wird immer berechnet egal wie klein man die Cents einwirft.
Bei meinem Programm ist es jedoch so, dass wenn man 20 Cent einwirft es entweder sagt, dass das geld nicht reicht, dann aber gar nichts macht auch nicht weiter rechnet (ist ja klar wegen dem Script) oder es einfach das Ticket druckt.
Ich brauche also eine Endlos schleife, die nach jedem Einwurf (bei mir jetzt txt_eingabe) das Restgeld neu berechnet. Diese Schleife soll aber erst dann anfangen, wenn man WENIGER als das eingeforderte Geld eingeworfen hat. Es soll also nicht passieren, dass man 50 Cent einwirft aber dann trotzdem eine Schleife kommt und es soll nicht passieren, dass man 20 Cent einwirft und KEINE Schleife bekommt.
Besser kann ich des Problem nicht beschreiben, wenn des jetzt noch immer nicht verständlich war weiß ich auch net weiter. -
kill-a-teddy schrieb:
Falsch du brauchst keine Endlosschleife sonder eine Schleife mit definierter Abbruchbedingung (Endlosschleifen = Programmierfehler), ausserdem sollte man idealerweise immer in diese Schlefie kommen. Für so eine Problemstellung benutzt man do ... until. Hier einmal Pseudo-Code:
Ich brauche also eine Endlos schleife, die nach jedem Einwurf (bei mir jetzt txt_eingabe) das Restgeld neu berechnet. Diese Schleife soll aber erst dann anfangen, wenn man WENIGER als das eingeforderte Geld eingeworfen hat. Es soll also nicht passieren, dass man 50 Cent einwirft aber dann trotzdem eine Schleife kommt und es soll nicht passieren, dass man 20 Cent einwirft und KEINE Schleife bekommt.
Es wird immer mind. 1 mal auf den Einwurf einer Münze gewartet aber höchstens solange bis der eingworfene Betrag grösser oder gleich dem zu zahlenden Betrag ist. ich hoffe dir damit den Sinn einer "fussgesteuerten" Schleife klargemacht zuhaben.bereitsEingeworfen=0 ZuBezahlen = ZahlbetragErmitteln(Ankunftszeit) ;wird in einer separaten Funktion ermittelt do bereitsEingeworfen = bereitsEingeworfen + neuEingeworfen until bereitsEingeworfen >= ZuBezahlen RueckGeld = bereitsEingeworfen - ZuBezahlen gebeRueckgeld(RueckGeld) ;Funktion zum Geld zurückgeben aufrufen druckeTicket; Funktion zum Parkschein drucken aufrufen.
Beitrag zuletzt geändert: 19.11.2011 21:09:19 von autobert -
autobert schrieb:
[...] Falsch du brauchst keine Endlosschleife sonder eine Schleife mit definierter Abbruchbedingung (Endlosschleifen = Programmierfehler), ausserdem sollte man idealerweise immer in diese Schlefie kommen. Für so eine Problemstellung benutzt man do ... until. [...]
Das ist genau das, was ich meine :) Damit kann das Thema endlich geschlossen werden. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage