Rechnen mit Mengen
Hallo zusammen,
ich habe folgendes Problem: Das kleine Rotkäpchen packt ihren Korb mit Lebensmitteln für ihre Großmutter zur Verfügung stehen ihr folgende Lebensmittel:
Delphi-Quellcode:
Soweit ist alles schön und gut :)
type
TLebensmittel = (Moehren, Erbsen, Kartoffeln, Tomaten, Erdnuesse, Aepfel, Birnen, Banananen, Annanas, Sahnetorten, Fruchtkuchen, Lebkuchen, Spekulatius); TKorb = set of TLebensmittel; Jetzt möchte ich ihr aber sagen können, packe nur Obst, Gemüse oder nur Backwaren ein. Dazu bin ich bisher so vorgegangen:
Delphi-Quellcode:
Da Rotkäpchen aber sehr vergässlich ist, guckt sie noch einmal nach ob noch alles da ist:
type
TLebensmittelgruppen = (Obst, Gemuese, Backwaren) var FKorb : TKorb; impelmentation procedure packeKorbEin(AGruppe : TLebensmittelgruppen ); begin case AGruppe of Obst: begin FKorb := FKorb + Aepfel, Birnen, Banananen, Annanas; end; Gemuese: begin FKorb := FKorb + Moehren, Erbsen, Kartoffeln, Tomaten; end; Backwaren: begin FKorb := FKorb + Sahnetorten, Fruchtkuchen, Lebkuchen, Spekulatius; end; end; end;
Delphi-Quellcode:
Wie ihr seht reicht ihr oft eine Sache von einer ganzen Gruppe von Sachen. Daher will sie danach nicht mehr danach suchen müssen, Äpfel und Birnen sehen ja auch ähnlich aus. Darum packt sie das Obst einfach aus dem Korb heraus ... und genau das will nicht klappen:
procedure guckeInKorb;
var neSache : TLebensmittel; begin for neSache in FKorb do begin case neSache of Aepfel, Birnen: ShowMessage('Heimische Früchte hab ich!'); Banananen, Annanas: ShowMessage('Exotische Früchte hab ich!'); Moehren, Erbsen, Kartoffeln: ShowMessage('Gemüse hab ich!'); Tomaten: ShowMessage('Tomaten aus dem eigenen Garten hab ich!'); Sahnetorten, Fruchtkuchen, Lebkuchen, Spekulatius: ShowMessage('Sachen die dick machen hab ich!'); else: ShowMessage('Den andern Kram wie Erdnüsse und so hab ich auch!') end; end;
Delphi-Quellcode:
Das Problem daran ist er versteht nicht das das Teilmengen sind. Kann mir jemand erklären wie das in Delphi geht? Hier in dem Beispiel habe ich jetzt die Typen genommen, es bringt auch nix wenn ich davon "Objekte" anlege.
type
THeimischesObst = (Aepfel, Birnen); TExotischesObst = (Bananen, Annanas); TGemuese = (Moehren, Erbsen, Kartoffeln); // usw. implementation procedure guckeInKorb; var neSache : TLebensmittel; begin for neSache in FKorb do begin case neSache of THeimischesObst : begin FKorb = FKorb - THeimischesObst; ShowMessage('Heimische Früchte hab ich!'); end; TExotischesObst :begin FKorb = FKorb - TExotischesObst ; ShowMessage('Exotische Früchte hab ich!'); end; TGemuese :begin FKorb = FKorb - TGemuese ; ShowMessage('Gemuese hab ich!'); end; Tomaten: ShowMessage('Tomaten aus dem eigenen Garten hab ich!'); TGebaeck: begin FKorb = FKorb - TGebaeck; ShowMessage('Gebäck hab ich!'); end; else: ShowMessage('Den andern Kram wie Erdnüsse und so hab ich auch!') end; end; Das hier habe ich mir angeguckt bringt mich aber nicht sonderlich weiter. Vielen Dank, Tobias |
Re: Rechnen mit Mengen
Du brauchst keine Typdeklaration, sondern Konstanten:
Delphi-Quellcode:
type
TLebensmittel = (Moehren, Erbsen, Kartoffeln, Tomaten, Erdnuesse, Aepfel, Birnen, Banananen, Annanas, Sahnetorten, Fruchtkuchen, Lebkuchen, Spekulatius); TKorb = set of TLebensmittel; const Obst:TKorb = [Aepfel, Birnen, Banananen, Annanas]; HeimischesObst:TKorb = [Aepfel, Birnen]; ExotischesObst:TKorb = [Bananen, Annanas]; KotztsichGut:TKorb = [Sahnetorten, Erbsen]; |
Re: Rechnen mit Mengen
Hallo,
vielen Dank für den Versuch aber der Compiler meckert immer noch es sei ein Konstantenausdruck erwartet .... Dabei habe ich doch jetzt Konstanten: type THeimischesObst = (Aepfel, Birnen); TExotischesObst = (Bananen, Annanas); TGemuese = (Moehren, Erbsen, Kartoffeln); // usw. implementation
Delphi-Quellcode:
Auch die Typen zu ändern auf Lebensmittel oder Set of Lebensmittel bringt nix. Allerdings Rechnen kann ich damit jetzt :). Hat noch jemand eine Idee?
procedure guckeInKorb;
var neSache : TLebensmittel; const HeimischesObst:TKorb = [Aepfel, Birnen]; ExotischesObst:TKorb = [Bananen, Annanas]; Gemuese : TKorb = [Moehren, Erbsen, Kartoffeln]; begin for neSache in FKorb do begin case neSache of HeimischesObst : begin FKorb = FKorb - THeimischesObst; ShowMessage('Heimische Früchte hab ich!'); end; ExotischesObst :begin FKorb = FKorb - TExotischesObst ; ShowMessage('Exotische Früchte hab ich!'); end; Gemuese :begin FKorb = FKorb - TGemuese ; ShowMessage('Gemuese hab ich!'); end; Tomaten: ShowMessage('Tomaten aus dem eigenen Garten hab ich!'); TGebaeck: begin FKorb = FKorb - TGebaeck; ShowMessage('Gebäck hab ich!'); end; else: ShowMessage('Den andern Kram wie Erdnüsse und so hab ich auch!') end; end;
Delphi-Quellcode:
Vielen Dank,
FKorb := FKorb - Gemuese; // funktioniert =)
Tobias |
Re: Rechnen mit Mengen
Zitat:
Schau mal, wie es shmia genau gemacht hat. |
Re: Rechnen mit Mengen
Oh, Verzeihung da hab ich zu viel kopiert:
So sieht es jetzt bei mir aus:
Delphi-Quellcode:
Die Typendeklaration habe ich schon lange von Bord geschmissen :), hätte aber eh wenig auswirkungen da ich ja auf HeimischesObst und nicht auf THeimischesObst im Case prüfe ;). Danke trozdem für den Hinweis, außer bei dem rechenkram...
procedure guckeInKorb;
var neSache : TLebensmittel; const HeimischesObst:TKorb = [Aepfel, Birnen]; ExotischesObst:TKorb = [Bananen, Annanas]; Gemuese : TKorb = [Moehren, Erbsen, Kartoffeln]; Gebaeck : TKorb = [Kuchen (* usw.*)] begin for neSache in FKorb do begin case neSache of HeimischesObst : begin FKorb = FKorb - HeimischesObst; ShowMessage('Heimische Früchte hab ich!'); end; ExotischesObst :begin FKorb = FKorb - ExotischesObst ; ShowMessage('Exotische Früchte hab ich!'); end; Gemuese :begin FKorb = FKorb - Gemuese ; ShowMessage('Gemuese hab ich!'); end; Tomaten: ShowMessage('Tomaten aus dem eigenen Garten hab ich!'); Gebaeck: begin FKorb = FKorb - Gebaeck; ShowMessage('Gebäck hab ich!'); end; else: ShowMessage('Den andern Kram wie Erdnüsse und so hab ich auch!') end; end; |
Re: Rechnen mit Mengen
das sollte gehn
Delphi-Quellcode:
PS: typisierte Konstanten werden wie Variablen angesehn/behandelt, welche aber nicht verändert werden dürfen.
for neSache in FKorb do begin
if neSache in HeimischesObst them begin FKorb = FKorb - HeimischesObst; ShowMessage('Heimische Früchte hab ich!'); end else if neSache in ExotischesObst then begin FKorb = FKorb - ExotischesObst; ShowMessage('Exotische Früchte hab ich!'); end ...
Delphi-Quellcode:
probiere es mal so,
const HeimischesObst[b]: TKorb[/b] = ...
Delphi-Quellcode:
aber es kann auch sein, daß CASE solche Konstanten garnicht versteht.
const
HeimischesObst = [Aepfel, Birnen]; ExotischesObst = [Bananen, Annanas]; Gemuese = [Moehren, Erbsen, Kartoffeln]; Gebaeck = [Kuchen (* usw.*)] |
Re: Rechnen mit Mengen
Das sieht immer noch etwas seltsam aus in deinem Code.
So müsste es passen:
Delphi-Quellcode:
var neSache : TLebensmittel;
const HeimischesObst:TKorb = [Aepfel, Birnen]; ExotischesObst:TKorb = [Bananen, Annanas]; Gemuese : TKorb = [Moehren, Erbsen, Kartoffeln]; Gebaeck : TKorb = [Kuchen (* usw.*)] begin ... if neSache in HeimischesObst then ShowMessage('Heimische Früchte hab ich!'); if neSache in ExotischesObst then ShowMessage('Exotische Früchte hab ich!'); // man kann auch alles auf einen Rutsch prüfen // und die Schnittmenge bilden if (korb * HeimischesObst) <> [] then ShowMessage('Heimische Früchte sind im Korb'); |
Re: Rechnen mit Mengen
hmmm hab ich alles schon versucht....
Delphi-Quellcode:
Ist equivalent und um einiges langsamer zu:for neSache in FKorb do begin if neSache in HeimischesObst them begin FKorb = FKorb - HeimischesObst; ShowMessage('Heimische Früchte hab ich!'); end else if neSache in ExotischesObst then begin FKorb = FKorb - ExotischesObst; ShowMessage('Exotische Früchte hab ich!'); end ...
Delphi-Quellcode:
Wenn man die unter Lösung nimmt kommt wieder das Problem das die Äpfel, dann zu heimisch sind aber keiner Lebensmittel mehr -.-. Weil er dann annimmt das wären verschiedene Daten.
if HeimischeObst in FKorb then begin
FKorb = FKorb - HeimischesObst; ShowMessage('Heimische Früchte hab ich!'); end else if ExotischesObst in FKorb then begin FKorb = FKorb - ExotischesObst; ShowMessage('Exotische Früchte hab ich!'); end ... Mfg Tobi Oh rote Box ... Hmm ja dann werde ich wohl doch alles mit If abfackeln müssen, das war eigendlich das was ich nicht wollte, weil meine Orginal Source ungefair so viele Typen hat wie ein Großmarkt. -.- Wenn noch jemand eine Idee hat wie man das Case bei biegt wäre ich sehr verbunden. PS: Mir ist durch ausbewusst das ein set nur 255 versch. Datentypen haben kann .... aber darum ja die Gruppen, um Sets mit einander zu verbinden. EDIT: Hallo zusammen, ich hab meinen Denkfehler gefunden: Eine Menge ist kein Ordinalwert und darum nicht in case of verwendbar. @Admin / Mod: Wie kennzeichne ich jetzt als beantwortet, der Harken als offene Frage makieren ist nicht da. Ich kann ihn also nicht rausnehmen-.- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz