Endliche Automaten < Sonstige < Schule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 11:47 Do 30.08.2007 | Autor: | abingdon |
Aufgabe | Programmiere einen endlichen Automaten mit Geldwechsler in Turbo Pascal |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Ich habe das Programm so gut wie fertig getippt, funktioniert auch alles.
Leider kriege ich das mit dem Geldwechsler nicht hin, mehrere Versuche scheiterten kläglich, immer kommen Fehlermeldungen. Also habe ich es jetzt so,dass man halt eine Münze reinschmeißt und der Automat nimmt sie direkt als passend an und händigt das Produkt (in diesem Falle Cola) aus.
Besser wäre jetzt, dass der Automat z.b. nur 50 cent Stücke akzeptiert, und der Kunde muss angeben wie er den Betrag für die Cola einschmeißt.
Wäre nett, wenn mir jemand helfen könnte, ich hänge das Programm, soweit ich es bis jetzt habe an ! Nehme auch gerne Verbesserungsvorschläge entgegen !
Danke für Eure Hilfe !
Abingdon
PROGRAM Automat;
USES CRT;
Const
colaanzahl = 10;
Type
eingalphabet = (muenze, warenhebel, rueckknopf);
zustaende = (neutral, aktiv);
ausgalphabet = (cola, geld, nichts);
VAR
x: eingalphabet;
y: ausgalphabet;
z: zustaende;
anzahl : integer;
Function eingabe : eingalphabet;
VAR
taste : char;
Begin
Repeat read(taste) UNTIL taste IN ['m','w','r','M','W','R'];
CASE taste OF
'm','M' : eingabe := muenze;
'w','W' : eingabe := warenhebel;
'r','R' : eingabe := rueckknopf;
End
END;
FUNCTION ergebnis (eing : eingalphabet; zustand : zustaende) : ausgalphabet;
BEGIN
ergebnis := nichts;
IF zustand = aktiv THEN
CASE eing OF warenhebel : ergebnis := cola;
rueckknopf : ergebnis := geld;
END
END;
FUNCTION folgezustand (eing : eingalphabet; zustand : zustaende) : zustaende;
BEGIN
IF zustand = neutral THEN
IF eing = muenze THEN
folgezustand := aktiv
ElSE
folgezustand := neutral
ELSE IF (eing=warenhebel) or (eing=rueckknopf) THEN
folgezustand := neutral
END;
PROCEDURE ausgabe (wunsch: ausgalphabet);
BEGIN
CASE wunsch OF
cola: writeln ('Bitte entnehmen sie ihr Getraenk');
geld: writeln ('Hier haben Sie ihr Geld zurueck!');
End
End;
Begin
writeln;
writeln (' Cola-automat ');
writeln (' ------------ ');
writeln;
writeln (' Bitte waehlen Sie: ');
writeln (' .________________________________________________.');
writeln (' . .');
writeln (' . .');
writeln (' . Geld einwerfen................... M druecken .');
writeln (' . Warenhebel betaetigen............ W druecken .');
writeln (' . .');
writeln (' . Abbruch.......................... R druecken .');
writeln (' . .');
writeln (' . .');
writeln (' . .');
writeln (' .________________________________________________.');
writeln;
anzahl := colaanzahl;
z := neutral;
Repeat
x := eingabe;
y := ergebnis (x,z);
ausgabe (y);
z := folgezustand (x,z);
anzahl := (anzahl - 1)
Until anzahl = 0;
writeln ('Automat leer.');
Delay (10000);
END.
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:56 Do 30.08.2007 | Autor: | abingdon |
die version von TP ist 1.9 !
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:34 Fr 31.08.2007 | Autor: | leduart |
Hallo
Da deine Aufgabe ist nen Geldwechsler mit einzuplanen, solltest du wenigstens 2 Optionen haben: 1 und 0,5
also darst du nicht nur M sondern M oder E als Eingabe haben. im case E muss du dann 0,5 +cola ausspucken.
mehr mögliche Münzen musst du dann anfangen zu rechnen um richtig rauszugeben.
Wo waren deine Fehlschläge denn? wär besser du schickst uns den fehlgegangenen Versuch, dann können wir eher helfen.
Gruss leduart
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:44 Fr 31.08.2007 | Autor: | abingdon |
problem eins ist z.b., dass ich die aktuelle anzahl der getränke (hier die var "colaanzahl") gerne dem benutzer anzeigen möchte, dies ist auch gar kein problem, allerdings spinnt das programm bei der richtigen anzahl der colas die wirklich noch da sind. mit dem programm oben zieht er bei jedem erfolgreichen kauf gleich 2 colas raus, so dass die colaanzahl in 2er schritten sinkt.
ich verzweifele echt an diesem teil, füge ich jetzt die anderen var ein, funktioniert alles nicht mehr, bzw. gibt er gar keine cola mehr raus :-D.... kann es sein,dass ich die gesamte programmstruktur ändern sollte, wäre es dann leichter ? oder hat jemand eine simple idee ??
danke euer abingdon
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 11:07 Sa 01.09.2007 | Autor: | Kroni |
Hi,
habe das Programm gerade überflogen.
Zu der Anzahl der Cola: Du schreibst dort doch Anzahl:=Anzahl-1, du ziehst also konstant IMMER 1 Cola ab, egal wie viele ausgegeben wurden. Das musst du ändern.
Noch eine Kritik von mir:
1) Warum packst du das ganz in eine Dauerschleife? Du kannst doch via ich glaube ReadLN war es, eine Eingabe abfragen. Das ist deutlich besser, als das über ein paar Funktionen zu machen (ist meine Meinung).
Deine Proceduren und Funktionen sind auch nicht gerade übersichtlich. Ich würde das ganze erst einmal so "runterschreiben" und das ganze dann evtl. hinterher in Proceduren zu packen. Zudem verstehe ich auch nicht sonderlich, warum du dir eine eigene Variablenart dort einbaust. Du kannst das ganze doch auch via Stringabgleich machen.
Zu deiner Schleife die du da machst: Die kannst du ja auch trotzdem noch machen, aber dann würde ich dort wirklich noch ein ReadLN machen, denn in dem Falle, wenn du nichts machst, geht er die Schleife dennoch durch, zieht immer eins von der ColaAnzahl ab, und dann sollte dort direkt sofort stehen, dass du keine Cola mehr hast, und das Programm sich dann beenden, kann das sein?
Und das kannst du mit einem ReadLN verhindenr, weil das Prgoramm dort wartet, bis du eine Eingabe gemacht hast.
LG
Kroni
|
|
|
|