Beiträge von Ycul

    Hallo,
    Ich hoffe ihr könnt mir helfen.
    Wir mussten als Aufgabe eine Klasse erstellen, in der ein Array Counter erstellt wird und das je nach Konstruktor entweder mit 0en oder mit zufälligen Integer Werten gefüllt wird. Dazu zum einen eine Methode, in der eine angegebene Position um 1 erhöht wird und alle minderwertigeren Stellen auf 0 gesetzt werden (genaueres steht im Quellcode). Zum anderen eine Methode, die einfach alle Stellen um 1 erhöht.
    Jetzt habe ich das Problem, dass das Programm beim Ausführen der ersten Methode offenbar in einer Endlosschleife hängt und entsprechend gar nichts rauskommt, und die andere Methode erhöht zwar alle Stellen um 1 (wenn ich den "0er-Konstruktor" gewählt habe), gibt dann aber ArrayIndexOutOfBoundsException aus, und wenn ich den anderen Konstruktor nehme, gibt es mir irgendeine Stelle aus, erhöht die Werte jedoch nicht.

    Hier mal der Code, ich konnte leider nichts kürzen, weil für die Methoden ja doch irgendwie alles relevant ist. Wobei die Konstruktoren eigentlich richtig sein müssten.

    Ich hoffe, mir kann da jemand helfen.

    Edit:
    Hier nochmal die komplette Aufgabenstellung dazu: (die ä,ö,ü sind jetzt nur a o u, weil das PDF so komisch ist, wollte jetzt nicht alles durchgehen und korrigieren, kann man ja trotzdem lesen)

    Aufgabe 3: Codeknacker: Zahlensystem-Zahler 30 Punkte
    In dieser Aufgabe geht es darum einen Zahlensystem-Zahler zu implementieren. Die Klasse
    soll Counter heien. Ein Zahler hat eine Lange (Zahl der Stellen innerhalb des Zahlers) und
    eine Basis. Jede Stelle im Zahler hat einen ganzzahligen Wert im Bereich [0,Basis).
    z.B. ein Zahler mit Lange 4 und Basis 2 zahlt die 4-stelligen Binarzahlen ab und ein Zahler
    mit Lange 2 und Basis 10 zahlt die 2-stelligen Dezimalzahlen ab.
    (a) Konstruktor: 6 Punkte
    Der Konstruktor soll zwei Integer-Parameter besitzen. Zum Einen die Zahlerlange, zum
    Anderen die Basis Counter(int length, int base). Gultige Werte fur die Zahlerlange
    sind 1 und fur die Basis 2. Der Konstruktor soll robust gegen ungultige Werte sein.
    Alle Stellen des Counters werden mit 0 initialisiert.
    (b) Konstruktor: 6 Punkte
    Der zweite Konstruktor hat drei Parameter Counter(int length, int base, boolean
    random). Wenn random nicht wahr ist, funktioniert er wie der Konstruktor mit nur zwei
    Parametern. Wenn random wahr ist, wird der Counter initialisiert mit einem random Wert.
    Der Konstruktor soll robust gegen ungultige Werte sein.
    (c) int inc(int pos): 6 Punkte
    Diese Methode erhoht die angegebene Position im Zahler um 1 und setzt die minderwertigeren
    Stellen auf 0. Wird bei diesem Schritt der Wertebereich uberschritten, so wird die
    nachsthoherwertigeren Position um 1 erhoht, usw. Sollte der Uberlauf auf die hochstwertigen
    Position eintreten, werden alle Stellen auf 0 gesetzt.
    Der Ruckgabewert dieser Methode ist der Index der hochstwertigen Position die verandert
    wurde.
    Es ist ein Fehler, wenn pos < 0 oder pos length ist.
    (d) int inc(): 6 Punkte
    Erhoht den Zahler als Ganzen um 1, unter Beachtung der Basis, wie unter inc(pos) beschrieben.


    (e) value(): 6 Punkte
    Die Methode int[] value() soll den aktuellen Stand des Zahlers zuruck geben. Achte
    darauf, dass es nicht moglich sein soll, den Zahler von auen zu manipulieren indem
    man das zuruckgegebene Array andert. Damit das Resultat der Methode fur Menschen
    leicht lesbar ist, enthalt es die meist-signikante Zier auf Position 0 (big-endian). z.B. new
    Counter(4,2).inc().inc() ergibt f0,0,1,0g.
    Beispiel
    int x;
    Counter c = new Counter(3,4);
    // c.value() = {0,0,0}
    x = c.inc();
    // c.value() = {0,0,1}, x = 0;
    x = c.inc();
    // c.value() = {0,0,2}, x = 0;
    x = c.inc();
    x = c.inc();
    // c.value() = {0,1,0}, x = 1;
    x = c.inc(2);
    // c.value() = {1,0,0}, x = 2;
    x = c.inc();
    // c.value() = {1,0,1}, x = 0;
    x = c.inc(1);
    // c.value() = {1,1,0}, x = 1;
    ...
    // Assume c.value = {3,3,3} here
    c.inc();
    // c.value() = {0,0,0}, x = 2;
    3

    @IndexOutOfBounds: Ich meinte den Aufruf in der main-Methode, der die Rekursion beginnt


    Äh... Das ist die einzige Methode dazu.

    Zitat

    stackoverflow: Das Array-Objekt ist in jedem rekursiven Aufruf das gleiche, das heisst seine Laenge veraendert sich nie. Es kann daher auch nie die Laenge 1 erreichen.

    Ja, dass das nicht stimmt wurde mir auch schon gesagt, deswegen hab ich das geändert.


    Edit: Ich hab das darüber getestet, dass ich ein neues Objekt erzeuge und da die Methode ausführ. Hab da 7 Elemente eingegeben für das array, start = 0 und ende = 7, weil in der Aufgabe steht, das Intervall soll [start;ende) sein, also exklusive ende. Hab jetzt mal statt 7 6 eingegeben für ende und es ging.

    Also zum IndexOutOfBounds sieht der Code bei mir so aus:


    Also im Vergleich zu Roflkopf hab ich nur mittel zu mid geändert.
    Und beim StackOverflow hatte ich


    bzw. zuerst array.length<=1, aber da kam das gleiche.