Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Seite 1
Informatik
Datenstrukturen und Dateien
Th Letschert
Seite 2
Datenstrukturen
Datenstrukturen Sprachelemente zur Speicherung von vielen Daten
Datentyp vs DatenstrukturDatentyp
Format + Operationen für ein Datum z.B. ganze Zahl im 32 Bit 2er Komplement Format, Zeichen in einem Byte in ASCII-Codierung
DatenstrukturKollektion von Speicherstellen die zusammen eine (komplexe) Information ausmachen
Vorgegebene Strukturen (Beispiele)Feld (Array) Daten unter einem Index gespeichert Liste Daten als Folge von Werten gespeichert Abbildung Daten unter einem „Schlüssel“ abgelegt
Selbst definierte Strukturen erfordern meist spezielle Sprachmittel
0110 0010
char c = 'a';
c
2 31
Das Zeichen a
Die Liste [1,2,3]
int[] a = {1,2,3};
Seite 3
Datenstrukturen: Felder (Arrays)
Felder (Arrays)Daten unter einem Index speichern
älteste Datenstruktur in Programmiersprachen
Vorbild: Vektoren und Matrizen in der Mathematik
Wird von allen klassischen Programmiersprachen unterstützt (C, C++, C#, Java, ...)
Felder bestehen aus Feldelementen, die über einen Index angesprochen werden können
Beispiel: Feld mit 10 Elementen
int[] x = new int[10];for (int i=0; i < 10; i++) {
x[i] = i;}
x wird als ein Feld mit 10 Komponenten angelegt und mit 0, 1, .. 9 gefüllt.
Seite 4
Felder (Arrays)
Felder (Arrays)
Geordnet: ein Element nach dem anderen, jedes Element hat einen Index
Homogen: alle Elemente haben den gleichen Typ
Struktur: VariableSpeicher für Elemente
Speicher
Feld-Variableenthält Zeiger (Adresse) auf den Speicherbereich für die Elemente
Speicherplatz für die Feldelemente
Seite 5
Felder (Arrays)
Felder (Arrays) definierenVariante 1 / Erzeugung eines Felds
int [] a = new int[10];
a
1. Eine Feld-Variable a wird angelegt.2. Zusammenhängender Speicherplatz für die Feldelemente wird angelegt und mit 0-en gefüllt. 3. Die Feld-Variable wird mit der Adresse des Speicherplatzes gefüllt.
Feld-Variable
Feldelement-Typ
Feld-Größe
Speicher
0 0 0 0 0 0 0 0 0 0
Seite 6
Felder (Arrays)
Felder (Arrays) definierenVariante 2 / Erzeugung eines Felds
a
1. Eine Feld-Variable a wird angelegt.2. Zusammenhängender Speicherplatz für die Feldelemente wird angelegt und mit den Werten gefüllt.3. Die Feld-Variable wird mit der Adresse des Speicherplatzes gefüllt.
Feld-Variable
Feldelement-Typ
Feld-Elemente
Speicher
int [] a = {1,2,3,4,5,7,8,9,0};
1 2 3 4 5 6 7 8 9 0
Seite 7
Felder (Arrays) : Beispiele
For-Schleife: Felder (Arrays) durchlaufen
Feld durchlaufen mit klassische Schleifefor ( int i = 0; i < feld.length; i++ )
... verarbeite feld[i] ....
Feld durchlaufen mit „for-each“ Schleife
for ( Typ elem: feld )... verarbeite elem ....
Nur lesender Zugriff möglich
Für jedes elem in feld mache Folgendes
Für jeden Index i zwischen 0 und der Feldlänge feld.length mache Folgendes
Seite 8
Felder (Arrays) : Beispiele
Beispiel: Quadratzahlen von 0 bis 19
0. 1. 4. 9. 16. 25. 36. 49. 64. 81. 100. 121. 144. 169. 196. 225. 256. 289. 324. 361.
„For-each“-Schleife über den Inhalt des Feldes
Zähl-Schleife: 0 .. 19
Feld mit 20 Elementen, Index 0 .. Index 19
int[] quadZahl = new int[20];
for (int i=0; i < quadZahl.length; i++) { quadZahl[i] = i*i;}
for (int v : quadZahl) { System.out.print(v + ". ");}System.out.println();
Seite 9
Felder (Arrays) : Beispiele
Beispiel: Fakultäten f[i] = i! berechnen und ausgeben (1)
1 1 2 6 24 120 720 5040 40320 362880
Funktion: nimmt Feld an und verändert es
static void compFak(int[] a) { a[0] = 1; for (int i = 1; i<a.length; i++) {
a[i] = a[i-1]*i; }}
public static void main(String args[]) { int[] f = new int[10]; compFak(f); for (int v : f) { System.out.print(v + " "); } System.out.println();}
Seite 10
Felder (Arrays) : Beispiele
Beispiel: Fakultäten f[i] = i! berechnen und ausgeben (2)
1 1 2 6 24 120 720 5040 40320 362880
Funktion: erzeugt Feld und gibt es zurück
static int[] compFak() { int[] a = new int[10]; a[0] = 1; for (int i = 1; i<a.length; i++) { a[i] = a[i-1]*i; } return a;}
public static void main(String args[]) { int[] f = compFak(); for (int v : f) { System.out.print(v + " "); } System.out.println();}
Seite 11
Felder (Arrays) : Beispiele
Beispiel: Suche nach dem Maximum in einem Feld
static int max(int[] a) { int max = a[0]; for (int i = 1; i<a.length; i++) { if (a[i] > max) { max = a[i]; } } return max;}
public static void main(String args[]) { int[] f = new int[]{4,3,0,1,2,3,7,4,5,2,4,7}; System.out.println(max(f));}
7
Seite 12
Felder (Arrays) : Zuweisung und Vergleich
Felder zuweisen'=' kopiert bei Feldern nicht den Inhaltsondern nur die Zeiger
int [] a1 = { 1, 2, 3 };int [] a2 = { 9, 8, 7 };a2 = a1;
a1
a2 = a1;
1 2 3
a2 9 8 7
a1 1 2 3
a2
vorher
nachher
Zuweisung
9 8 7
Seite 13
Felder (Arrays) : Zuweisung und Vergleich
Felder vergleichen'==' testet bei Feldern nicht auf gleichen Inhaltsondern auf Identität
int [] a1 = { 1, 2, 3 };int [] a2 = { 1, 2, 3 }; a1==a2 ist falsch!
a1
int [] a1 = { 1, 2, 3 };int [] a2 = a1; a1==a2 ist wahr!
1 2 3
a2 1 2 3
a1 1 2 3
a2
unterschiedliche Zeiger in a1 und a2
gleiche Zeiger in a1 und a2
Seite 14
Felder (Arrays) und Funktionen
Felder als Funktionsargumente– Zahlwerte als Argumente werden in die Parameter-Variablen der Funktion
kopiert
– Felder als Argumente werden nicht kopiert.Lediglich der Verweis auf den Elementspeicher wird zu Funktion kopiert.
int x = 5;int [] a = new int[10];f(a,x);
static void f(int[] a, int v) { for (int i = 1; i<a.length; i++) {
a[i] = a[i]+v; }}
5x
a
f(a,x); 5
5va
Übertragung der Argumente
Aufruf der Funktion
Parameter-Variablen der Funktion
Variablen in main
Seite 15
Felder (Arrays) voller Felder
Mehrdimensionale Felder– Felder können Felder enthalten– Dies kann zur Modellierung mehrdimensionaler Felder genutzt
werden.
matrixint[][] matrix = { { 10, 20, 30 },
{ 21, 22, 23 },
{ 31, 32, 33 } };
for (int[] zeile : matrix) {
for (int elem : zeile) {
System.out.print(elem + " ");
}
System.out.println();
}
10 20 30 21 22 23 31 32 33
31 32 33
10 20 30
21 22 23
Seite 16
Felder (Arrays) voller Felder
Mehrdimensionale Felder– Beispiel Matrix-Multiplikation (1)
/** * Matrixmultiplikation. * @param matrix1 MxK Matrix * @param matrix2 KxN Matrix * @return MxN Matrix als Produkt von matrix1 und matrix2; * null falls die Dimensionen der Matrizen nicht passen */static double[][] matmult(double[][] matrix1, double[][] matrix2) { int M = matrix1.length; // Zeilen matrix1 int K = matrix2.length; // Zeilen matrix2 int N = matrix2[0].length; // Spalten matrix2
if (K != matrix1[0].length) { // Spalten matrix1 != Zeilen matrix2return null;
}
double[][] resultat = new double [N][M];
for(int i = 0; i < N; i++) {for(int j = 0; j < M; j++) {
double s = 0.0;for(int k = 0; k < K; k++) {
s = s+ matrix1[i][k] * matrix2[k][j];}resultat[i][j] = s;
} } return resultat;}
Seite 17
Felder (Arrays) voller Felder
Mehrdimensionale Felder– Beispiel Matrix-Multiplikation / (2) Aufruf der Funktion
public static void main(String args[]) { double[][] matrix1 = {{ 1, 2, 3 }, { 4, 5, 6 }};
double[][] matrix2 = {{ 1, 3 }, { 2, 2 }, { 3, 1 }};
double[][] matrix3 = matmult(matrix1, matrix2);
for (double[] zeile : matrix3) { for (double elem : zeile) System.out.print(elem + " "); System.out.println(); } }}
Seite 18
Felder (Arrays) : Zusammenfassung
Vorteile der Felder– einfache– effiziente
Verwaltung von Mengen gleichartiger Daten
Nachteile der Felder– feste Größe
– Änderung der Größe nicht direkt möglich
muss bei Bedarf simuliert werden(Neues Feld anlegen, Elemente umkopieren)
– Einfügen und Entfernen von Elementen nicht direkt möglich
muss bei Bedarf simuliert werden(umkopieren und verschieben)
Seite 19
Datenstrukturen : Listen
Listen
Definition
def Listen-Variable = Listen-Wert
Beispiel
Zugriff auf Listen-Elementelesend
Listen-Variable.get( Index )
schreibendListen-Variable.add( Index, Wert )
Listen-Variable.add( Wert )
List<Integer> liste = new ArrayList<Integer>();
An einer bestimmten Position einfügen
Am Ende anhängen
Seite 20
Listen
Beispiel: Zahlen einlesen und sortiert ausgeben
Th Letschert
package hallo;
import javax.swing.JOptionPane;import java.util.ArrayList;import java.util.Collections;import java.util.List;
public class Listenbeispiel {
public static void main(String args[]) { List<Integer> liste = new ArrayList<Integer>();
while (true) {String zahlStr = JOptionPane.showInputDialog("Bitte Zahl eingeben");if (zahlStr == null) { break;}int zahl = Integer.parseInt(zahlString);liste.add(zahl);
}
Collections.sort(liste); System.out.println(liste); }
}
Seite 21
Abbildungen
Abbildung (Zuordnung, engl. Map)
Abbildung
Wert-Zuordnung
Beispiel Telefonbuch: Name ~> Nummer
beliebige endliche Tabellen mit 2 Spalten
Schlüssel ~> Wert (Key ~> Value) Beziehung
Notationeng verwandt mit Listen
Definition Map<String, Integer> telefonverz = new HashMap<String, Integer>();
telefonverz ~ { "Hugo" ~> 4711, "Karla" ~> 4712, "Egon" ~> 4713 }
SchlüsselWert
Abb.-Variable
Abb.-Wert
Ideell, kann so (leider) in Java nicht
hingeschrieben werden.
Seite 22
Abbildungen
Abbildung (Zuordnung, engl. Map)
Zugriff auf Map-Elemente lesend
Map-Variable.get( Schlüssel )
schreibendListen-Variable.put( Schlüssel, Wert )
Seite 23
Abbildungen
Th Letschert
Abbildung Beispiel
package hallo;
import java.util.HashMap;import java.util.Map;import javax.swing.JOptionPane;
public class MapBeispiel {
public static void main(String args[]) { Map<String, Integer> telefonverz = new HashMap<String, Integer>();
while(true) {String name = JOptionPane.showInputDialog("Eintrag: Bitte Name eingeben");if (name == null) { break; }String nrString = JOptionPane.showInputDialog("Eintrag: Bitte TelefonNr eingeben");if (nrString == null) { break; }telefonverz.put(name, Integer.parseInt(nrString));
}
System.out.println(telefonverz);
while(true) {String name = JOptionPane.showInputDialog("Suche: Bitte Name eingeben");if (name == null) { break; }JOptionPane.showMessageDialog(null, "Die gesuchte Nr "
+ (telefonverz.get(name) != null ? "ist " + telefonverz.get(name) : "gibt es nicht") );
} }}
Seite 24
Datenmodellierung mit Listen und Abbildungen
Th Letschert
These:(Fast) Alle Informationsstrukturen der realen Welt lassen sich als Mengen, Listen und Abbildungen über Zahlen und Zeichenketten darstellen.
In Programmiersprachen bilde dies nach mit
int / double (für Zahlen)
String (für Zeichen und Zeichenketten)
array (für Listen und Abbildungen mit Schlüssel vom Typ int)
List (für Listen und Mengen)
Map (für Abbildungen)
Seite 25
Datenmodellierung
Th Letschert
Daten-Modellierung
Zentrales Anliegen der Informatik: Informationsstrukturen der realen (Anwendungs-) Welt darstellen.
vielfältige Anwendungen der Datenmodellierung in der Programmierung im System-Entwurf
vielfältige Methoden und Notationenin diversen Programmiersprachenin der Systementwicklung zwischen denen u.U. gewechselt werden muss
Seite 26
Datenstrukturen / Datenmodellierung : Beispiel
Stücklisten-Verwaltung– Stammdaten:
wichtige statische Informationen eines Betriebs über Lieferanden, Kunden, Erzeugnisse etc.
– Stücklisten:Stammdaten zu Erzeugnissen:
„Eine Stückliste beschreibt die mengenmäßige Zusammensetzung eines Erzeugnisses aus seinen Einzelteilen. Die Stückliste gibt dabei an, wie viele Mengeneinheiten eines bestimmten Teils oder einer bestimmten Baugruppe auf untergeordneter Erzeugnisstrukturebene benötigt werden, um eine Einheit des Erzeugnisses auf übergeordneter Erzeugnisstrukturebene herzustellen.“http://wirtschaftslexikon.gabler.de/Archiv/72926/stueckliste-v4.html
– Baukasten-Stückliste:Stücklisten können in unterschiedlicher Form gespeichert werden. Eine davon ist die Baukasten-Stückliste.
„Baukastenstücklisten (englisch: „unit list“) zeichnen sich dadurch aus, dass jeweils nur eine Ebene der Produktstruktur betrachtet wird: Baugruppen erhalten eigene Stücklisten, die in den Stücklisten der übergeordneten Gruppen verwendet werden.“http://de.wikipedia.org/wiki/Stückliste
Seite 27
Datenstruktur : Beispiel
Beispiel Baukasten-Stückliste– Produkt P
besteht aus einem Einzelteil E1 und einer Baugruppe B– Baugruppe B
besteht aus aus zwei Einzelteilen E1 und und einem Einzelteil E2
E1 E1 E1 E2
P BStückliste = Produkt ~> Menge( (Anzahl x (Baugruppe | Teil)) )
Baugruppe = Menge( (Anzahl x (Baugruppe | Teil)) )
Eine Stückliste ist eine Zuordnung - von Produkten (-nummern) - zu Mengen von Paaren - von Anzahl und Baugruppe (-nummern) oder Teil (-nummern).Eine Baugruppe ist eine Menge Paaren bestehend aus Anzahl und Baugruppe oder Teil.
Wie können Stücklisten mit Hilfe von Arrays, Listen und / oder Abbildungen gespeichert werden?
Seite 28
Dateien
Umgang mit Dateien - Beispiele
Der Umgang mit Dateien ist komplex, wir beschränken uns auf einige Beispiele
Datei auswählen
Dateien können durch Eingabe ihres „Pfads“ oder mit einem speziellen Dialog-Fenster ausgewählt werden.
Dateiauswahl durch Angabe eines Pfads
public static void main(String[] args) throws FileNotFoundException {
String fileNane = JOptionPane.showInputDialog("Bitte Datei-Pfad eingeben"); File f = new File(fileNane);
Scanner scan = new Scanner(f);
while (scan.hasNext()) { System.out.println(scan.next()); }}
Der Benutzer wird in einem Dialog um die Angabe einer Datei gebeten. Diese wird – falls gefunden – dann wortweise ausgegeben.
Seite 29
Dateien
Dateiauswahl mit Datei-Auswahl-Dialog
Der Benutzer wird in einem Dialog um die Auswahl einer Datei gebeten. Diese wird dann wortweise ausgegeben.
public static void main(String[] args) throws FileNotFoundException {
File f = null; JFileChooser fc = new JFileChooser(); int chooseResult = fc.showDialog(null, "Bitte Datei auswählen"); if (chooseResult == JFileChooser.APPROVE_OPTION) {
f = fc.getSelectedFile(); }
if (f != null) {Scanner scan = new Scanner(f);while (scan.hasNext()) {
System.out.println(scan.next());}scan.close();
}}
Seite 30
Dateien
Datei analysierend lesen
Text-Dateien können auf verschiedene Art „analysierend“ gelesen werden.– Zeilenweise lesen– Wortweise lesen– Zahlenweise lesen– ...
File f = ...;Scanner scan = new Scanner(f);while (scan.hasNextLine()) {
System.out.println(scan.nextLine());}scan.close();
File f = ...;Scanner scan = new Scanner(f);while (scan.hasNextInt()) {
System.out.println(scan.nextInt());}scan.close();
File f = ...;Scanner scan = new Scanner(f);while (scan.hasNext()) {
System.out.println(scan.next());}scan.close();
Seite 31
Dateien
Datei schreiben
Text-Dateien können einfach beschrieben werden.– Beispiel 1:
– Beispiel 2:
File f = ...;if (f != null) {
PrintWriter pw = new PrintWriter(f);pw.println("Hallo");pw.close();
}
public static void main(String[] args) throws IOException { String filePath = JOptionPane.showInputDialog("Ausgabe-Datei?"); PrintWriter pw = new PrintWriter(new FileWriter(filePath)); pw.println("Hallo"); pw.println("Welt!"); pw.close();}
Seite 32
Dateien
Datei mit strukturiertem Inhalt lesen
Beispiel: Einlesen einer Tabelle
Anlage; Bezeichnung; Baujahr; Garantie; Typbezeichnung; Stoerungen;283006025; Rollstuhl Venezia XTRA; 2006; 03.10.08; Venezia 923; 4;283006026; Rollstuhl Venezia XTRA; 2006; 03.10.08; Venezia 923; 0;283006041; Hunderolli HappyWuff; 2006; 01.01.10; XZR61E00; 2;287006004; Seniorenrollstuhl Evolution; 2006; 12.12.08; BC61E00; 0;287006007; Seniorenrollstuhl Esprit; 2006; 08.08.09; XZR71A30; 11;287006008; Seniorenrollstuhl Esprit; 2005; 08.08.09; XZR71A30; 9;287006009; Personenrollstuhl Budget; 2006; 04.02.09; XZR51E55; 10;287006010; Seniorenrollstuhl Esprit; 1985; 04.02.09; XZR71A40; 0;287006011; Personenrollstuhl Esprit; 2007; 03.06.09; XZR71A30; 0;287006012; Personenrollstuhl Esprit; 2006; 03.06.09; XZR71A30; 0;287006013; Personenrollstuhl Esprit; 2006; 27.11.09; XZR71A00; 0;287006014; Personenrollstuhl AVO 1000; 2006; 31.05.09; XZR61 E54; 1;287006015; Personenrollstuhl AVO 1000; 2006; 31.05.09; XZR61 E54; 0;287006016; Personenrollstuhl AVO 1000; 2006; 31.05.09; XZR61 E54; 0;287006017; Personenrollstuhl AVO 1000; 2006; 31.05.09; XZR61 E54; 0;287006018; Personenrollstuhl Esprit; 2006; 13.11.08; XZR71A30; 5;287006019; Seniorenrollstuhl Esprit; 2006; 22.12.08; XZR71A30; 0;287006020; Personenrollstuhl Esprit; 2006; 14.01.10; XZR71A30; 0;287006021; Personenrollstuhl Esprit; 2006; 13.11.08; XZR71A30; 0;287006024; Personenrollstuhl Esprit; 2006; 30.05.10; XZR71A00; 0;287006025; Personenrollstuhl Esprit; 2006; 30.05.10; XZR71A00; 0;
als
Liste( [ Attribut ~> Wert ] )
Attribut Anlage
Seite 33
Dateien
Datei mit strukturiertem Inhalt lesen
Beispielpublic static void main(String[] args) throws IOException { List<Map<String, String>> stock = new ArrayList<Map<String, String>>();
File f = null; JFileChooser fc = new JFileChooser(); int chooseResult = fc.showDialog(null, "Bitte Datei auswählen"); if (chooseResult == JFileChooser.APPROVE_OPTION) {
f = fc.getSelectedFile(); }
if (f != null) {Scanner scan = new Scanner(f);String header = scan.nextLine();String[] attrName = header.split(";");for(int i =0; i<attrName.length; i++) {
attrName[i] = attrName[i].trim();}
while (scan.hasNextLine()) {Map<String,String> entry = new HashMap<String,String>();String line = scan.nextLine();String[] values = line.split(";");int i = 0;for(String a: attrName) {
String value = values[i++].trim();entry.put(a, value);
}stock.add(entry);
}scan.close();
Seite 34
Dateien
... und wieder in Datei ausgeben
f = null;fc = new JFileChooser();chooseResult = fc.showDialog(null, "Bitte Datei auswählen");if (chooseResult == JFileChooser.APPROVE_OPTION) {
f = fc.getSelectedFile();}
if (f != null) {PrintWriter pw = new PrintWriter(f);for (String attr: attrName) {
pw.print(attr+";\t");}pw.println();for(Map<String, String> entry: stock) {
for (String key: attrName) {pw.print(entry.get(key)+";\t");
}pw.println();
}pw.close();}
}
Seite 35
Dateien
Alle Dateien eines bestimmten Verzeichnisses mit einer bestimmten Endung lesen
private static File findDirectory(String msg) { JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int returnVal = fc.showDialog(null, msg); if (returnVal == JFileChooser.APPROVE_OPTION) { return fc.getSelectedFile(); } else return null;}
private static File[] findFilesInDirectory(File directory, final String extension) { FilenameFilter extensionFilter = new FilenameFilter() { public boolean accept(File f, String name) { if (name.endsWith(extension)) { return true; } else { return false; } } }; return directory.listFiles(extensionFilter);}
public static void main(String[] args) { File dir = findDirectory("CSV-Verzeichnis"); File[] csvFiles = findFilesInDirectory(dir, "csv"); for (File f: csvFiles) { System.out.println(f); }}