AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Geldautomat

Ein Thema von Matz4000 · begonnen am 2. Mär 2011 · letzter Beitrag vom 3. Mär 2011
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#11

AW: Geldautomat

  Alt 3. Mär 2011, 09:29
Um genau zu sein ist Currency eine Festkommazahl. In Delphi intern ist es ein normaler 64-bit Integer (bei dem die vier niederwertigsten Stellen als Nachkommastellen angesehen werden).

Und wie gesagt: Die Schleifen bieten sich geradezu an, in eine Funktion ausgelagert zu werden. Und auch die Strings wie "2-Euro-Stück" könnte man automatisch erzeugen.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#12

AW: Geldautomat

  Alt 3. Mär 2011, 11:48
Kann man nicht das ganze mit nur einer Schleife lösen?
Delphi-Quellcode:
while R<> 0 do
  begin
    if R>2 then
      begin
        listbox.Add ...;
        R=R-2;
      end
    else if R>1 then
      begin
        listbox.Add ...;
        R=R-1;
      end
    else if ...

  end
Mach den Code jetzt auch nicht schöner, aber man hat nur eine Schleife...
Oder hab ich da jetzt einen Denkfehler drin?
Ralph

Geändert von Jumpy ( 3. Mär 2011 um 11:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#13

AW: Geldautomat

  Alt 3. Mär 2011, 11:54
Kann man nicht das ganze mit nur einer Schleife lösen?´
Mach den Code jetzt auch nicht schöner, aber man hat nur eine Schleife...
Oder hab ich da jetzt einen Denkfehler drin?
Ja, geht - macht den Code aber weder schöner noch schneller von daher isses egal
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#14

AW: Geldautomat

  Alt 3. Mär 2011, 11:57
@Jumpy:
Mh, sollte gehen. Aber was hat man davon? Es sind immer noch zig Redundanzen drin. Darum sagte ich ja auch auslagern in eine Funktion ^^
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#15

AW: Geldautomat

  Alt 3. Mär 2011, 12:24
Evtl. so?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
//aus Bequemlichkeitsgründen Konstanten definiert statt Eingaben auszuwerten
const
  Preis = 5.01;
  Einwurf = 10;
var
  Rest: Currency;
begin
  ListBox1.Items.BeginUpdate;
  try
    Rest := Einwurf - Preis;
    Rueckgabe(trunc(Rest * 100));
  finally
    ListBox1.Items.EndUpdate;
  end;
end;

procedure TForm1.Rueckgabe(WertInCent: integer);
begin
  if WertInCent > 0 then
    case WertInCent of
      1:
        begin
          ListBox1.Items.Add('1 Cent');
          Rueckgabe(WertInCent - 1);
        end;
      2 .. 4:
        begin
          ListBox1.Items.Add('2 Cent');
          Rueckgabe(WertInCent - 2);
        end;
      5 .. 9:
        begin
          ListBox1.Items.Add('5 Cent');
          Rueckgabe(WertInCent - 5);
        end;
      10 .. 19:
        begin
          ListBox1.Items.Add('10 Cent');
          Rueckgabe(WertInCent - 10);
        end;
      20 .. 49:
        begin
          ListBox1.Items.Add('20 Cent');
          Rueckgabe(WertInCent - 20);
        end;
      50 .. 99:
        begin
          ListBox1.Items.Add('50 Cent');
          Rueckgabe(WertInCent - 50);
        end;
      100 .. 199:
        begin
          ListBox1.Items.Add('1 Euro');
          Rueckgabe(WertInCent - 100);
        end;
    else
      begin
        ListBox1.Items.Add('2 Euro');
        Rueckgabe(WertInCent - 200);
      end;
    end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#16

AW: Geldautomat

  Alt 3. Mär 2011, 13:36
War das jetzt auf mein "in eine Funktion auslagern" bezogen? Wenn ja: Nein, so hatte ICH mir das nicht vorgestellt. Eher so:
Delphi-Quellcode:
procedure TForm1.WechselgeldAusgeben(var ABetrag: Currency; AMuenzwert: Currency);
begin
  While ABetrag >= AMuenzwert do
  begin
    ABetrag := ABetrag - AMuenzwert;
    If AMuenzwert >= 1 then ListBox1.Items.Add(Format('%d-Euro-Stück', [Round(AMuenzwert)]))
      else ListBox1.Items.Add(Format('%d-Cent-Stück', [Round(AMuenzwert * 100)]));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  S: Integer;
  Preis, R: Currency;
begin
  Preis := StrToCurr(Edit1.Text);
  S := StrToInt(Edit2.Text);
  ListBox1.Clear;
  R := S - Preis;
  If R > 9.99 then raise Exception.Create('Der Automat gibt ausschließlich Kleingeld und nur bis 9,99€.');
  WechselgeldAusgeben(R, 2.00);
  WechselgeldAusgeben(R, 1.00);
  WechselgeldAusgeben(R, 0.50);
  WechselgeldAusgeben(R, 0.20);
  WechselgeldAusgeben(R, 0.10);
  WechselgeldAusgeben(R, 0.05);
  WechselgeldAusgeben(R, 0.02);
  WechselgeldAusgeben(R, 0.01);
end;
Ungetestet, aber so ist meine Vorstellung
So kann man einfach verfügbare Münzen hinzufügen, entfernen oder ändern, ohne die Schleife in dem der Münzwert drei mal redundant vorkommt anfassen zu müssen. Durch die Redundanz in der ursprünglichen Implementation schleichen sich sonst seeehr leicht Fehler ein.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.

Geändert von Deep-Sea ( 3. Mär 2011 um 16:30 Uhr) Grund: StrToFloat durch StrToCurr ersetzt.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#17

AW: Geldautomat

  Alt 3. Mär 2011, 15:31
Wenn man den Betrag in Cent hat (also Eingabe*100) und das dann irgendwie in Integer umwandelt ginge auch:

Delphi-Quellcode:
var
  R,a : Integer;
  M : array[1..8]
begin
  M[1]=200;M[2]=100;M[3]=50;M[4]=20;M[5]=10;M[6]=5;M[7]=2;M[8]=1;

  R=CurrencyToInt(RückgeldInEuro * 100); //CurrencyToInt ??? s.o.

  for i = 1 To 8 do
    begin
    a:=R div M[i];
    R:=R-a;
    if a > 0 then
      begin
      if M[i] >= 100 then
        ListBox1.Items.Add(IntToStr(M[i]/100)+'-Euro-Stück: '+IntToSTr(a)+'x')
      else
        ListBox1.Items.Add(IntToStr(M[i])+'-Cent-Stück: '+IntToSTr(a)+'x');
      end;
    end;
end
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 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