Programmierkurs - ZAIK

Werbung
Programmierkurs
Birgit Engels, Anna Schulze
ZAIK
Universität zu Köln
WS 07/08
Kapitel 6
Felder (Arrays)
Mehrdimensionale Arrays
6.0 Felder (Arrays)
Bisher haben wir einzelne Variablen primitiver Datentypen benutzt.
Manchmal benötigt man aber mehrere Variablen des gleichen Typs.
Dazu kann man sogenannte Felder (Arrays) dieses Typs nutzen:
Ein Feld besteht aus mehreren Variablen des gleichen Typs.
Der gewünschte Typ wird bei der Deklaration angegeben und
ist im Feld homogen.
Ein Feld besitzt einen anderen Datentyp als seine Einträge.
Der Datentyp eines Feldes von Variablen des Typs typ ist
typ[] (“Typ-Array”).
Deklaration von Feldern
Deklaration ohne Initialisierung:
< Datentyp > < Name > [] = new < Datentyp >[< n >];
oder
Deklaration mit Initialisierung:
< Datentyp > < Name > [] =
{< Wert1 >, ..., < Wertn >};
n: Länge des Feldes bzw. Anzahl der Einträge.
Beispiele für Deklaration von Feldern
int intArray[] = new int[10];
double doubleArray[] =
{1.5, 3.12, 7.85};
int tore[] = new int[34];
Im ersten und dritten Fall sind die Array-Variablen noch nicht
initialisiert! Zugriff ist daher erst nach Zuweisung eines Wertes
sinnvoll (s.u.).
Zugriff und Zuweisungen
Zugriff auf einen einzelnen Eintrag im Feld, erhält man mit
dem []-Operator über einen Index 0 ≤ i < n. Beispiel:
< Name >[i]
Ein solcher Eintrag verhält sich wie eine Variable vom Typ
< Datentyp >.
Daher sind folgende Zuweisungen möglich:
tore[1]=2;
int t=tore[1];
Der Array-Index
Der Index eines Arrays muss vom Typ int sein.
(Eine rationaler oder anderer ganzzahliger Datentyp ist nicht
zugelassen, auch wenn die entsprechende Variable
ganzzahligen Wert hat.)
Der Index i kann Werte zwischen 0 und n − 1 annehmen.
Bei anderen Werten kommt es zu einer Ausnahme (später).
Die Einträge eines Arrays sind von 0 (!) bis n − 1 (!)
durchnummeriert. (Das sind genau n Eintrge.)
Die Länge des Arrays (also auch Name.length) entspricht der
Anzahl der Einträge n, nicht der Nummer des letzten Eintrags
n − 1.
Beispiel Arrays (ArrayEx.java)
1. public static void main(String[] args)
2. {
3.
int tore[] = new int[34];
4.
int toreges=0;
5.
for (int i=0; i<tore.length; i++)
6.
tore[i]=i%4 ;
7.
for (int i=0; i<tore.length; i++)
8.
toreges+=tore[i] ;
9.
System.out.println( ‘‘Tore: ’’ + toreges);
10. }
49
Beispiel Arrays (ArrayEx.java)
1. public static void main(String[] args)
2. {
3.
int tore[] = new int[34];
Initialisierung von tore mittels for4.
int toreges=0;
Schleife.
5.
for (int i=0; i<tore.length; i++)
6.
tore[i]=i%4 ;
7.
for (int i=0; i<tore.length; i++)
8.
toreges+=tore[i] ;
9.
System.out.println( ‘‘Tore: ’’ + toreges);
10. }
49
Beispiel Arrays (ArrayEx.java)
1. public static void main(String[] args)
2. {
über
for-Schleife:
Summierung
3.
int tore[] = new int[34];
toreges+=tore[i] müsste mit
4.
int toreges=0;
einzelnen int-Variablen 34 Mal (!)
5.
for (int i=0; i<tore.length;
als explizitei++)
Anweisung auftauchen.
6.
tore[i]=i%4 ;
7.
for (int i=0; i<tore.length; i++)
8.
toreges+=tore[i] ;
9.
System.out.println( ‘‘Tore: ’’ + toreges);
10. }
49
Länge eines Arrays
Die Länge eines Arrays kann abgefragt werden mit
< Name >.length, Beispiel:
int n=tore.length;
Wie schon bei Methoden, taucht wieder die Punktnotation als
Zugriffsoperator auf.
Es fehlen allerdings Klammern am Schluss, da nicht auf eine
Methode, sondern auf eine Variable zugegriffen wird, die im
Array automatisch zusätzlich zu den Einträgen gespeichert ist.
Das Array ist offenbar selbst kein primitiver Datentyp, auch
wenn seine Einträge solche sein können (nicht müssen).
Arrays haben feste Länge
Die Länge eines Arrays kann nur einmal bei der Deklaration
festgelegt werden.
Diese Festlegung kann durch eine int-Variable erfolgen.
Spätestens zur Abarbeitungszeit der Deklaration (im laufenden
Programm), muss der Wert der Variablen feststehen.
Dies kann ein Nachteil sein, da zur Zeit der Deklaration die
benötigte Länge nicht immer fest steht (Beispiel:
Dateneinlesen aus Datei, später).
Abhilfe bei variablem Längenbedarf
Steht die benötigte Länge eines Arrays bei der Deklaration nicht
fest, kann man das Array einfach “gross genug” wählen. Diese
Methode ist nur bei kleinen Programmen und kleinen
Datenmengen empfehlenswert, da
Dennoch unerwartet grosse Datenmengen auftreten können.
Bei kleineren Datenmengen immer zu viel Speicher reserviert
wird.
Eventuell nicht mehr gültige Daten noch auf unbenutzten
Array-Plätzen residieren.
Andere Möglichkeiten bieten weitere vordefinierte Datentypen in
Java, z.B. Vector, Hashtable (später).
6.1 Mehrdimensionale Arrays
Ein Array umfasst eine Reihe von Variablen gleichen Typs
< Typ >.
Ein Array ist dabei selber eine Variable vom Typ < Typ > [].
Ein Array kann also selbst wieder Arrays enthalten:
Typ < Name >[][] = new Typ[n][m]
oder
Typ < Name >[][] =
{
{Wert11, Wert12, ... ,Wert1m}
{Wert21, Wert22, ... ,Wert2m}
...
{Wertn1, Wert12, ... ,Wertnm}
}
Beispiel Mehrdimensionale Arrays (MoreArray.java)
1. public static void main(String[] args)
2. {
3.
double matrix[][] = {{0.5, 0.0},{0.5, 0.0}};
4.
double vektor[] = {2.0,2.0};
5.
double evektor[] = new double[2] ;
6.
evektor[0]=0 ;
7.
evektor[1]=0 ;
8.
for (int i=0; i<matrix.length; i++)
9.
for(int j=0; j<matrix[i].length; j++)
10.
evektor[i]+=(matrix[i][j])*vektor[j] ;
11.
System.out.println(‘‘Vektor: (’’+
evektor[0]+‘‘,’’+evektor[1]+‘‘)’’);
12. }
Vektor: (1.0,1.0)
Beispiel Mehrdimensionale Arrays (MoreArray.java)
1. public static void main(String[] args)
2. {
3.
double matrix[][] = {{0.5, 0.0},{0.5, 0.0}};
4.
double vektor[] = {2.0,2.0};
5.
double evektor[] = new double[2] ;
Deklaration und Initialisierung eines
6.
evektor[0]=0 ;
2-dim. Arrays (Hier Nutzung als Ma7.
evektor[1]=0 ;
trix).
8.
for (int i=0; i<matrix.length;
i++)
9.
for(int j=0; j<matrix[i].length; j++)
10.
evektor[i]+=(matrix[i][j])*vektor[j] ;
11.
System.out.println(‘‘Vektor: (’’+
evektor[0]+‘‘,’’+evektor[1]+‘‘)’’);
12. }
Vektor: (1.0,1.0)
Beispiel Mehrdimensionale Arrays (MoreArray.java)
1. public static void main(String[] args)
2. {
3.
double matrix[][] = {{0.5, 0.0},{0.5, 0.0}};
4.
double vektor[] = {2.0,2.0};
5.
double evektor[] = new double[2] ;
6.
evektor[0]=0 ;
7.
evektor[1]=0 ;
8.
for (int i=0; i<matrix.length; i++)
9.
for(int j=0; j<matrix[i].length; j++)
10.
evektor[i]+=(matrix[i][j])*vektor[j]
; 1-dim.
Beide Deklarationsarten eines
11.
System.out.println(‘‘Vektor:
(’’+
Arrays (Hier als Vektor) und entspreevektor[0]+‘‘,’’+evektor[1]+‘‘)’’);
chende Initialisierung.
12. }
Vektor: (1.0,1.0)
Beispiel Mehrdimensionale Arrays (MoreArray.java)
1. public static void main(String[] args)
2. {
3.
double matrix[][] = {{0.5, 0.0},{0.5, 0.0}};
4.
double vektor[] = {2.0,2.0};
5.
double evektor[] = new double[2] ;
6.
evektor[0]=0 ;
7.
evektor[1]=0 ;
8.
for (int i=0; i<matrix.length; i++)
9.
for(int j=0; j<matrix[i].length; j++)
10.
evektor[i]+=(matrix[i][j])*vektor[j] ;
11.
System.out.println(‘‘Vektor: (’’+
evektor[0]+‘‘,’’+evektor[1]+‘‘)’’);
12. }
Vektor: (1.0,1.0)
Zugriff auf die Länge des Arrays (Zeilenanzahl der Matrix)
Beispiel Mehrdimensionale Arrays (MoreArray.java)
1. public static void main(String[] args)
2. {
3.
double matrix[][] = {{0.5, 0.0},{0.5, 0.0}};
4.
double vektor[] = {2.0,2.0};
5.
double evektor[] = new double[2] ;
6.
evektor[0]=0 ;
7.
evektor[1]=0 ;
8.
for (int i=0; i<matrix.length; i++)
9.
for(int j=0; j<matrix[i].length; j++)
10.
evektor[i]+=(matrix[i][j])*vektor[j] ;
11.
System.out.println(‘‘Vektor: (’’+
evektor[0]+‘‘,’’+evektor[1]+‘‘)’’);
12. }
Vektor: (1.0,1.0)
Zugriff auf die Breite des Arrays
(Spaltenanzahl der Matrix)
Beispiel Mehrdimensionale Arrays (MoreArray.java)
1. public static void main(String[] args)
2. {
3.
double matrix[][] = {{0.5, 0.0},{0.5, 0.0}};
4.
double vektor[] = {2.0,2.0};
5.
double evektor[] = new double[2] ;
6.
evektor[0]=0 ;
7.
evektor[1]=0 ;
8.
for (int i=0; i<matrix.length; i++)
9.
for(int j=0; j<matrix[i].length; j++)
10.
evektor[i]+=(matrix[i][j])*vektor[j] ;
11.
System.out.println(‘‘Vektor: (’’+
evektor[0]+‘‘,’’+evektor[1]+‘‘)’’);
12. }
Vektor: (1.0,1.0)
Berechnung einer
Multiplikation.
Matrix-Vektor-
Mehrdimensionale Arrays
Ein Array kann natürlich wiederum eine Reihe 2-dimensionale
Arrays umfassen und damit selbst ein 3-dimensionales Array
bilden, usw.
Es können damit beliebig-dimensionale Arrays erzeugt werden.
Deklaration und Zugriff setzen sich entsprechend fort.
Herunterladen