Einführung in die Programmierung - os.updog.coos.updog.co/dhbw/java1/pdf/chapter0.pdf · Literatur...

50
Einführung in die Programmierung Oliver Stuhr DHBW Mannheim IMBIT

Transcript of Einführung in die Programmierung - os.updog.coos.updog.co/dhbw/java1/pdf/chapter0.pdf · Literatur...

Einführung in die Programmierung

Oliver StuhrDHBW Mannheim

IMBIT

Literatur

• Klaus-Georg Deck & Herbert NeuendorfJava-Grundkurs für Wirtschaftsinformatiker2. Auflage, Vieweg+Teubner 2010 ISBN 978-3-8348-1222-3, 37.99€

• D. Ratz, J. Scheffler, D. Seese & J. Wiesenberger Grundkurs Programmieren in Java7. Auflage, Hanser 2014 ISBN 978-3-446-42663-4, 34.99€

Literatur

• Christian Ullenboom Java ist auch eine Insel 10. Auflage, Galileo Computing 2011 http://openbook.galileocomputing.de/javainsel

• Thomas Ottmann & Peter WidmayerAlgorithmen und Datenstrukturen5. Auflage, Spektrum Akademischer Verlag 2012 ISBN 978-3-8274-2803-5, 49.95€

Problem

Lösungsidee

Algorithmus

Programm

Ausführung

Vom Problem zur Lösung

Problem

Lösungsidee

Algorithmus

Programm

Ausführung

Vom Problem zur Lösung

Bsp.: ggT-Bestimmung• größter gemeinsamer Teiler zweier natürlicher Zahlen

z.B. ggT(12, 18) = 6, ggT(35, 6) = 1, ggT(7, 21) = 7 (eine natürliche Zahl ist eine ganze Zahl größer Null)

• möglicher Ansatz: probiere für alle Zahlen k von 1 bis zur kleineren der beiden gegebenen Zahlen, ob k beide Zahlen teilt wenn ja: merke dir k der ggT ist die letzte gemerkte Zahl (warum?)

• Nachteil dieser Methode: nicht besonders schnell

• alternativer Ansatz: über die Primfaktorzerlegung beider Zahlen (wie?), aber es geht besser…

Problem

Lösungsidee

Algorithmus

Programm

Ausführung

Vom Problem zur Lösung

Bsp.: ggT-Bestimmung

• Euklids Lösung (ca. 300 v. Chr.) basiert auf der Idee, dass jede Zahl, die sowohl x als auch y teilt, auch die Differenz der beiden Zahlen teilt

• auch die Umkehrung gilt: wenn eine Zahl die Differenz von x und y teilt und auch y teilt, dann teilt sie auch x

• also kann man die Bestimmung des ggT von x und y auf die Bestimmung des ggT von einer der Zahlen und der Differenz zurückführen: ggT(x, y) = ggT(x−y, y)

• unter der Annahme, dass x>y (der andere Fall ist analog), können wir das Problem so auf immer kleinere natürliche Zahlen reduzieren und können aufhören, wenn beide Argumente gleich sind: ggT(x, x) = x

Problem

Lösungsidee

Algorithmus

Programm

Ausführung

Vom Problem zur Lösung

Algorithmus• Vorgehensbeschreibung, Handlungsanweisung

• Alltagsbeispiele: Kochrezept, Bastelanleitung, Partitur

• mathematische Beispiele: Euklids ggT-Bestimmung, geometrische Konstruktionen

• Name abgeleitet von Muhammed al-Chwarizmis Buch „Über das Rechnen mit indischen Ziffern“ (um 825)

• erster Computeralgorithmus: 1843 von Ada Lovelace für Charles Babbages Analytical Engine (Maschine wurde nicht vollendet)

Bsp.: ggT-Bestimmung• Euklidscher Algorithmus (ca. 300 v. Chr.):

Bestimmung des ggTs zweier natürlicher Zahlen x und y:

Solange x ungleich y ist, wiederhole:Wenn x größer y ist, dann:

Ziehe y von x ab und weise das Ergebnis x zu.Andernfalls:

Ziehe x von y ab und weise das Ergebnis y zu.Wenn x gleich y ist, dann:

x (bzw. y) ist der gesuchte größte gemeinsame Teiler

• Euklidscher Algorithmus (ca. 300 v. Chr.):

x y

12 18

12 6

6 6

x y

7 21

7 14

7 7

x y

35 6

29 6

23 6

17 6

11 6

5 6

5 1

4 1

3 1

2 1

1 1

Veranschaulichung über Wertverlaufstabellen

Bsp.: ggT-Bestimmung

interessant: die Laufzeit des Algorithmus (proportional zur Anzahl der Tabellenzeilen)

variiert abhängig von den Eingabewerten

Frage: Warum ist es erforderlich, dass die Eingaben größer sind als Null?

Bsp.: ggT-Bestimmung• Euklidscher Algorithmus (ca. 300 v. Chr.):

x ≠ y

x > y

x = x − y

y = y − x

Start

Stop

ggT = x

ja

ja

nein

nein

Rauten stehen für Fallunterscheidungen

(zwei Ausgänge), Kästen für Anweisungen

das Gleichheitszeichen steht für eine Wertzuweisung, nicht für

Gleichheit im Sinne einer mathematischen Gleichung

als Flussdiagramm(Programmablaufplan)

Bsp.: ggT-Bestimmung• Euklidscher Algorithmus (ca. 300 v. Chr.):

als Struktogramm (Nassi-Shneiderman-

Diagramm) solange x ungleich yx ist größter gemeinsamer Teiler

x kleiner als y ja nein

y = y − x x = x − y

ein Struktogramm ist ein rechteckiger Block, die Abarbeitung erfolgt von

oben nach unten

das äußere „L“ steht für eine Schleife, das auf dem Kopf stehende Dreieck für eine

Fallunterscheidung

Algorithmus• Eigenschaften:

• verarbeitet definierte Eingaben

• liefert definierte Ausgaben

• Beschreibung durch endlich viele Einzelschritte

• die Einzelschritte beinhalten exakte Anweisungen

• eindeutige Abfolge der Schritte während des Laufs

• hält bei jeder Eingabe nach endlicher Zeit an

• Korrektheit in Bezug auf ein gegebenes Problem: zu allen Eingabewerten werden die jeweils richtigen Ausgabewerte geliefert

Problem

Lösungsidee

Algorithmus

Programm

Ausführung

Vom Problem zur Lösung

Entwicklung der Programmiersprachen

• Maschinensprachen: prozessorspezifisch,für Menschen kaum lesbar, „Zahlenkolonnen“

• Assemblersprachen: prozessorspezifisch,für Menschen lesbar, Befehle wie z.B. ADD & MOV

• Hochsprachen: prozessorunabhängig, gut lesbar,Befehle wie z.B. PRINT, IF … THEN … & RETURN

Beispiel: Vergleich von zwei Werten

• Maschinencode: C5.1C.92A4.8C2B* C5 – Befehlscode für Zeichenvergleich 1C – Länge der Werte minus 1 (also: 29 Bytes) es folgen die beiden Adressen der Werte

• Assemblercode: CLC FELDA(29),FELDB CLC – Befehlscode für „Compare Logical Character“FELDA und FELDB – zuvor definierte Adressen

• Hochsprache: IF FELD_A = FELD_B THEN …

Quelle: http://de.wikipedia.org/wiki/Maschinensprache*Hexadezimaldarstellung: 16er-System, Ziffern 0-9 und A-F

Höhere Programmiersprachen

• prozedural: Zerlegung in Teilaufgaben

• strukturiert: Verzicht auf GOTO

• modular: Module bündeln Prozeduren + Daten

• objektorientiert: Klassen bündeln Methoden + Daten und sind instanziierbar (-> Objekte)

• weitere: funktional, logisch, stapelorientiert, …

Programmierparadigmen:

Überlappungen sind möglich (z.B. objektorientiert & funktional)

Höhere Programmiersprachen

Höhere Programmiersprachen

Bsp.: ggT-Bestimmung• Euklidscher Algorithmus (ca. 300 v. Chr.):

/** * Euklidscher Algorithmus als Java-Methode */ public int ggT(int x, int y) {

while (x != y) { if (x > y) {

x = x - y; } else {

y = y - x; }

} return x;

}

Bsp.: ggT-Bestimmung• Euklidscher Algorithmus (ca. 300 v. Chr.):

Bestimmung des ggTs zweier natürlicher Zahlen x und y:

Solange x ungleich y ist, wiederhole:Wenn x größer y ist, dann:

Ziehe y von x ab und weise das Ergebnis x zu.Andernfalls:

Ziehe x von y ab und weise das Ergebnis y zu.Wenn x gleich y ist, dann:

x (bzw. y) ist der gesuchte größte gemeinsame Teiler

public int ggT(int x, int y) { while (x != y) {

if (x > y) { x = x - y;

} else { y = y - x;

} } return x;

}

x ≠ y

x > y

ja

x = x − y

ja

y = y − xnein

Start

nein

Stop

ggT = x

zum Vergleich

Problem

Lösungsidee

Algorithmus

Programm

Ausführung

Vom Problem zur Lösung

Übersetzung• Programme in Maschinencode können direkt auf

dem Prozessor laufen, eine Übersetzung ist nicht erforderlich

• Programme in Assemblercode werden von einem Übersetzungsprogramm, das Assembler genannt wird, in Maschinencode übersetzt

• für Hochsprachen gibt es zwei Typen von Übersetzungsprogrammen:

• Compiler – der Code wird übersetzt und zur späteren Ausführung abgespeichert

• Interpreter – der Code wird sukzessiv übersetzt und ausgeführt

Entwicklungssystem

Übersetzung – CompilerSprachen: z.B. FORTRAN, COBOL, C und C++

Zielsystem 1: Windows

Quellcode (u.U.

verschiedene Varianten für Zielsysteme)

Zielsystem 2: Linux

Maschinencode für Windows

Maschinencode für Linux

Compiler für

Windows

Compiler für Linux

Vorteile: schnelle Ausführung, Quellcode muss nicht weitergegeben werden, frühzeitige Fehlerkontrolle

Nachteile: Entwickler müssen für jedes Zielsystem separat kompilieren, u.U. mehrere Quellcodevarianten

Entwicklungssystem

Übersetzung – InterpreterSprachen: z.B. BASIC, Forth, Ruby und PHP

Zielsystem 1: Windows

QuellcodeZielsystem 2: Linux

Maschinencode für Windows

Maschinencode für Linux

Interpreter für

Windows

Interpreter für Linux

Vorteile: keine Quellcodevarianten, Entwickler müssen nicht kompilieren (Interpreter läuft auf Zielsystem)

Nachteile: langsamere Ausführung, Quellcode muss weitergegeben werden, frühzeitige Fehlerkontrolle fehlt

Entwicklungssystem

Übersetzung – zweistufigSprachen: z.B. Java, C#, Perl und Python

Zielsystem 1: Windows

Byte- code Zielsystem 2: Linux

Maschinencode für Windows

Maschinencode für Linux

Interpreter für

Windows

Interpreter für Linux

Vorteile: keine Quellcodevarianten, Quellcode muss nicht weitergegeben werden, Entwickler müssen nur einmal kompilieren, frühzeitige Fehlerkontrolle

Nachteile: etwas langsamere Ausführung

Quell- code Compiler

Problem

Lösungsidee

Algorithmus

Programm

Ausführung

Vom Problem zur Lösung

Bemerkung 1: i.d.R. gibt es mehr als einen Weg zur Lösung eines Problems, d.h. mehrere richtige

Lösungsideen, mehrere korrekte Algorithmen und

mehrere Programme für ein und dasselbe Ausgangsproblem

Bemerkung 2: der Begriff

„Programmieren“ steht nicht nur für das Eintippen von

Programmen, sondern beinhaltet auch die Suche nach einer

Lösungsidee und die Entscheidung für einen geeigneten

Algorithmus

Software-Entwicklung mit Java

Java

Entwicklungsumgebung

Weitere Aspekte

Software-Entwicklung mit Java

Java

Entwicklungsumgebung

Weitere Aspekte

Java

• objektorientierte Programmiersprache

• von Sun Microsystems entwickelt (Freigabe 1995)

• seit 2010 Oracle, aktuelle Version: Java 13 (2019)

• empfohlene Version: Java 11 (long-term support)

• syntaktische Nähe zu C++, aber einfacher

• zweistufige Übersetzung:

• Quellcode (*.java) wird kompiliert zu Bytecode

• Bytecode (*.class) wird zur Laufzeit interpretiert

Logo Duke

bezeichnet auch die zugrunde liegende Plattform:

• mit JDK (Java Development Kit) inkl. Compiler zur Bytecodeerzeugung

• und JRE (Java Runtime Environment) inkl. JVM (Java Virtual Machine) zur Bytecodeausführung

• auch Basis für andere Sprachen wie z.B. Groovy

Varianten:

• Java SE (Standard Edition) als Basisvariante

• Java EE (Enterprise Edition) für Unternehmensanw.

• Java ME (Micro Edition) für Mobiltelefone, PDAs etc.

Java

Typen von Java-Programmen:

• Standalone-Javaprogramme: laufen selbständig

• Applets: spezielle Klassen, die im Webbrowser unter besonderen Sicherheitsauflagen laufen

• Servlets (und JSPs): spezielle Klassen, die im Webserver dynamische Inhalte (HTML) erzeugen

• Enterprise Java Beans (EJB): spezielle Klassen, die im Application-Server laufen (JavaEE-Anwendungen)

für alle Typen gilt: jedes Java-Programm läuft in einer JVM und benutzt die Java-Klassenbibliotheken

Java

Java• zur Standardausstattung gehören umfangreiche

Klassenbibliotheken, auf die über die Java-API (Application Programming Interface) zugegriffen wird

• die Java-API-Spezifikation findet sich unter docs.oracle.com/en/java/javase/11/docs/api/

• etliche Standardthemen werden dort unterstützt:• Datenstrukturen, z.B. Listen und Maps• Umgang mit Formaten wie HTML und XML• Zugriffe aufs Dateisystem und auf Datenbanken• Benutzeroberfläche (GUI: Graphical User Interface)• und vieles mehr

JavaMerkmale (laut Sun)• einfach: ähnlich zu C/C++, keine Zeigerarithmetik, …• objektorientiert: Programme bestehen aus Klassen• verteilt: ermöglicht netzbasierte Anwendungen• interpretiert: Bytecode wird von JVM interpretiert• robust: integrierte Speicherverwaltung, …• sicher: Sicherheitskonzept gegen unsicheren Code• architekturneutral: Abstraktion von Hardware & OS• portabel: identischer Bytecode auf Win/Mac/Linux/…

• performant: durch starke Optimierungen der JVM• nebenläufig: unterstützt parallele Abläufe (Threads)• dynamisch: Nachladen benötigter Klassen zur Laufzeit

Installation des JDKs (Java Development Kit)

• Test, ob schon vorhanden: java -version (unter Win in CMD.exe, unter macOS im Terminal)

• für diesen Kurs geeignet ist Java 7 oder höher(1.6.x steht für Java 6, 1.7.x für Java 7 und 1.8.x für Java 8)

• Download Java SE 11.0.4 JDK: www.oracle.com/technetwork/java/javase/downloads/

• anschließend Installation mit Standardvorgaben

• zur Kontrolle: Win dir C:\Programme\Java, Mac ls /Library/Java/JavaVirtualMachines

Java

• erstes Java-Programm: Textdatei HelloWorld.java

• der Name der Klasse lautet HelloWorld, er findet sich in identischer Schreibweise im Dateinamen und im Quellcode hinter dem Schlüsselwort class

• die Klasse hat eine Methode mit dem Namen main, die die Ausgabe "Hello, world!" erzeugt

Bsp.: HelloWorld

public class HelloWorld { public static void main(String[] args) {

System.out.println("Hello, world!"); }

}

Bildquelle:Dr. Schneider

Bsp.: HelloWorldDie JDK-Programme javac und java:

• der Java-Compiler javac übersetzt die Quellcode-Datei HelloWorld.java in die Bytecode-Datei HelloWorld.class

• das Java-Ausführungsprogramm java ruft die main-Methode der angegebenen Klasse auf

• mit cd ins Verzeichnis der Quelldatei wechseln, dann den Java-Compiler mit javac HelloWorld.java aufrufen (unter Windows bei Bedarf zuvor z.B. set Path=C:\Programme\Java\jdk…\bin;%Path%)

• der Compiler erzeugt im gleichen Verzeichnis die Bytecode-Datei HelloWorld.class

• Aufruf des Programms über java HelloWorld

• dies führt zum Start einer JVM, zur Ausführung der main-Methode der angegebenen Klasse in der JVM und zur Beendigung der JVM

• bei erfolgreichem Verlauf erscheint die Textausgabe

Bsp.: HelloWorld

Programme des JDKs (Auswahl):

• java – startet Standalone-Javaprogramme

• javac – Compiler, übersetzt Quellcode in Bytecode

• javap – Disassembler, erzeugt Quellcode aus Bytecode

• javadoc – erzeugt Dokumentation aus Kommentaren

• jar – bündelt Bytecode u.a. Dateien zu *.jar-Archiven

• jdb – Debugger, erlaubt Ausführung mit Breakpoints

• jps, jconsole, jinfo – zur Analyse laufender Prozesse

• appletviewer – für Applettests ohne Webbrowser

Java

• Programme des JDKs (Überblick):

Java

Bildquelle:Dr. Schneider

Software-Entwicklung mit Java

Java

Entwicklungsumgebung

Weitere Aspekte

• die Bearbeitung der Quellcode-Dateien im Texteditor mit anschließender Übersetzung über die Kommando-zeile ist nur für sehr kleine Aufgaben geeignet

• in der Praxis wird eine Entwicklungsumgebung (IDE – Integrated Development Environment) verwendet, die Editor, Compiler und viele andere Werkzeuge integriert

• gängig sind u.a. Eclipse (aus IBM Visual Age for Java hervorgegangen) und NetBeans (von Sun, heute Oracle)

Entwicklungsumgebung

Installation von Eclipse

•Installer für Eclipse 2019-09 (4.13) downloaden: www.eclipse.org/downloads

• „Eclipse IDE for Java Developers“ installieren (angegebenen Pfad bei Bedarf anpassen)

• Eclipse starten (mit Default-Workspace), Wechsel zur „Workbench“ (rechts oben)

• zur Kontrolle: Preferences öffnen (Win: Window → Preferences, Mac: Eclipse → Einstellungen), unter Java → Installed JREs steht die installierte JVM

Entwicklungsumgebung

EntwicklungsumgebungHelloWorld in Eclipse (s.a. Eclipse Welcome Page)

• neues Projekt anlegen: File → New → Java Project, Projektname z.B. „DHBW-Java1“ (→ Finish), kein Modul, das neue Projekt erscheint links im Package Explorer

• das Projekt im Package Explorer selektieren, neue Klasse anlegen: File → New → Class, Name „HelloWorld“ (→ Finish), das Gerüst für die Klasse HelloWorld erscheint in der Mitte im Editor

• die Klasse im Editor vervollständigen, sichern (File → Save) und ausführen (Run → Run)

• unten in der Konsole erscheint die Ausgabe

Software-Entwicklung mit Java

Java

Entwicklungsumgebung

Weitere Aspekte

Weitere Aspekte

…, die im Kurs gestreift werden:

• UML (Unified Modeling Language)

• Design Patterns (Adapter, Factory, Singleton, …)

• Debuggen (mit dem Eclipse-Debugger)

• Testen: JUnit, TDD (Test Driven Development), …

• Refaktorierung

• Softwarequalität, Metriken

Weitere Aspekte

…, die nicht Gegenstand dieses Kurses sind:

• Versionsmanagement (CVS, SVN, Git, …)

• Buildprozess (Ant, Maven, Hudson, Jenkins, …)

• Issue-Tracking (JIRA, Bugzilla, …)

• Agile Methoden (Scrum, Kanban, …)

• …

ToDos

• Test, ob geeignete Java-Version bereits vorhanden ist

• falls nicht: JDK 11.0.4 runterladen und installieren

• (optional:) Datei HelloWorld.java erstellen, mit javac kompilieren und mit java ausführen

• Eclipse 2019-09 runterladen, installieren und starten

• HelloWorld in Eclipse erstellen und ausführen