Seite 1
CS1005Objektorientierte Programmierung Bachelor of Science (Informatik)
Algorithmen und Programme
Th Letschert
Seite 2
I want You for Java !
Seite 3
Allgemeines
Lernziel / InhaltEinführung in die objektorientierte Programmierung
Java
Grundbegriffe der Softwaretechnik
Literatur– Folien / Skript / Anleitungen
[Kurs A, B: http://homepages.thm.de/~hg51/Veranstaltungen/OOP_WS13_14/index.html , Moodle-Kurse, werden eingerichtet ]
Jedes beliebige neuere Java Buch
Oracle Dokumentation
[ http://www.oracle.com/technetwork/java/javase/documentation/index.html ]
SoftwareJava SE 7 – JDK !
[ http://www.oracle.com/technetwork/java/javase/downloads/index.html ]
Entwicklungsumgebung
Eclipse Eclipse IDE for Java Developers [http://www.eclipse.org/downloads/]
Seite 4
Organisation
Kursaufteilung von OOP9 Kurse
Gleicher Lehrinhalt
Gleiche Anforderungen
Unterschiedliche Dozenten
Kurse A-J
Wahlfreiheit bei der Kurswahl außer:Medizin-informatik ~> Kurs H oder I (Dozenten Lidwin / Schwarz)Reserviert für MIBio-Informatik ~> Kurs K oder J (Dozent Schölzel)BI-Studierende werden bei der Platzvergabe hier bevorzugt bevorzugt, ansonsten benachteiligt.
Studierende dieser Studiengänge besuchen die entsprechenden Kurse
Alle anderen können einen Kurs frei wählen
Das bedeutet aber nicht, dass sie einen Platz in einem Kurs ihrer Wahl garantiert bekommen.
Feste Kurseinteilung erfolgt in der zweiten regulären Vorlesungswoche.
~> Weiteres zur Orgsanisation: Herr Schölzel
Seite 5
OOP
Algorithmen und Programme
Seite 6
Algorithmen und Programme
Informatik – zentrale IdeeTrenne Maschinen auf in Hardware und Software:
– Hardware: Ausführende Maschinerie– Software: Handlungsvorschrift
ENIAC: erster elektronischer Computer (1946) mitProgramm (Patch-Kabel und ca. 3000 Schalter in
bestimmter Konstellation),Programmierer (damals „Computer“ genannt) und
Hardware (27 Tonnen Elektronik)
Programm
Hardware Programmierer
Seite 7
Algorithmen und Programme
Algorithmus – DefinitionEin Algorithmus ist eine detaillierte und explizite Vorschrift zur schrittweisen Lösung eines Problems, d. h. eine Vorschrift zur Lösung einer Aufgabe, die präzise formuliert, in endlicher Form dargestellt und effektiv ausführbar ist.
Beispiel: Euklidscher Algorithmus
– Lies zwei ganze Zahlen in die Variablen x und y ein
– Solange der Wert von x größer 0 ist wiederhole: Wenn x < y dann vertausche die Inhalte von x und y Setze x auf die Differenz x-y
– Gib den Wert von y (ist der gesuchte ggt) aus
Eingabe
Rechenaktionen
Ausgabe
Seite 8
Algorithmen und Programme
Euklidscher Algorithmus zur Berechnung des GGT von 9 und 12
– x sei 9 und y und y sei 12
– Solange der Wert von x größer 0 ist wiederhole: Wenn x < y dann vertausche die Inhalte von x und y Setze x auf die Differenz x-y
– y ist der gesuchte ggt
ProgrammEin Programm ist ein Algorithmus, der in einer exakt festgelegten, maschinell ausführbaren Programmiersprache notiert wurde.
Beispiel: Programm zur Berechnung des GGT von 9 und 12:
int x = 9;int y = 12;while (x > 0) { if (x<y) { int t = y; y = x; x = t; } x = x-y;}
Programmiersprache C(sehr ähnlich so auch in: C++, C#, Java, ... )
„Programm“ und „Algorithmus“ werden heute i.A. nicht mehr streng unterschieden.
Seite 9
Algorithmen und Programme
Programm zur Berechnung des GGT von eingegebenen Zahlen in Java
package ggt;
import javax.swing.JOptionPane;
public class Euklid {
public static void main(String[] args) {
String xS = JOptionPane.showInputDialog("Bitte 1-te Zahl eingeben");String yS = JOptionPane.showInputDialog("Bitte 2-te Zahl eingeben");
int x = Integer.parseInt(xS);int y = Integer.parseInt(yS);
while (x > 0) {if (y > x) {
int t = x;x = y; y = t;
}x = x-y;
}JOptionPane.showMessageDialog(null, "GGT: " + y);
}}
Seite 10
Algorithmus und Programm
Programm – Wesentliche Bestandteile Variable
Ablageplatz für Werte
realisiert als Speicherstelle im Hauptspeicher Register in der CPU
AusdruckRechenvorschrift zu Bestimmung eines Wertes aus anderen Werten und/oder dem Inhalt von Variablen
ZuweisungTransfer von Werten
aus Variablen oder Ausdrücken in Variablen
VerzweigungProgramm-Fortsetzung abhängig von einer Bedingung
SchleifeWiederholung (meist) abhängig von einer Bedingung
Variable
Zuweisung
Ausdruck
Schleife
int a = 9;int i = 12;while (x > 0) { if (x<y) { int t = y; y = x; x = t; } x = x-y;}
Verzweigung
Seite 11
Programmbestandteile
Algorithmus – Variable Variablen werden nicht wie in der Mathematik als Namen von Werten
verstanden sondern als Namen von Speicherplätzen
Variablen enthalten in der Regel eine in der Zeit wechselnde Folge von Werten
Die Werte werden oft mit indizierten mathematischen Variablen beschrieben. Die Indizes entsprechen Zeitpunkten im Ablauf (Beginn eines Schleifendurchlaufs sind übliche Zeitpunkte)
int x = 12;int y = 18;int t = 0;
while (x>0) { if (x<y) { t = x; x = y; y = t; } x = x-y;}
x y t
12 18 0 6 12 12 6 6 6 0 6 6
Zeit
Variablen und ihre Wertezu unterschiedlichen Zeiten
im Programmablauf
GGT-Algorithmus als Programm
x y t
x0 y
0 t
0
x1 y
1 t
1
x2 y
2 t
2
x3 y
3 t
3
Werte von Programm-Variablen werden oft mit mathematischen
Variablen beschrieben.
x hat am Anfang den Wert x0
x1 = y
0-x
0 falls y
0 > x
0
x1 = x
0-y
0 falls x
0 ≥ y
0
Zeit~ Index
Variable x
Seite 12
Programmbestandteile
Algorithmus – Zuweisung und Ausdruck
AusdruckDer Wert eines Ausdrucks wird mit den aktuellen Werten der Variablen berechnet
ZuweisungDie Zuweisung überschreibt den Wert einer Variablen: Der Speicher ändert seinen Zustand
x = x - y;12
9
Speichermit Variablenwerten
vorher !
···
···
x
y
12 9
-3
3
9
···
···
x
y
Speichermit Variablenwerten
nachher !
Variable
Wert
Seite 13
Programmbestandteile
Algorithmus – Verzweigung
VerzweigungDie nächste(n) Aktion(en) wird/werden abhängig von einer Bedingung bestimmt
BedingungAusdruck dessen Wert ein Wahrheitswert ist (wahr / falsch)
if (x>y) {
t = x;
x = y;
y = t;
}
Bedingung Nur wenn der aktuelle Wert der Variablen x größer ist als der aktuelle Wert der Variablen y dann führe die folgenden Aktionen aus.
Aktionen
Seite 14
Programmbestandteile
Algorithmus – Schleife
SchleifeDie nächste(n) Aktion(en) wird/werden abhängig von einer Bedingung weiter ausgeführt.
BedingungAusdruck dessen Wert ein Wahrheitswert ist (wahr / falsch). Er regelt die Fortsetzung der Schleife.
Die Bedingung wird vor Eintritt und vor jedem Durchlauf geprüft.
while (x>0) { if (x<y) { t = x; x = y; y = t; } x = x-y;}
Bedingung Nur wenn der aktuelle Wert der Variablen x größer als 0 ist, dreht sich die Schleife weiter.
Aktionen
Seite 15
Datentypen
Programm – Datentyp
Datentyp Im Speicher des Rechners werden alle Daten in Form von Bit-
Sequenzen (0/1-Folgen) abgelegt.
Um die Daten verarbeiten zu können muss bekannt sein welchen Typ sie haben (wie lang / wie viele Bits welche Codierung).
Die Information über Länge und Codierung einer Bit-Sequenz bzw. eines Bereichs im Speicher bezeichnet man als Datentyp oder kurz Typ.
Seite 16
Datentypen
Beispiel: Bedeutung des Datentyps
01001010011110101010000101010010101001000010010000100100001001000010100010010
Beginn Speicherbereich von Variable a
a = a + 1;
Anweisung
Was ist der Wert der Variable a?- Ganze Zahl in einem Byte ~> 133- Zahl im 2-er Komplement in zwei Byte ~> -31414- Zeichen in Windows-1252 Code (ein Byte) ~> Zeichen '…' - Zeichen in ISO-8859-1 Code (ein Byte) ~> nicht definiert- Zeichen UTF-8 Codierung (zwei Byte) ~> Zeichen 蕉- · · ·
Ohne Wissen über den (Daten-) Typ von a kann die Anweisung nicht ausgeführt werden!
Wie viele Bits soll ich verarbeiten.
Welche Codierung haben sie?
Seite 17
Datentypen
Information über Datentypen
Die Information über den Typ von Speicherstellen kann prinzipiell auf zwei Arten verwaltet werden:
Explizite Speicherung des Typs
Zu allen Daten wird eine Typ-Information in einem bestimmten verabredeten Code gespeichert.
Implizite Informationen über den TypJeder Verarbeiter muss (irgend-woher) wissen welchen Typ die Bits im Speicher haben.
Vorgehen bei (typisierten) ProgrammiersprachenDas Programm als Verarbeiter der Daten enthält die Informationen über die Typen:
aus Informationen des Programmierers / der Programmiererin durch abgeleitetes (berechnetes) Wissen über die Typen
Seite 18
Datentypen
Information über Datentypen / Beispiel
int x = 12;int y = 18;int t = 0;
while (x>0) { if (x<y) { t = x; x = y; y = t; } x = x-y;}
Programm
Programmierer:
„die Variable x habe den Typ int“
=> Konventionen der verwendeten Programmiersprache: „Ganze Zahl im 2er-Komplement in 4 Bytes“
Aha, x und y sind ints, also ist mit „-“ die Subtraktion von 2 Werten im 2er-Komplement der Länge 4 Bytes gemeint!
Seite 19
Datentypen
Datentypen im Programm
Information über den Typ von Speicherstellen werden auf verschiedene Arten in Programmen eingesetzt. Wichtige Beispiele sind:
– Werte-Bezeichnungen (Literale) Notationen (Bezeichnungen) für Werte, sogenannteLiterale, haben einen zugeordneten Typ.
– Variablendefinitionen mit Typ Variablen werden mit einem bestimmten Typ im Programm definiert.
– Explizite UmrechnungGelegentlich muss das Programm explizite Anweisungen enthalten mit denen von einer Codierung in die andere umgerechnet wird.
int x = 12;
int x = Integer.parseInt("12");
"12" 12 ≠
ein int-Literal ein String-Literal
Seite 20
Datentypen
Literale – Wertebezeichnungen Für Werte verwendet man übliche Bezeichnungen
Diesen ist implizit ein bestimmter Typ (Speicherformat, Codierung) zugeordnet.
Th Letschert
12 Lieber Computer, ich meine die Zahl 12. Genau gesagt meine ich die Bitsequenz, die einer Ganzzahldarstellung im 2-er Komplement der Zahl 12 zugeordnet ist. Also die folgenden Bits im Speicher (Byte-weise gruppiert):
0000 0000 0000 00000000 00000000 1100
"12" Lieber Computer, ich meine die Folge bestehend aus den Zeichen 1 und 2. Genau gesagt meine ich die Darstellung des Zeichens 1 in UTF-8 Code gefolgt von der Darstellung des Zeichens 2 in UTF-8 Code. Also ganz genau gesagt meine ich die folgenden Bits im Speicher (Byte-weise gruppiert):
0000 00000011 00010000 00000011 0011
Seite 21
Datentypen
Variablendefinition
Variablen werden mit einem bestimmten Typ im Programm definiert.
Damit wird nicht der Speicherplatz markiert, sondern ein Hinweis gegeben für die Speicherung und Verarbeitung der dort abgelegten Daten.
Lieber Computer, ich möchte in meinem Programm eine Speicherstelle mit dem Namen x verwenden. Bitte suche dir einen passenden Platz im Speicher dafür. Alle Daten die dort abgelegt werden sollen ganze Zahlen sein die Du in der passenden Form und Codierung dort speichern sollst.
Speicher erst einem die Zahl 12 im 2-er Komplement dort.
Wenn ich eine Rechenoperation aufschreibe in der x vorkommt, dann nimm die Bits die du an der Speicherstelle findest und und interpretiere sie als ganze Zahl in dieser Codierung.
int x = 12;
String s = "hugo"; Lieber Computer, ich möchte in meinem Programm eine Speicherstelle mit dem Namen s für Zeichenfolgen verwenden. Bitte veranlasse alles notwendige und speichere dort erst einmal die Zeichen h u g o in UTF-8 Codierung!
Seite 22
Datentypen
Explizite Umrechnung von einer Codierung in eine andere
In der Regel wird zwischen verschiedenen Codierungen / Speicherformaten eines Wertes automatisch hin und her gewechselt.
Gelegentlich muss der Programmierer / die Programmiererin mit expliziten Anweisungen dafür sorgen, dass von einer Darstellung / Codierung in die andere gewechselt wird.
Th Letschert
Lieber Computer, ich weiß ja dass "12" keine Zahl sondern eine zwei-einelementige Zeichenfolge ist. Sie in einer int-Variablen zu speichern ist Unsinn und das würdest Du auch nicht tun, sondern mir eine Fehlermeldung anzeigen.
Wir Menschen können aber aus den beiden Zeichen 1 und 2 eine Zahl berechnen. (1*10 + 2)
Ich weiß Du kannst das auch, tue es bitte!
Speichere diese Zahl dann (im Format einer ganzen Zahl im 2er-Komplement) an der Stelle die Du Dir als Platz für die Werte der Variablen x ausgedacht hast.
int x = Integer.parseInt("12");
"12"12
0000 00000011 00010000 00000011 0011
0000 0000 0000 00000000 00000000 1100
Seite 23
Hilfsroutinen
Hilfsroutinen
Für viele Standard-Aktionen gibt es vorgefertigte Hilfsroutinen mit denen sie ausgeführt werden können.
Beispielsweise kann das Einlesen oder die Ausgabe von Daten über ein Fenster mit einfachen Hilfsroutinen veranlasst werden:
Th Letschert
String xS = JOptionPane.showInputDialog("Bitte 1-te Zahl eingeben");
Lieber Computer. Öffne ein Dialogfenster in dem der Benutzer einen Text eintippen kann. Schreibe den Text Bitte 1-te Zahl eingeben hinein, damit der Benutzer eine Idee hat, was er tippen soll.
Den eingegeben Text speichere bitte in der Variablen xS.
Ich weiß dass Du die eingegebenen Zeichen dort im UTF-8 Format ablegen wirst und dass damit keine Rechnen möglich ist. Das stört mich aber nicht, denn ich kann Dich ja veranlassen aus den Zeichen die Zahl zu machen, die der Benutzer gemeint hat.
JOptionPane.showMessageDialog(null, "GGT: " + y);
Lieber Computer. Öffne ein Fenster und schreibe dort den aktuellen Wert der Variablen y hinein. Schreibe vor diesen Wert den Text GGT: hinein, damit der Benutzer eine Idee hat, was er da sieht.
Seite 24
Softwaretechnisches „Gedöhns“
Paket-, und Import-Anweisungen sowie anderes Gedöhns
Moderne Programmiersprachen enthalten ausgefeilte Konstrukte die der Entwicklung sehr großer Programms-Systeme dienen. Sie wirken unverständlich und sind nicht einfach zu erklären.
Für den ersten Einstieg nimmt man sie am Besten erst einmal als vorgegeben Programmrahmen einfach hin.
package ggt;
import javax.swing.JOptionPane;
public class Euklid {
public static void main(String[] args) {
}}
Programm-Anweisungen hier !
frei wählbare Namen
vorgegebener Rahmen für Java-Programme
Paket-Anweisung Import-Anweisung
Seite 25
Maschinen, real und gedacht
Implementierung : Von der hypothetischen zur realen Maschine
Hypothetische Maschine Programmierer schreiben Programme für eine hypothetische (gedachte)
Maschine, die die Programme versteht und direkt ausführen kann. Um gute Programme schreiben zu können ist es nicht notwendig zu wissen,
wie Programme tatsächlich ausgeführt werden. Es ist aber notwendig sehr genau über die hypothetische Maschine Bescheid zu wissen.
String xS = JOptionPane.showInputDialog("Bitte 1-te Zahl eingeben");String yS = JOptionPane.showInputDialog("Bitte 2-te Zahl eingeben");int x = Integer.parseInt(xS);int y = Integer.parseInt(yS);while (x > 0) { if (y > x) { int t = x; x = y; y = t; } x = x-y;}JOptionPane.showMessageDialog(null, "GGT: " + y);
3 5xy
main
Ausgabedaten
„3“ „5“xS yS
Eingabedaten
aktuelle Aktion
t
Seite 26
Maschinen, real und gedacht
Implementierung : Von der hypothetischen zur realen Maschine
Hypothetische Maschine Programmierer schreiben Programme für eine hypothetische (gedachte)
Maschine, die die Programme versteht und direkt ausführen kann. Um gute Programme schreiben zu können ist es nicht notwendig zu wissen,
wie Programme tatsächlich ausgeführt werden. Es ist aber notwendig sehr genau über die hypothetische Maschine Bescheid zu wissen.
Ablauf auf einer realen Maschine Um Programme auf einer realen Maschine (Computer) zum Ablauf zu
bringen werden viele teilweise sehr komplexe Verfahren eingesetzt. Professionelle Programmierer sollten mit deren Ablauf zumindest grob
vertraut sein. Die Realisation der Programmausführung (Compiler, Interpreter,
Betriebssysteme, ...) ist etwas für Spezialisten in diesem Gebiet: für Informatiker.