home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
automat.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-03-02
|
9KB
|
283 lines
{---------------------------------------------------------------------------}
{ Simulation in Pascal }
{ Idee und Ausfuehrung : Ernst Heinz, 22.9.1986 }
{---------------------------------------------------------------------------}
PROGRAM fahrkarten_automat (INPUT, OUTPUT);
CONST max_geld_stuecke = 7; (* Anzahl verschiedener Geldstuecke *)
max_speicher = 100; (* Kapazitaet des Geldspeichers *)
TYPE feld_index = 1..max_geld_stuecke;
int_feld = ARRAY[1..max_geld_stuecke] OF INTEGER;
str_feld = ARRAY[1..max_geld_stuecke] OF STRING[5];
VAR preis : INTEGER; (* der zu zahlende Preis *)
bezahlt : INTEGER; (* das eingeworfene Geld *)
eingabe : int_feld; (* die eingegebenen Geldstuecke *)
rueckgabe : int_feld; (* die zurueckzugebenden Geldstuecke *)
geld_speicher : int_feld; (* die im Automaten vorhandenen Geldstuecke *)
geld_wert : int_feld; (* der Wert der einzelnen Geldstuecke *)
geld_name : str_feld; (* die Bezeichnung der einzelnen Stuecke *)
ch : CHAR;
{---------------------------------------------------------------------------}
PROCEDURE loesche_bildschirm; (* u.U. an Ihre Pacalversion anpassen ! *)
BEGIN
PAGE(output);
END;
{---------------------------------------------------------------------------}
PROCEDURE pieps_ton; (* u.U. an Ihre Pascalversion anpassen ! *)
BEGIN
WRITE(CHR(7))
END;
{---------------------------------------------------------------------------}
PROCEDURE init_name; (* belegt das Feld mit den Namen der Geldstuecke *)
BEGIN
geld_name[1] := '10 PF';
geld_name[2] := '50 PF';
geld_name[3] := '1 DM';
geld_name[4] := '2 DM';
geld_name[5] := '5 DM';
geld_name[6] := '10 DM';
geld_name[7] := '20 DM';
END;
{---------------------------------------------------------------------------}
PROCEDURE init_wert; (* wird intern in Pfennigdarstellung gespeichert *)
BEGIN
geld_wert[1] := 10; (* 10 PF, muss der Groesse nach belegt werden *)
geld_wert[2] := 50; (* 50 PF *)
geld_wert[3] := 100; (* 1 DM *)
geld_wert[4] := 200; (* 2 DM *)
geld_wert[5] := 500; (* 5 DM *)
geld_wert[6] := 1000; (* 10 DM *)
geld_wert[7] := 2000; (* 20 DM *)
END;
{---------------------------------------------------------------------------}
PROCEDURE init_speicher; (* am Anfang im Automaten gespeichertes Geld *)
VAR i : INTEGER;
BEGIN
geld_speicher[max_geld_stuecke] := 0;
FOR i := 1 TO (max_geld_stuecke - 1) DO
geld_speicher[i] := 20;
END;
{---------------------------------------------------------------------------}
PROCEDURE init_int_feld (VAR feld: int_feld);
VAR i: INTEGER;
BEGIN
FOR i := 1 TO max_geld_stuecke DO feld[i] := 0;
END;
{---------------------------------------------------------------------------}
PROCEDURE write_dm_wert (pf: INTEGER);
VAR dm_string: STRING[8]; (* zur Pfg./DM - Umwandlung *)
BEGIN
STR(pf, dm_string);
WHILE LENGTH(dm_string) < 3 DO
INSERT('0', dm_string,1); (* fuehrend Nullen *)
INSERT('.', dm_string, LENGTH(dm_string)-1);
WRITE(dm_string, ' DM')
END;
{---------------------------------------------------------------------------}
FUNCTION waehle_fahrkartenpreis: INTEGER; (* Fahrkarte und Preis waehlen *)
VAR wahl: CHAR;
BEGIN
loesche_bildschirm;
WRITELN('< Ende durch Eingabe von "0" >'); WRITELN;
WRITELN('Fahrkarte Nr.1 = 0.80 DM');
WRITELN('Fahrkarte Nr.2 = 1.20 DM');
WRITELN('Fahrkarte Nr.3 = 1.90 DM');
WRITELN('Fahrkarte Nr.4 = 2.50 DM');
WRITELN('Fahrkarte Nr.5 = 3.20 DM');
WRITELN('Fahrkarte Nr.6 = 4.70 DM');
WRITELN('Fahrkarte Nr.7 = 5.90 DM');
WRITELN('Fahrkarte Nr.8 = 8.30 DM');
WRITELN; WRITELN;
WRITE ('Ihre Wahl - Sie wuenschen Fahrkarte Nr.'); pieps_ton;
REPEAT
READLN(wahl);
UNTIL wahl IN ['0'..'8'];
CASE wahl OF
'0' : waehle_fahrkartenpreis := 0;
'1' : waehle_fahrkartenpreis := 80;
'2' : waehle_fahrkartenpreis := 120;
'3' : waehle_fahrkartenpreis := 190;
'4' : waehle_fahrkartenpreis := 250;
'5' : waehle_fahrkartenpreis := 320;
'6' : waehle_fahrkartenpreis := 470;
'7' : waehle_fahrkartenpreis := 590;
'8' : waehle_fahrkartenpreis := 830;
END;
END;
{---------------------------------------------------------------------------}
PROCEDURE geld_einwerfen; (* laesst den Benutzer ein Geldstueck einwerfen *)
VAR i, wert : INTEGER; (* in 'wert' der eingeworfene Betrag *)
einwurf : STRING[7]; (* zum Lesen beim Geldeinwurf *)
FUNCTION speicher_voll (nr: INTEGER): BOOLEAN; (* Geldspeicher voll ? *)
BEGIN
speicher_voll := (geld_speicher[nr] = max_speicher);
END;
BEGIN
WRITE('Ihre Fahrkarte kostet '); write_dm_wert(preis); WRITELN('.');
WRITE('Zu bezahlen sind noch '); write_dm_wert(preis-bezahlt);
WRITE('. Bitte Geld einwerfen --> ');
READLN(einwurf);
(* alles in Grossbuchstaben umwandeln *)
FOR i := 1 TO LENGTH(einwurf) DO
IF einwurf[i] IN ['a'..'z'] THEN
einwurf[i] := CHR(ORD(einwurf[i])-32);
wert := 0;
FOR i := 1 TO max_geld_stuecke DO
IF LENGTH(einwurf) >= LENGTH(geld_name[i]) THEN
IF geld_name[i] = COPY(einwurf, 1, LENGTH(geld_name[i])) THEN
IF speicher_voll(i) THEN
BEGIN
WRITELN('Der ',geld_name[i],' - Speicher ist voll !');
pieps_ton;
wert := -1;
END
ELSE
BEGIN
wert := geld_wert[i];
eingabe[i] := eingabe[i]+1;
geld_speicher[i] := geld_speicher[i]+1;
END;
IF wert=0 THEN
BEGIN
WRITE('Falschgeld wird nicht akzeptiert !'); pieps_ton; pieps_ton;
WRITELN;
END
ELSE IF wert > 0 THEN bezahlt := bezahlt + wert;
WRITELN;
END;
{---------------------------------------------------------------------------}
FUNCTION kann_herausgeben: BOOLEAN; (* ist Rueckgabe denn auch moeglich ? *)
VAR i, anz, rest: INTEGER;
BEGIN
rest := bezahlt-preis;
FOR i := max_geld_stuecke DOWNTO 1 DO (* zuerst die grossen Geldstuecke *)
BEGIN
anz := rest DIV geld_wert[i]; (* Anzahl der zurueckzugebenden Stuecke *)
IF anz > geld_speicher[i] THEN (* sind hiervon genug vorhanden ? *)
anz := geld_speicher[i];
rueckgabe[i] := anz;
rest := rest-anz*geld_wert[i];
END;
kann_herausgeben := (rest=0); (* geht die Rueckgabe auf ? *)
END;
{---------------------------------------------------------------------------}
PROCEDURE herausgeben (VAR geld: int_feld); (* gibt das 'geld' zurueck *)
VAR i: INTEGER;
BEGIN
FOR i := max_geld_stuecke DOWNTO 1 DO
IF geld[i] > 0 THEN
BEGIN
geld_speicher[i] := geld_speicher[i]-geld[i]; (* Bestand verringern *)
WRITELN;
WRITE(geld[i]:3, 'x ', geld_name[i]:5);
END;
END;
{---------------------------------------------------------------------------}
PROCEDURE drucke_fahrkarte;
BEGIN
WRITELN('##################################################');
WRITELN('# #');
WRITELN('# #');
WRITELN('# automatisch gedruckte F A H R K A R T E #');
WRITELN('# #');
WRITE ('# zum F A H R P R E I S von < ');
write_dm_wert(preis);
WRITELN(' > #');
WRITELN('# #');
WRITELN('# #');
WRITELN('##################################################');
END;
{---------------------------------------------------------------------------}
BEGIN { main }
init_name;
init_wert;
init_speicher;
REPEAT
bezahlt := 0;
preis := waehle_fahrkartenpreis;
IF preis > 0 THEN
BEGIN
init_int_feld(eingabe);
loesche_bildschirm;
REPEAT
geld_einwerfen;
UNTIL bezahlt >= preis; (* Geld einwerfen, bis 'preis' erreicht *)
init_int_feld(rueckgabe);
IF kann_herausgeben THEN (* Restgeldherausgabe ist moeglich *)
BEGIN
loesche_bildschirm;
drucke_fahrkarte;
WRITELN; WRITELN; WRITELN;
WRITE('O.k. , von den bezahlten ');
write_dm_wert(bezahlt);
WRITE(' erhalten Sie ');
write_dm_wert(bezahlt-preis);
WRITELN(' zurueck !');
herausgeben(rueckgabe);
END
ELSE
BEGIN
WRITELN; WRITELN;
WRITE('Restgeldherausgabe unmoeglich - Sie erhalten Ihr ');
WRITELN('ganzes Geld zurueck !');
herausgeben(eingabe);
END;
WRITELN; WRITELN('RETURN druecken...');
READLN(ch);
END;
UNTIL preis = 0;
END.