Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Fahrkartenautomat (https://www.delphipraxis.net/131031-fahrkartenautomat.html)

b2info 17. Mär 2009 20:27


Fahrkartenautomat
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich muss in der Schule einen Fahrkartenautomaten programmieren
ich erklärs euch ma und zum schluss meine frage
3 Buttons für hamburg berlin münchen

8 Buttons für alle scheine bis 100 und 2, 1, 50 cent Stücke
das ist halt das Portmonee

Funktionsweise:

Zuerst Stadt auswählen
dann wird der betrag ins edit feld geladen

dann aus dem portmonee geld anklicken
wird dann ebenfalls je nach klicks in ein edit feld geladen

Dann klickt man auf einzahlen
bei dem ´´richtigen´´ geld spuckt er einen das rückgeld aus (edit feld)
sonst steht da halt das man zu wenig eingezahlt hat

und zu allerletzt zeigt er den wechselgeldbestand an Startwert 2500€
dann hab ich dort stehen

Scheine Bestand(Anzahl) im edit feld

100 10
50 10
20 20
10 30
5 30
2 30
1 50
0,50 80

Bis hierhin hab ich schon alles programmiert & mich durchgekämpft durchs ausprobieren

Meine Frage ist nun, wie schaffe ich es, wenn er das rückgeld ausspuckt
das der bestand der scheine & Münzen weniger oder mehr wird, je nach dem,
weil es wird ja auch geld eingezahlt

im attachment ist nochma die delphi datei

danke schonma im vorraus

Luckie 17. Mär 2009 20:33

Re: Fahrkartenautomat
 
Addiere erst das eingezahlte Geld zum Bestand hinzu und dann ziehst du das Rückgeld wieder ab.

BAMatze 17. Mär 2009 20:35

Re: Fahrkartenautomat
 
Also eigentlich musst du für die eingezahlten Scheine und Geldstücke eigentlich nur die Buttonklicks registrieren, was du ja eigentlich schon machst, wenn du das Geld einzahlst. Also druck auf 100€-Schein und die Anzahl 100€-Scheine im Automat steigt.
Beim Auszahlen das abnehmen des Geldes zu realisieren ist schon schwieriger, weil man ja 100€ unterschiedlich zusammen setzen kann: z.B. 1mal 100, 2mal 50, 5mal 30, ... Hier müsstest du vieleicht mehr Informationen geben, wie das zusammen gesetzt werden soll. Soll z.B. Ausweichzahlungen einprogrammiert werden, was wenn keine 20iger mehr da sind oder oder oder

blink182 17. Mär 2009 20:37

Re: Fahrkartenautomat
 
hiho
machs halt mit schleifen

Delphi-Quellcode:
while rueckgeld >=100 do
begin
edit100.text:=inttostr(strtoint(edit100)-1);
rueckgeld:=rueckgeld-100;
end
while rueckgeld >=50 do
begin
edit50.text:=inttostr(strtoint(edit50)-1);
rueckgeld:=rueckgeld-50;
end;
...
und später kannst du dann Wechselgeld neuberechnen

Delphi-Quellcode:
wechselgeld:=100*strtoint(edit100.text)+50*stroint(edit50.text)...

Klaus01 18. Mär 2009 07:41

Re: Fahrkartenautomat
 
Zitat:

Zitat von blink182
hiho
machs halt mit schleifen

Delphi-Quellcode:
while rueckgeld >=100 do
begin
edit100.text:=inttostr(strtoint(edit100)-1);
rueckgeld:=rueckgeld-100;
end
while rueckgeld >=50 do
begin
edit50.text:=inttostr(strtoint(edit50)-1);
rueckgeld:=rueckgeld-50;
end;
...
und später kannst du dann Wechselgeld neuberechnen

Delphi-Quellcode:
wechselgeld:=100*strtoint(edit100.text)+50*stroint(edit50.text)...

Guten Morgen,

mit diesem Beispiel erschlägst Du nicht das Problem (hat Matze schon gesagt) wenn
von dem Wechselgeld nicht mehr genügend Schein/Münzen einer Sorte vorhanden sind.
Dann müßen die "nicht vorhandenen" großen Scheine/Münzen durch kleinere ersetzt werden.

Auch kann man anstelle der While Schleifen
den Operator div benutzen um die Anzahl einer gewissen Sorte an Scheinen/Münzen zu ermitteln.

Grüße
Klaus

BAMatze 18. Mär 2009 08:19

Re: Fahrkartenautomat
 
Zitat:

Zitat von blink182
hiho
machs halt mit schleifen

Delphi-Quellcode:
while rueckgeld >=100 do
begin
edit100.text:=inttostr(strtoint(edit100)-1);
rueckgeld:=rueckgeld-100;
end
while rueckgeld >=50 do
begin
edit50.text:=inttostr(strtoint(edit50)-1);
rueckgeld:=rueckgeld-50;
end;
...
und später kannst du dann Wechselgeld neuberechnen

Delphi-Quellcode:
wechselgeld:=100*strtoint(edit100.text)+50*stroint(edit50.text)...

Man könnte diese Struktur aber eventuell abwandeln, indem man in die while Schleifen erweitert zu
Delphi-Quellcode:
while (rueckgeld>=100) and (Anzahl_100ter > 0) do
...
Wenn alle Schleifen so erwitert werden, sollte er automatisch fehlende große Scheine durch kleinere ersetzen.

Klaus01 18. Mär 2009 08:34

Re: Fahrkartenautomat
 
.. eigentlich wollte ich ja von den ganzen while Schleifen Gedöns weg.

Im Prinzip könnte es doch so laufen:

Delphi-Quellcode:
Rückgeld = gezahltesGeld - Fahrkarte

While Rückgeld > 0 do
  begin
    100erRück := Rückgeld div 100;
    if 100erRück > 100erVorhaden then
      begin
        Rückgeld := Rückgeld - (100erVorhanden * 100);
      end
    else
      begin
        100erVorhanden := 100erVorhanden - 100erRück;
        Rückgeld := Rückgeld - (100erVorhanden * 100)
      end;
    ...
     50er
    ...
     20er
    ...
     10er
  end;
Wenn mann noch die Schein und Münzwerte (und eventuell deren Anzahl) in ein Array packt
kann man durch das Array laufen und kann sich die lange Abfolge
von Abprüfugen sparen.

So könnte man ein Record Geld erstellen
Delphi-Quellcode:
  TGeld = record
    wert  : Integer;
    anzahl : Integer;
  end;
und ein Array Geldspeicher

Delphi-Quellcode:
GeldSpeicher = Array [0..10] of TGeld;

Delphi-Quellcode:
Rückgeld = gezahltesGeld - Fahrkarte;
for i:=0 to length(Geldspeicher) -1 do
  if Rückgeld > 0 then
    begin
      tempRück := Rückgeld div Geldspeicher[i].wert;
      if tempRück > Geldspeicher[i].anzahl then
        begin
          Rückgeld := Rückgeld - (Geldspeicher[i].anzahl * Geldspeicher[i].wert);
          Geldspeicher[i].anzahl:=0;
        end
      else
        begin
          Geldspeicher[i].anzahl := Geldspeicher[i].anzahl - tempRück;
          Rückgeld := Rückgeld - (tempRück * Geldspeicher[i].wert)
        end;
    end;

Grüße
Klaus

BAMatze 18. Mär 2009 09:08

Re: Fahrkartenautomat
 
Ich denke er hat damit 2 gangare Wege. Worüber er sich noch Gedanken machen muss, wäre, was passieren soll, wenn mehr Rückgeld gezahlt werden soll als im Geldspeicher vorhanden ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz