Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II a[0] a[1] a[2] a[3] a[n 1]

Ähnliche Dokumente
Reihungen. Prof. Dr. Christian Böhm. In Zusammenarbeit mit Gefei Zhang. WS 07/08

Programmieren I. Kapitel 12. Referenzen

Reihungen. Martin Wirsing. in Zusammenarbeit mit Michael Barth, Fabian Birzele und Gefei Zhang

Gleitkommazahlen. Die Typen float und double. Page 1. Variablen. Konstanten. Syntax der Gleitkommakonstanten

Java Referenzdatentypen genauer betrachtet

Martin Unold INFORMATIK. Geoinformatik und Vermessung

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

10. Felder (Arrays) Teil 2. Java-Beispiele: Echo.java Primzahlen.java Monate.java. K. Bothe, Institut für Informatik, HU Berlin, GdP, WS 2015/16

3.8 Objekttypen und Arrays. Wir werden uns in diesem Kapitel näher mit den Objekttypen in Java beschäftigen.

Einführung in die Programmierung für NF. Arrays

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

6 Speicherorganisation

Die for -Schleife HEUTE. Schleifen. Arrays. Schleifen in JAVA. while, do reichen aus, um alle iterativen Algorithmen zu beschreiben

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

Vorlesung Programmieren

Programmieren I. Arrays Heusch 7.2 Ratz Institut für Angewandte Informatik

Beispiel: die Klasse Brüche

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

1. Referenzdatentypen: Felder und Strings

Reihungen und Prozeduren

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Arrays. Gilbert Beyer und Annabelle Klarl. Einführung in die Informatik. Zentralübung zur Vorlesung Einführung in die Informatik

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Objekttypen. Referenzen, Objekte, Gleichheit, Wrapper, Arrays, mehr-dimensionale Arrays, Bildbearbeitung, krumme Arrays

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

n 1. Grundzüge der Objektorientierung n 2. Methoden, Unterprogramme und Parameter n 3. Datenabstraktion n 4. Konstruktoren n 5. Vordefinierte Klassen

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Programmieren in Java

Algorithmen und Datenstrukturen

Algorithmen und Programmierung II

Einstieg in die Informatik mit Java

Software Entwicklung 1

Felder (Arrays) und Zeiger (Pointers) - Teil I

Grundlagen der Programmierung Prof. H. Mössenböck. 6. Methoden

Anweisungen zur Ablaufsteuerung

Zeiger: Der Adressoperator &

Wenn... dann... if (condition) statement. if (kontostand < 0) System.out.println("Oops..."); false. condition. true. statement

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Praxis der Programmierung

Die Sprache C# Datentypen, Speicherverwaltung Grundelemente der Sprache. Dr. Beatrice Amrhein

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Felder (Arrays) und Zeiger (Pointers) - Teil I

Felder (1) Felder (Arrays) speichern viele Datenelemente des gleichen Typs. Auf einzelne Elemente kann über einen Index zugegriffen werden

Einstieg in die Informatik mit Java

6 Speicherorganisation

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Advanced Programming in C

Arrays. Einleitung. Deklarieren einer Array Variablen

Vorlesung Programmieren

Übersicht. 4.1 Ausdrücke. 4.2 Funktionale Algorithmen. 4.3 Anweisungen. 4.4 Imperative Algorithmen Variablen und Konstanten. 4.4.

Grundlagen der OO- Programmierung in C#

Vorlesung Programmieren

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Organisatorisches. Folien (u.a.) auf der Lva-Homepage Skriptum über MU Online

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben. Aufgabe 1.1. Alle Aufgaben beziehen sich auf Java.

Informatik II Übung 5

Sprachkonstrukte Verzweigungen und Array-Strukturen

Java Methoden. Informatik 1 für Nebenfachstudierende Grundmodul. Kai-Steffen Hielscher Folienversion: 1. Februar 2017

Einführung in die Programmierung

Technische Universität München WiSe 2018/19 Fakultät für Informatik Übungsblatt 6 Dr. Ch. Herzog 26. November 2018

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Informatik II Übung 5

Die Sprache C# Datentypen, Speicherverwaltung Grundelemente der Sprache. Dr. Beatrice Amrhein

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

5. Java Arrays und Strings

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Visuelle Kryptographie. Anwendung von Zufallszahlen

Arrays (Reihungen) Arrays (Reihungen) in Java: Syntax, Typisierung, Semantik.

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Felder (Arrays) und Zeiger (Pointers) - Teil I

7. Verkettete Strukturen: Listen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems

Dynamische Datentypen

2.7 Felder (Arrays) Das englische Wort array hatte ursprünglich militärische Bedeutung: Aufstellung zur Schlacht : Titel der Zeichnung links:

F Zeiger, Felder und Strukturen in C

Programmierung und Angewandte Mathematik

Reihungen. Martin Wirsing. in Zusammenarbeit mit Matthias Hölzl und Nora Koch 11/03

Repetitorium Programmieren I + II

Vorlesung Programmieren

Informatik II Übung 05. Benjamin Hepp 3 April 2017

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben

Variablen und Parameter

Grundlagen der Programmierung Prof. H. Mössenböck. 7. Arrays

Tag 8 Repetitorium Informatik (Java)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Einführung in die Programmierung für NF MI. Übung 04

Informatik II Prüfungsvorbereitungskurs

Martin Unold INFORMATIK. Geoinformatik und Vermessung

3.2 Datentypen und Methoden

Teil 5: Zeiger, Felder, Zeichenketten Gliederung

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

9. Java Arrays und Strings. Allokation, Referenzen, Elementzugriff, Mehrdimensionale Arrays, Strings, Stringvergleiche

PK-Einstufungstest. 1. Allgemeine Multiple-Choice-Aufgaben. Alle Aufgaben beziehen sich auf Java.

Tag 5. Repetitorium Informatik (Java) Dozent: Marius Kamp Lehrstuhl für Informatik 2 (Programmiersysteme)

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

Software Entwicklung 1. Rekursion. Beispiel: Fibonacci-Folge I. Motivation. Annette Bieniusa / Arnd Poetzsch-Heffter

Transkript:

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -108 Kapitel 5: Arrays Einführung Ein Array ist eine Reihung gleichartiger Objekte. a: a[0] a[1] a[2] a[3] a[n 1] Bezeichner a steht für das gesamte Array. Elemente werden über Indizes angesprochen: a[0], a[1], a[i], Deklaration von Array-Variablen Ein Arraytyp besteht aus dem Basistyp und eckigen Klammern [] : int [] a; float [] vector; Es wird noch kein Speicher für das Array belegt, die Länge ist unbekannt. Bevor ein Array benutzt werden kann, muss es erzeugt werden. Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -109 Erzeugung von Arrays Erzeugen eines neuen Arrays int[] a = new int [5]; legt neues int-array mit 5 Elementen an und weist dessen Adresse a zu. Array-Variablen enthalten nicht Arrays, sondern Zeiger auf Arrays. a a[0] a[1] a[2] a[3] a[4] Länge von Arrays Länge ist beliebig und nur durch verfügbaren Speicherplatz beschränkt. Länge eines jeden Arrays kann mit length abgefragt werden: a.length Initialisierung mit Array-Konstanten double[] d = {0.17, 0.43, 5.78, 2.65; // Array der Länge 4. Äquivalent zu double[] d; d = new double [4]; d[0] = 0.17; d[1] = 0.43; d[2] = 5.78; d[3] = 2.65; Array kann auch bei seiner Erzeugung initialisiert werden d = new int[] {0.17, 0.43, 5.78, 2.65;

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -110 Benutzung von Arrays Zugriff auf die Elemente Elemente haben keine eigenen Namen, sie sind anonyme Variablen. Zugriff über []-Operator: a[0] = 5, a[i] = a[2*i + 1] / a[0], Gültiger Indexbereich: 0 i (a.length 1). Beispiel: Summe der Elemente im Array int sum = 0; for (int i = 0; i < a.length; i++) { sum = sum + a[i]; Fehlermöglichkeiten Zugriff auf Array, das noch nicht erzeugt ist. Index liegt nicht im gültigen Bereich: a[ 1] oder a[a.length] Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -111 Zuweisen von Arrays Arrayvariablen sind Referenzen (d.h. Zeiger, Verweise, Adressen) Bei Zuweisung wird nur Referenz kopiert, nicht der Inhalt eines Arrays. Zuweisungen müssen typkompatibel sein (z.b. nicht float[] int[]). Mehrere Arrayvariablen können auf dasselbe Array zeigen. int[]a=newint[5]; a: 0 0 0 0 0 int[]b=a; a: /* jetzt ist a == b */ b: 0 0 0 0 0 a[0] = 17; a: /* hier auch b[0] == 17 */ b: 17 0 0 0 0

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -112 Zuweisen von Arrays (2) Zuweisungen an Arrayvariablen überschreiben alte Referenzen Zuweisung der leeren Referenz a = null; a: 17 0 0 0 0 b: Zuweisung eines neuen Arrays b = new int [3]; a: b: 17 0 0 0 0 0 0 0 Explizites Kopieren von Arrays möglich Mit Aufruf von clone(): int[] b = a.clone(); Mit Systemmethode arraycopy: System.arraycopy (a, 0, b, 0, a.length); Parameter: void arraycopy (source, srcindex, dest, destindex, length); Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -113 Arrays als Parameter Vergleich von Arrays!!! Basistypen als Parameter (call by value) Werte der aktuellen Parameter werden in formale Parameter kopiert. Änderungen auf den Kopien wirken sich nicht auf Originale aus. Rückgabe von Ergebnissen durch Parameter ist nicht möglich. Arrays als Parameter (call by reference) Beim Aufruf wird der Zeiger übergeben, das Array wird nicht kopiert. Änderungen im Array werden für aufrufende Methode wirksam. static void sort (int[] a ) { // Kopie des Zeigers a[i] = a[i 1]; myarray sort(myarray );

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -114 Beispiel: Kürzen von Brüchen Bisher: keine Ergebnisrückgabe möglich Ergebnisrückgabe in neuem Array static int[] reduce (int[] fraction) { int t = ggt (fraction[0], fraction[1]); int[]result={fraction[0]/t,fraction[1]/t; return result; Ergebnisrückgabe in ursprünglichem Array static void reduce (int[] fraction) { int t = ggt (fraction[0], fraction[1]); fraction[0] = fraction[0] / t; fraction[1] = fraction[1] / t; Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -115 Speicherverwaltung in Programmen Statisches Segment für Programmcode, statische Variablen, Array- und Stringkonstanten. Lebensdauer der Objekte von Programmbeginn bis Programmende. Speicherbelegung bleibt über den Programmablauf hinweg konstant. Stapel (Stack, Keller) für lokale Variablen und Funktionsergebnisse. Lebensdauer der Objekte jeweils vom Methodenaufruf bis zum Methodenende. Speicherbelegung pulsiert im Rhythmus der Methodenaufrufe. Halde (Heap) für dynamisch erzeugte Objekte wie Arrays, Strings u.a. Lebensdauer eines Objektes ab Erzeugung (new), bis es nicht mehr erreichbar ist; explizite Freigabe nicht möglich, sondern automatische Freigabe von Zeit zu Zeit. Speicherbelegung ist dynamisch und für das System nicht vorhersehbar.

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -116 Freispeicherverwaltung: Garbage Collection Prinzip Dynamische Objekte leben nur solange sie erreichbar sind. Suche statt nicht-erreichbarer Objekte die erreichbaren Objekte. Ablauf Markiere rekursiv alle Objekte, die vom Heap aus (direkt oder indirekt) erreichbar sind. Gib den gesamten verbliebenen Speicher frei. int[] A; // int [6] int[][] B; // int [3][2] float[] C; // float [2] C B A Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -117 Beispiel: Sieb des Erathostenes Aufgabe: Berechne die Primzahlen von 1 bis n Sieb: Betrachte natürliche Zahlen von 2 bis n. Erste Zahl im Sieb (= 2) ist eine Primzahl; streiche alle Vielfachen. Nächste verbliebene Zahl (= 3) ist eine Primzahl; streiche alle Vielfachen. usw; streiche jeweils die Vielfachen der nächsten Primzahl. Implementierung Stelle natürliche Zahlen von 0 bis n in einem boolean-array prime dar. Setze anfangs alle Zahlen auf prim (= true) und streiche dann wie oben. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t t t t t t t t t t t t t t t t t t t t t - t - t - - - t - t - - - t - t -

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -118 Sieb des Erathostenes (2) static void printprimes (int n) { boolean[] prime = new boolean [n+1]; inti,j; for (i = 2; i <= n; i++) prime [i] = true; i=2; while (i <= n) { System.out.println (i); for (j = i; j <= n; j = j + i) prime [j] = false; while (i <= n &&!prime[i]) i++; // Initialize 2..n as prime // i is prime // remove multiples of i // locate next prime Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -119 Beispiel: Monatstage berechnen Bisher: Berechnung durch Anweisungen if-else-kaskade switch-anweisung Neue Alternative: Ergebnisse aus Array holen static int[] daytab = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; days = daytab [month 1]; if (month == 2 && leapyear) days = 29; Implementierung in Methodenrumpf verbergen static int daysofmonth (int month, boolean leapyear) {

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -120 Beispiel: Binäre Suche Rekursive Lösung static int search (int q, int[] a, int first, int last) { int m = (first + last) / 2; if (first > last) return 1; // empty if (q == a[m]) return m; // found q else if (q < a[m]) return search (q, a, first, m 1); else /* q > a[m] */ return search (q, a, m+1, last); static int search (int query, int[] a) { return search (query, a, 0, a.length 1); Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -121 Beispiel: Binäre Suche Iterative Lösung static int search (int q, int[] a) { int first = 0; int last = a.length 1; while (last >= first) { int m = (last + first) / 2; if (q == a[m]) return m; else if (q < a[m]) last = m 1; else /*q > a[m]*/ first = m + 1; return 1; // not found Ohne return in der Schleife: static int search (int q, int[] a) { int first = 0; int last = a.length 1; int m; boolean notfound = true; while (last >= first && notfound) { m = (last + first) / 2; if (q == a[m]) notfound = false; else if (q < a[m]) last = m 1; else /*q > a[m]*/ first = m + 1; return notfound? 1 : m;

Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -122 Mehrdimensionale Arrays Zweidimensionale Arrays (= Matrizen) und deren Speicherung a[0] a[0][0] a[0][1] a[0][2] a a[0] a[1] a[1][0] a[1][1] a[1][2] a[1] a[2] a[2][0] a[2][1] a[2][2] a[3] a[3][0] a[3][1] a[3][2] a[2] a[3] Deklaration int [][] a = new int [4] [3]; // keine Initialisierung a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2] a[3][0] a[3][1] a[3][2] int [][] m = { {1, 2, 3, {4, 5, 6 ; // Initialisierung mit Konstanten 1 2 4 5 3 6 Höhere Dimensionen int [][][] q = new int [2][2][2]; // 3D: Quader Universität München, Hans-Peter Kriegel und Thomas Seidl Informatik II -123 Beispiel: Matrixmultiplikation /** matrix product of left and right */ static float[][] product (float[][] left, float[][] right) { float[][] prod = new float [left.length] [right[0].length]; for (int i = 0; i < left.length; i++) { for (int j = 0; j < right[0].length; j++) { float prod_ij = 0; for (int k = 0; k < right.length; k++) prod_ij = prod_ij + left [i][k] * right [k][j]; prod [i][j] = prod_ij; left k return prod ; i right k j