Hier werden die Unterschiede zwischen der gewählten und der aktuellen Version gezeigt.
start:info:11if:09_arrays 30.01.2009 08:27 | start:info:11if:09_arrays 11.06.2015 12:22 aktuell | ||
---|---|---|---|
Zeile 33: | Zeile 33: | ||
- Ein Array ist ein Verweis auf eine Abfolge fester Länge von Variablen des gleichen Typs, genannt Fächer (engl. slots). | - Ein Array ist ein Verweis auf eine Abfolge fester Länge von Variablen des gleichen Typs, genannt Fächer (engl. slots). | ||
- Der Typ ''typ[]'' ist der Typ der Arrays mit Einträgen vom Typ ''typ''. | - Der Typ ''typ[]'' ist der Typ der Arrays mit Einträgen vom Typ ''typ''. | ||
- | - Der Ausdruck ''new typ[n]'' liefert ein frisches Array vom Typ ''typ'' der Länge ''%%n%%'' zurück. Hier ist ''%%n%%'' ein Ausdruck vom Typ ''%%int%%''. | + | - Der Ausdruck ''new typ[n]'' liefert ein frisches Array vom Typ ''typ'' der Länge ''%%n%%'' zurück. Hier ist ''%%n%%'' ein Ausdruck vom Typ ''%%double%%''. |
Im Beispiel ist also ''data'' eine Arrayvariable, die ein frisches Array vom Typ ''double'' der Länge 10 enthält. | Im Beispiel ist also ''data'' eine Arrayvariable, die ein frisches Array vom Typ ''double'' der Länge 10 enthält. | ||
Zeile 96: | Zeile 96: | ||
- Die Fächer eines Arrays werden durch Anfügen des in eckige Klammern gesetzten Index bezeichnet. | - Die Fächer eines Arrays werden durch Anfügen des in eckige Klammern gesetzten Index bezeichnet. | ||
- Ein auf diese Weise bezeichnetes Fach ist eine Variable. Man kann ihren Wert verwenden und ihr mit ''='' einen neuen Wert zuweisen. | - Ein auf diese Weise bezeichnetes Fach ist eine Variable. Man kann ihren Wert verwenden und ihr mit ''='' einen neuen Wert zuweisen. | ||
- | - Arrayindizes beginnen immer bei 0. | + | - Arrayindizes beginnen immer bei 0 (wie bei String). |
- Die Länge eines Arrays erhält man mit ''.length'' | - Die Länge eines Arrays erhält man mit ''.length'' | ||
Zeile 165: | Zeile 165: | ||
Man kann nun etwa ''mittelwert(data)'' aufrufen. Wert ist der Mittelwert von ''data''. | Man kann nun etwa ''mittelwert(data)'' aufrufen. Wert ist der Mittelwert von ''data''. | ||
- | ====== Arrays als Methodenparameter ====== | ||
- | Es wird nur das Array übergeben, d.h. der Verweis auf das Array. Man kann daher (zuweilen unerwünschte) Seiteneffekte erhalten: | ||
- | |||
- | <code java> | ||
- | public double f(double[] zahlen) { | ||
- | if (zahlen.length == 0) { | ||
- | return 23; | ||
- | } else { | ||
- | zahlen[0] = 27; | ||
- | return 23; | ||
- | } | ||
- | } | ||
- | </code> | ||
- | |||
- | Der Aufruf ''f(data)'' hat stets den Wert 23, setzt aber gleichzeitig ''data[0]'' auf 27. | ||
====== Arrays als Rückgabewerte ====== | ====== Arrays als Rückgabewerte ====== | ||
Zeile 204: | Zeile 189: | ||
====== Finden eines Wertes ====== | ====== Finden eines Wertes ====== | ||
- | Man möchte wissen, ob eins der eingelesenen Preise ''<= 1000'' ist: | + | Man möchte wissen, ob einer der eingelesenen Preise ''≤ 1000'' ist: |
<code java> | <code java> | ||
Zeile 213: | Zeile 198: | ||
</code> | </code> | ||
- | jetzt ist gefunden ''true'' genau dann, wenn ''data'' einen Eintrag ''<= 1000'' hat. Man möchte nun auch noch wissen, wie viele Preise ''<= 1000'' sind: | + | jetzt ist gefunden ''true'' genau dann, wenn ''data'' einen Eintrag ''≤ 1000'' hat. Man möchte nun auch noch wissen, wie viele Preise ''≤ 1000'' sind: |
<code java> | <code java> | ||
Zeile 222: | Zeile 207: | ||
</code> | </code> | ||
- | Jetzt ist ''count'' gleich der Anzahl derjenigen Preise, die ''<= 1000'' sind. | + | Jetzt ist ''count'' gleich der Anzahl derjenigen Preise, die ''≤ 1000'' sind. |
====== Löschen eines Wertes ====== | ====== Löschen eines Wertes ====== | ||
Zeile 231: | Zeile 216: | ||
<code java> | <code java> | ||
- | data[pos] = data[dataSize-1]; | + | // Definition für die intern benutzte Länge: |
- | dataSize = dataSize - 1; | + | dataSize = data.length; |
+ | |||
+ | // Das zu löschende Element an der Stelle pos | ||
+ | // mit dem letzten Element überschreiben | ||
+ | data[pos] = data[dataSize-1]; | ||
+ | |||
+ | // die intern verwendete Längenangabe reduzieren | ||
+ | dataSize = dataSize - 1; | ||
+ | |||
+ | // Achtung: data.length hat sich nicht verändert! | ||
</code> | </code> | ||
Falls die Ordnung beibehalten werden muss: | Falls die Ordnung beibehalten werden muss: | ||
- | for(int i = 0; i < dataSize - 1; i++) | + | <code java> |
+ | // Elemente bis zur Position aufschieben | ||
+ | for(int i = pos; i < dataSize - 1; i++) | ||
data[i] = data[i+1]; | data[i] = data[i+1]; | ||
+ | // die intern verwendete Längenangabe reduzieren | ||
dataSize = dataSize - 1; | dataSize = dataSize - 1; | ||
</code> | </code> | ||
+ | ====== Einfügen eines Elements ====== | ||
+ | |||
+ | ...an der Stelle pos unter Beibehaltung der Ordnung: | ||
+ | |||
+ | <code java> | ||
+ | for(int i = dataSize; i > pos; i--) | ||
+ | data[i] = data[i-1]; | ||
+ | |||
+ | data[pos] = neuerWert; | ||
+ | dataSize = dataSize + 1; | ||
+ | </code> | ||
+ | |||
+ | Man muss sich immer wieder sehr genau klar machen, was hier passiert. | ||
+ | |||
+ | In der Anwendung muss man natürlich sicherstellen, dass ''pos'' nicht außerhalb der Grenzen liegt. | ||
+ | |||
+ | ====== Arrays als Instanzvariablen ====== | ||
+ | |||
+ | Arrays können auch als Instanzvariablen eines Objektes in Erscheinung treten. Es empfiehlt sich, dann im Konstruktor auch gleich ein frisches Array zu erzeugen. | ||
+ | |||
+ | **Beispiel:** | ||
+ | |||
+ | <code java> | ||
+ | public class Polygon { | ||
+ | private int n; // Zahl der Ecken | ||
+ | private Point[] ecken; // Liste der Ecken | ||
+ | |||
+ | /* Methoden und Konstruktoren */ | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ====== Zweidimensionale Arrays ====== | ||
+ | |||
+ | Die Einträge eines Arrays können wieder Arrays sein. Das gibt ein zweidimensionales Array. | ||
+ | |||
+ | <code java> | ||
+ | int[][] einmaleins = new int[10][10]; | ||
+ | |||
+ | for(int i = 0; i < 10; i++) { | ||
+ | for(int j = 0; j < 10; j++) { | ||
+ | einmaleins[i][j] = (i+1) * (j+1); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ====== Fragen ====== | ||
+ | |||
+ | - Erkläre, was an diesem Codefragment falsch ist und gib an, wie man es besser macht: <code java>int[] v = new int[10]; | ||
+ | for(int i = 1; i <= 10; i++) | ||
+ | v[i] = v.length - i; | ||
+ | </code> Was steht nach erfolgreicher Ausführung der Schleife im Array? (Bitte selbst durchspielen und nicht laufen lassen...) | ||
+ | - Gib Beispiele für eine sinnvolle Methode, die... | ||
+ | * einen formalen Parameter vom Typ ''int[]'' hat, der modifiziert wird. | ||
+ | * einen formalen Parameter vom Typ ''int[]'' hat, der nicht modifiziert wird. | ||
+ | * die ein Array vom Typ ''int[]'' zurückgibt. | ||
+ | - Schreibe eine Schleife, die ein Array wie folgt besetzt: ''1 4 9 16 25 36 49 64 81 100'' | ||
+ | - Konstruiere ein 2D-Array von Booleans, das schachbrettartig vorbesetzt ist. | ||
+ | - Schreibe eine Methode, die überprüft, ob zwei Arrays dieselben Elemente in derselben Reihenfolge enthalten. | ||
+ | - Lade folgende Datei herunter und benenne Sie in "Felder.java" um: {{:start:info:11if:felder.txt|felder.txt}} | ||
+ | - Öffne BlueJ. | ||
+ | - Schließe evtl. bereits geöffnete Projekte. | ||
+ | - Erstelle ein neues Projekt "Felder". | ||
+ | - Erstelle darin eine Klasse "Felder". | ||
+ | - Kopiere den Inhalt der oben angegebenen Klasse an Stelle der automatisch generierten Codezeilen in deiner soeben erstellten Klasse und speichere ab. | ||
+ | - Fang an die Arbeitsaufträge abzuarbeiten (Methoden implementieren und kommentieren). Und ab geht's! :-) | ||