Arrays - Institut für Informatik

Werbung
Schwerpunkte
•
•
•
•
•
•
Klassifikation von Typen in Programmiersprachen
Array: einziger strukturierter Typ in Java
Deklaration, Erzeugung
Initialisierung, Zugriff
Typische Verarbeitung von Arrays: Iteration
Methoden (Prozeduren) für Arrays variabler
Länge
• Programmparameter
• Techniken mit Arrays
10. Felder
(Arrays)
Teil 1
Java-Beispiele:
Echo.java
Primzahlen.java
Monate.java
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
Version: 16. Nov. 2015
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
2
Klassifikation von Typen in
Programmiersprachen
Typen
einfach
einfach - elementar
• Ganze Zahlen
(byte, short, int, long)
• Reelle Zahlen
(float, double)
• Boolean
• Zeichen
strukturiert
zusammengesetzt aus anderen
Typen
• Arrays (Felder)
Grundprinzip von Arrays
1)
• Records (Strukturen)
• Mengen
2)
3)
• Zeiger (Pointer)
2)
1) in Java direkt als Typ
2) in Java: über Klassen
3) in Java:
- selbst implementieren
- oder: API-Klasse Set
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
3
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
4
Array von ‘String'–Werten:
Strings: feste Länge?
Arrays (Felder)
Folge von Werten
- desselben Typs
- fester Länge
der Werte
"12489"
Warum ?
Nr. des Elements
Æ Adresse steht fest
(Direktzugriff)
1000
-2
"Adlershof"
...
Strings: Objekte einer Klasse
Æ über Adressen repräsentiert
• Array von 'int'-Werten:
2
"Berlin"
(Vorgriff auf Teil III)
0
-1
1000
also:
• Array von 'char'-Werten:
"Berlin"
'a'
'b'
'e'
'r'
"12489"
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
5
"Adlershof"
"Rud. Ch."
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
6
Erstellen von Arrays (1)
1. Schritt: Deklaration
double [] temperatures;
String [] wochenTage;
Arbeit mit Arrays in Java:
temperatures:
• Deklaration
• Erzeugung
• Zugriff
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
Eine Speichereinheit!
2. Schritt: Erzeugung
temperatures = new double [20];
wochenTage = new String [7];
Von nun an steht
die Größe fest
temperatures:
Array-Variablen sind Referenzen, d.h.
Adressen Æ beliebig große Arrays
7
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
8
Erstellen von Arrays (2)
Arrays in Pascal
1. und 2. Schritt: zusammen
Deklaration und Erzeugung nicht getrennt
(bei Deklaration: Anzahl der Elemente steht fest)
VAR temperatures:
ARRAY [1900..2015] OF real;
double [] temperatures
= new double [20];
Semantische Indexbereiche
Arrays keine Referenzen
Erzeugung durch Anfangswert
1900
double [] temperatures
= {1.0, 1.5, 2.0, 2.5};
Pascal: temperatures:
1.5
2.0
2.5
1.0
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
9
Zugriff: einzelne Komponenten
double [] temperatures
= new double [20];
2.0
…… Welche Indexangabe
in Java für 1900..2015?
2.
1.5
2.0
double [] temperatures
= new double [???];
115
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
10
Typische Verarbeitung: for-Anweisung
Anzahl der Elemente: 20
Index von 0 .. 19
final int N = 100;
int [] arr = new int[N];
Indexbereich:
0 .. 19
temperatures:
1.
1.5
2015
Array: sequentielle Struktur fester Länge
temperatures[0] = 0.0;
temperatures[1] = 2.0;
temperatures[2] =
temperatures[1];
0.
1901 …
Java: temperatures:
temperatures:
1.0
1.0
Syntax lesbarer
19.
for (int i = 0; i < N; i++)
// i: 0 .. 99
arr[i] = -i;
nicht: i <= N !
Æ Laufzeitfehler
0.0 2.0 2.0
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
11
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
12
Methoden: für Arrays beliebiger Länge
Methode: Summe der Array-Elemente für beliebig lange Arrays
int summe (int[] vektor) {
int gesamt = 0;
Programmparameter
for (int i = 0; i < vektor.length; i++)
gesamt += vektor[i];
return gesamt;
(Konsolenargumente)
}
Anwendung:
int [] v1 = new int[8];
int [] v2 = new int[100];
. . . // v1, v2: fuellen
s1 = summe(v1);
s2 = summe(v2);
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
13
Programmparameter
class Temperature {
// Convert temperature
// from Fahrenheit to Centigrade
Aktueller
Parameter ?
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
14
Programmparameter
Formaler Parameter:
Verwendung im
Methodenkörper?
class select {
public static void main (String[] args) {
...
}
}
public static void main (String[] args) {
double tempFahr; // Fahrenheit
double tempCels; // Celsius
System.out.print("Temperature (deg F): ");
tempFahr = Keyboard.readDouble();
tempCels = (5.0 * (tempFahr - 32.0)) / 9.0;
System.out.print(tempFahr);
Typ des Parameters
System.out.print(" deg F is ");
System.out.print(tempCels);
von main?
System.out.println(" deg C");
}
}
% java Square 7
% java Square 100
Technik möglich,
da Arrays in Java
Referenzen
formaler Parameter vom Typ 'Array' von 'String'
aktueller Parameter ?
% java select -p1-5 file.ps
Aufruf von main ?
% javac Temperature.java
Interpreter ruft main() auf …
% java Temperature
args:
Parameter der
Kommandozeile
Programmparameter
… und übergibt Programmparameter
Temperature (deg F): 10
10 deg F is -12.222222222222221 deg C
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
-p1-5
15
file.ps
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
= aktueller Parameter
16
Programm: gesteuert von Parametern
beim Aufruf des Programms
Beispiel: Programmparameter
public class Echo {
public static void main(String[] args) {
% psnup -4 folie.ps f4.ps
for (int i = 0; i < args.length; i++)
UNIX-Dienstprogramme
% psselect -p1-2,6 f1.ps f2.ps
System.out.print(args[i] + "\n");
}
% java temp -C -F,K
Java-Programme
% java temp -K -C,F
args:
-C
% java Echo -p1-5,6 f1.ps f2.ps
-p1-5,6
f1.ps
f2.ps
-F,K
args:
Variable args kann vom
Programm analysiert werden
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
neu:
-p1-5,6
f1.ps
f2.ps
3 Programmparameter
Æ 1 aktueller Parameter vom Typ Array der Länge 3
17
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
Echo: Variante
bisher:
Wirkung?
}
18
Echo: Variante
% java Echo -p1-5,6 f1.ps f2.ps
-p1-5,6
f1.ps
f2.ps
bisher:
% java Rev -p1-5,6 f1.ps f2.ps
f2.ps f1.ps -p1-5,6
neu:
% java Echo -p1-5,6 f1.ps f2.ps
-p1-5,6
f1.ps
f2.ps
% java Rev -p1-5,6 f1.ps f2.ps
f2.ps f1.ps -p1-5,6
Änderungen?
Änderungen?
bisher:
args[])
public static void main(String
main(String[]
args) {
public static void main(String[] args) {
i < args.length;
for (int i=0;
i = args.length
- 1; ii++)
>= 0; i--)
for (int i = 0; i < args.length; i++)
System.out.print(args[i] + "\n");
" ");
System.out.print(args[i] + "\n");
}
}
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
19
K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16
20
Herunterladen