Unterschiede

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! :-)
start/info/11if/09_arrays.1233300473.txt.gz · Zuletzt geändert: 23.10.2013 10:12 (Externe Bearbeitung)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0