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

Ähnliche Dokumente
Propädeutikum zur Programmierung

Vorlesung Programmieren

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

Datenfelder (Arrays) Vektoren, Matrizen, Tabellen. Dr. Beatrice Amrhein

Objektorientierte Programmierung OOP Programmieren mit Java

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

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Kapitel 6. Programmierkurs. 6.0 Felder (Arrays) Deklaration von Feldern. Felder (Arrays) Mehrdimensionale Arrays. Birgit Engels, Anna Schulze WS 07/08

Einstieg in die Informatik mit Java

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

Der Datentyp String. Stringvariable und -vergleiche

Wertebereich und Genauigkeit der Zahlendarstellung

Dr. Monika Meiler. Inhalt

Java programmieren mit JavaKara. Eine Zusammenfassung in Beispielen

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

2. Programmierung in C

Modellierung und Programmierung 1

Kapitel 3: Variablen

2.5 Primitive Datentypen

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

Einstieg in die Informatik mit Java

Übungspaket 23 Mehrdimensionale Arrays

Inhalt. 4.5 Arbeit mit Zeigern (engl. Pointer)

String s1, s2; Eine Zuweisung geschieht am einfachsten direkt durch Angabe des Strings eingeschlossen in doppelte Hochkommata:

Vorkurs Informatik WiSe 16/17

Motivation/Beispiel. Zur Auswertung der Klausuren im Fach Programmieren fallen folgende Daten an:

Grundlagen der Informatik Enums, Strings und Arrays

Einstieg in die Informatik mit Java

Zeiger: Der Adressoperator &

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Arrays und Schleifen

15. Elementare Graphalgorithmen

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

Tag 4 Repetitorium Informatik (Java)

Arrays Fortgeschrittene Verwendung

2. Programmierung in C

Einführung in die Java- Programmierung

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

Inhalt. Peter Sobe 63. Felder in C

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

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

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Dynamische Datentypen

Programmieren I. Kapitel 5. Kontrollfluss

Grundlagen der Programmierung in C++ Arrays und Strings, Teil 1

Am Dienstag, den 16. Dezember, ist Eulenfest. 1/48

Primitive Datentypen und Felder (Arrays)

RO-Tutorien 3 / 6 / 12

Kapitel 6: Graphalgorithmen Gliederung

Kapitel 7. Zusammengesetzte Datentypen, Vektoren, Zeichenketten

GI Vektoren

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Theoretische Informatik 1 WS 2007/2008. Prof. Dr. Rainer Lütticke

Werkzeuge zur Programmentwicklung

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

2.4 Schleifen. Schleifen unterscheiden sich hinsichtlich des Zeitpunktes der Prüfung der Abbruchbedingung:

Felder (1) Allgemeines

Schulbesuch Erich-Kästner Gesamtschule 07. April 2011

JAVA-Datentypen und deren Wertebereich

Zeiger, Arrays und Strings in C und C++

Wie entwerfe ich ein Programm?

FAKULTÄT FÜR INFORMATIK

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

Vorkurs C++ Programmierung

+ C - Array (Vektoren, Felder)

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

Programmieren in C/C++ und MATLAB

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

Übungspaket 23 Mehrdimensionale Arrays

C++ Teil 5. Sven Groß. 8. Mai IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 8. Mai / 16

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

Elementare Datentypen in C++

7. Transitive Hülle. Kante des Graphen. Zusatz-Kante der transitiven Hülle

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Grundlagen der Objektorientierten Programmierung - Statische Arrays

Bereits behandelt: Einfache Datentypen / Variablen. Schleifen und Verzweigungen. Funktionen. Heute: Felder, Zeiger, Referenzen. Freispeicherverwaltung

Übungspaket 14 Eindimensionale Arrays

3. Grundanweisungen in Java

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

Vorlesung Programmieren

Programmierkurs Java

Kodieren Von Graphen

Programmierung mit Feldern OOPM, Ralf Lämmel

MLAN1 1 MATRIZEN 1 0 = A T =

Welche Informatik-Kenntnisse bringen Sie mit?

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

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Copyright, Page 1 of 5 Die Determinante

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Kapitel 4: Zeiger. Inhalt. Zeiger Zeigerarithmetik

C-Propädeutikum Höhere Datentypen

Programmierstarthilfe SS 2008 Fakultät für Ingenieurwissenschaften und Informatik 5. Blatt Für den 26. und

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

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Grundlagen von C# - 2

Transkript:

2.7 Felder (Arrays) Felder (Arrays) bilden eine Zusammenfassung von Elementen gleichen Typs, deren Anzahl bei der Programmierung noch nicht notwendigerweise feststeht. Das englische Wort array hatte ursprünglich militärische Bedeutung: Aufstellung zur Schlacht : Schlachtaufstellung der Schweden bei Kopenhagen, 1659, Handzeichnung Titel der Zeichnung links: Bataille, welche Ihr Königl. Majst. von Schweden bei Belägerung Kopenhagen den 29. Oktobr. 1659 in ein Lager gesetzt und selbige Stadt damahls biß den 27 Mai 1660 blokiret gewesen Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 112

Arrays ein Array ist eine Tabelle gleichartiger Elemente, d.h. die Elemente haben den gleichen Typ. Die Tabelle hat einen Namen, die einzelnen Elemente werden über eine Indizierung angesprochen. a a[0] a[1] a[2] a[3] a[4] a[5]... In Java sind die Elemente eines Arrays Variablen, die alle den gleichen Typ haben. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 113

Das Sieb des Eratosthenes Problem Primzahlen: geg: n N Idee: ges: alle Primzahlen n 1. Schreibe alle Zahlen 2,..., n in ein Array. 2. 2 ist eine Primzahl: streiche alle Vielfachen von 2. 3. die kleinste nicht gestrichene Zahl ist 3. 3 ist eine Primzahl: streiche alle Vielfachen von 3. 4. die kleinste nicht gestrichene Zahl ist 5. 5 ist eine Primzahl: usw. Nichtprimzahlen fallen durch ein Sieb. Die Zahlen, die im Sieb verbleiben, sind Primzahlen. Eratosthenes 276-194 v.chr. (?) Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 114

Das Sieb des Eratosthenes schrittweise Implementierung /* Nach Ausführung enthält das Array "sieb" im Element sieb[i] entweder i, wenn i */ /* Primzahl ist, oder einen echten Primteiler von i, wenn i keine Primzahl ist */ int n = In.readInt(); /* lese Obergrenze für Primzahlen */ int[] sieb = new int[n+1]; /* reserviere Platz für n+1 Zahlen sieb[0],...,sieb[n] */ Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 115

Das Sieb des Eratosthenes schrittweise Implementierung /* Nach Ausführung enthält das Array "sieb" im Element sieb[i] entweder i, wenn i */ /* Primzahl ist, oder einen echten Primteiler von i, wenn i keine Primzahl ist */ int n = In.readInt(); /* lese Obergrenze für Primzahlen */ int[] sieb = new int[n+1]; /* reserviere Platz für n+1 Zahlen sieb[0],...,sieb[n] */ for (int i = 2; i <= n; i++) sieb[i] = i; /* initialisiere sieb[i] = i */ Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 115

Das Sieb des Eratosthenes schrittweise Implementierung /* Nach Ausführung enthält das Array "sieb" im Element sieb[i] entweder i, wenn i */ /* Primzahl ist, oder einen echten Primteiler von i, wenn i keine Primzahl ist */ int n = In.readInt(); /* lese Obergrenze für Primzahlen */ int[] sieb = new int[n+1]; /* reserviere Platz für n+1 Zahlen sieb[0],...,sieb[n] */ for (int i = 2; i <= n; i++) sieb[i] = i; /* initialisiere sieb[i] = i */ for (int i = 2; i <= n; i++) { /* solange noch Zahlen i zu testen sind... */ } // for all i <= n... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 115

Das Sieb des Eratosthenes schrittweise Implementierung /* Nach Ausführung enthält das Array "sieb" im Element sieb[i] entweder i, wenn i */ /* Primzahl ist, oder einen echten Primteiler von i, wenn i keine Primzahl ist */ int n = In.readInt(); /* lese Obergrenze für Primzahlen */ int[] sieb = new int[n+1]; /* reserviere Platz für n+1 Zahlen sieb[0],...,sieb[n] */ for (int i = 2; i <= n; i++) sieb[i] = i; /* initialisiere sieb[i] = i */ for (int i = 2; i <= n; i++) { /* solange noch Zahlen i zu testen sind... */ if (sieb[i]==i) { Out.println(i); /* i ist Primzahl */ } // if... } // for all i <= n... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 115

Das Sieb des Eratosthenes schrittweise Implementierung /* Nach Ausführung enthält das Array "sieb" im Element sieb[i] entweder i, wenn i */ /* Primzahl ist, oder einen echten Primteiler von i, wenn i keine Primzahl ist */ int n = In.readInt(); /* lese Obergrenze für Primzahlen */ int[] sieb = new int[n+1]; /* reserviere Platz für n+1 Zahlen sieb[0],...,sieb[n] */ for (int i = 2; i <= n; i++) sieb[i] = i; /* initialisiere sieb[i] = i */ for (int i = 2; i <= n; i++) { /* solange noch Zahlen i zu testen sind... */ if (sieb[i]==i) { Out.println(i); /* i ist Primzahl */ for (int j = 2*i; j <= n; j=j+i) /* markiere echte Vielfache von i */ sieb[j] = i; /* i<j ist echter Primteiler von j */ } // if... } // for all i <= n... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 115

Das Sieb des Eratosthenes Deklaration eines Arrays /* Nach Ausführung enthält das Array "sieb" im Element sieb[i] entweder i, wenn i */ /* Primzahl ist, oder einen echten Primteiler von i, wenn i keine Primzahl ist */ int n = In.readInt(); /* lese Obergrenze für Primzahlen */ int[] sieb = new int[n+1]; /* reserviere Platz für n+1 Zahlen sieb[0],...,sieb[n] */ for (int i = 2; i <= n; i++) sieb[i] = i; /* initialisiere sieb[i] = i */ for (int i = 2; i <= n; i++) { /* solange noch Zahlen i zu testen sind... */ if (sieb[i]==i) { Out.println(i); /* i ist Primzahl */ for (int j = 2*i; j <= n; j=j+i) /* markiere echte Vielfache von i */ sieb[j] = i; /* i<j ist echter Primteiler von j */ } // if... } // for all i <= n... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 115

Das Sieb des Eratosthenes Zuweisung an Arrayelemente /* Nach Ausführung enthält das Array "sieb" im Element sieb[i] entweder i, wenn i */ /* Primzahl ist, oder einen echten Primteiler von i, wenn i keine Primzahl ist */ int n = In.readInt(); /* lese Obergrenze für Primzahlen */ int[] sieb = new int[n+1]; /* reserviere Platz für n+1 Arrayelemente 0,...,n */ for (int i = 2; i <= n; i++) sieb[i] = i; /* initialisiere sieb[i] = i */ for (int i = 2; i <= n; i++) { /* solange noch Zahlen i zu testen sind... */ if (sieb[i]==i) { Out.println(i); /* i ist Primzahl */ for (int j = 2*i; j <= n; j=j+i) /* markiere echte Vielfache von i */ sieb[j] = i; /* i<j ist echter Primteiler von j */ } // if... } // for all i <= n... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 115

Das Sieb des Eratosthenes Abfrage von Arrayelmenten /* Nach Ausführung enthält das Array "sieb" im Element sieb[i] entweder i, wenn i */ /* Primzahl ist, oder einen echten Primteiler von i, wenn i keine Primzahl ist */ int n = In.readInt(); /* lese Obergrenze für Primzahlen */ int[] sieb = new int[n+1]; /* reserviere Platz für n+1 Arrayelemente 0,...,n */ for (int i = 2; i <= n; i++) sieb[i] = i; /* initialisiere sieb[i] = i */ for (int i = 2; i <= n; i++) { /* solange noch Zahlen i zu testen sind... */ if (sieb[i]==i) { Out.println(i); /* i ist Primzahl */ for (int j = 2*i; j <= n; j=j+i) /* markiere echte Vielfache von i */ sieb[j] = i; /* i<j ist echter Primteiler von j */ } // if... } // for all i <= n... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 115

Das Sieb des Eratosthenes Operationen mit Array /* Nach Ausführung enthält das Array "sieb" im Element sieb[i] entweder i, wenn i */ /* Primzahl ist, oder einen echten Primteiler von i, wenn i keine Primzahl ist */ int n = In.readInt(); /* lese Obergrenze für Primzahlen */ int[] sieb = new int[n+1]; /* reserviere Platz für n+1 Arrayelemente 0,...,n */ for (int i = 2; i <= n; i++) sieb[i] = i; /* initialisiere sieb[i] = i */ for (int i = 2; i <= n; i++) { /* solange noch Zahlen i zu testen sind... */ if (sieb[i]==i) { Out.println(i); /* i ist Primzahl */ for (int j = 2*i; j <= n; j=j+i) /* markiere echte Vielfache von i */ sieb[j] = i; /* i<j ist echter Primteiler von j */ } // if... } // for all i <= n... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 115

Deklaration von Arrays int[ ] sieb; /* Deklaration einer Arrayvariablen "sieb" */ /* mit unbestimmter Anzahl von int-elementen */ Damit: BNF-Produktionen für Typdefinition: <Typ> ::= <primitivetype> <complextype> <arraytype> <primitivetype> ::= int long byte short double float char boolean <complextype> ::= String... <arraytype> ::= <Typ>[ ] Nach der Deklaration einer Arrayvariablen unbestimmter Länge existiert noch kein Element des Arrays! Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 116

Erzeugung von Arrays mit new und Längenabfrage int[ ] sieb; /* Deklaration der Arrayvariablen "sieb" */ sieb = new int[n+1]; /* Erzeugung von n+1 Arrayelementen vom Typ int */ int[ ] sieb = new int[n+1]; /* Deklaration und Erzeugung */ Arrayelemente werden durchnumeriert. Die Numerierung beginnt immer bei 0. Die Länge eines Arrays ist definiert als die Anzahl der Elemente im Array und kann jederzeit im Programm abgefragt werden: int[ ] sieb = new int[n+1]; /* Deklaration und Erzeugung */ int m = sieb.length... /* jetzt ist m = n+1 */ Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 117

Arraytyp Arrayvariablen haben den Arraytyp <Typ>[ ]. Arrayvariablen gleichen Arraytyps können aufeinander zugewiesen werden. Arrayvariablen sind Zeiger auf einen Speicherbereich. Durch Zuweisung ändert sich die Speicherzelle, auf die das Array zeigt: int[ ] a; /* Deklaration */ int[ ] b; /* b und a haben gleichen Typ int[] */ Speicher b a Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 118

Arraytyp Arrayvariablen haben den Arraytyp <Typ>[ ]. Arrayvariablen gleichen Arraytyps können aufeinander zugewiesen werden. Arrayvariablen sind Zeiger auf einen Speicherbereich. Durch Zuweisung ändert sich die Speicherzelle, auf die das Array zeigt: int[ ] a = new int[5]; /* Deklaration und Erzeugung */ int[ ] b = new int[3]; /* b und a haben gleichen Typ int[] */ Speicher b a 0 1 2 3 4 0 1 2 0 0 0 0 0 0 0 0 Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 118

Arraytyp Arrayvariablen haben den Arraytyp <Typ>[ ]. Arrayvariablen gleichen Arraytyps können aufeinander zugewiesen werden. Arrayvariablen sind Zeiger auf einen Speicherbereich. Durch Zuweisung ändert sich die Speicherzelle, auf die das Array zeigt: int[ ] a = new int[5]; /* Deklaration und Erzeugung */ int[ ] b = new int[3]; /* b und a haben gleichen Typ int[] */ for (int i = 0; i < a.length; i++) a[i] = i+10; /* init(a) */ for (int i = 0; i < b.length; i++) b[i] = i+20; /* init(b) */ Speicher b a 0 1 2 3 4 0 1 2 10 11 12 13 14 20 21 22 Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 118

Arraytyp Arrayvariablen haben den Arraytyp <Typ>[ ]. Arrayvariablen gleichen Arraytyps können aufeinander zugewiesen werden. Arrayvariablen sind Zeiger auf einen Speicherbereich. Durch Zuweisung ändert sich die Speicherzelle, auf die das Array zeigt: int[ ] a = new int[5]; /* Deklaration und Erzeugung */ int[ ] b = new int[3]; /* b und a haben gleichen Typ int[] */ for (int i = 0; i < a.length; i++) a[i] = i+10; /* init(a) */ for (int i = 0; i < b.length; i++) b[i] = i+20; /* init(b) */ a = b; /* Zuweisung einer neuen Adresse an a */ Speicher b a 0 1 2 3 4 0 1 2 10 11 12 13 14 20 21 22 Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 118

Arraytyp Arrayvariablen haben den Arraytyp <Typ>[ ]. Arrayvariablen gleichen Arraytyps können aufeinander zugewiesen werden. Arrayvariablen sind Zeiger auf einen Speicherbereich. Durch Zuweisung ändert sich die Speicherzelle, auf die das Array zeigt: int[ ] a = new int[5]; /* Deklaration und Erzeugung */ int[ ] b = new int[3]; /* b und a haben gleichen Typ int[] */ for (int i = 0; i < a.length; i++) a[i] = i+10; /* init(a) */ for (int i = 0; i < b.length; i++) b[i] = i+20; /* init(b) */ a = b; /* Zuweisung einer neuen Adresse an a */ Speicher b 0 1 2 a 10 11 12 13 14 20 21 22 Das Array, auf das a zeigte, kann nie wieder referenziert werden. Sein Speicherplatz wird vom Java-System freigegeben. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 118

Zugriff auf Arrayelemente Arrayelemente sind indiziert. Auf sie kann mit <Array>[<Index>] zugegriffen werden. Dabei muss der Typ des Index ganzzahlig sein, d.h. int, long, short, byte. sieb[i] =... ; sieb[i%j+k] =... ; Um auf alle Elemente eines Arrays zuzugreifen eignet sich besonders die for-schleife: for (i = 0; i < sieb.length; i++) sieb[i] =... Arrayelemente können wie einfache Variablen gleichen Typs verwendet werden: sieb[i] = i; /* Zuweisung */ if (sieb[i] == i)... /* Ausdruck */ p = sieb[i]/sieb[j]; q = sieb[i] % sieb[j]; /* Operationen für int */ p = p+sieb[j];... for (sieb[i] = 0; sieb[i] <= i; sieb[i]++)... /* unschön */ Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 119

Initialisierung von Arrayelementen Nach new haben alle Arrayelemente den Wert 0 (Achtung: Die Elemente sind nicht immer ganze Zahlen. Es werden alle Bits auf 0 gesetzt!) Ist die Anzahl der Elemente zum Zeitpunkt der Programmentwicklung noch nicht bekannt, können die Arrayelemente mit einer Schleife initialisiert werden: int n = In.readInt(); int[ ] sieb = new int[n+1]; for (i = 0; i < sieb.length; i++) sieb[i] = i; Sind die Anzahl der Elemente und ihre initialen Werte zum Zeitpunkt der Programmentwicklung bekannt, kann das Array schon mit der new-anweisung initialisiert werden: String[] monat = new String[] { "Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez" } Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 120

Mehrdimensionale Arrays Ein Array ist eine Tabelle gleichartiger Elemente. Sind diese gleichartigen Elemente wieder Arrays, so erhält man mehrdimensionale Arrays. a a[0][0] a[0][4] a[0] a[1] a[2] 0 5 10 1 6 11 2 7 12 3 8 13 4 9 14 a[2][0] a[2][4] Das Beispiel links zeigt eine 2-dimensionale Tabelle, oder Matrix. int[][] a; /* Deklaration */ a = new int[3][5]; /* Erzeugung */ for (int i = 0; i < a.length; i++) for (int j = 0; j < a[i].length; j++) a[i][j] = 5*i+j; /* Initialisierung */ /* oder */ int[][] a = {{0,1,2,3,4}, {5,6,7,8,9}, {10,11,12,13,14}}; Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 121

Beispiel: Transponieren einer Matrix Es seien m, n N. Eine m n Matrix A über den reellen Zahlen R (A R m n ) ist eine 2-dimensionale Tabelle mit m Zeilen und n Spalten über R. Die Elemente von A werden mit A i,j, 0 i m 1, 0 j n 1 bezeichnet. Zu einer Matrix A R m n ist die Transponierte A T R n m definiert durch A T i,j = A j,i 0 i n 1, 0 j m 1 Beispiel: A = 0 @ 1 2 3 4 5 6 7 8 9 1 A, A T = 0 @ 1 4 7 2 5 8 3 6 9 1 A, B = ` 1 2 3, B T = 0 @ 1 2 3 1 A Die Transponierte einer Matrix entsteht durch Spiegelung der Elemente an der Hauptdiagonalen. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 122

Beispiel: Transponieren einer Matrix Problem Transponierte: geg: n N, A R n n ges: A T Es ist A T i,j = A j,i für alle i, j. Also: vertausche die Elemente unterhalb der Hauptdiagonalen mit den entsprechenden Elementen überhalb der Hauptdiagonalen. /* wandelt eine quadratische Matrix A R n n in A T um */ int n = In.readInt(); float a[][] = new int[n][n];... for (int i = 0; i < a.length; i++) for (int j = 0; j < i; j++) { float h; /* vertausche A i,j und A j,i */ h = a[i][j]; a[i][j] = a[j][i]; a[j][i] = h; } Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 123

Beispiel: Matrixmultiplikation Es seien m, n, k N, A R m n, B R n k. Dann ist das Matrixprodukt C= A B R m k definiert durch C i,j = Xn 1 p=0 A i,p B p,j, 0 i n 1, 0 j k 1 /* seien die Matrizen a und b schon eingelesen */ float[][] c = new float[a.length][b[0].length]; /* Dimens. beachten */ for (int i = 0; i < a.length; i++) for (int j = 0; j < b[0].length; j++) { c[i][j] = 0; /* initialisiere mit 0 */ for (int p = 0; p < b.length; p++) c[i][j] = c[i][j] + a[i][p]*b[p][j]; /* addiere Summanden */ } Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 124

Beispiel: Adjazenzmatrix eines Graphen Ein (gerichteter) Graph G = (V, E) besteht aus einer Knotenmenge V und einer Kantenmenge E V V. Graphen können gezeichnet werden: Knoten sind Punkte, Kanten sind Linien. 0 1 3 2 Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 125

Beispiel: Adjazenzmatrix eines Graphen Ein (gerichteter) Graph G = (V, E) besteht aus einer Knotenmenge V und einer Kantenmenge E V V. Graphen können gezeichnet werden: Knoten sind Punkte, Kanten sind Linien. Es sei G = (V, E) ein Graph, n = V. Die Adjazenzmatrix A {0, 1} n n ist definiert durch A i,j = 1 (i, j) E 0 1 3 2 Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 125

Beispiel: Adjazenzmatrix eines Graphen Ein (gerichteter) Graph G = (V, E) besteht aus einer Knotenmenge V und einer Kantenmenge E V V. Graphen können gezeichnet werden: Knoten sind Punkte, Kanten sind Linien. 0 1 Es sei G = (V, E) ein Graph, n = V. Die Adjazenzmatrix A {0, 1} n n ist definiert durch A i,j = 1 (i, j) E Ein Graph G mit n Knoten kann im Computer dargestellt werden, indem man seine Adjazenzmatrix speichert: A = 0 B @ 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 C A ist die Adjazenzmatrix des Graphen links. 3 2 Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 125

Beispiel: Adjazenzmatrix eines Graphen Ein (gerichteter) Graph G = (V, E) besteht aus einer Knotenmenge V und einer Kantenmenge E V V. Graphen können gezeichnet werden: Knoten sind Punkte, Kanten sind Linien. 0 1 3 2 Es sei G = (V, E) ein Graph, n = V. Die Adjazenzmatrix A {0, 1} n n ist definiert durch A i,j = 1 (i, j) E Ein Graph G mit n Knoten kann im Computer dargestellt werden, indem man seine Adjazenzmatrix speichert: A = 0 B @ 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 C A ist die Adjazenzmatrix des Graphen links. Transponieren der Adjazenzmatrix von G ist äquivalent zum Umdrehen der Kanten von G. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 125

Beispiel: Wegeberechnung in Graphen Es sei G = (V, E) ein Graph, A die Adjazenzmatrix von G, A k = A.{z.. A}, k N. k-mal Dann gilt: es existiert ein Weg von i nach j in G es existiert k N 0 : A k i,j > 0 0 1 A 0 = 0 B @ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 C A, A 1 = 0 B @ 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 C A, 3 2 A 2 = 0 B @ 0 0 1 0 0 0 0 1 1 1 0 0 0 1 1 0 1 C A, A 3 = 0 B @ 0 0 0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 C A Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 126

Beispiel: Sudoku-Spiel 6 1 2 9 7 8 6 6 7 3 5 9 2 7 1 3 8 4 9 9 3 4 8 5 9 2 4 Das Spiel ist gelöst, wenn alle Felder so mit Zahlen gefüllt sind, daß in jeder Zeile, in jeder Spalte und in jedem Teilquadrat jede Zahl aus {1,..., 9} genau einmal vorkommt. (Siehe auch http://www.sudoku-lobby.de) Wir wollen berechnen, welche Zahlen für ein gegebenes Feld (i, j), i, j {0,..., 9} eines Sudokus noch zur Verfügung stehen. Dazu schliessen wir alle Zahlen aus, die in Zeile i, in Spalte j oder dem Teilquadrat von (i, j) schon vorkommen. Wir speichern das Sudoku-Feld in einem zweidimensionalen Array über den ganzen Zahlen. Dabei habe Inhalt 0 eines Feldes die Bedeutung noch nicht besetzt. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 127

Beispiel: Sudoku-Spiel 6 1 2 9 7 8 6 6 7 3 5 9 2 7 1 3 8 4 9 9 3 4 8 5 9 2 4 Bsp.: Für das Feld (0, 6) stehen die Zahlen 1, 2, 4, 6, 7, 8 nicht mehr zur Verfügung, also kann das Feld (0, 6) nur mit einer der Zahlen 3, 5 oder 9 besetzt werden. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 128

Problem SudokuCandidates: geg: ein zweidimensionales, 9 9 int-array A (Eintrag 0 bedeute nicht besetzt ), ein Feld (z, s) von A ges: ein Array B {false, true} 10 so daß für alle j {1,..., 9} gilt: B[j] = true j ist Kandidat für (z, s). /* Initialisiere */ final int n = 9; /* Dimension des Sudokus */ int[][] A = new int[n][n]; /* reserviere Platz für n 2 Arrayelemente in A */ boolean[] B = new boolean[n+1]; /* reserviere Platz für n+1 Arrayelemente in B */ Out.print("A = "); In.open("sudoku.txt"); /* lese Sudoku aus der Datei sudoku.txt */ for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) A[i][j] = In.readInt(); In.close(); /* von jetzt an lese wieder von Tastatur */ for (int j = 1; j <= n; j++) B[j] = true; /* initialisiere B */ Out.print("z,s = "); int z = In.readInt(); int s = In.readInt(); /* lese z, s */... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 129

Problem SudokuCandidates: geg: ein zweidimensionales, 9 9 int-array A (Eintrag 0 bedeute nicht besetzt ), ein Feld (z, s) von A ges: ein Array B {false, true} 10 so daß für alle j {1,..., 9} gilt: B[j] = true j ist Kandidat für (z, s). /* Initialisiere */... /* Analysiere Zeile z */ for (int j = 0; j < n; j++) { int x = A[z][j]; B[x] = false; } /* B[A[z][j]] = false; */ /* Analysiere Spalte s */ for (int i = 0; i < n; i++) { int x = A[i][s]; B[x] = false; } /* B[A[i][s]] = false; */... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 130

Problem SudokuCandidates: geg: ein zweidimensionales, 9 9 int-array A (Eintrag 0 bedeute nicht besetzt ), ein Feld (z, s) von A ges: ein Array B {false, true} 10 so daß für alle j {1,..., 9} gilt: B[j] = true j ist Kandidat für (z, s). /* Initialisiere */... /* Analysiere Zeile z */... /* Analysiere Spalte s */... /* Analysiere Teilquadrat von (z, s) */ final int m = 3; /* Größe des Teilquadrats bei n = 9 */ int p = z/m; int q = s/m; /* (p, q) ist linke obere Ecke des Teilquadrats von (z, s) */ for (int i = p; i < p+m; i++) for (int j = q; j < q+m; j++) { int x = A[i][j]; B[x] = false; }... Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 131

Problem SudokuCandidates: geg: ein zweidimensionales, 9 9 int-array A (Eintrag 0 bedeute nicht besetzt ), ein Feld (z, s) von A ges: ein Array B {false, true} 10 so daß für alle j {1,..., 9} gilt: B[j] = true j ist Kandidat für (z, s). /* Initialisiere */... /* Analysiere Zeile z */... /* Analysiere Spalte s */... /* Analysiere Teilquadrat von (z, s) */... /* Ausgabe der Kandidaten für Feld (z, s) */ Out.print("Kandidaten(" + z + "," + s + "):"); for (int j = 1; j <= n; j++) if (B[j]) Out.print(" "+ j); /* B[j] = true j ist Kandidat */ Out.println(); Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 132

Verzweigte Arrays Verzweigte Arrays sind Arrays, deren Elemente wieder Arrays sind. Im Unterschied zu mehrdimensionalen Arrays können die Arrayelemente unterschiedliche Längen haben. Es sei G = (V, E) ein Graph. Für einen Knoten v V ist die Adjazenzliste A(v) definiert durch 0 1 A(v) = (w 1,..., w k ), (v, w i ) E, 1 i k 3 2 Ein Graph G kann im Computer dargestellt werden, indem man seine Adjazenzlisten speichert. a a[0] a[1] a[2] a[3] 1 2 3 0 1 Adjazenzlisten benötigen bei Graphen mit wenigen Kanten signifikant weniger Speicherplatz als die Adjazenzmatrix. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 133

Beispiel: Einlesen von Adjazenzlisten eines Graphen int n = In.readInt(); /* lese Anzahl der Knoten von G */ int[][] a = new int[n][]; /* Platz für n Adjazenzlisten */ for (int i=0; i < a.length; i++) { } Out.print("Anzahl der Nachbarn von Knoten "+i+ ": "); int h = In.readInt(); /* lese Anzahl der Nachbarn von i */ a[i] = new int[h]; /* Platz für h Nachbarn */ for (int j = 0; j < a[i].length; j++) { Out.print(j+". Nachbar von "+i+": "); a[i][j] = In.readInt(); /* lese j-ten Nachbarn von i */ } Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 134