Fakultät für Wirtschaftswissenschaften Einführung in die Programmierung Datensammlung Uwe Lämmel www.wi.hs-wismar.de/~laemmel [email protected] Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 1 Inhalt Verwalten mehrerer Objekte: Sammlungen (Collections) – ArrayList – Array Arbeiten mit Sammlungen: – Wiederholung (Iteration) – Iteratoren – Schleifen ( for–each, while–do, for) Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 2 Sammlungen Typische Aufgabe der Wirtschaftsinformatik: Verwalten mehrerer (beliebig vieler) Objekte : – – – – Personal Termine Aufträge Rechnungen Aktionen: – Elemente hinzufügen – Elemente entfernen – Element suchen Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 3 Beispiel: Notizbuch Anforderungen / Erwartungen: Notizen speichern keine Begrenzung für die Anzahl Anzahl gespeicherter Notizen angeben Einzelne Notizen anzeigen Alle Notizen anzeigen Uwe Lämmel Machen Sie sich mit dem Notizbuch-Projekten vertraut!! Einführung in die Programmierung – Sammlungen Folie 4 Klassen-Bibliotheken nicht alles muss neu programmiert werden: es gibt nützliche, bereits "fertige" Klassen: Java – API: Application Programming Interface Bibliothek in Java: package java.util package bietet Klassen für Objekt-Sammlungen Wir nutzen Klasse ArrayList Machen Sie die Java – API für sich verfügbar! Schauen Sie sich die Klasse ArrayList an! Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 5 Klasse Notizbuch import java.util.ArrayList; /** * ... */ public class Notizbuch { // Speicher für beliebige Anzahl von Notizen private ArrayList <String> notizen; /** * Initialisierung für ein Notizbuch */ public Notizbuch( ) { notizen = new ArrayList<String>(); } // Konstruktor ... } // Notizbuch Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 6 Klasse ArrayList es wird definiert: – Typ der Sammlung: ArrayList – Typ der Elemente: <String> – Name der Sammlung: notizen private ArrayList <String> notizen; ArrayList<String> – "Array-Liste von Zeichenketten" Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 7 Objekt-Struktur Was passiert beim Einfügen einer weiteren Notiz? Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 8 Benutzen der Sammlung class Notizbuch { private ArrayList <String> notizen; ... public void speichereNotiz(String notiz) { notizen.add(notiz); } // speichereNotiz Hinzufügen einer Notiz public int anzahlNotizen() { return notizen.size(); } // anzahlNotizen ... } // Notizbuch Gibt Anzahl der Elemente in der ArrayList zurück add, size : Methoden der Klasse ArrayList, siehe API Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 9 Ermitteln einer Notiz public void zeigeNotiz(int notiznummer){ if ( notiznummer >= 0 && notiznummer < anzahlNotizen() ) { Gültigkeit des Index prüfen! System.out.println(notizen.get(notiznummer)); } // if } // zeigeNotiz Uwe Lämmel - vordefinierte Methode! - Parameter: Aufruf einer Methode! Einführung in die Programmierung – Sammlungen Folie 10 Zusammenfassung Elemente können hinzugefügt / entfernt werden Jedes Element hat eine Nummer (Index): 0, 1, 2 … Wichtige Methoden der Klasse ArrayList sind: add, get, remove, size ArrayList ist ein parametrisierter (generischer) Datentyp ArrayList-Objekte speichern beliebig viele Objekte Java - API enthält packages mit vordefinierten Klassen: java.util.ArrayList, java.lang.String, java.lang.System Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 11 Wiederholung = Iteration oft sind Aktionen mehrfach auszuführen: – z.B. Ausgabe aller Notizen des Notizbuchs die meisten Programmiersprachen bieten: Schleifen–Anweisungen (loop statements) mehrere Schleifen-Formen in Java. – beginnen mit for–each–Schleife. Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 12 for–each–Schleife Schlüsselwort for Schleifen-Kopf for ( ElementTyp element : Sammlung) { Schleifen-Körper } // for-each Anweisungen, die wiederholt werden Bedeutung: Für jedes element aus der Sammlung, führe die Anweisungen im Schleifen-Körper aus. Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 13 for–each–Beispiel /** * Gib alle Notizen eines Notizbuchs aus */ public void notizenAusgeben() { for(String notiz : notizen) { // Schleifen-Kopf System.out.println(notiz); // Schleifen-Körper } // for } //notizenAusgeben for each note in notes, print out note Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 14 while–Schleife Schlüsselwort while Schleifenkopf: Bedingung while(bedingung) { Schleifen-Körper }//while Anweisungen, die wiederholt werden Bedeutung: Solange die bedingung wahr (true) ist, führe die Anweisungen im Schleifen-Körper aus. Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 15 while-Schleife: Beispiel /** * Gib alle Notizen eines Notizbuchs aus */ public void notizenAusgeben() { int index = 0; while(index < notizen.size()) { System.out.println(notizen.get(index)); index++; um 1 erhöhen } //while }//notizenAusgeben Bedeutung: while the value of index is less than the size of the collection, print the next note, and then increment index Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 16 while–Schleife while (Bedingung) { Anweisungen } – while-Schleife ist anfangsgesteuert: – Bedingung wird zuerst geprüft mind. einmal! – wird benutzt, falls: – die Zahl der Durchläufe unbestimmt und – Test der Bedingung vor dem Bearbeiten des Körpers erforderlich: – z.B. in Sammlungen: Gibt es überhaupt ein Element? – Anweisungen im Schleifen–Körper müssen Bedingung beeinflussen, z.B. i++; Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 17 for–each versus while for–each: einfacher aufzuschreiben sicher: stoppt garantiert! stets für alle Elemente der Sammlung while: nicht notwendig, die gesamte Sammlung zu bearbeiten kann auch ohne Sammlung benutzt werden Gefahr unendlicher Wiederholungen! Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 18 Suche in einer Sammlung von Objekten int index = 0; boolean gefunden = false; // Nr. des aktuellen Elements // schon gefunden? // index < Größe der Sammlung UND noch nicht gefunden while(index < notizen.size() && !gefunden) { String notiz = notizen.get(index); // aktuelles Element if(notiz.contains(suchString)) { // siehe API: lang.String gefunden = true; // gefunden: Zeichenkette ist enthalten } //if else { index++; // nächster Index=>nächstes Element } //else } //while // Entweder gefunden oder gesamte Sammlung durchsucht if(!gefunden) index = –1; // index für nicht gefunden Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 19 Suche in einer Sammlung von Objekten int index = 0; boolean gefunden = false; // Nr. des aktuellen Elements // schon gefunden? /** // index < Größe(Signatur) der Sammlung UND noch nicht gefunden * Kopf der Methode sucheText while(index < notizen.size() && !gefunden) { * @param suchString Zeichenkette nach der gesucht wird String notiz = notizen.get(index); // aktuelles * @return Index der Notiz, die text enthält, oder –1 Element */ if(notiz.contains(suchString)) { // siehe API: lang.String public intgefunden sucheNotiz( String suchString ){ = true; // gefunden: Zeichenkette ist enthalten … } //if return else index; { } // sucheNotiz index++; // nächster Index=>nächstes Element } //else } //while // Entweder gefunden oder gesamte Sammlung durchsucht if(!gefunden) index = –1; // index für nicht gefunden Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 20 Schleife mittels Iterator-Objekt Iterator<Elementtyp> it = meineSammlung.iterator(); while(it.hasNext()) { ElementTyp el = it.next(); // nächstes Element Anweisungen "machen etwas" mit Element el } //while Beispiel: public void notizenAusgaben() { Iterator<String> it = notizen.iterator(); while ( it.hasNext() ) { String el = it.next(); System.out.println(el); } //while } //notizenAusgeben Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 21 Schleifen und Objektsammlungen for–each: – wenn alle Elemente bearbeitet werden while–Schleife: – falls nur einige Elemente bearbeitet werden – wird durch Bedingung gesteuert – für Wiederholungen ohne Sammlungen Iterator–Objekt: – falls nur einige Elemente zu bearbeiten – insbesondere für Sammlungen ohne Index – alle Sammlungen (collections) der API stellen Iterator bereit Iteration / Schleife ist wichtiges Programmier-Muster (pattern) Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 22 Aufgabe Beispiel Notizbuch implementieren Wertungsaufgabe E-Mail-Verwaltung Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 23 Array: Sammlungen fester Größe häufig Obergröße für Objekt-Sammlungen bekannt Programmiersprachen bieten: – spezielle Konstruktion: array – spezielle Schreibweise (Syntax): typ[ ] bzw. element[index] Arrays speichern: – (Adressen der) Objekte – Werte einfacher Datentypen Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 24 Array feste Anzahl von Elementen eines Typs Arrays sind Objekte: mit new-Methode erzeugen Elemente eines Array beliebig aber fest: int[ ] feld = new int[6]; 0 1 2 Attribut length gibt Anzahl der Elemente an: System.out.writeln(feld.length); // ausgegeben wird 6 Zugriff: 3 4 5 feld[0] = 17; feld[1] = 35; for(int i=0; i<feld.length; i++) feld[i]=2*i+1; Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 25 Array: Arbeitsweise Deklaration: int[ ] folge; int zfolge; // Zeiger Füllstand Erzeugung: folge = new int[100]; Initialisierung: for(int i=0;i<max;i++) folge[i]=0; Zugriff nur zwischen 0…max Index möglich! – Lesen: a = folge[z]; System.out.println(folge[2]); for(int i=1; i<zfolge; i++) summe +=folge[i]; – Schreiben: folge[z] = b; Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 26 Weblog–Analyse Auswertung der Zugriffe je Stunde vereinfacht – Zugriffe = Eingabe der Stunde durch Nutzer: Eingabe 14 = ein Zugriff in 14:00 – 14:59 notwendig: – Sammlung für 24 Werte (int) – Methode zum Einlesen von Werten Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 27 Array zugriffeInStunde Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 28 Klasse Weblog class Weblog { // Instanz-Variabeln private int[ ] zugriffInStunde; private int maxSt; public Weblog () { maxSt = 24; zugriffInStunde = new int[maxSt]; for(int i=0; i<maxSt; i++) zugriffInStunde[i] = 0; } //Weblog public int getZugriffInStunde(int st) { return zugriffInStunde[st];} public int summeZugriffe(){ … } } //Weblog Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 29 Methode Einlesen public void liesZugriffe() { wiederhole: Sag Nutzer, dass Stunde einzugeben ist. Lies Stunde ein. Wenn gültige Stunde, dann erhöhe Anzahl Zugriffe in der Stunde um eins. bis Ende (Nutzer hat –1 eingegeben) } //liesZugriffe Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 30 Einschub Ein–, Ausgabe: Klasse LineIO Java nicht für zeilenweise Ein-, Ausgabe entwickelt! Hilfe notwendig: Sammlung von Methoden für zeilenweise Ein- und Ausgabe: write, writeln für String, int, double, … io.writeln("zahl= "+z); formatierte Ausgabe: io.write(betrag,7,2); Eingabe für Sring, double, int, char: zahl = io.readInt("Bitte Zahl eingeben: "); KEIN Bestandteil der API LineIO aus StudIP herunterladen! Datei LineIO.class muss im Verzeichnis stehen Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 31 Nutzung von LineIO 1. LineIO.java kopieren in BlueJ: Edit > Add class from file 2. E/A-Objekt in Methode erzeugen: LineIO io = new LineIO(); 3. Methoden nutzen: st = io.readInt(" Zahl eingeben"); – werden Eingaben programmiert, dann: public void einlesen() throws Exception … Uwe Lämmel Schauen Sie sich die Methoden an von LineIO.java Einführung in die Programmierung – Sammlungen Folie 32 Methode Einlesen public void liesZugriffe() throws Exception { LineIO io = new LineIO(); // Ein- Ausgabe-Objekt int st = -1; // einzulesende Stunde io.writeln(" Weblog: Eingabe der Stunden. Ende mit –1 "); do { st=io.readInt("Zugriff in Stunde: "); if(st>=0 && st<=maxSt) { // Test auf gueltige Stunde zugriffInStunde[st]++; // Anzahl Zugriffe erhöhen } else if(st!= -1){ // falls keine Stunde (s.o.) und kein Ende io.writeln("Ungueltige Stundenangabe!"); } //if } while(st!=-1); // wiederhole solange nicht Ende } //liesZugriffe Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 33 Iteration: do–while–Schleife do { Anweisungen } while (Bedingung); do { zahl = io.readInt("Zahl: "); if (zahl >0) summe = summe +zahl; } while (zahl != -1); – endgesteuert – eingesetzt, falls: – Zahl der Durchläufe unbestimmt ist, und – Körper mindestens einmal durchlaufen werden muss. – typisch: Nutzerdialog Interpretation: Führe die Anweisungen wiederholt aus, solange die Bedingung wahr ist. Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 34 Iteration: for–Schleife for (Initialisierung; Bedingung; EndeAnweisung) { Anweisungen } //for int fak = 1; for (int i=1;i<=zahl; i++) { fak = fak * i; } //for – anfangsgesteuert – eingesetzt, falls: – Zahl der Schleifendurchläufe bekannt ist und – durch eine Zählvariable gezählt werden kann Interpretation: Führe die Initialisierung aus, führe dann die Anweisungen des Körpers wiederholt aus, solange die Bedingung gilt. Nach jeder Ausführung des Schleifenkörpers wird die EndeAnweisung einmal ausgeführt. Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 35 Beispiel for(int index = 0; index < zugriffeInStunden.length; index++) { io.writeln(index + ": " + zugriffeInStunden[index]); } //for Wirkung identisch! int index = 0; while(index < zugriffeInStunden.length) { io.writeln(index + ": " + zugriffeInStunden [index]); index++; } //while Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 36 Zusammenfassung Sammlung Arraylist – Sammlung: Elemente (Objekte) mit Index 0,1,… – import java.util.Arraylist; – API enthält die Infos über Methoden – wichtige Methoden: add, delete, get, size Arrays für Sammlungen mit fester Obergrenze – Sammlung: Elemente mit Index 0,1,… – Elemente sind Objekte oder einfache Datentypen – Arrays sind Objekte mit new erzeugen – haben spezielle Syntax: eckige Klammern [ ] Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 37 Zusammenfassung – Schleifen while(!gefunden) { … } – Anfangsgesteuert, unbestimmte Zahl von Durchläufen do { … } while(!ende); – Endgesteuert, unbestimmte Zahl von Durchläufen for(Notiz n:notizen) … //for-each – Für alle Elemente einer ArrayList for(int i= 0,i<zfolge, i++) { folge[i] … } – Anfangsgesteuert, Zahl der Durchläufe bestimmt // iterator: Iterator<Notiz> it = notizen.iterator(); while (it.hasNext()) … – Für Objekte von Sammlungsklassen, wie ArrayList … Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 38 Aufgabe: Schleifen ohne eine Objektsammlung Gib alle geraden Zahlen zwischen 0 und 30 aus. Berechne alle Teiler einer Zahl. Bestimme die Quersumme einer Zahl. Bestimme den größten gemeinsamen Teiler zweier Zahlen. – … – – – – Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 39 Aufgabe: Sieb des Eratosthenes Zahl n einlesen Array mit Elementen von 0..n erzeugen; – Alle Komponenten auf true setzen Mit 2 beginnen bis n: alle Vielfachen im Array „streichen“, d.h. auf false setzen Ausgabe der Primzahlen zwischen 0..n Programmieren Sie den Algorithmus in einer ausführbaren Klasse (main-Methode) Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 40 Aufgabe: Studenten–Team Felder/Array kann beliebigen Typ enthalten! … Student[ ] team; int zst; 0 1 2 3 team = new Student[anzahl]; … team[zst] = new Student(name, matrikel); zst++; 4 5 Entwickeln Sie eine Klasse Team, in der ein Studenten–Team verwaltet werden kann. Benutzen Sie die Klasse Student und verwalten Sie die Team-Mitglieder in einem Array! Die maximale Teamgröße wird beim Erzeugen eines Teams festgelegt. Uwe Lämmel Einführung in die Programmierung – Sammlungen Folie 41