blatt3 - aufgabe 4


@Daniel: Also spontan würde ich sagen, dass du bei der ermittleStueckelung() nur den Betrag als Parameter übergeben darfst. Also etwa so:

public static int[] ermittleStueckelung(double dBetrag) {...}

Definiere dein Array stueckelung einfach in der Methode, dann musst du es auch nicht übergeben.

Edit: Wird die Anzahl der Münzen bei dir richtig berechnet? Sieht irgendwie kompliziert aus bei dir mit dem a-(a%b)?! Geht auch einfach mit typecast auf int und dann Ganzzahldivision…

Gruß
Flo


Grml, mein Test läuft auf 0% raus, obwohl das Programm genau tut was es soll. Argh

thx
vielen Dank hab leider jetzt keine Zeit mehr das durchzugehen und einfach kopieren wäre ja albern


Geht das eigentlich nochmal wer manuell durch was man fabriziert hat? Ich peil nicht, warum ich 0% kriege, alles läuft und die Beträge werden so gestückelt wie sie sollen, so ein man setze beliebigen Fäkalbegriff ein :motz:


Seltsam. Eigentlich kriegst du bereits 5% wenn sich das Programm kompelieren lässt. Das muss man sich mal anschauen.

kommt zwar zu spät
Ich weiß, das kommt nun zu spät - aber das hier gibt 100%.

public class Wechselgeld {
        public static   double [] Muenzwerte = {10.0, 2.0, 1.0, 0.5, 0.2, 0.1, 0.05,0.02, 0.01};
        public static void main(String[] args) {
                double [] TestWerte = {1.24, 3.13, 5, 8.32, 12.11, 19.33, 1002.22};
                int [] Wechselgeld;
                for(int i = 0; i < TestWerte.length; ++i) {
                        Wechselgeld = ermittleStueckelung(TestWerte[i]);
                        System.out.print("Testbetrag: " + TestWerte[i]+" Euro");
                        System.out.println();
                        for(int a = 0; a < Wechselgeld.length; ++a)
                                System.out.println(Wechselgeld[a]+" x "+ Muenzwerte[a]+" Euro");
                        System.out.println();
                }
        }

        public static double ermittleRestbetrag(double Betrag, double MuenzWert){
                return Betrag % MuenzWert;
        }

        public static int ermittleStueckzahl(double Betrag, double MuenzWert) {
                return (int)(Betrag / MuenzWert);
        }

        public static int[] ermittleStueckelung(double Testwert) {
                int [] Wechselgeld = new int[Muenzwerte.length];
                for(int i = 0; i < Muenzwerte.length; ++i) {
                        if (Testwert < Muenzwerte[i]) {
                                Wechselgeld[i] = 0;
                                continue;
                        }
                        Wechselgeld[i] = ermittleStueckzahl(Testwert, Muenzwerte[i]);
                        Testwert = ermittleRestbetrag(Testwert, Muenzwerte[i]);
                }
                return Wechselgeld;
        }
}

also:

Hmm, wenn ich mir so die Teilaufgabenstellung 3.4c) so ansehe, sehe ich nicht was eine Aussage über Parameterübergabe darstellt:

Zusammenfassend:

  • public
  • ermittleStueckelung
  • die 2 Funktionen verwenden
  • Rückgabe Array int mit Größe 9
  • Reihenfolge im Array
    Also mehr lese ich da nicht raus…

Und was diese Aufgabe allgemein angeht, hier meine Version:

public class Wechselgeld {
	public static void main(String[] args) {
		if(args.length != 1) {
			System.out.println("Bitte einen Betrag eingeben!");
			System.exit( 0 );
		}
		double[] euroMuenzen = {10, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01};
		double geld = Double.parseDouble(args[0]) + 0.001;
		int[] ergebnis = new int[euroMuenzen.length];
		ergebnis = ermittleStueckelung(geld, euroMuenzen);
		for(int i = 0; i < euroMuenzen.length; ++i) {
			if(ergebnis[i] == 1) {
				System.out.println(ergebnis[i] + " " + euroMuenzen[i] + " Euro Muenze");
			}
			else {
				System.out.println(ergebnis[i] + " " + euroMuenzen[i] + " Euro Muenzen");
			}
		}
	}
	public static double ermittleRestbetrag(double geld, double euroMuenzen[]) {
		for(int i = 0; i < euroMuenzen.length; ++i) {
			if(geld >= euroMuenzen[i]) {
				return (geld % euroMuenzen[i]);
			}
		}
	return(666);
	}
	public static int ermittleStueckzahl(double geld, double euroMuenzen[]) {
		for(int i = 0; i < euroMuenzen.length; ++i) {
			if(geld >= euroMuenzen[i]) {
				return (int)(geld / euroMuenzen[i]);
			}
		}
	return(666);
	}
	public static int[] ermittleStueckelung(double geld, double euroMuenzen[]) {
		int[] anzahl = new int[euroMuenzen.length];
		for(int i = 0; i < euroMuenzen.length; ++i) {
			if(geld >= euroMuenzen[i]) {
				anzahl[i] = ermittleStueckzahl(geld, euroMuenzen);
				geld = ermittleRestbetrag(geld, euroMuenzen);
			}
			else {
				anzahl[i] = 0;
			}
		}
	return(anzahl);
	}
}

Soweit ich das noch sehe, habe ich nichts verbrochen was gegen die Aufgabenstellung verstößt (gut, ich habe den Rundungsfehler hingepfuscht. aber wer besitzt schon zehntelcent oder kleineres :smiley: ).
Aber ich sehe momentan in meinem 5% code eh den Wald vor lauter Bäumen nicht mehr…

Trotzdem heist es ja:

Darum lasse ich mich mal überraschen, wieviel Punkte das „5%“ Programm letztendlich bringt.

Doch du hast etwas verpfuscht
Schau dir mal meine obigen Methoden
ermittleRestbetrag und ermittleStueckzahl an.

Ich verweise hier auf die Parameter.


Ist dann wohl mit “Euro-Betrag” ein Parameter “Betrag” gemeint?
Und mit dem 2. “Münzwert” ein Parameter “Muenzwert”?

Sehe ich nicht ein, denn dann müsste ja das Testprogramm explizit auf genau “Euro-Betrag” und “Münzwert” testen. Wobei letzteres schon extrem unglücklich mit dem Umlaut ü angegeben wäre, was man ja vermeiden soll.

Das mit dem Array, ähnlich wie in der vorgehenden Aufgabe würde ich noch verstehen, aber ich sehe es nicht ein meinen Funktionen 9 und 1 Parameter zu übergeben. 1 Array ist ja wohl auch 1 Parameter. Und in der Aufgabenstellung steht ja auch nichts über Arraybenutzung, ausser das die letzte Methode eines zurückgeben soll.

Gut, mag sein dass mein Programm ein bischen verpfuscht erscheint;
Aber es ist doch nicht falsch?!

sch**** testcases :#:


Nur wenn du doch das ganz Array übergibst werden doch die einzelnen Helferfunktionen sinnlos…

Nun - ich habe 100%


Ja, gut. Naja. Werde ja bald erfahren wie das ausgeht.

Mit 100% bist du jedenfalls auf der sicheren Seite.

aber jetzt erstmal…

plopp

muss mich mal beruhigen…

und es ist ja Wochenende…

Resümee
Fleißig, fleißig, die Aufgaben wurden schon teilweise korrigiert!

Dabei kam raus, dass mit:

natürlich genau ein Münzwert gemeint war.

Tja, habe wohl die Angaben ein bischen zu großzügig interpretiert 8-(

⇒ 5 Punkte Abzug
⇒ in Zukunft Angaben noch genauer lesen und so lange rumcoden, bis die Testcases 100% anzeigen…


Habe heute gehoert das man die testcases tricksen kann…soll heissen 100% bedeutet nicht gleich volle punkte!


das steht ja aber auch auf der algo seite. es muss auch nicht beuten, wenn du keine 100% erreichst in dem testcase, dass deine loesung nicht korrekt ist.


ja beuten … da werden die prozente nur so erbeutet. aber richtig … wenn der mensch ders dann nochma anguggt irgendeinen stuss findet, den das testcase-programm nich findet … gibts natürlich noch abzug. :wink:


loool :slight_smile:

Naja ich bin der Ansicht wenn man 100% hat und nicht aktiv versucht hat den Testcase auszutricksen dann wird man auch 100% der Punkte bekommen, so Spielereien wie aber mein Prog ist richtig und ihr seid zu dumm um einen gescheiten Testcase zu proggen würd ich vorerst nicht machen … klar wirds solche fälle geben aber dann sollte man klug genug sein und sich nach dem testcase richten, und den übungsgruppenleiter dann direkt mit seiner super-duper-implementierung konfrontieren … ich würd lieber mein prog nochmal schreiben als auf mein recht pochen “aber des ist doch logisch alles so” …