Einführung in die Programmierung

Werbung
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
Herunterladen