Studium Struktogramm

ID: 58267
L
17 Mai 2006
122
5
Hey Klammunity,

ich soll für Info ein Struktogramm entwerfen und wollte es, nach erfolgreicher Fertigstellung, einmal von euch überprüfen lassen.

Aber erstmal die komplette Aufgabenstellung:
Entwickeln Sie die Struktogramme für den folgenden Restgeldautomaten:
In einer Datei sind alle acht EuroMünzwerte und deren Anzahl abgelegt. Das Programm soll die Daten
zunächst einlesen. Der Benutzer kann einen Restgeldbetrag eingeben. Der Automat zeigt dann an, wie
viele Münzen welcher Wertigkeit zurückgegeben werden und wie viele sich noch im Automaten benden.


Hauptprogramm:
• Das Programm meldet sich mit einer Bildschirmausgabe als Begrüÿung.
• Das Programm liest aus der Datei geld.dat Zeilenweise jeweils die Münzwerte in das Feld muenzen
und die Anzahl in das Feld anzahl ein. Kann die Datei nicht geönet werden, so soll das Programm
mit einer Fehlermeldung beendet werden.
• Der Benutzer wird aufgefordert, einen Restgeldbetrag einzugeben. Gibt der Benutzer die Zahl Null
ein, so soll sich das Programm mit einer passenden Bildschirmmeldung verabschieden.
• Der eingegebene Wert wird in die Variable betrag geschrieben und es wird das Unterprogramm
berechnung aufgerufen.
• Es wird auf den Bildschirm ausgegeben, wie viele Münzen jeder Wertigkeit der Automat ausgegeben
hat und wie viele Münzen jeder Wertigkeit noch im Automaten sind. Sind in dem Automaten noch
Münzen und der Betrag konnte nicht vollständig ausgezahlt werden, so soll zusätzlich eine Meldung
auf dem Bildschirm erscheinen. Benden sich keine Münzen mehr in dem Automaten, so soll das
Programm stattdessen mit einer entsprechenden Bildschirmmeldung verlassen werden.
• Nach der Ausgabe des Rückgeldes auf den Bildschirm fährt das Programm erneut mit der Auorderung
zur Eingabe eines Restgeldbetrages fort.


Unterprogramm berechnung:
In diesem Unterprogramm wird ermittelt, wie viele Münzen ausgegeben werden müssen.
• Initialisieren Sie ein Feld ausgabe mit Nullen, in welches im weiteren Verlauf gespeichert wird, wie
viele Münzen einer Wertigkeit ausgegeben werden sollen. Initialisieren Sie weiterhin eine Variable
leer mit Null, mit deren Hilfe Sie prüfen, ob sich im Automaten noch Geld bendet.
• Für jede Münzwertigkeit (in absteigender Reihenfolge) werden folgende Punkte geprüft:
- Sind von der Münze noch welche im Automaten vorhanden? Wenn nicht, soll die Variable leer
um eins erhöht werden und die nächste Münze betrachtet werden.
- Wenn man von betrag den aktuell betrachteten Münzwert muenze abziehen würde und das
Ergebnis gröÿer Null wäre, so soll folgendes geschehen:
~ Von betrag soll der Münzwert abgezogen werden.
~ Die Anzahl der Münzwertigkeit im Automaten anzahl verringert sich um eins.
~ Das Feld ausgabe muss sich für den entsprechenden Münzwert um eins erhöhen.
Ist dies nicht der Fall, so kann die nächste Münze betrachtet werden.
• Ist betrag Null oder wurden schon alle Münzwerte betrachtet, so soll das Unterprogramm beendet
werden.
Hinweis: Denken Sie an die richtige Initialisierung der Variablen.

Dazu mein Struktogramm:
Klick mich

Das einzige was ich noch nicht implementiert hab, sind die letzten beiden Punkte vom Hauptprogramm. Das dürfte aber nun auch kein Problem mehr sein. Möchte nur gern von euch wissen, ob alles logisch ist *gg

edit:
Struktogramm v.1
Struktogramm v.2
Struktogramm v.3
Struktogramm v.4
 
Zuletzt bearbeitet:
paar Kleinigkeiten siond mir aufgefallen:

Bei der Berechnung machst Du

TEST = BETRAG - MUENZEN[n]
PRÜFE TEST > 0

müsste eigentlich ein Test auf >= 0 sein.

Oder einfacher
PRÜFE BETRAG >= MUENZEN[n]

und im Fall True musst Du natürlich die anzahl verringern und die ausgabe erhöhen ( nicht umgerkehrt )


Aufpassen musst Du natürlich auch, in welcher Reihenfolge die Münzwerte in der ursprünglichen Datei (geld.dat) stehen, also ob in Muenzen[1] der 1Ct Wert steht oder der 2 Euro.


Was Dein Upro berechnen vermutlich nicht korrekt zurückgibt:

Du willst 5 Ct ausgeben und der Automat hat keine 5 Ct und keine 2 Ct Stücke, aber noch jede Menge 1 Ct Stücke. Dann kann der Betrag vollständig ausbezahlt werden, aber Dein leer-Zähler steht auf 2 ( nun gut, das soll lt .Aufgabenbeschreibung wohl so sein .... )


Lt. Beschreibung soll das Upro beendet werden, wenn der Betrag = 0 ist. Diese Abfrage ist nicht implementiert.
 
Zuletzt bearbeitet:
Vielen vielen Dank für deine Antwort.
Hatte schon unabhängig von dir weitergemacht.

Irgendwie glaub ich das ich beim Hauptprogramm bei der letzten Schleife irgendwie durcheinander gekommen bin oder haut das so hin? [else, True, False]


grüße, benni

edit: Achja, hab sche*sse gebaut. Bin beim überarbeiten.
edit2: Neues Strukto

Wenn ich das Programm wiederholen lassen will. Muss ich dann die Datei wieder neu einlesen?
Übrigens ist die Datei so aufgebaut:
2 ------ 10
1 ------ 10
0,5 ---- 10
0,2 ---- 10
0,1 ---- 10
0,05 --- 10
0,02 --- 10
0,01 --- 10

grüße
 
Zuletzt bearbeitet:
Sieht doch schon sehr schön aus.
Das mit der Logik im Hauptprogramm passt so.

Es ist schon ca. 25 Jahre her, dass ich so was gezeichnet habe. Wenn ich mich recht erinnere, dann steht bei den Schleifen im Fuss die Bedingung
"wiederhole solange diese Bedingung wahr ist"
Demnach müsste bei Dir immer n <= 8 im Fuss stehen ( statt n = 8 ), sonst würde die Schleife nach dem ersten Durchlauf schon verlassen.

Eingebaut hast Du ja jetzt das
WENN BETRAG=0 DANN SETZE N=8.
Damit ist aber die SchleifenBedingung N=8 wahr und die Schleife würde noch einmal durchlaufen. --> Setze N auf 9, dann passt es.

Einmal nennst Du die Variable MUENZE statt MUENZEN. Und bei "wurde insgesamt x-mal ausgegeben" fehlt einmal ge .


Wenn das Programm nochmal durchläuft, solltest Du die Datei nicht neu einlesen, sonst würden ja wieder 10 Münzen jeder Art im Programm zur verfügung stehen, aber real nicht im Automaten sein.

Dieser Teil der Aufgabe ist allerdings noch nicht realisiert:

Sind in dem Automaten noch
Münzen und der Betrag konnte nicht vollständig ausgezahlt werden, so soll zusätzlich eine Meldung
auf dem Bildschirm erscheinen. Befinden sich keine Münzen mehr in dem Automaten, so soll das
Programm stattdessen mit einer entsprechenden Bildschirmmeldung verlassen werden.


Nachtrag: das Symbol für Unterprogramm ist ein Rechteck mit links und rechts einem senkrechten Strich, nicht zwei Rechtecke ineinander
 
Es ist schon ca. 25 Jahre her, dass ich so was gezeichnet habe. Wenn ich mich recht erinnere, dann steht bei den Schleifen im Fuss die Bedingung
"wiederhole solange diese Bedingung wahr ist"
Demnach müsste bei Dir immer n <= 8 im Fuss stehen ( statt n = 8 ), sonst würde die Schleife nach dem ersten Durchlauf schon verlassen.

Eingebaut hast Du ja jetzt das
WENN BETRAG=0 DANN SETZE N=8.
Damit ist aber die SchleifenBedingung N=8 wahr und die Schleife würde noch einmal durchlaufen. --> Setze N auf 9, dann passt es.

Bei uns ist das die Austrittsbedigung, also durchlaufe solange, bis n=8. Aber du hast natürlich Recht: Da muss überall ne 9 stehen. Sowohl bei dem x, als auch bei dem n.

Einmal nennst Du die Variable MUENZE statt MUENZEN. Und bei "wurde insgesamt x-mal ausgegeben" fehlt einmal ge .
Danke. Werd ich nachher noch verbessern.

Dieser Teil der Aufgabe ist allerdings noch nicht realisiert:
Sind in dem Automaten noch
Münzen und der Betrag konnte nicht vollständig ausgezahlt werden, so soll zusätzlich eine Meldung
auf dem Bildschirm erscheinen. Befinden sich keine Münzen mehr in dem Automaten, so soll das
Programm stattdessen mit einer entsprechenden Bildschirmmeldung verlassen werden.
Hmm.. Da hast du Recht. Allerdings kapier ich den ersten Teil grad nicht richtig.
Seh da grad noch keinen Ansatz :-?
Für den zweiten müsste ich ja eigentlich nur ne Schleife machen, in welcher abgefragt wird, ob anzahl[n]=0 für alle n ist, oder?

Nachtrag: das Symbol für Unterprogramm ist ein Rechteck mit links und rechts einem senkrechten Strich, nicht zwei Rechtecke ineinander
Ist bei uns als Verfeinerung angegeben und steht so im Skript. Dort steht auch, dass wir nichts anderes verwenden dürfen *gg
 
Hmm.. Da hast du Recht. Allerdings kapier ich den ersten Teil grad nicht richtig. Seh da grad noch keinen Ansatz :-?

z.B. Du willst 5 Ct auszahlen und es sind nur noch 2-Euro-Stücke im Automaten.
Nach Durchlaufen des Upros kann im Hauptprogramm geprüft werden, ob
anzahl[1]+anzahl[2] ... + anzahl[8] > 0 ist und die Variable BETRAG > 0
( denn im Upro wurde ja BETRAG immer runtergezählt bis alle Münztypen durch sind ). Steht da noch was grösser 0 drin, dann konnte der Betrag nicht vollständig ausgezahlt werden.


Für den zweiten müsste ich ja eigentlich nur ne Schleife machen, in welcher abgefragt wird, ob anzahl[n]=0 für alle n ist, oder?

Richtig. Wenn anzahl[1]+anzahl[2] ... + anzahl[8] = 0 dann Meldung+Programmende

Ich würde die Bedingungen so abfragen:
Wenn Summe anzahl[] = 0 dann Meldung+Programmende
sonst
wenn Betrag > 0 dann Meldung "Achtung Betrag nicht vollständig ausbezahlt"
sonst "alles ok"
 
Fast perfekt.

Wie gesagt n=8 und x=8 jeweils durch 9 ersetzen. Auch bei Betrag=0 im True-teil n=9 setzen
und das test > 0 durch test >= 0 ersetzen.

( Wenn Restbetrag 5 ct sind und die 5 Ct. Münzen abgefragt werden, dann ist
test = Betrag - münzen also 5 ct - 5 Ct = 0. Nach der momentanen Logik würde das programm dann in den False-Zweig verzweigen anstatt das 5 Ct Stück rauszurücken. Spätestens das letzte 1 Ct Stück würde der Automat immer behalten wollen und somit käme im Hauptprogramm immer die Meldung "Münzen noch da, aber Betrag nicht vollständig ausbezahlt" ).

Aber den neuen Codeteil hast Du völlig korrrekt eingebaut.
 
Zuletzt bearbeitet:
Perfekt.

Noch ein kurzer Hinweis:

Wenn Dein Lehrer sagt, anstatt ANZAHL 1-8 zu addieren und die Summe auf 0 zu prüfen, ob "keine Münzen mehr vorhanden" sind, wäre ja viel einfacher auch ein Prüfen von LEER = 8 möglich gewesen, dann irrt er :)
 
Hallo liebe Helferinnen und Helfer und erstmal ein frohes Fest!

Ich bin über diesen Artikel auf das Forum gestoßen und hab mich dann auch gleich mal registriert.
Warum ich jetzt die Frage, die ich habe, in diesen Artikel schreibe, liegt daran, dass ich ein sehr ähnliches Programm entwerfen soll, also ein Struktogramm für einen Restgeldautomaten schreiben soll. Es unterscheidet sich nur in feinheiten.

Das ist das erste Programm bzw Struktogramm, was ich schreibe, dementsprechend habe ich meine Probleme dabei.

Meine Datei geld.dat sieht genau so aus wie oben beschrieben.
Das erste Problem, das ich jetzt habe, bezieht sich auf folgenden Punkt:

Nachdem überprüft wurde, ob die Datei existiert, sollen nacheinander alle acht Euro-Münzen und die jewielige Anzahl der Münzen aus der Datei in die Felder bzw. Vektoren 'muenze' und 'anzahl' eingelesen werden.
Und wenn der Benutzer das Programm nicht beendet und der Automat nicht leer ist, werden weitere Schritte (Restgeldbetrag eingeben usw.) ausgeführt.

Was heißt es eigentlich, dass 'die jewielige Anzahl der Münzen aus der Datei in die Felder bzw. Vektoren 'muenze' und 'anzahl' eingelesen werden' sollen?
Also was soll da genau passieren? Soll das Programm in der Datei nachgucken, wie viele Münzen je von welchem Wert vorhanden sind und diese Information dann irgendwo (in den Feldern bzw Vektoren) "ablegen"?
Und woher weiß das Programm, welche Zahl ein Münzwert und welche Zahl eine Anzahl ist?
Reicht hierzu das Kästchen zum Einlesen aus der Datei:
E(D)='geld.dat',muenze[n],anzahl[n] ??

Und warum beides mit [n] gekennzeichnet wird, habe ich auch noch nciht so ganz kapiert.
Vielleicht kann mir ja jemand auf die Sprünge helfen, wäre sehr nett.

Achso dann habe ich noch eine Frage zu dem Struktogramm von oben:
Für was steht denn das 'try=0'?

Und sorry für die schwammige Fragestellung, aber wie gesagt, ich muss mich noch komplett in diese ganze Geschichte reinarbeiten und bin schon mit so einer vermeintlich einfachen Aufgabe leicht überfordert.

lg
 
Zuletzt bearbeitet: