Java Einführung Teil 1: Einfacher Java Code Michael Hahsler Java Einführung SOFTWARE-ENTWICKLUNG Kapitel 1 Inhalt dieser Einheit • Phasen eines Softwareprojekts • Algorithmus • Überblick über (Programmier-) Sprachen • Wie funktioniert JAVA? Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 2 Software Engineering Fachgebiet der Informatik stellt • Methoden • Werkzeuge zur Herstellung und Anwendung von Software bereit. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 3 Die Phasen eines Softwareprojekts (klassisch sequentielles Software-Life-Cycle-Modell) Problemstellung, Idee Betrieb und Wartung Problemanalyse Systemtest (Komponenten-) Entwurf = Design Implementierung und Komponententest Spezifikation = Analyse Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 4 Problemanalyse und Planung Was? • Erhebung des Ist-Zustandes • Abgrenzung des Problembereichs • Skizzieren der Bestandteile des geplanten Systems • erste Abschätzung des Umfanges und der Wirtschaftlichkeit • Erstellung eines groben Projektplans • Benutzeranalyse • Aufgabenanalyse Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 5 Analyse: Spezifikation Was? • Genaue Festlegung des Leistungsumfanges des geplanten Systems (Pflichtenheft) • Umsetzung der Anforderungen in ein Modell, welches die künftige Funktionalität des zu entwickelnden Produktes vollständig beschreibt • Funktionsmodelle, Datenmodelle, Ereignismodelle, Interaktionsmodelle, WorkflowModelle • noch unabhängig von der Implementierung Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 6 Design: System- und Komponentenentwurf Wie? • Umsetzung, der in der Spezifikation erstellten Modelle in eine formale Form • Festlegung, welche Systemkomponenten die vorgegebenen Anforderungen abdecken werden • Definition der Systemkomponenten (Schnittstellen!) • Entwurf der algorithmischen Struktur (Pseudocode) • Entwurf der Datenstrukturen • unabhängig von der Implementierung! Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 7 Implementierung und Komponententest • Umsetzung der Ergebnisse der Entwurfsphase in eine rechnerausführbare Form • Verfeinerung der Komponenten und Algorithmen • Codierung in der gewählten Programmiersprache • Komponententests Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 8 Systemtest • Wechselwirkungen der Systemkomponenten unter realen Bedingungen prüfen • Fehler aufdecken • sicherstellen, dass die Systemspezifikation erfüllt ist (aus Pflichtenheft) • Freigabe der Software Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 9 Betrieb und Wartung • Fehler, die erst während des tatsächlichen Betriebs auftreten beheben • Systemänderungen und Systemerweiterungen durchführen Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 10 Andere SoftwareEngineering Modelle • • • • • Wasserfall-Modell Spiral-Modell Prototyping-orientiertes Life-Cycle-Modell Objektorientiertes Life-Cycle-Modell Objekt- und prototyping-orientiertes LifeCycle-Modell Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 11 Beschreibung von Abläufen (Bsp. Kochrezept) „Man nehme 2 dag Schmalz und erhitze es in einer Pfanne. Inzwischen versprudelt man 3 Eier mit einer Brise Salz. Wenn das Fett heiß ist, gieße man die Eier in die Pfanne. Mit einer Gabel umrühren, bis die Eier stocken, sofort heiß servieren...'' • • • • Kochrezepte Gebrauchsanweisungen Algorithmen Programme Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 12 Algorithmus (Definition) Ein Algorithmus ist ein • Plan zur Lösung gleichartiger Probleme mit Hilfe einer endlichen Folge eindeutiger, ausführbarer Schritte • bestehend aus - elementaren Anweisungen - in einer geeigneten Sprache - die sequentiell (schrittweise) durchgeführt werden. Ein Programm ist ein Algorithmus formuliert in einer bestimmten Programmiersprache. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 13 Algorithmus ( Bsp. Telefonnummersuche) "Suche die Telefonnummer zu einem gegebenen Namen in einem beliebigen Adressbuch“ 1. Gehe zum ersten Eintrag im Adressbuch 2. Vergleiche den aktuellen Eintrag mit dem gesuchten Namen 3. Bei Gleichheit: gib die zugehörige Telefonnummer aus und halte an sonst gehe zu Schritt 4 4. (Ungleichheit) Wenn noch Einträge im Adressbuch vorhanden sind: nimm‘ den nächsten Eintrag und gehe zu (2) sonst gehe zu Schritt 5 5. melde Misserfolg und halte an Name Tel.Nr. Neumann, Gustaf 12235 Neumann, Gustav 13356 Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 14 Definition einer Sprache Wie definiert sich eine Sprache? • Aus der Menge der Symbole (Worte) können Sätze gebildet werden. • Syntax: Die Regeln für das Bilden gültiger Sätze aus diesen Symbolen (=''Grammatikregeln''). • Semantik: Die Bedeutung der gültigen Sätze. • Bsp: 2+4=7 ist in der Sprache der Mathematik syntaktisch richtig, aber semantisch falsch. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 15 Bsp: Regelgramatik Syntaxregeln (BNF) <Ziffer> ::= 0|1|2|3|4|5|6|7|8|9 <Vorzeichen> ::= +|<Ziffernfolge> ::= <Ziffer> | <Ziffernfolge><Ziffer> <Zahl> ::= <Ziffernfolge>| <Vorzeichen><Ziffernfolge> • Terminale Symbole werden nicht mehr abgeleitet {0,1,2,...,9} • Nicht-terminale Symbole gekennzeichnet durch <...> • | bedeutet eine Auswahl (oder) • Alles was von <Zahl> (Startsymbol) abgeleitet werden kann, ist eine gültige Zahl Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 16 Bsp: Syntaxdiagramm Ziffer Ziffernfolge Ziffer 0 1 ... Ziffernfolge Ziffer 9 Zahl Vorzeichen Ziffernfolge + - Vorzeichen Ziffernfolge Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 17 Natürliche versus formale Sprache • Natürliche Sprachen sind vielfach syntaktisch und/oder semantisch mehrdeutig. („Dings“ wird aus dem Kontext erkannt) • Natürliche Sprachen sind fehlertolerant. • Der vorgegebene Wortumfang natürlicher Sprachen ist sehr groß. (80000 Worte Langenscheidt vs. 51 Java) • Eine Programmiersprache ist eindeutig und ist primitiv genug, um in Maschinencode übersetzt werden zu können. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 18 Java-Wortschatz reservierte Worte abstract catch do final implements long private static this try true enum boolean char double finally import native protected super throw void short strictfp break class else float instanceof new public switch throws volatile interface byte case continue default extends false for if int null return synchronized transient while package assert * derzeit ohne Verwendung byvalue* goto* var* cast* inner* const* operator* future* outer* Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch generic* rest* 19 Programmiersprachen Definition Eine Programmiersprache • ist eine Sprache zur Formulierung von Rechenvorschriften bzw. Anweisungen (Datenstrukturen und Algorithmen), die von einem Computer ausgeführt werden können, • hat eine eindeutig definierte • Syntax (welche Zeichenfolgen sind erlaubt) und • Semantik (was bewirken die Zeichenfolgen auf dem Rechner), • bildet die wichtigste Schnittstelle zwischen Rechner und Programmierer. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 20 Wie kann ich eine Sprache lernen? ÜBEN und ANWENDEN! Wie beim Lernen eines Musikinstruments! Notenkenntnis und Erkennen der Tasten ist zuwenig! Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 21 Programmiersprachen Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 22 Programmiersprachen Übersicht • Maschinensprache Programme in Maschinensprache bestehen aus Maschinenbefehlen, die als Folge von Nullen und Einsen im Rechner dargestellt werden. Nur Maschinensprache kann vom Prozessor verarbeitet werden. • Assembler Sprachen Die Bitkombinationen der Maschinenbefehle werden durch ein leicht zu merkendes Symbolwort ausgedrückt werden (MOV A L). • Höhere/symbolische Programmiersprachen Sind an die menschlichen Denkweisen angepasst (sie sind problemorientiert und nicht mehr maschinenorientiert). Höhere Programmiersprachen erlauben die Formulierung von Programmen in einer vom Zielrechner unabhängigen Notation. Mit Hilfe eines Übersetzungsprogramms (Compiler) werden Programme einer höherer Programmiersprache in Maschinenprogramme übersetzt. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 23 Höhere Programmiersprachen Übersicht • Strukturierte Programmiersprachen Höhere Programmiersprachen, die das Modulkonzept unterstützen BASIC, PASCAL, C, Modula • Objektorientierte Programmiersprachen Höhere Programmiersprachen, welche Daten und Anweisungen nicht trennen sondern zusammen als Objekte behandeln. Objekte stehen miteinander in Beziehung und kommunizieren miteinander durch Versenden von Nachrichten (Messages). Das Empfängerobjekt hat für jede Nachricht, die es “versteht”, einen eingebauten Algorithmus (Methode genannt). C++, C# und Java • Deskriptive Programmiersprachen dient zur Beschreibung der Eigenschaften gesuchter Informationen (üblicherweise Daten aus einer Datenbank) SQL • Logische Programmiersprachen Die logische Programmierung beruht auf der Erkenntnis, dass einer Untermenge der Prädikatenlogik eine prozedurale Interpretation gegeben werden kann. PROLOG Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 24 Programmiersprachen grafische Übersicht Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 25 Entwicklung von prozeduralen Programmiersprachen John v. Neumann: Programmierbare Rechenmaschine IBM: PL/1 1964 General Purpose PL Dahl: Simula Simulation N. Wirth: Pascal Strukturierte Programmierung D. Ritchie (AT&T): C N. Wirth: Modula-2 Verbesserte Datenkapselung 1940 Systemprogrammierung 1967 1971 1974 1980 B. Stroustroup (AT&T): C++ Objektorientierte Erweiterung von C Sun: Java vereinfachte und gestutzte Weiterentwicklung von C++ Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 1987 1995 26 Java-Geschichte • 1991: Projekt ``Green`` (consumer electronics) bei Sun zunächst basierend auf C++, das sich aber im Hinblick auf Sicherheit, Portabilität und Zuverlässigkeit als unzureichend herausgestellt hatte => Entwicklung einer eigenen Sprache ``Oak``, später Java • 1994: Entwicklung des HotJava-Browsers (Java Applets) • 1995: offizielle Vorstellung von Java, Netscape lizenziert Java • 1996: Gründung von JavaSoft bei Sun, Release 1.0 des Java Development Kits (JDK) • 1997: JDK 1.1 • 1999: JDK 1.2 = Java 2 Platform • 2000: JDK 1.3 • 2001: SDK 1.4 • 2005: JDK 5.0 = Version 1.5 Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 27 Was ist Java? • Objektorientiert • Einfach (keine Pointer, automatische Garbage Collection, nur einfache Vererbung) • Plattformunabhängig (durch Bytecode) • Verteilt/Netzwerkfähig (Internet) • Sicher (Sandbox) • Multithreading-fähig (Parallelverarbeitung) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 28 Grundlagen: Ausführbare Programme • Der Quellcode beinhaltet Anweisungen, die noch nicht direkt durch ein Computersystem ausgeführt werden können. Für die Ausführung der Anweisungen muss der Quellcode erst in Maschinencode übersetzt werden. • Es gibt zwei Möglichkeiten, Quellcode einer höherer Programmiersprachen in Maschinencode zu übersetzen: • Interpreter: Nach dem Start des Interpreters wird jeweils eine Anweisung des Quellprogramms nach der anderen in Maschinenbefehle übersetzt, geprüft und sofort ausgeführt. • Compiler: Übersetzt das Quellprogramm vollständig in Maschinencode, der zu einem beliebigen Zeitpunkt vom Betriebssystem geladen und ausgeführt werden kann. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 29 Ausführen von Java • Java kombiniert Compiler und Interpreter • Zunächst wird die Quelldatei mit Hilfe des Java Compilers in Bytecode übersetzt. HelloWorld.java Quellcode javac Java Compiler HelloWorld.class Java Bytecode • Wichtig: Die Bytecode-Datei beinhaltet exakt denselben Bytecode, egal von welchem System sie erzeugt wird (Plattformunabhängig!) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 30 Java Bytecode Interpreter • Der Bytecode kann noch nicht direkt ausgeführt werden. Dazu wird im zweiten Schritt ein Java Bytecode Interpreter eingesetzt. • Jedes System hat seinen eigenen Java Bytecode Interpreter, die „Java Virtual Machine“ (JVM) Betriebssystem Prozessorarchitektur Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 31 Java - Übersetzung Java Quellcode javac ProgramName.java ProgramName.java Java-Compiler javac Java ByteCode java ProgramName ProgramName.class Java-Interpreter java JVM-NT Windows NT JVM-Sol Sun Solaris JVM-Net Netscape Betriebssystem/ Browser/ Machinensprache Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 32 Programmcode class HelloWorld { public static void main (String[] args) { System.out.println(“Hello, world“); } } “Quellcode” Der Programmcode muss erst in die für den Computer verständliche Sprache übersetzt werden! Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 33 Java Applikationen vs. Applets vs. Java-Script • Java-Applikationen: Anwendungen auf Betriebssystemebene, z.B. wird unter Windows gestartet und öffnet ein eigenes Fenster. • Java-Applets: Java-Anwendungen, die in einem WWW-Browser ablaufen. Sind in HTML-Seiten eingebettet und werden automatisch über das Internet heruntergeladen; z.B. im Internet Explorer. • Java-Script: Scriptsprache zum Einbetten von einfachen Programmen in HTML-Seiten. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 34 Selbstkontrolle • In welchen Phasen läut ein Software-Projekt ab? • Welche Klassen von Programmiersprachen gibt es? Und zu welcher Klasse gehört Java? • Was sind die Eigenschaften von Java? • Erklären Sie die Schritte vom Java-Quellcode zum ausführbaren Java-Programm. • Was ist der Unterschied zwischen JavaApplikationen und Java-Applets? Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 35 Java Einführung Programmcode Inhalt dieser Einheit • Programmelemente • Der erste Programmcode • Die Entwicklungsumgebung: Sun's Java Software Development Kit (SDK) • Vom Code zum Ausführen des Programms Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 2 Wiederholung: Java • „Write once, run everywhere!“ (unabhängig von Hardware, Betriebssystem etc.): der Programmcode wird zu unabhängigem Bytecode kompiliert, der von der Java-Virtual Machine (JVM) des Zielsystems interpretiert und ausgeführt wird. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 3 Wiederholung: Algorithmus Ein Algorithmus ist eine Arbeitsanleitung zur Lösung eines Problems, die so präzise formuliert ist, dass sie von einem Computer ausgeführt werden kann. Er besteht aus • elementaren Anweisungen • in einer geeigneten Sprache • die sequentiell (schrittweise) durchgeführt werden. Der in einer für Menschen verständlichen Sprache beschriebene Algorithmus wird dann in eine Programmiersprache (hier: JAVA) transferiert. Quelltext (auch Quellcode) bezeichnet einen in einer Programmiersprache codierten Algorithmus. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 4 Programmelemente • Anweisungen • elementarste ausführbare Programmelemente • werden mit Semikolon ('';'') beendet • z.B.: Anweisung; • Blöcke • • • • Reihe von Anweisungen wirkt nach außen hin wie eine Anweisung werden von geschwungenen Klammern umgrenzt { Anweisung; Anweisung; ... } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 5 Programmelemente / 2 • Klassendefinitionen • Grundlegende Strukturierungseinheit eines objektorientierten Programms • z.B. class Teacher {...} • Methoden • • • • Block, der über einen Namen aufrufbar ist kann Aufrufparameter beinhalten kann Rückgabewerte beinhalten z.B. int grade (String[] student_name) {...} Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 6 Programmelemente / 3 • Kommentare Beschreibenden Text rund um Code verfassen und wird nicht kompiliert Arten: // Kommentar bis zum Zeilenende /* ... Kommentar bis zum nächsten */ /** ... JavaDoc Kom. bis zum nächsten */ - diese Form dient der Kennzeichnung von JavaDocKommentaren, die später elegant in HTML-Seiten umgewandelt werden können. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 7 Das erste Programm Klasse Block Methode class HelloWorld { public static void main (String[] args) { Kommentar // Hello world ausgeben System.out.println(“Hello world“); } Anweisung } Quellcode wird mit Hilfe eines Editors (WordPad) oder einer Entwicklungsumgebung geschrieben. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 8 Java ist case-sensitiv! Achtung! In der Programmiersprache Java haben Worte, die bis auf die Groß- und Kleinschreibung identisch sind, eine unterschiedliche Bedeutung. z.B. HelloWorld <> helloworld <> Helloworld <> helloWorld <> ... Anmerkung: Großbuchstabe (engl.: upper-case) Kleinbuchstabe (engl.: lower-case) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 9 Untersuchung: HelloWorld • class HelloWorld: Hauptklasse mit dem Namen HelloWorld • Methode main: Hauptmethode. Hier startet die Applikation • System.out.println("..."): Anweisung an die Klasse System.out die Methode println() (“print line“) auszuführen. println() veranlasst die Ausgabe einer Zeichenkette, die durch ein Zeilensendezeichen abgeschlossen wird. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 10 Die Methode „main“ Die Methode „main“ ist jene Methode, die zum Programmstart ausgeführt wird. Sie kann wiederum andere Methoden aufrufen. public static void main (String[] args){...} Die Methode ''main'' ist • public (=öffentlich, für alle verfügbar) und static (=statisch, immer verfügbar und nicht änderbar) definiert und hat • Parameter (String[] args) und • keinen Rückgabewert (void engl.: leer). Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 11 Blöcke • In Java wird die Quellcode-Datei in Teile geteilt, die durch öffnende und schließende geschwungene Klammern { } getrennt sind. • Alles zwischen { und } ist ein Block. Damit werden zusammengehörige Anweisungen gruppiert. • Blöcke können verschachtelt sein und andere Blöcke beinhalten. z.B: HelloWorld.java - äußerer Block für die Klassendefinition, welcher einen - inneren Block der Main-Methode beinhaltet. • Ein Block sollte zur besseren Lesbarkeit eingerückt werden. Durch diese Strukturierung wird der Code u.a. leichter lesbar. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 12 Die Entwicklungsumgebung von Sun Das Java Software Development Kit (JDK) beinhaltet die Software und Tools, die von Entwicklern benötigt werden, um Quellcode zu kompilieren, zu debuggen und auszuführen. Die JDK Software und Dokumentation inkludiert • grundlegende Entwicklungstools, • eine große Menge an Klassen-Bibliotheken, • und ist gratis verfügbar. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 13 Java 2 Plattform Standard Edition • Java 2 Plattform seit Ende 1998 (Version Java 1.2 und höher) • Derzeit JDK 5.0 (Java 1.5) • Download unter http://java.sun.com/ Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 14 Bestandteile JDK • Compiler (javac) • Bytecode Interpreter (java) • jar, javadoc, etc. Ausführbare Programme Beispielprogramme und Applets Java Runtime Environment (Virtual Machine) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 15 Installation und Konfiguration • SDK herunterladen und installieren • PATH auf das bin-Verzeichnis setzen: Einstellungen->Systemsteuerung->System Erweitert/Umgebungsvariablen/Path • Ausführliche Information zur gerade aktuellen Version liefern die Installationshinweise von Sun. (http://java.sun.com/) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 16 Schritte vom Code zur Programmausführung • Abspeichern des Codes unter dem Namen der Hauptklasse, Erweiterung “.java“. (HelloWorld.java) • Kompilieren > javac HelloWorld.java Î Bytecode-Datei HelloWorld.class wird erzeugt • Ausführen > java HelloWorld Î Ausgabe > HelloWorld MS DOS-Fenster (Start->Ausführen->CMD) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 17 Aufgabe • Installieren Sie JDK zuhause oder gehen Sie in den Übungsraum. • Suchen Sie das jdk-Verzeichnis (meist unter C:\Programme\Java) und setzen Sie die “PATH“ Variable. • Implementieren Sie das HelloWorld Beispiel, kompilieren Sie es und führen es aus. • Ändern Sie das Programm so ab, dass es GoodNight heißt und auch Good Night! ausgibt. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 18 Nach dieser Einheit sollten Sie wissen, ... • welche Programmelemente ein Programm enthält • was Anweisungen sind • wie diese zu Blöcken zusammengefasst werden können • wie ein Programm strukturiert wird • und wie Sie Ihr Programm HelloWorld erstellen, kompilieren und ausführen können Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 19 Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Inhalt dieser Einheit • Variablen (Sinn und Aufgabe) • Bezeichner • Datentypen, Deklaration und Operationen • Typenumwandlung (implizit/explizit) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 2 Variablen • Daten werden in Variablen gespeichert. Variablen sind aus der Mathematik bekannt: y=5+x • Variablen haben einen Namen (Bezeichner) und einen Wert. Bsp. x kann den Wert 8 haben. • Variablen sind Behälter, die jeweils nur einen Wert eines bestimmten Datentyp beinhalten können. Bsp. x ist vom Datentyp 'ganze Zahl' (Integer), die Variable kann daher keine Zeichenkette enthalten. • Variablen müssen vor der Verwendung deklariert werden, dabei wird der Name und der Datentyp festgelegt. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 3 Bezeichner • Bezeichner benennen Variablen, Klassen, Instanzen, Methoden, • beginnen mit Buchstaben, “_“ oder “$“, • anschließend folgen Buchstaben, Ziffern, Unterstrich, Dollar und/oder Unicode-Zeichen. • Zur besseren Lesbarkeit wird eine einheitliche Form der Benennung der Klassen, Objekte, Methoden und Variablen empfohlen. Besteht ein Bezeichner aus mehreren Worten werden Sie folgendermaßen zusammengeschrieben: nameOfTheUser Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 4 Bezeichner (forts.) • Variablennamen (und Instanznamen): kleiner Anfangsbuchstabe. z.B.: zaehler oder meinZaehler • Konstantennamen: komplett groß z.B.: MAXINT • Klassennamen: ein Hauptwort, den ersten Buchstaben einer Klasse groß schreibt. z.B.: MeineErsteKlasse • Methodennamen: sind Verben, beginnen mit Kleinbuchstaben. z.B.: getNameFromUser() Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 5 Datentypen und Werte • • Es gibt unterschiedliche Kategorien (Datentypen) von Werten: • Ganze Zahlen: 2, 4754, -50 • Gleitkomma (Reelle-) Zahlen: -3.4, 34.98, 34.83945 • Wahrheitswerte: Richtig/Falsch • Zeichen: ‘a‘, ‘b‘ • Zeichenketten: “Hello World!“ Unterschiedliche Datentypen benötigen unterschiedlich viel Speicherplatz; z.B. Wahrheitswerte 1 Bit oder ASCII-Zeichen 7 Bit • Grund für den Einsatz von Datentypen: • Überprüfung sinnvoller Operationen (verhindert Addition “hallo“+3) • Reservierung passenden Speicherplatzes Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 6 Primitive Datentypen In Java eingebaute Datentypen: • Ganze Zahlen: byte, short, int, long • Gleitkomma (Reelle-) Zahlen: float, double • Zeichen: char • Wahrheitswerte: boolean (true/false) Die Datentypen und ihre Eigenschaften (Größe, Genauigkeit) hängen nicht (wie bei anderen Programmiersprachen) vom jeweiligen Computersystem ab, sondern sind in Java einheitlich festgelegt. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 7 Primitive Datentypen (forts.) Typ byte short int long char von bis -128 127 -32768 32767 -2.147.483.648 2147483647 -9.223.372.036.854.770.000 9.223.372.036.854.770.000 0 Ganzzahlen 65535 Unicode Wahrheits werte false boolean true +/-1,40239846 * 10^-45 +/-3,40282347 * 10^38 Gleitkomfloat double +/-4,94065645841246544 * 10^-324+/-1,79769313486231570 * 10^308 mazahlen Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 8 Ganze Zahlen (Primitive Datentypen) • Datentypen byte, short, int, long • Operationen (Operanden und Ergebniswert sind ganze Zahlen) + Addition - Subtraktion * Multiplikation / Ganzzahldivision % Restbildung (Modulo-Funktion) • Beispiele: 1, -45 weitere Operatoren folgen... Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 9 Gleitkommazahlen (Primitive Datentypen) • Datentypen float, double • Operationen: (Operanden und Ergebniswert sind Gleitkommazahlen) + Addition - Subtraktion * Multiplikation / Division • Beispiel: 2.77, 1.0 (Achtung . als Komma!) weitere Operatoren folgen... Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 10 Zeichen (Primitive Datentypen) • Datentyp char • Operationen: (Operanden und Ergebniswert sind Zeichen oder Zeichenketten) + (Verkettung) • Beispiel: ‘a‘, ‘z‘ (Achtung einfaches Anführungszeichen!) weitere mögliche Werte für Character-Datentypen auf der nächsten Folie... Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 11 Zeichen (forts.) • Tastatur-, Unicode oder Oktal-Zeichen in einfachen Hochkomma • Tastaturzeichen ‘Z‘ • Unicode-Zeichen ‘\u005A‘ • Oktal-Zeichen ‘\132‘ • Sonderzeichen (Auswahl der Escapesequenzen) • • • • • • • ‘\b‘ Backspace ‘\“‘ Doppeltes Hochkomma ‘\n‘ linefeed ‘\\‘ Backslash ‘\r‘ carriage return ‘\‘‘ Einfaches Hochkomma ‘\t‘ Tabulator Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 12 Wahrheitswerte (Primitive Datentypen) • Datentyp boolean • Operationen: Ergebniswert sind wieder Wahrheitswerte a && b a || b !a (logisches UND: a ist wahr und b ist wahr) (logisches ODER: a ist wahr oder b ist wahr) (logisches NICHT: ist wahr wenn a falsch ist) • Mögliche Werte: true, false Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 13 Wahrheitswerte (forts.) Folgende Operatoren ergeben Wahrheitswerte: < (kleiner) <= (kleiner oder gleich) == (gleich) != (ungleich) z.B. z.B.Vergleich Vergleichvon vonzwei zweiInteger-Variablen Integer-Variablen >= (größer oder gleich) int int int int > (größer) aa bb == == 1; 1; 2; 2; boolean boolean bool bool == aa <= <= b; b; Ergebniswert bool: true Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 14 Variablendeklarationen • Variablen haben einen Namen und sind Behälter für Werte eines bestimmten Datentyps • Damit Variablen verwendet werden können, müssen sie zuerst deklariert werden. z.B.: int i; short x, y; Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 15 Deklaration u. Initialisierung • Deklaration: Datentyp z.B.: name; int abgaben; boolean an; • mehrere Variable vom selben Typ: Datentyp name1, name2, name3; z.B.: int gehalt, lohn, provision; • Wertzuweisung: variable = wert; z.B.: gehalt = 3000; provision = 2000; an = true; Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 16 Deklaration u. Initialisierung (forts.) • Deklaration mit Initialisierung int gehalt = 3000; int provision = 100; double x = 0.000001; char zeichen = 'a'; boolean aus = false; • Zugriff auf Variablenwerte gehalt = gehalt + provision; System.out.println(“Gehalt: “+gehalt); Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 17 Automatische Initialisierung von primitiven Datentypen • Wird eine Variable bei der Deklaration nicht Initialisiert (Bsp. int i;), erhält sie automatisch folgenden Wert: • Zahlen: 0 bzw. 0.0 • Wahrheitswerte: false • Zeichen/Referenzen*: null (bedeutet: leer) • besser: explizite Initialisierung • int provision = 0; *Referenzen werden erst später behandelt! Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 18 Datentypen-Beispiel class ArithmeticDemo { public static void main(String[] args) { int i = 37; int j = 42; Variablendouble x = 27.475; deklarationen double y = 7.22; System.out.println("Variablenwerte..."); System.out.println(" i = " + i); System.out.println(" j = " + j); System.out.println(" x = " + x); System.out.println(" y = " + y); Ausgabe der Variablenwerte System.out.println("Addieren..."); System.out.println(" i + j = " + (i + j)); System.out.println(" x + y = " + (x + y)); Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch Addition 19 Datentypen-Beispiel Teil2 System.out.println("Subtrahieren..."); System.out.println(" i - j = " + (i - j)); System.out.println(" x - y = " + (x - y)); System.out.println("Multiplizieren..."); System.out.println(" i * j = " + (i * j)); System.out.println(" x * y = " + (x * y)); System.out.println("Dividieren..."); System.out.println(" i / j = " + (i / j)); System.out.println(" x / y = " + (x / y)); System.out.println(“Restwertbestimmung..."); System.out.println(" i % j = " + (i % j)); System.out.println(" j % i = " + (j % i)); System.out.println("Vermischte Typen..."); System.out.println(" j + y = " + (j + y)); System.out.println(" i * x = " + (i * x)); }} Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch Subtraktion Multiplikation Division Rest gemischte Datentypen 20 Ausgabe des Programms Variablenwerte... i = 37 j = 42 x = 27.475 y = 7.22 Addieren... i + j = 79 x + y = 34.695 Subtrahieren... i - j = -5 x - y = 20.255 Multiplizieren... i * j = 1554 x * y = 198.37 Dividieren... i / j = 0 x / y = 3.8054 Restwertbestimmung... i % j = 37 j % i = 5 Vermischte Typen... j + y = 49.22 i * x = 1016.58 Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 21 Konstanten • Werte sollen während des gesamten Programmablaufes gleich bleiben. • Konstante ist kein weiterer Datentyp. • Deklaration: Sie werden mit dem Schlüsselwort final deklariert. final Datentyp NAME = Wert; z.B.: final double PI = 3.1416; Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 22 Typumwandlungen • Java ist streng typisiert, Variablen dürfen nur Werte vom deklarierten Typ zugewiesen werden. • Vergleichsoperatoren vergleichen nur Ausdrücke gleichen Typs. • Es gibt implizite und explizite Typumwandlung int ganz = 3; double komma = ganz; //implizit float komma2 = (float) ganz; //explizit Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 23 Implizite Typumwandlung • In manchen Fällen wird automatisch vom Compiler umgewandelt (implizite Typumwandlung) • byte, short => int => long • int => float • float => double • char => int • Beispiel: short s = 3; // s=3 int i = s; float g = 3 + i; int b = ‘a‘; int i = ‘z‘-‘a‘; // // // // i=3 g=6.0 b=97* i=25* *Ascii-Werte a=97, z=122 Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 24 Implizite Typvergrößerungen Java nimmt diese Konversionen, falls nötig, bei Zuweisungen, Methoden- und Konstruktoraufrufen und bei der Auswertung von Ausdrücken implizit vor. Zuweisungskompartibilität: byte -> short -> int -> long -> float -> double Kein Informationsverlust! Ausnahme beim Übergang zu den Gleitkommazahlen: bei long -> float wird Genauigkeit verloren Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 25 Explizite Typumwandlung (Cast) Explizite Angabe des umzuwandelnden Typs double d = 7.99; int i = (int) d; /*i =7, da keine Nachkommastellen beim Datentyp int */ int zahl = 33000; short s = (short)zahl; //s=-32536 /*Zahl außerhalb des Wertebereichs 33000 binär = 1000 0000 1110 1000 Die erste Ziffer wird nun als Minuszeichen interpretiert und ergibt den Wert -32536 im 2er-Komplement (-32768 + 232)*/ ACHTUNG! Die Typverkleinerung kann zu falschen Werten führen, wenn der Wertebereich des Zieldatentyps nicht ausreicht, den Wert darzustellen. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 26 Exkurs: Zeichenketten (Strings) • Achtung: Zeichenkette ist keine primitiven Datentyp sondern ein Objekt-Datentyp* • Operationen: Verkettung, Ergebniswert ist wieder eine Zeichenkette + (Verkettung) • Mögliche Werte: z.B. "Hallo World" = Kombinationen vom Typ char • Initialisierung String s = "A short way to initialize"; (oder* String id = new String( "The long way" ); ) * Wird später genau behandelt Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 27 Exkurs: Unicode ... Entspricht im unteren Bereich ASCII Bsp: char c = '\u0060'; ... Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 28 Nach dieser Einheit sollten Sie ... • Die verschiedenen Arten von Variablen kennen. • alle primitiven Datentypen deren Initialisierung und gängigen Operationen. • Variablen verschiedenen Typs definieren, deren Typ umwandeln, und damit rechnen können. • Die Konventionen zur Bezeichnung von Variablen, Methoden und Klassen kennen. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 29 Java Einführung Operatoren Kapitel 2 und 3 Inhalt dieser Einheit • • • • • Operatoren (unär, binär, ternär) Rangfolge der Operatoren Zuweisungsoperatoren Vergleichsoperatoren Logische Operatoren Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 2 Operatoren • Abhängig vom Datentyp können bestimmte Operationen vorgenommen werden • Operatoren haben ein oder mehrere Operanden Operand Operand 3+4 Operator • Die Ausführung der Operationen erfolgt nach einer festgelegten Reihenfolge (d.h. einige Operatoren haben Vorrang vor andern) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 3 Operatoren • unäre Operatoren (1 Operand): Bsp. ++ (erhöht den Wert des Operanden um 1, var++) oder logisches Nicht ( ! ) • binäre Operatoren (2 Operanden): Bsp. + (Addition der beiden Operanden, var1 + var2) • ternärer Operator (3 Operanden): ?: als einziger ternärer Operator in Java erlaubt die verkürzte Implementierung einer if-else-Verzweigung (i<j)?“true“:“false“ Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 4 Operatoren im Überblick (Auszug) 1 = Zuweisung + - Addition/ Subtraktion * / Multiplikation/ Division ++ -- Inkrement/ Dekrement Erhöht oder erniedrigt den Wert der Variablen um 1 % Modulo Liefert den Rest einer ganzzahligen Division (i<j)?“ja“:“nein“ if-then-else Einziger ternärer Operator in Java. Kurzform der IF-Schleife Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 5 Operatoren im Überblick (Auszug) 2 <= < >= > Vergleich Der Vergleich zweier Werte liefert true oder false zurück. == != Vergleich (gleich, ungleich) Der Vergleich zweier Werte liefert true oder false zurück. ! logisches NICHT Negiert den Wahrheitswert einer Aussage && logisches UND Verknüpft zwei Aussagen. Liefert true, wenn beide Aussagen true sind. || logisches ODER Verknüpft zwei Aussagen. Liefert true, wenn eine der beiden Aussagen true sind. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 6 niedrig hoch Rangfolge der Operatoren in Java . [] () ++ -- ! ~ instanceof new (data type) */% +<< >> >>> <> == != & ^ | && || ?: += -= *= = &= ^= &= = <<= >>= >>>= • Die Operatoren oben in der Tabelle werden zuerst ausgewertet. • Operatoren in der gleichen Zeile haben die gleiche Rangfolge und werden von links nach rechts ausgewertet. Beim Ausdruck y = 6 + 4/2 wissen Sie jetzt anhand der Tabelle, dass die Division vor der Addition ausgewertet wird, deshalb ergibt sich für y ein Wert von 8. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 7 Verkürzte Schreibweise • • • • x+=4; // x=x+4; x*=10; // x=x*10; ++a; // a=a+1; --a; // a=a-1; Achtung: a++ hat eine andere Funktionsweise als ++a • m=n++; ist wie m=n; n++; • m=++n; ist wie n++; m=n; Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 8 Der Zuweisungsoperator (primitive Datentypen) 1 • Operator: = • Syntax: Operand1 = Operand2 Weist dem Operanden auf der linken Seite den Wert des Operanden auf der rechten Seite zu. • Beispiele: • Variableninitialisierung: int i = 2; • Arithmetische Operationen: i = i + 2; Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 9 Der Zuweisungsoperator (primitive Datentypen) 2 Primitive Datentypen: Zuweisung des Wertes entspricht der Kopie des Wertes in die neue Variable. var1 5 kopiere 5 var2 var2 = var1; Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 5 10 Der Zuweisungsoperator (primitive Datentypen) 3 ... int i1 = 19; // i1 = 19 int i2 = 47; // i2 = 47 i1 = i2; // i1 = 47 i1 = 27+13; // i1 = 40 i2 = 88; // i2 = 88 ... Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 11 Der Vergleichsoperator (Primitive Datentypen) ... int i1 = 19; int i2 = 19; boolean b = i1 == i2;// b ist true boolean c = i1 <= 9; // c ist false ... Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 12 Logische Operatoren (Primitive Datentypen) Logisches UND && Logischen ODER || Negation ! (2x AltGr <) int x = 10; boolean norm = (x >= 9 && x <= 11); boolean result = (0<= x && x <= 10 || 100 <= x && x <= 110); Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 13 Logische Operatoren b1 true OR NOT AND !b1 b1 && b2 b1 || b2 b2 true false true true false true true false true false false true false false true false false false true Wahrheitstabelle Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 14 Nach dieser Einheit sollten Sie ... • Zuweisungsoperator, Vergleichsoperator und logische Operatoren kennen. • Die Reihenfolge ihrer Ausführung kennen. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 15 Java Einführung ABLAUFSTEUERUNG Kapitel 3 und 4 Inhalt dieser Einheit Merkmale und Syntax der verschiedenen Kontrollstrukturen: • if else • switch • while • do while • for • break, continue EXKURS: Rekursion Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 2 Kontrollstrukturen • Alle Kontrollstrukturen eines Programms basieren auf Zustandsüberprüfungen, die die Werte true oder false liefern. z.B. PIN-Überprüfung des ATM: Wenn der richtige PIN eingegeben wurde, dann wird die Abhebung erlaubt, andernfalls verweigert. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 3 Kontrollstrukturen Verschiedene Arten von Kontrollstrukturen • • • • Verzweigungen: if else, switch Iterationen: while, do while, for Sprunganweisungen: continue, break Exception Handling*: (try | catch |finally) throw *wird später behandelt! Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 4 if TRUE statements block 1 In der hier dargestellten Anwendung wird eine FALSE Bedingung überprüft (boolbool-expr expr). Ist diese erfüllt (true), dann wird der unter statement1 beschriebene Programmcode ausgeführt, anschließend wird das Programm mit statement fortgesetzt. Ist die Bedingung nicht erfüllt (false), dann wird statements das Programm sofort mit statement fortgesetzt. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 5 if Syntax und Beispiel TRUE Balance>100000 reicheKunden++ statements FALSE JavaSyntax: if (bool-expr) { statements1; } z.B: if (balance>100000){ reicheKunden++; } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 6 if-else In der hier dargestellten Anwendung wird eine Bedingung überprüft (bool-expr). Ist diese erfüllt (true), dann wird der unter TRUE FALSE statement1 beschriebene bool-expr Programmcode ausgeführt, anschließend wird das Programm statements1 statements2 mit statement fortgesetzt. Ist die Bedingung nicht erfüllt (false), wird der unter statement2 beschriebene Programmcode statements ausgeführt, anschließend wird das Programm mit statement fortgesetzt. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 7 if-else Syntax und Beispiel FALSE TRUE Pin==inputPin Stimmt=true Fehlversuche++ statements JavaSyntax: if (bool-expr) { statements1; } else { statements2; } z.B: if (pin==inputPin){ stimmt = true; } else { fehlversuch++; } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 8 if-else Beispiel In der hier dargestellten Anwendung wird eine Bedingung überprüft (bool-expr1). Ist diese erfüllt (true), dann wird der unter statement1 beschriebene Programmcode ausgeführt, anschließend wird das Programm mit statement fortgesetzt. Ist die Bedingung bool-expr1 nicht erfüllt (false), dann wird eine weitere Bedingung (bool-expr2) überprüft. FALSE TRUE bool-expr1 FALSE TRUE bool-expr2 statement1 statement2 statement3 Ist diese Bedingung erfüllt, dann wird der unter statement2 beschriebene Programmcode ausgeführt, anschließend wird das Programm mit statement fortgesetzt. Andern-falls wird der unter statement3 beschriebene Programmcode ausgeführt und das Programm mit statement fortgesetzt. statement Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 9 if-else Beispiel if-else kann beliebig tief verschachtelt werden. FALSE TRUE bool-expr1 TRUE bool-expr2 statement1 statement2 statement FALSE statement3 ... if (bool-expr1) { statement1; } else if (bool-expr2) { statement2; } else { statement3; } statement; ... Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 10 switch switch TRUE case 1 statement1 FALSE TRUE case 2 FALSE statement2 ... default statement Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 11 switch (forts.) 1. An die switch – Anweisung wird eine Variable (integral selector) übergeben (z.B. int) 2. case1 überprüft ob der Wert der Variable mit dem angegebenen Wert übereinstimmt. 3. Ist dies der Fall, dann wird die Anweisung in statement1 ausgeführt. 4. Dann überprüft case2 ob der Wert der Variable mit dem angegebenen Wert übereinstimmt. 5. Ist dies der Fall, dann wird die Anweisung in statement2 ausgeführt. 6. Dann wird der Vergleich der Variablen in case3 analog fortgesetzt. 7. Ist keine der angegebenen Bedingungen erfüllt, dann werden die Anweisungen vom Default-Zweig ausgeführt. (Der Default-Zweig ist optional) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 12 switch - Syntax switch TRUE case 1 statement1 FALSE case 2 TRUE statement2 FALSE ... default statement switch(integral-selector){ case integral-value1: statement1; break; case integral-value2: statement2; break; ... default: statement; } (break verhindert, dass alle restlichen Statements ausgeführt werden.) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 13 switch (Bsp.) int month = 12; switch (month) { case 1: System.out.println("Jan"); break; case 2: System.out.println("Feb"); break; … case 12: System.out.println("Dec"); break; default: System.out.println("error"); break; } (implizit: Wenn month == 1, dann gibt „Jan“ aus!) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 14 Iterationen • Mit Iterationen (=Schleifen) kann der Programmfluss von Anweisungen, die mehrmals hintereinander durchgeführt werden sollen, gesteuert werden. • Die Schleifen werden solange durchlaufen, bis ein Abbruchkriterium erfüllt ist. • Das Abbruchkriterium befindet sich am Kopf oder am Fuß der Schleife. z.B. PIN-Eingabe des Kunden: Fordere den Kunden zur Eingabe der PIN auf, bis die richtige PIN bzw. 3* eine falsche PIN eingegeben wurden. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 15 while While-Schleife bool-expr FALSE Die Anweisungen der while-Schleife werden ausgeführt, solange die boolexpr erfüllt (=true) ist. Die Überprüfung der Bedingung findet am Anfang der Schleife statt. TRUE statements 1 statements JavaSyntax: while (bool-expr){ statements1; } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 16 while Beispiel FALSE i<zielWert int zielWert = 100; int i = 1; while (i < zielWert) { System.out.print("i="+i+“,“); i++; } TRUE Print; i++ Ausgabe: i=1,i=2,i=3,…,i=99 Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 17 do-while Die Anweisungen der do-while-Schleife werden ausgeführt, bis die bool-expr nicht mehr erfüllt ist. Die Überprüfung der Bedingung findet am Ende der Schleife statt. Sie wird somit mindestens einmal durchlaufen. statement1 TRUE bool-expr FALSE JavaSyntax: do { statement1; } while (bool-expr) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 18 do-while Beispiel int zielWert = 1000; int i = 1; do { System.out.println("i="+i+“,“); i++; } while (i < zielWert); Print; i++ TRUE Ausgabe: i=1, i=2, i=3, … i=999, Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch i<zielWert FALSE 19 for initialization step statements bool-expr FALSE Die Anweisungen der for-Schleife werden aus-geführt, solange die bool-expr erfüllt ist. Sie wird idR eingesetzt, um eine bekannte, d.h. im vorhinein festgelegte Anzahl von Schritten mit einem Zähler durchzuführen. TRUE JavaSyntax: for (initialization; bool-expr; step){ statements; } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 20 for Beispiel int zielWert = 4; for (int i = 1; i < zielWert; i++) { System.out.println(i+“,“); } i=1 step Ausgabe: 1, 2, 3, print i<zielWert TRUE FALSE Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 21 For (Ergänzung) Java Syntax bei Verwendung von mehreren Zählvariablen (gleichen Typs!): for (initialization; bool-expr; step) { statements; } for (int i=0, j=10; i<=10; i++,j--) { System.out.println(“i=“ + i + “ i inkrementiert“); System.out.println(“j=“ + j + “ j dekrementiert“); } Ausgabe: i=0 i inkrementiert j=10 j dekrementiert i=1 i inkrementiert i=9 j dekrementiert … Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 22 Endlosschleifen Problemfall: Endlosschleifen (Abbruchbedingung kann nie erfüllt werden!) for (int i=2; i>=1; i = i + 2) { System.out.println(i); } i = 10 while (i >= 1){ System.out.println(i); i++; } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 23 Endlosschleifen 2 Soll eine Endlosschleife programmiert werden: while (true) { // Code } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 24 Iterationen Überblick Abfrage Durchlauf Anzahl der Durchläufe while zu Beginn 0, 1 oder mehrmals unbestimmt do-while am Ende 1 oder mehrmals unbestimmt for zu Beginn 0, 1 oder mehrmals festgelegt Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 25 for Beispiel Fakultät Berechnen der Fakultät n! = 1*2*3*…*n einer Zahl mittels For-Schleife: class Fakultaet{ public static void main(String[] arg){ int n = 20; long f = 1; for(long i = 2; i<=n; i++){ f = f * i; } System.out.println(n + "! = "+ f); } } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 26 Sprunganweisungen Sprunganweisungen können in allen Schleifen verwendet werden: break bricht die Schleife ab continue setzt die Schleife mit dem nächsten Durchgang fort, d.h. der Rest dieses einen Durchgangs wird übersprungen. Um Lesbarkeit und Nachvollziehbarkeit des Codes zu gewährleisten empfehlen wir, Sprunganweisungen nicht einzusetzen! Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 27 Sprunganweisungen Beispiel class Sprung { public static void main (String[] args) { int i=0,j=0; while(i<10){ i++; System.out.println("1. "+ i); if(i==7) break; } while(j<10){ j++; if(j<7) continue; System.out.println("2. "+j); } } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch Ausgabe: 1. 1 1. 2 1. 3 1. 4 1. 5 1. 6 1. 7 2. 7 2. 8 2. 9 2. 10 28 Nach dieser Einheit sollten Sie ... • die Möglichkeiten bedingter Anweisungen kennen, • die verschiedenen Schleifen kennen, • ihre Eignung für spezielle Anforderung kennen, • und alle Konstrukte in eigenen Programmen anwenden können. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 29 Lernkontrolle Schreiben Sie ein kleines Programm, dass zu arabischen Zahlen die entsprechende römische Zahl ausgibt. Verwenden Sie dazu verschiedenartige Kontrollstrukturen. Anleitung: Beginnen Sie zuerst mit einer vereinfachten Problemstellung (I, V, X) und erweitern Sie diese später. Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 30 Lernkontrolle Fibonacci Sequence Versuchen Sie die Ausgabe dieses Programms zu ermitteln. class Fibonacci { public static void main (String[] args) { /** Ausgeben der Fibonacci Zahlen kleiner 50 */ int lo = 1; int hi = 1; System.out.println(lo); while (hi < 50) { System.out.println(hi); hi = lo + hi; lo = hi - lo; } } } Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 31 Exkurs: Rekursion* * benötigt Methoden, die später durchgenommen werden Methode bool-expr FALSE TRUE Die Rekursion stellt eine Alternative zur Verwendung von Schleifen dar. Rekursion bezeichnet den Aufruf der eigenen Methode mit anderem Parameter. Analog zu den Schleifen darf dieser Aufruf nur dann durchgeführt werden, wenn eine bestimmte Bedingung erfüllt ist. Methodenaufruf Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 32 Rekursion-Beispiel Berechnen der Fakultät einer Zahl mittels Rekursion (siehe Fakultaet.java): static int fakulRekursiv(int i){ if (i > 1) return i * fakulRekursiv(i-1); else return 1; } (Kapitel 14 in „Sprechen Sie Java“) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 33 Rekursion-Beispiel (forts.) Aufruf Rückgabe: 6 fakulRekursiv(3) Aufruf Rückgabe: 2 fakulRekursiv(3-1) Aufruf Rückgabe: 1 fakulRekursiv(2-1) Grundzüge der Programmierung - Hahsler, Guth, Kaukal, Klimesch 34 Java Einführung Methoden Kapitel 6 Inhalt • Deklaration und Aufruf von Methoden • Lokale und globale Namen (Bezeichner) • Sichtbarkeit und Lebensdauer von Variablen in Methoden • Überladen von Methoden Grundzüge der Programmierung - Hahsler 2 Methoden • Methoden gehören logisch zusammen und lösen einen bestimmte Teilaufgabe. • Methoden werden zur Lösung der Teilaufgabe aufgerufen. • In Klassen werden Methoden eingesetzt um das Verhalten der Klasse abzubilden. Grundzüge der Programmierung - Hahsler KlassenName -Variablen +Methoden() 3 Deklaration von Methoden • Methoden haben eine Namen (Bezeichner) wie Variablen. • Methoden haben Parameter. Das sind Werte, die beim Aufruf einer Methode übergeben werden. static void printMax (int x, int y) { if (x>y) { System.out.print(x) } else { System.out.print(y) } Signatur } Grundzüge der Programmierung - Hahsler 4 Aufruf von Methoden Durch Angabe von Name und Parameter der Methode: public static void main (String[] arg) { int a=5; printMax (a, 9); } void printMax (int x, int y){ if(x>y) { ... } Beim Aufruf wird den formellen Parametern (x, y) der Wert der aktuellen Parametern (a, 9) zugewiesen. x und y können nur in der Methode printMax verwendet werden. Grundzüge der Programmierung - Hahsler 5 Deklaration von Methoden mit Rückgabewert static int max (int x, int y) { if (x>y) { return(x); } else { return(y); } } • Der Rückgabewert ist hier als int definiert. • return legt den Rückgabewert fest und verlässt die Funktion. • Es kommen alle Datentypen für den Rückgabewert in Frage. Das Schlüsselwort void bedeutet: kein Rückgabewert Grundzüge der Programmierung - Hahsler 6 Aufruf von Methoden mit Rückgabewert Durch Angabe von Name und Parameter der Methode: public static void main (String[] arg) { int a=15; int maximum; maximum = max(a, 9); System.out.println(maximum); } int max (int x, int y){ if(x>y) { return(x); } else { return(y); } } Bei der Rückgabe wird der Rückgabewert (Wert von x, 15) als Ergebnis der Funktion max(15,9) der Variable maximum zugewiesen. Grundzüge der Programmierung - Hahsler 7 Beispiele: Aufrufen von Methoden // Def. der Methode max von der vorherigen Folie int a=15; int m; m = max(a/5,9); m = max(a,7) + 19 if (max(-a,23) == 35) { ... } Grundzüge der Programmierung - Hahsler 8 Rückgabewerte • Als Rückgabewert ist ein einzelnes Element eines Datentyps (auch eine Instanz) möglich. z.B.: int addiere(int a, int b) {...} • Hat die Methode keinen Rückgabewert, wird das Schlüsselwort void verwendet. z.B.: void ausgeben(String text) { ...} Grundzüge der Programmierung - Hahsler 9 Lokale Namen • Lokale Namen (Methoden, Variablen) sind nur in der Methode (im Block) verfügbar, in der sie deklariert wurden static void macheWas(int x) { int y; // x und y sind nur in dieser Methode verfügbar ... } Grundzüge der Programmierung - Hahsler 10 Gültigkeitsbereich von Variablen • Gültigkeitsbereich: ist jener Bereich im Programm, in dem auf eine Variable über den Namen zugegriffen werden kann 1. Sichtbarkeit: Block (+ Unterblöcke), in dem die Variable deklariert wurde. 2. Lebensdauer: werden bei betreten des Blocks angelegt und bei Verlassen wieder freigegeben. Grundzüge der Programmierung - Hahsler 11 Bsp: Sichtbarkeit und Lebensdauer class Prog { static int x; static int y; ... static void machen(){ int x; while(...) { int z; } } } „Global“ x in Klasse Verdeckt (Sichtbarkeit) y Grundzüge der Programmierung - Hahsler x lokal z Lebensdauer 12 Überladen von Methoden • Allgemein gilt: In einem Block deklarierte Namen müssen unterschiedlich sein. Bei Methoden gibt es eine Ausnahme: Zwei Methoden dürfen den gleichen Namen haben, wenn sich durch ihre Parameterliste (Art und Anzahl) unterscheidet. Rückgabewert und Name der Parametervariablen sind egal beim Überladen egal! static void print (int x) { ... } static void print (double x) { ... } static void print (int x, int y) { ... } Grundzüge der Programmierung - Hahsler 13 Bsp: Aufruf überladener Methoden class MaxProgramm { static int max (int x, int y) { if (x>y) { return(x); } else { return(y); } } static int max (int x, int y, int z) { int max; max = max(z, max(x,y)); return max; } public static void main (String[] arg) { System.out.println(max(45,13,98)); } } Die richtige Methode wird beim Aufruf über die Signatur automatisch ausgewählt. Grundzüge der Programmierung - Hahsler 14 Fehler beim Überladen von Methoden 1. 2. 3. 4. static static static static int addiere (int a, int b) {...} int addiere (int a, int b, int c) {...} double addiere (double a, double b) {...} double addiere (int x, int y) { ... } Die Methoden in Zeile 1 und 4 können nicht gemeinsam deklariert werden, da beide die gleiche Signatur addiere(int,int) haben. Der Compiler bricht die Übersetzung mit einer Fehlermeldung ab. Grundzüge der Programmierung - Hahsler 15 Nach dieser Einheit sollten Sie ... • Methoden deklarieren und aufrufen können • Über die Sichtbarkeit und Lebensdauer von Variablen bescheid wissen • Das überladene von Methoden kennen Grundzüge der Programmierung - Hahsler 16 Java Einführung Arrays Kapitel 7 Inhalt • Eindimensionale Arrays • • • • Erzeugung Benutzung Zuweisung Beispiel • Mehrdimensionale Arrays Grundzüge der Programmierung - Hahsler 2 Arrays • Oft benötigt man nicht nur Einzelwerte (eine Variable) sondern eine Wertemenge, die gemeinsam verarbeitet werden • Wertmengen werden oft in Tabellen oder Listen angeordnet • Ein Array ist eine Tabelle von gleichartigen Elementen (Zahlen, Zeichen,...) Grundzüge der Programmierung - Hahsler 3 Eindimensionales Array a[0] a[1] a[2] a[3] ... a[9] ... a • Ein Array hat einen Namen (a) • Die einzelnen Elemente können durch den Index ([0],[1],...) angesprochen werden • Die einzelnen Elemente verhalten sich wie namenlose Variablen • Die Größe wird einmal festgelegt und ist dann fix. Grundzüge der Programmierung - Hahsler 4 Erzeugung eines Arrays • Deklaration des Namens (Arrayvariable, Zeiger) int[] a; float[] vector; • Erzeugung des Arrays a = new int[5]; // Array mit Index 0...4 a Name a[0] a[1] a[2] a[3] a[4] Array Grundzüge der Programmierung - Hahsler 5 Benutzung eines Arrays • Arrayelemente werden durch den Index angesprochen und können wie normale Variablen verwendet werden int i=1, j=3; a[3]=0; a[2*i+1]=a[j]; // i und j sind int a[max(i,j)]=100; // max ist eine Fkt. • Zur Laufzeit wird geprüft ob der verwendete Index gültig ist (ob es das Element gibt) • a.length enthält die Länge des Arrays Grundzüge der Programmierung - Hahsler 6 Zuweisung eines Arrays • Einer Arrayvariable (Name des Arrays) dürfen alle Arrays des passenden Typs zugewiesen werden a int[] a; a=new int[5]; int[] b; a[0] a[1] a[2] a[3] a[4] 0 0 0 0 b null a a[0] a[1] a[2] a[3] a[4] 0 b=a; 0 b 0 0 0 0 b[0] b[1] b[2] b[3] b[4] a und b sind zeigen auf (referenzieren) das gleiche Array! Grundzüge der Programmierung - Hahsler 7 Freigabe von Arrays • Java verwendet zur Freigabe von Speicher eine automatische Speicherbereinigung (Garbage Collection) • Wenn kein Zeiger (Arrayvariable) mehr auf das Array zeigt, wird das Array gelöscht • die Arrayvariable wird verändert a=null; oder a=b; • die Arrayvariable verlässt den Bereich ihrer Lebensdauer Grundzüge der Programmierung - Hahsler 8 Initialisierung von Arrays • Arrays können schon bei der Deklaration initialisiert werden int[] primes = {2, 3, 5, 7, 11}; • Später können die Elemente nur noch einzeln (über den Index) zugewiesen werden Grundzüge der Programmierung - Hahsler 9 Typische Schleife für Arrays class Primes { public static void main (String[] args) { int[] primes = {2, 3, 5, 7, 11}; for (int i = 0; i < primes.length; i++) { System.out.print(primes[i] + " "); } } } Grundzüge der Programmierung - Hahsler 10 Bsp: Sequentielle Suche • Bei der sequentiellen Suche werden alle Elemente durchgegangen, bis das richtige Element gefunden wird static int search(int[] a, int x) { int pos = a.length-1; while (pos>=0 && a[pos]!=x) { pos--;} return pos; } static void main (String[] args) { int[] b= { 27, 11, 19}; Achtung: das Array wird nicht kopiert, int c= search(b,11); es wird nur eine "Referenz" auf das Array übergeben! } 11 Grundzüge der Programmierung - Hahsler Mehrdimensionales Array • Mehrdimensionale Arrays sind Arrays von Arrays • Bsp: Zweidimensionales Array (Matrix) int[][] a = new int[2][3]; a[0][0] a[0][1] a[0][2] a a[0] a[1][0] a[1][1] a[1][2] a[1] Grundzüge der Programmierung - Hahsler 12 Benutzung Mehrdimensionaler Array • Initialisierung int[][] a = { {1, 2, 3} {4, 5, 6} }; • Länge a.length // Zeilen a[0].length // Spalten Grundzüge der Programmierung - Hahsler 13 Nach dieser Einheit sollten Sie ... • Arrays erzeugen und über den Index benutzen können • Wissen was der Arrayname ist und was bei der Zuweisung von Arraynamen passiert Grundzüge der Programmierung - Hahsler 14