home *** CD-ROM | disk | FTP | other *** search
- {---------------------------------------------------------------------------}
- { 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.