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