Vorlesung Programmieren

Ähnliche Dokumente
Vorlesung Programmieren

Vorlesung Programmieren

Vorlesung Programmieren

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

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

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

RO-Tutorien 3 / 6 / 12

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

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

Programmieren I. Kapitel 5. Kontrollfluss

Vorlesung Programmieren

Arrays. Einleitung. Deklarieren einer Array Variablen

Propädeutikum zur Programmierung

Schleifen Datenfelder (Arrays) Verzweigungen

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

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

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

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Vorlesung Programmieren

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

Dr. Monika Meiler. Inhalt

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

RO-Tutorien 17 und 18

Dr. Monika Meiler. Inhalt

Vorkurs Informatik WiSe 16/17

Institut für Programmierung und Reaktive Systeme. Java 3. Markus Reschke

3.2 Datentypen und Methoden

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

1 Klassen und Objekte

RO-Tutorien 15 und 16

Java programmieren mit JavaKara. Eine Zusammenfassung in Beispielen

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Vorlesung Programmieren

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

CS1005 Objektorientierte Programmierung Bachelor of Science (Informatik)

Java - Schleifen. Bedingung. wiederhole. Anweisung Anweisung Anweisung. Leibniz Universität IT Services Anja Aue

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

3. Anweisungen und Kontrollstrukturen

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50

Organisatorisches. Neue Übungsblätter: Nur mehr elektronisch? Abgabe Di, , 14 Uhr bis Do, , 8Uhr

Programmieren I + II Regeln der Code-Formatierung

Arrays und Schleifen

Modellierung und Programmierung 1

Programmieren I + II Regeln der Code-Formatierung

Einstieg in die Informatik mit Java

Anweisungen zur Ablaufsteuerung

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

Objektorientierte Programmierung und Modellierung

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

Martin Unold INFORMATIK. Geoinformatik und Vermessung

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Programmierung für Mathematik (HS13)

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

HEUTE. Effizienzbeispiel: bekannte Version (Übung ) Mathematik: Was ist Effizienz? vollständige Induktion

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!

EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 16/17

2 Teil 2: Nassi-Schneiderman

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

Algorithmen und Datenstrukturen

Wie entwerfe ich ein Programm?

Software Entwicklung 1. Felder / Arrays. Deklaration und Initialisierung I. Arrays. Annette Bieniusa / Arnd Poetzsch-Heffter

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Einstieg in die Informatik mit Java

Vorlesung Programmieren

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

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

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

Einstieg in die Informatik mit Java

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

1. Referenzdatentypen: Felder und Strings

Ausgabe:

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

Arrays und Schleifen

Einfache Datentypen in JAVA

Javakurs für Anfänger

Algorithmen und Datenstrukturen

Einführung in die Informatik Iterationen

2.7 Anweisungen. x+2; // Java-Fehler, korrekt in C oder C++

Klassen als Datenstrukturen

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

FAKULTÄT FÜR INFORMATIK

Objektorientierte Programmierung

Tag 4 Repetitorium Informatik (Java)

Einführung in die Informatik Iterations

5. Tutorium zu Programmieren

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

Programmiertechnik Felder (Arrays)

Einstieg in die Informatik mit Java

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Algorithmen und Datenstrukturen

Einstieg in die Informatik mit Java

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

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Zentralübung Grundlagen der Programmierung

FHZ. K20 Arrays. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Transkript:

Vorlesung Programmieren 5. Arrays Prof. Dr. Ralf H. Reussner Version 1.1 LEHRSTUHL FÜR SOFTWARE-DESIGN UND QUALITÄT (SDQ) INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD), FAKULTÄT FÜR INFORMATIK sdq.ipd.kit.edu KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu

Literaturhinweis - Weiterlesen Dietmar Ratz, Jens Scheffler, Detlef Seese und Jan Wiesenberger "Grundkurs Programmieren in Java", 7. Auflage, 2014 (mit Java 8), Hansa-Verlag Kapitel 5 "Referenzdatentypen" 2

Wiederholung Ausdrücke, Anweisungen: Ausdrücke berechnen einen Wert Anweisungen ändern den Zustand des Programms Kontrollfluss-Anweisungen: Fallunterscheidung: if, switch Schleifen: while, do-while, for Wiederholtes Ausführen von Anweisungen Schleifen-Ausführung kann mit break und continue modifiziert werden 3

Definition Array: (Feld) Folge (Kollektion) von Elementen Alle Elemente haben denselben Typ Der Zugriff auf die Elemente des Arrays erfolgt über einen (ganzzahligen) Index Länge: Anzahl n der Elemente in der Kollektion Index / Nummerierung: von 0 bis n-1 Beispiele: 0.7 23.2 0.003-12.7 1.1 0 1 2 3 4 Maier" Mayr" Meier" Meyr" 0 1 2 3 4

Array-Deklaration Schema: Typ[] name; deklariert eine Array-Variable mit Namen "name" für Elemente des Typs "Typ" Typ[] name = new Typ[N]; Typ[] name = { v0,..., vn-1 ; deklariert Array und reserviert Speicherplatz für N Elemente deklariert Array, reserviert Speicherplatz für N Elemente und initialisiert diese mit v0,..., vn-1 Beispiele: int[] a; // nur Deklaration, kein Speicherplatz reserviert byte[] b = new byte[12]; // reserviert Speicherplatz für 12 Elemente String[] s = { "Maier", "Maier", "Maier", "Maier" ; // reserviert Speicherplatz für 4 Elemente und initialisiert diese Beachte: Die Größe eines Arrays ist nach Anfordern des Speicherplatzes fest! In der ersten Variante der Speicherplatzreservierung (mit new...) werden die Elemente nach den Regeln der Attributinitialisierung vorbelegt (vgl. Kap. 3 der Vorlesung) 5

Deklaration und Initialisierung Beispiel: double[] a = new double[8]; a = 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 1 2 3 4 5 6 7 String[] b = new String[100]; b = null null null null null 0 1 2 98 int[] p = { 2, 3, 5, 7, 11 ; 99 p = 2 3 5 7 11 0 1 2 3 4 6

Ansprechen von Elementen / Länge des Arrays Setzen von Elementen: double[] a = new double[8]; a[0] = 3.5; a[3] = 7.9; a[6] = -22.3; a = 3.5 0.0 0.0 7.9 0.0 0.0-22.3 0.0 0 1 2 3 4 5 6 7 Selektion / Auslesen von Elementen: double x = a[3]; System.out.println(x); // gibt 7.9 aus Länge des Arrays: a.length // liefert den Wert 8 int[] smallprimes = { 2, 3, 5, 7, 11 ; int l = smallprimes.length; // liefert den Wert 5 length ist implizit als final int (also Konstante) deklariert 7

Arrays und Schleifen: Beispiele Erzeuge ein Array mit 100 Zufallswerten: final int N = 100; double[] a = new double[n]; for (int i = 0; i < N; i++) { a[i] = Math.random(); Berechne den Mittelwert der Array-Elemente: double sum = 0.0; for (int i = 0; i < N; i++) { sum += a[i]; double average = sum / N; Kopiere alles in ein zweites Array: double[] b = new double[a.length]; for (int i = 0; i < a.length; i++) { b[i] = a[i]; "Spiegele" das Array (Umkehrung der Reihenfolge): for (int i = 0; i < N/2; i++) { double temp = b[i]; b[i] = b[n-1-i]; b[n-1-i] = temp; 8

Quiz Ist der folgende Code korrekt? a) double[] a = new double[10]; a.length = 5; a[6] = 27.5; b) int[] b = new int[3_000_000_000l]; c) int[] c = new int[4]; for (int i = 0; i <= c.length; i++) { c[i] = 2*i + 3; Gehen Sie auf die Seite m.socrative.com (Raum prog1516) und wählen Sie die korrekte Antwort! 9

Arrays und Schleifen: Weitere Beispiele Bestimme die Häufigkeit einer Zahl in einem Integer-Array: int countoccurrences(int[] a, int number) { int count = 0; for (int i = 0; i < a.length; i++) { if (a[i] == number) { count++; return count; Suche eine Zahl in einem Integer-Array: boolean search(int[] a, int number) { int i; for (i = 0; i < a.length; i++) { if (a[i] == number) { break; return (i!= a.length); 10

Beispiel: Polygone y p1 class Polygon2D { // attributes Vector2D[] vertices; p0 p3 p2 // constructor Polygon2D(Vector2D[] vertices) { this.vertices = vertices; p4 x // methods int getnrvertices() { return vertices.length;... Polygone im R 2 11

Polygone erzeugen Variante 1: Vector2D[] vertices = new Vector2D[5]; vertices[0] = new Vector2D(-1.0, 5.0); vertices[1] = new Vector2D(5.0, 7.0); vertices[2] = new Vector2D(8.0, 4.0); vertices[3] = new Vector2D(4.5, 3.0); vertices[4] = new Vector2D(3.5, -1.0); Polygon2D poly = new Polygon(vertices); Variante 2: Polygon2D poly = new Polygon2D( new Vector2D[] { new Vector2D(-1.0, 5.0), new Vector2D(5.0, 7.0), new Vector2D(8.0, 4.0), new Vector2D(4.5, 3.0), new Vector2D(3.5, -1.0) ); class Polygon2D { // attributes Vector2D[] vertices; // constructor Polygon2D(Vector2D[] vertices) { this.vertices = vertices; // methods int getnrvertices() { return vertices.length;... 12

Arrays und Schleifen: for-each Java kennt eine spezielle Variante der for-schleife für Arrays (meistens for-each genannt) Schema: for (Typ element : array) { Anweisungen Führe Anweisungen für jedes Element (dieses hat in der Schleife den Namen "element") des Arrays (vom Typ Typ[]) aus. Beispiel: final int N = 100; double[] numbers = new double[n]; // average double sum = 0.0; for (int i = 0; i < N; i++) { sum += numbers[i]; double average = sum / N; final int N = 100; double[] numbers = new double[n]; // average double sum = 0.0; for (double number : numbers) { sum += number; double average = sum / N; Konventionelle for-schleife for-each-schleife 13

Matrizen Eine Matrix kann als eine Tabelle von Einträgen betrachtet werden Einträge der Matrix sind häufig Zahlen Eine zweidimensionale Matrix mit m Zeilen n Spalten A = (a ij ) = m Zeilen n Spalten a 11 a 12... a 1n a 21 a 22... a 2n......... a m1 a m2... a mn a ij ist ein Eintrag in der i-ten Zeile und j-ten Spalte der Matrix Wie wird diese Matrix in Java realisiert? 14

Mehrdimensionale Arrays Mehrdimensionale Arrays sind als "Array-von-Arrays" möglich Beispiel: int[][] m = new int[10][15]; Erzeugt ein 2-dimensionales Array von Ganzzahlen. Genauer ist m dabei ein Array der Größe 10 von Arrays der Größe 15. Die "eingeschachtelten" Arrays können Variablen des passenden Typs zugewiesen werden. int[] v = m[3]; // v ist ein Array der Größe 15 Das Iterieren über mehrdimensionale Arrays erfolgt meist mit geschachtelten for-schleifen: for (int i = 0; i < m.length; i++) { for (int j = 0; j < m[i].length; j++) { m[i][j] = i + j; 15

Beispiel: Sieb des Eratosthenes Aufgabe: Gegeben: Eine natürliche Zahl n Gesucht: Eine Liste aller Primzahlen kleiner n (als Array) Lösungsmethode (Sieb des Eratosthenes): Schreibe alle Zahlen von 2 bis n auf. Markiere nun Zahlen nach folgendem Schema: 1. Wähle die kleinste unmarkierte Zahl und markiere sie als "prim". 2. Markiere alle Vielfachen dieser Zahl als "nicht-prim". 3. Solange noch nicht alle Zahlen markiert sind, fahre mit Schritt 1 fort. 16

Beispiel: Sieb des Eratosthenes enum Mark { UNMARKED, PRIME, NOT_PRIME ;// Datentyp für Markierungen public static int[] primesieve(int n) { Mark[] mark = new Mark[n+1]; mark[0] = mark[1] = Mark.NOT_PRIME; for (int i = 2; i <= n; i++) mark[i] = Mark.UNMARKED; // Setze Markierungen int p = 2, count = 0; while (p <= n) { mark[p] = Mark.PRIME; count++; for (int k = 2; k * p <= n; k++) { mark[k * p] = Mark.NOT_PRIME; // Markierung für jede Zahl [0,n] // 0 und 1 sind keine Primzahlen. // Alle anderen Zahlen werden als "unmarkiert" // initialisiert. // Beginne bei Kandidat p = 2. ( count zählt // die Anzahl gefundener Primzahlen.) // Kleinste unmarkierte Zahl p ist prim. // Markiere alle Vielfachen von p als nicht-prim do { // Suche nächste unmarkierte Zahl p++; while (p <= n && mark[p]!= Mark.UNMARKED); Problem: // Fülle Ergebnis-Array mit Primzahlen int[] primes = new int[count]; int j = 0; Bei der Multiplikation k * p" kann ein for (int i = 0; i < mark.length; i++) {// Kopiere Überlauf als auftreten! prim markierte Zahlen ins if (mark[i] == Mark.PRIME) { // Ergebnis-Array. primes[j++] = i; Was könnte man dagegen tun? return primes; 17

Beispiel: Sieb des Eratosthenes (optimiert) Beobachtungen Mark.PRIME und Mark.UNMARKED können zusammengefasst werden Die Default-Initialisierung von Arrays kann ausgenutzt werden: default "false" muss dann für "ist-prim" stehen. Beim Setzen der "nicht-prim"- Markierungen von Vielfachen von p genügt es, bei p 2 zu beginnen. Die äußere Schleife zur Markierung muss nur bis n durchlaufen werden. Optimierungen möglich! (siehe rechts) class PrimeSieveOpt { public static int[] primesieve(int n) { boolean[] notprime = new boolean[n+1]; int p=2, count=0; int sqrn = (int) Math.sqrt(n); while (p<=sqrn){ count++; for(int k=p*p;k<=n;k+=p){ notprime[k]=true; while(notprime[++p]) ; while (p<=n){ if(!notprime[p++]) count++; int[] primes = new int[count]; int j = 0; for (int i = 2; i <= n; i++){ if(!notprime[i]) primes[j++] = i; return primes; 18

Generelles zum Optimieren Verschiedene Optimierungsmöglichkeiten: Algorithmus austauschen / verbessern im Bsp.: Vielfache ab p 2, äußere Schleife nur bis n Datenstrukturen verbessern boolean[] statt Mark[] Detailoptimierungen Beste Vorgehensweise: Optimierungen erst spät im Entwurfsprozess Nur "hot spots" optimieren Es gibt Werkzeuge (profiler) zur Ermittlung von hot spots. Optimierung kann Programmcode auch schlechter lesbar machen Dokumentation besonders wichtig 19

Mehr zu Arrays Arrays werden in Java wie Objekte behandelt String[] a = { "a0", "a1", "a2", "a3", "a4" ; Erstellt ein neues Array (auf dem Heap) und weist der Variablen a die Referenz auf das Array zu. String[] b = a; Beide Variablen (a und b) referenzieren dasselbe Array b[1] = "b1"; Der Ausdruck "a[1]" wertet zu "b1" aus. 20

Mehr zu mehrdimensionalen Arrays int[][] m = new int[10][15]; Erzeugt ein Array mit 10 Referenzen auf int-arrays der Länge 15. int[][] a = new int[3][]; Erzeugt ein Array mit 3 Referenzen des Typs int[]. 21

Quiz Wieviele Objekte werden in folgender Codezeile erzeugt? double[][][] d = new double[2][3][4]; d double[][] d[0] double[][] d[1] d[0] double[] d[0][0] double[] d[0][1] double[] d[0][2] d[1] double[] d[1][0] double[] d[1][1] double[] d[1][2] d[0][0] double d[0][0][0] double d[0][0][1] d[0][1] double d[0][0][2] double d[0][0][3] double d[0][1][0] double d[0][1][1] d[0][2] double d[0][1][2] double d[0][1][3] double d[0][2][0] double d[0][2][1] double d[0][2][2] double d[0][2][3] d[1][0] double d[1][0][0] double d[1][0][1] d[0][1] double d[1][0][2] double d[1][0][3] double d[1][1][0] double d[1][1][1] d[0][2] double d[1][1][2] double d[1][1][3] double d[1][2][0] double d[1][2][1] double d[1][2][2] double d[1][2][3] 22

Zusammenfassung Arrays sind Folgen von Elementen desselben Typs Elemente werden über einen Index angesprochen Arrays werden in Java wie Objekte behandelt 23