Hallo, ich erstelle hier gerade eine Procedure in einem Programm was Cocktails einliest und deren Name, Alkoholgehalt, und Zutaten ausgiebt.
Jetzt habe ich hier ein kleines Problem mit dieser Anforderung
Gültige Zutaten sind eine beliebige Menge aus den Werten Cocktailkirsche, Sahne, Eis, Saft und Rum, einzulesen wie folgt:
Deklariert Euch zunächst einen Aufzählungstyp TIngredient mit den Elementen Cocktailkirsche, Sahne, Eis, Saft und Rum in sinnvoller, einheitlicher Benennung (z.B. mit demselben Präfix in für Ingredient) als mögliche Zutaten.
Ergänzt dann einen Typ TIngredientSet für eine Menge dieses Aufzählungstyps.
Deklariert weiterhin exakt folgendes konstantes Stringarray mit den textuellen Bezeichnern aller Zutaten:
INGREDIENT_NAMES : array[TIngredient] of string = ('Cocktailkirsche', 'Sahne', 'Eis', 'Saft', 'Rum');
Somit habt Ihr ein Array mit fünf Elementen vom Typ String, die auch gleich gesetzt werden.
Beispiel: INGREDIENT_NAMES[inJuice]liefert dann z.B. den String 'Saft', wenn inJuice ein Wert des Aufzählungstyps TIngredient ist.
Entscheidend ist hier dieselbe Reihenfolge im Aufzählungstyp und im Stringarray, damit die Zuordnung funktioniert!
Bei der Eingabe sind dabei die Bezeichner aller Zutaten (wie im konstanten Stringarray angegeben) mit einem + oder - davor zulässig. Dazu ein Beispiel:
Gibt der Benutzer nacheinander '+Rum', '+Sahne', '+Eis' an (jeweils abgeschlossen mit einem Return, also in einer Schleife und nur jeweils genau eine Zutat pro Eingabe!), dann werden diese drei Zutaten in die Menge der Zutaten aufgenommen. Folgt noch ein '-Sahne', dann wird diese Zutat wieder aus der Menge entfernt. Mehrfache Eingaben derselben Zutat haben keine Auswirkung (ein Element kann halt nicht mehrfach in einer Menge vorkommen). Gleiches gilt für ungültige Eingaben (z.B. '+abc' oder '+ Rum' oder '--Saft'). Die Eingabe der Zutaten endet immer mit einem 'X' oder 'x'. Es soll auch möglich sein, gar keine Zutat für einen Cocktail zu definieren.
Zur "Umwandlung" eines vom Benutzer eingegebenen Strings in einen Wert des Aufzählungstyps TIngredient, der dann der Menge hinzugefügt wird, nehmt Ihr bitte KEINE 10 if (5 für + und 5 für -) nacheinander und auch KEIN case, sondern folgendes Vorgehen:
Lauft in einer Schleife solange über die einzelnen Werte aus TIngredient und wandelt diese jeweils mit dem konstanten Stringarray INGREDIENT_NAMES in einen String um, bis dieser String der Eingabe des Benutzers entspricht (das + oder - am Beginn der Eingabe kann mit einem copy "entfernt" bzw. "überlesen" werden).
Delphi-Quellcode:
type
TIngredient = (inCherry, inCream, inIce, inJuice, inRum);
TIngredientSet = set of TIngredient;
const
INGREDIENT_NAMES: array [TIngredient] of string = ('Cocktailkirsche', 'Sahne',
'Eis', 'Saft', 'Rum');
Delphi-Quellcode:
procedure readIngredients(TIngredientSet: TIngredient): record;
begin
writeln('Was möchtest du im Cocktail haben?');
readln(readIngredients);
if (readIngredients in INGREDIENT_NAMES) then
begin
for I := Low to High do
end;
end;
Jetzt weiß ich nicht wie ich das Programm dazu bringen kann wenn z.B. Sahne oder +Sahne gefunden wurde, das auch in den Array einzulesen ohne dafür eine If Anweisung zu verwenden.
Danke im Voraus