1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

ArrayIndexOutOfBoundsException und Endlosschleife, finde meine Fehler nicht

  • Ycul
  • 23. Dezember 2013 um 09:44
  • Unerledigt
  • Ycul
    2
    Ycul
    Mitglied
    Punkte
    35
    Beiträge
    6
    • 23. Dezember 2013 um 09:44
    • #1

    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.

    Code
    public class Counter{
        private int base;
        private int length;
        private final int[] counter;
    
    
    
    
        /**
         * Aufgabe 3 (a)
         */
        public Counter(int length, int base) {
            this.base = base;
            this.length = length;
    
            //Macht den Counter robust gegen ungültige Werte
            if(length<1 || base<2) {
                throw new IllegalArgumentException("Ungültige Länge oder Basis!");
            }
    
            //Initialisiert, falls length und base in Ordnung sind, einen Counter der Länge length und setzt alle Stellen auf 0.
            else { 
              counter = new int[length];
    
              for(int i = 0; i < length; i++) {
                  counter[i] = 0;
              }
            }
        }
    
        /**
         * Aufgabe 3 (b)
         */
        public Counter(int length, int base, boolean random) {
            //Überprüft, ob die Werte für length und base gültig sind.
            if(length<1 || base<2) {
                throw new IllegalArgumentException("Ungültige Länge oder Basis!");
            }
    
            //Überprüft, ob random false oder true ist. Ist es false, funktioniert dieser Konstruktor wie der erste, ist es true, 
            //wird jeder Stelle des Counters ein zufälliger Wert zugeordnet.
            else {
    
                this.base = base;
                counter = new int[length];
                if(random == false) {
                    for(int i = 0; i < length; i++) {
                        counter[i] = 0;
                    }
                }
    
                else {
    
                  for(int i = 0; i < length; i++) {
                       counter[i] = (int)(Math.random()*(base));
                  }
                }
            }
    
        }
    
    
    
    
        /**
         * Aufgabe 3 (c)
         * Die Methode nimmt eine bestimmte Position entgegen, erhöht den Wert dieser und setzt alle minderwertigeren Stellen auf 0. Sollte dabei der Wertebereich überschritten
         * werden, wird die nächsthöhere Position um 1 erhöht. Passiert dies auf der letzten Stelle des Arrays, werden alle Stellen auf 0 gesetzt.
         */
        public int inc(int pos) {
            //Verhindert, dass pos kleiner als 0 oder grösser als die Counterlänge ist.
            if(pos<0 || pos>=counter.length) {
                throw new IllegalArgumentException("Ungültiger Wert für pos!");
            }
            int i = pos-1;
    
            //setzt alle Stellen. die minderwertiger sind als pos, auf 0.
            while(i >= 0) {
                counter[i] = 0;
                i = i--;
            }
            //erhöht den Wert von pos um 1.
            counter[pos]++;
    
            //Falls pos dabei den Wertebereich übertritt, wird die nächsthöhere eins höher gesetzt und pos auf 0.
            if(counter[pos] >= base) {
              counter[pos+1]++; 
              counter[pos] = 0;
            }
    
            //Passiert der Überlauf auf der letzten Stelle des Arrays, werden alle Stellen auf 0 gesetzt.
            if(pos == counter.length-1) {
                if(counter[pos] >= base) {
                    counter[i] = 0;
                }
            }
    
            return counter[pos];
        }
    
        /**
         * (d)
         * Erhöht die Werte aller Stellen um 1, unter Beachtung der Base, wie bei int inc(int pos).
         */
        public int inc() {
            int i = 0;
    
            //Erhöht alle Stellen um 1
            for(i = 0; i < length; i++) {
                counter[i]++;
            }
    
            //Falls der Wertebereich überschritten wird, wird die nächsthöhere erneut um 1 erhöht.
            if(counter[i] == base) {
                counter[i+1]++;
            }
    
            //Setzt alle Stellen auf 0, falls der Überlauf an letzter Stelle eintritt.
            if(i == counter.length-1) {
                if(counter[i] >= base) {
                    counter[i] = 0;
                }
            }
    
            return counter[i];
        }
    
        /**
         * (e)
         * gibt den aktuellen Stand des Zählers zurück und erstellt dazu ein Hilfsarray.
         */
        public int[] value() {
            int[] help = new int[counter.length];
    
            for(int i = 0; i < counter.length; i++) {
                help[i] = counter[i];
            }
    
            return help;
        }
    }
    Alles anzeigen

    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

    Einmal editiert, zuletzt von Ycul (23. Dezember 2013 um 10:20) aus folgendem Grund: Aufgabenstellung hinzugefügt

  • Ycul
    2
    Ycul
    Mitglied
    Punkte
    35
    Beiträge
    6
    • 23. Dezember 2013 um 14:06
    • #2

    Die Probleme haben sich weitgehend gelöst, hab im Chat Hilfe bekommen.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern