# Programmieraufgabe Zoogeschäft



## anfänger15 (7. Apr 2009)

Hallo ich mach ne Ausbildung zum Fachinformatiker - AE und hab nun ne Aufgabe von meinem Lehrer bekommen.

Hier die Aufgabe:

Zoogeschäft
a)	Sie sollen in einem Zoogeschäft Tiere für genau 100 € einkaufen. Zur Auswahl stehen folgende Tiere:
Maus = 0.50 €
Katze = 4.50 €
Hund = 5.00 €
Bedingung: Insgesamt müssen es 100 Tiere sein und von jeder Tierart muss mindestens eins im Einkaufswagen auftauchen.
Falls mehrer Kombinationen möglich sind, geben Sie alle Kombinationen an.
b)	Nächste Woche sind die Katzen im Angebot und kosten nur 2.50 €. Welche Kombinationen sind nun möglich?


Ich weiß nicht ob es eine bessere Möglichkeit gibt, aber meine Idee war eigentlich einfach alle verschiedenen Möglichkeiten durch zu testen.

wäre nett wenn mir jemand helfen könnte.

Danke

//gibt es jetzt keine Code-tag mehr?


----------



## Marco13 (7. Apr 2009)

Hm OK. Ein Klassiker. 

Erstmal kurz vorneweg: Die Sprache ... ist C#, oder? Jedenfalls nicht Java. Ist aber egal.

Wenn dein Ansatz die Richtige Lösung liefern würde, wäre das ... schon fast "Zufall". (naja... es WÄRE Zufall  )

Wenn du versuchen willst, alle Möglichkeiten durchzuprobieren, solltest du dir klarmachen, was eine "Möglichkeit" überhaupt ist... (und das ist nicht rethorisch gemeint: Was meinst du mit "Möglichkeit")

Versuch' dir auch ... präziser klar zu machen, WAS du da eigentlich Programmierst. Versuche dir einen Ablauf zu überlegen, und spiel' deine Idee notfalls mal mit 10€ per Hand durch, und schau', ob das vernünftige Ergebnisse liefert. Im Moment ist das, was dasteht, ja sowas wie "Kaufe eine Maus, dann kaufe ein Katze, dann kaufe Hunde bis dir das Geld ausgeht, schmeiß' die Hunde dann in den Müll (ja, anzahlHunde wird immer wieder auf 0 gesetzt), kauf dann wieder eine Katze... "

Lass dir mal ein paar Infos ausgeben, z.B. in jeder Schleife NACH der Berechnung des "aktPreis" sowas wie
System.out.println("Ich habe gerade eine ...(Hund, Katze, Maus)..." gekauft");
System.out.println("Davon habe ich jetzt "+anzahlHund+" Stück"); // anzahlKatze, anzahlMaus...
System.out.println("Die Kosten sind bisher "+aktPreis);

... das sieht ziemlich chaotisch aus...


----------



## anfänger15 (7. Apr 2009)

Ich habe mir eigentlich dies hier zur Verdeutlichung genommen, da ich dachte es werden dort alle Möglichkeiten durch probiert und dann versucht dies auf das obige Beispiel zu übertragen.





Marco13 hat gesagt.:


> Erstmal kurz vorneweg: Die Sprache ... ist C#, oder? Jedenfalls nicht Java. Ist aber egal.


Darum steht es ja auch hier (Softwareentwicklung andere Programmiersprachen, Datenbanksysteme, OOP, allerlei )


----------



## fjord (8. Apr 2009)

Was dein Programm macht ist, dass es eine Kombination von Tieren sucht, bei der es auf 100 Tiere kommt und der Preis 100 nicht übersteigt. Wichtig dabei zu beachten ist auch, dass es terminiert, sobald es sowas gefunden hat und somit nicht alle Kombinationen finden wird, wie in der Aufgabenstellung gefordert.

Du testet 3 mal, ob die Anzahl der Tiere unter 100 ist. Ich würde einen anderen Ansatz wählen. Vergleiche alle Kombinationen mit 100 Tieren.(Wenn ich hier zuviel sage, habe ich gleich meine Lösung ausgeplaudert.)


----------



## Marco13 (8. Apr 2009)

Vielleicht noch so nebenbei: "Alle Kombinationen" oder "Alle Möglichkeiten" (was auch immer das im einzelnen bedeutet) kann OK sein. Aber spätestens, wenn es nicht um 100 Tiere und 100 Euro geht, sondern um 100000 Euro für 100000 Tiere von 15 verschiedenen Arten kann sowas aufwändig werden (ist aber in diesem Fall nicht sooo relevant - das ist nur eine kleine Programmierübung, da braucht man keine große draus zu machen...)


----------



## anfänger15 (8. Apr 2009)

Ok nun funktioniert es hatte dort wohl mehrere Denkfehler mit eingebaut. Danke für die Hilfe.

@Marco13: Wäre es ein großer Aufwand dies performenter zu machen bzw. nicht alle Kombinationen zu testen und auf was müsste ich dann prüfen?

Eine Idee dir mir gerade so einfällt ist in den while-Schleifen auf einen boolschen Wert abzufragen, der auf true geändert wird wenn das Ergebnis gefunden wurde.


----------



## El Jay (8. Apr 2009)

Also die Lösung würde mich nun schon interessieren, post mal den Code

Danke,
El Jay

PS: Nur zur Info ich will hier keine Hausaufgaben abschreiben, mich interessiert es nur.


----------



## anfänger15 (8. Apr 2009)

Werde sobald ich meine HA abgegeben habe die Lösung posten. Nicht das jemand die gleiche Lösung wie ich einreicht


----------



## El Jay (8. Apr 2009)

Ist klar, kann ich verstehen. Würde ich auch so machen.


----------



## fjord (8. Apr 2009)

anfänger15 hat gesagt.:


> [...] Eine Idee dir mir gerade so einfällt ist in den while-Schleifen auf einen boolschen Wert abzufragen, der auf true geändert wird wenn das Ergebnis gefunden wurde.


Also im 2. Fall gibts ja 2 Lösungen, würde ich also nicht zu raten.

@El
Mein Vorschlag in Java wäre:[highlight=Java]public class Zoo {
    static final int MOUSE_PRICE = 50;
    static final int CAT_PRICE = 450;
    static final int DOG_PRICE = 500;
    static final int TOTAL = 10000;
    static final int ANIMALS = 100;    

    public static void main(String[] args) {
        for (int mice = 1; mice < ANIMALS - 2; mice++) {
            for (int cats = 1; cats < ANIMALS - mice - 1; cats++) {
                int dogs = ANIMALS - mice - cats;
                if (mice * MOUSE_PRICE + cats * CAT_PRICE + dogs * DOG_PRICE == TOTAL) {
                    System.out.format("%d mice, %d cats, %d dogs%n", mice, cats, dogs);
                }
            }
        }
    }
}[/highlight]
Eine Optimierungsmöglichkeit in dem von mir geposteten Code wäre z.B., dass man im Voraus berechnet wieviele der Tiere mind. Mäuse sein müssen, damit man noch den Preis von einhundert erreichen kann und dann die Schleife der Mäuse erst bei dem Wert zu beginnen.

In so einem Fall wie diesem sollte man aufs Optimieren allerdings verzichten. 





			
				weiß gerade nicht von wem hat gesagt.:
			
		

> Rule #1: Don't optimize.
> Rule #2: [For experts only] Don't optimize yet.


Solange es nicht nötig ist, sollte man nicht optimieren. Es besteht nämlich die nicht geringe Chance, dass man dabei einen Teil der gewünschten Funktionalität unbewusst wegoptimiert.


----------



## anfänger15 (10. Apr 2009)

@El Jay: Meine Lösung sah im Grunde genommen genau gleich aus, nur dass ich bei der Berechnung der Hunde auch noch eine for-Schleife hatte(wie bei der Berechnung der Mäuse und Katzen) was aber eigentlich überflüssig ist, da die Hunde ja immer nur die restlichen Tiere(bis es insgesamt 100 Tiere sind) sein können.

Danke fjord


----------



## Prog500 (11. Sep 2011)

Kann man das ganze auch mit einer while-schleife lösen?

Danke im vorraus...


----------



## Firephoenix (12. Sep 2011)

Hi,
das Problem (und auch die Lösung von fjord) passen eigentlich auf eine leicht modifizierte Version hiervon:
Rucksackproblem ? Wikipedia
Nur mit einer while dürfte das schwer werden, geht aber bestimmt irgendwie und wird nicht schöner und auch nicht schneller 
Gruß


----------

