musti Geschrieben 26. Dezember 2009 Geschrieben 26. Dezember 2009 Hi Programmier Freaks, ich studiere momentan im 1. semester Informatik und hänge gerade an einer aufgabe in Programmieren mit java/bluej. Es geht in der Aufgabe um Arrays und Schleifen. Die Fragen lauten: Erstellen Sie in Ihrem Verzeichnis ein neues Projekt UmgangMitArrays. a. Erstellen Sie in diesem Projekt eine neue Klasse ZahlenSpeicher, die ein Datenfeld mit einer Arrayvariablen zahlen vom Typ int enthält. Verwenden Sie für die folgenden Aufgaben möglichst unterschiedliche Schleifenkonstrukte. Ihr Programmcode sollte dagegen robust mögliche Indexbereichsverletzungen sein. Testen Sie jede Teilaufgabe, bevor Sie zum nächsten Aufgabenteil gehen. b. Die Arrayvariable zahlen soll im Konstruktor so initialisiert werden, dass das zugehörige Array 10 Zahlen speichern kann. Der Konstruktor soll außerdem das Array mit den Quadratzahlen von 12 bis 102 initialisieren. d. Erstellen Sie eine Methode gibZahl(int index), welche die Zahl zurückgibt, die im Arrayelement mit dem Index index gespeichert ist. f. Erstellen Sie eine Methode ersetzeZahl(int index, int neueZahl), welche die Zahl mit dem Index index durch die übergebene Zahl ersetzt. h. Ergänzen Sie eine Methode entfernen(int index), welche die Zahl mit dem angegebenen Index aus dem Array entfernt und diese Zahl zurückgibt. Die restlichen Zahlen im Array sollen nachrücken. i. Die Klasse soll ein zusätzliches Datenfeld anzahlZahlen erhalten, mit dessen Hilfe sie über die Anzahl der tatsächlich gespeicherten Zahlen Buch führt. Der Wert soll im Konstruktor gesetzt werden. Alle bisher erstellten Methoden sollen so verändert werden werden, dass auch diese nur die tatsächlich im Array vorhandenen Zahlen benutzen. j. Ergänzen Sie eine Methode hinzufügen (int zahl), mit der eine Zahl zu dem ZahlenSpeicher hinzugefügt werden kann. Die Methode soll eine Fehlermeldung ausgeben, sofern das Array bereits voll ist und keine weiteren Zahlen mehr aufgenommen werden können. Hier mein Quelltext dazu: import java.util.ArrayList; /** * Beschreiben Sie hier die Klasse ZahlenSpeicher. * * @author (Ihr Name) * @version (eine Versionsnummer oder ein Datum) */ public class ZahlenSpeicher { private int [] zahlen; /** * Konstruktor für Objekte der Klasse ZahlenSpeicher */ public ZahlenSpeicher() { zahlen = new int [10]; for(int index =0 ; index<zahlen.length;index++) { zahlen[index] = (index+1) * (index+1); } } /** * c) Ein Beispiel einer Methode - ersetzen Sie diesen Kommentar mit Ihrem eigenen * * @param y ein Beispielparameter für eine Methode * @return die Summe aus x und y */ public void alleZahlenAusgeben() { for(int i =0; i <zahlen.length; i++) { System.out.println(zahlen); } } /** * d) Zahl soll zurückggeben werden, die im Arrayelement mit * dem Index index gespeichert ist. */ public int gibZahl(int index) { if(zahlen[index]>=0) { return zahlen[index]; } else if(zahlen[index]<zahlen.length) { return zahlen[index]; } else { return 404; } } /** * e) Soll die größte Zahl ausgeben, die im Array gespeichert ist. */ public int groessteZahl() { int groesste=zahlen[0]; int i = 0; while(i<zahlen.length) { if(zahlen>groesste) { groesste=zahlen; } i++; } return groesste; } /** * e) Soll den index der groessten Zahl ausgeben. */ public int indexGroessteZahl() { int groesste=0; int indexGroesste =0; int i = 0; while(i<zahlen.length) { if(zahlen>groesste) { groesste=zahlen; indexGroesste=i; } i++; } return indexGroesste; } /** * f) Soll Zahl mit dem Index, durch neue Zahl ersetzen */ public void ersetzeZahl(int index, int neueZahl) { zahlen[index]=neueZahl; } /** * g) Reihenfolge Umkehren */ public void reihenfolgeUmkehren() { for(int i=0; i<zahlen.length/2;i++) { int a = zahlen; zahlen = zahlen[zahlen.length - 1 - i]; zahlen[zahlen.length - 1 - i] = a; } } public int anzahlZahlen(int index) { return zahlen[index]; } } MEIN PROBLEM: bei der METHODE gibZahl(int index) - die methode soll bei eingabe eines index's von 0 bis 9, die dazugehörige zahl zurückgeben (mit return) und bei eingabe eines index's < 0 und > zahlen.length einen fehler zurückgeben, wie z.b. 0000....oder so doch bei mir tritt ein arrayIndexOutOfBounds ein. was muss ich machen. und bei der Methode ersetzeZahl(int index, int neueZahl) und bei den aufgaben von h) bis j) habe ich keine ahnung. würd mich sehr freuen, wenn mir jemand behilflich sein könnte. Zitieren
bequiet Geschrieben 26. Dezember 2009 Geschrieben 26. Dezember 2009 also der arrayindexoutofBound bedeutet das dein Programm einen Schritt über des Array Feld rausgeht. Wenn du ein Array von [8] hast, sind die Array Indizes 0-7. Da musst du bei deinem Programm überprüfen. Könnte dir jetzt zwar den Fehler vorkauen, aber denke du lernst es am besten wenn du selbst danach suchst. Geh dein Programm mal durch und schau wo der Feldrand überschritten wird, bzw. wo der Index >7 wird. Die 2. Frage schau ich mir im laufe des Tages mal genauer an. Zitieren
BrauniDeluxe Geschrieben 26. Dezember 2009 Geschrieben 26. Dezember 2009 (bearbeitet) Ich halte es nicht für günstig eine Zahl zurück zu liefern falls der Feld index überschritten wurde. Woher willst du später unterscheiden ob es die Fehlerzahl ist oder ob zufällig die gleiche Fehlerzahl als Feldwert vorhanden war? Im Zweifel eine Methode schreiben die prüft ob der abzufragende index Wert in den Grenzen des Feldes liegt. Je nach Rückgabe dann die gibZahl Methode aufrufen. Falls du das nicht möchtest returne in der Methode bei index Überschreitung null und überprüfe bei Aufruf obd er return Wert == null ist. Zudem überlege dir erstmal verschieden Fälle die auftreten können und schreibe diese in deine Main class zum testen. Entwerfe nach diesen Testfällen deine Methoden. Zum ersetzen von Zahlen ... das ist dann wieder das gleiche mit dem index Problem .. siehe oben ... falls der index in den Grenzen des Feldes ist einfach in der Methode ersetzeZahl sowas machen wie : zahlen[index] = neueZahl; Gruss Dennis Bearbeitet 26. Dezember 2009 von BrauniDeluxe Zitieren
musti Geschrieben 28. Dezember 2009 Autor Geschrieben 28. Dezember 2009 Hi nochmal, ich weiss nicht wie ich bei den AUfgaben rangehen soll. bräuchte mal ne kleine stütze nur mal nen tipp. danke h. Ergänzen Sie eine Methode entfernen(int index), welche die Zahl mit dem angegebenen Index aus dem Array entfernt und diese Zahl zurückgibt. Die restlichen Zahlen im Array sollen nachrücken. i. Die Klasse soll ein zusätzliches Datenfeld anzahlZahlen erhalten, mit dessen Hilfe sie über die Anzahl der tatsächlich gespeicherten Zahlen Buch führt. Der Wert soll im Konstruktor gesetzt werden. Alle bisher erstellten Methoden sollen so verändert werden werden, dass auch diese nur die tatsächlich im Array vorhandenen Zahlen benutzen. j. Ergänzen Sie eine Methode hinzufügen (int zahl), mit der eine Zahl zu dem ZahlenSpeicher hinzugefügt werden kann. Die Methode soll eine Fehlermeldung ausgeben, sofern das Array bereits voll ist und keine weiteren Zahlen mehr aufgenommen werden können. Zitieren
musti Geschrieben 28. Dezember 2009 Autor Geschrieben 28. Dezember 2009 /** * h) Entfernt die Zahl mit dem gegebenen Index und die Array rückt auf */ public int entfernen(int index) { for(int i = 0; i < zahlen.length-1; i++) { zahlen = zahlen[i+1]; zahlen[zahlen.length - 1] = 0; } return zahlen[index]; } aber ich bekomm folgenden fehler beim unit text angezeigt: expectet:<4> but was <9> was habe ich falsch gemacht? Zitieren
Al-Bundy Geschrieben 28. Dezember 2009 Geschrieben 28. Dezember 2009 Es sollen nur die Zahlen nachrücken NACH dem Index, bei dir rücken alle Zahlen ein vor. Ausserdem gibst du am Ende nicht die gewünschte Zahl zurück. Es soll ja die gelöschte Zahl sein und nicht der Nachfolger. Also musst du am Anfang diese Zahl in einer lokalen Variable speichern und am Ende zurück geben. und zahlen[zahlen.length - 1] = 0; sollte hinter der for-Schleife stehen, das muss man ja nur einmal machen Zitieren
musti Geschrieben 29. Dezember 2009 Autor Geschrieben 29. Dezember 2009 also nochmal kurz zu meinem problem. hab das jetzt mal umgeändert: /** * h) Entfernt die Zahl mit dem gegebenen Index und die Array rückt auf */ public int entfernen(int index) { for(int i = 0; i < zahlen.length; i++) { if( index == zahlen) { for (int x = i; x < zahlen.length - 1; x++) { zahlen[x] = zahlen[x+1]; } return zahlen; } } return 404; } Bei Unit Test, den mein Prof. eingefügt hat, besteht kein fehler in dieser methode. aber wenn ich es selbst teste, läuft das programm nicht so wie es in der ausgaben stellung steht. statt des index's soll ich die zahl die ich entfernen will angeben. und wenn ich die zahl entfernt habe, gibt mir das programm nicht die gelöschte zahl zurück, sondern die zahl, die hinter der gelöschten zahl steht. Aufrücken tut es normal. meine array: 1 4 9 16 25 36------> entferne 36 ( müsste ich eigentlich index 5 eingeben, doch das programm verlangt, das ich 36 eingebe) 49------> zurückgeben müsste das programm 36, aber es gibt 49 zurück 64 81 100 Zitieren
Al-Bundy Geschrieben 29. Dezember 2009 Geschrieben 29. Dezember 2009 Bei Unit Test, den mein Prof. eingefügt hat, besteht kein fehler in dieser methode. das ist wohl eher Zufall statt des index's soll ich die zahl die ich entfernen will angeben. das liegt hieran: if( index == zahlen) bei dem Vergleich wird der Inhalt von zahlen mit dem index geprüft, da müsste statt zahlen nur i stehen. und wenn ich die zahl entfernt habe, gibt mir das programm nicht die gelöschte zahl zurück, sondern die zahl, die hinter der gelöschten zahl steht. Aufrücken tut es normal. du hast die gelöscht Zahl ja auch überschrieben, die kann dann ja garnicht zurückgegeben werden. Für die Lösung brauchst du eine lokale Variable und auch nur eine for-Schleife. Zitieren
musti Geschrieben 29. Dezember 2009 Autor Geschrieben 29. Dezember 2009 nächsten 2 probleme Die Klasse soll ein zusätzliches Datenfeld anzahlZahlen erhalten, mit dessen Hilfe sie über die Anzahl der tatsächlich gespeicherten Zahlen Buch führt. Der Wert soll im Konstruktor gesetzt werden. Alle bisher erstellten Methoden sollen so verändert werden werden, dass auch diese nur die tatsächlich im Array vorhandenen Zahlen benutzen. Doch ich weiss nicht, wie und was ich alles machen soll. 2. Problem: ergänzen Sie eine Methode hinzufügen (int zahl), mit der eine Zahl zu dem ZahlenSpeicher hinzugefügt werden kann. Die Methode soll eine Fehlermeldung ausgeben, sofern das Array bereits voll ist und keine weiteren Zahlen mehr aufgenommen werden können. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.