Informatik I Bachelor of Arts: Translation Studies for Information Technologies Teil 1 : Grundlagen, Historie und imperative Programmierung Stephan Mechler 1. Vorlesung 28.09.2017 Übersicht Was ist Informatik? ▪ ▪ Informatik ♦ Englisch: Computer Science, Wissenschaft vom Computer Was ist ein Computer? ♦ ...mehr: Ihre Ausarbeitung INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme → 2 Rechnerarchitektur - I Pascaline (1642 ) Soroban ~ 1600 MAC IBM-Thinkpad Resulta BS 7 Iphone / VR / KI Supercomputer INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ 3 Moorsches Gesetz Berechnungen pro Sekunde und 1000 Dollar INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ 4 Geschwindigkeiten INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ 5 Rechnerarchitektur - I Schema: Prozessor Speicher Controller/Bus Bus Peripherie VNA: ALU + Steuereinheit Speicherwerk Eingabe-/Ausgabewerk PC (schematisch): RAM +Northbridge FSB CPU Southbridge PCI/PCIe •Karten •Steckplätze •Interne Karten INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ 6 Rechnerarchitektur - Mainboard Mainboard (Stand 2011) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ 7 Rechnerarchitektur - Layout PC (Stand 2004 / 2010): INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ 8 Elementare Begriffe - 1 Was ist der Unterschied zwischen Daten und Information? ♦ Daten = physikalische Zustände + ihre Interpretation ♦ Information = Daten + ihre Bedeutung INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen 9 Elementare Begriffe – 2 Beispiel: 0010 1001 Speicherzustand Interpretation 2 9 Daten Bedeutung 29 °C Information INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen 10 Elementare Begriffe – 1 Informatik und Elektronische Datenverarbeitung (EDV) ▪ ▪ Informatik bezeichnet die Wissenschaft von der systematischen Verarbeitung von Informationen, insbesondere der automatischen Verarbeitung mit Hilfe von Rechenanlagen. Die Elektronische Datenverarbeitung ist der Sammelbegriff für die Erfassung und Manipulation von Daten durch Computer. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 11 Elementare Begriffe – 3 ▪ ▪ ▪ Daten- (oder Informations-) Verarbeitung ♦ Verknüpfung und Transformation von Daten nach bestimmten Vorschriften ♦ EVA-Prinzip: Eingabe-Verarbeitung-Ausgabe ♦ Diese Vorschriften nennt man Algorithmen Informatik: (im engeren Sinne) Wissenschaft von der elektronischen Datenverarbeitung (EDV), also mittels Computer Datenverarbeitung wird benutzt, um Probleme der realen Welt zu lösen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 12 Teildisziplinen Angewandte Informatik/Realisierung Technische Informatik Praktische Informatik Theoretische Informatik INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 13 Theoretische Informatik Theoretische Grundlagen der Informatik ♦ ♦ ♦ ♦ ♦ ♦ ♦ Theorie formaler Sprachen Automatentheorie Berechenbarkeits- und Komplexitätstheorie Graphentheorie Kryptologie Logik (u. a. Aussagenlogik und Prädikatenlogik), formaler Semantik Grundlagen für den Bau von Compilern von Programmiersprachen und die mathematische Formalisierung von Problemstellungen. Sie ist somit das formale Rückrat der Informatik. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 14 Technische Informatik Hardwareseitigen Grundlagen der Informatik ♦ Rechnerarchitektur ● Mikroprozessor ● Speicher ● Controller ● Peripherie ♦ Rechnerkommunikation ● Verteilten Systeme ● Grid-Computing ● Middleware INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 15 Praktische Informatik ▪ ▪ Entwicklung von Softwarekomponenten ♦ Elemente von Computerprogrammen (Datentypen, Datenstrukturen, Algorithmen) ♦ Softwaretechnologie (auch: SW-Engineering oder Programmiertechnik) ♦ Programmierverfahren (funktional, objektorientiert etc.) Systemsoftware ♦ Betriebssysteme ♦ Software-Entwicklungsumgebungen (Compiler, Debugger etc.) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 16 Angewandte Informatik ▪ ▪ Allgemeine Anwendungen ♦ Datenbanksysteme ♦ Informationssysteme ♦ Künstliche Intelligenz ♦ Computergrafik ♦ Bildverarbeitung ♦ Multimediasysteme ♦ Simulation Spezielle Anwendungsgebiete ♦ Wirtschaftsinformatik ♦ Medizinische Informatik ♦ Technische Informations- und Steuerungssysteme (z.B. Robotik) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 17 Bereiche ▪ ▪ ▪ Grundlagen (Formalwissenschaften: Mathematik, Natur-, Wirtschafts- und Ingenieurwissenschaften aber auch Linguistik oder Erkenntnistheorie) Informationssysteme und ihre Entwicklung Anwendung der Informatik (Medizin, Telekommunikation, Biotechnologie, Geschäfts- und Produktionsprozesse etc.) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 18 Betriebssysteme ▪ ▪ Was ist ein Betriebssystem: ♦ Software, die den Betrieb des Computers ermöglicht. ♦ Verwaltet Betriebsmittel wie Speicher, Einund Ausgabegeräte ♦ steuert und überwacht die Ausführung von Programmen. Englisch operating system (OS) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung → Java Beispiel 19 Programmiersprachen ▪ ▪ ▪ Was ist ein Programmiersprache: ♦ formale Sprache zur Erstellung von Verarbeitungsanweisungen ♦ Lesbar und verständlich für den Menschen lesbare Beschreibung heißt Quelltext Quelltext wird zur Abarbeitung in Maschinensprache überführt INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Betriebssysteme→ Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE 20 AUSBLICK ▪ ▪ Java „Crash-Kurs“ Elementare Begriffe der Programmierung INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 21 ??? Fragen Welche Fragen haben Sie? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 22 Zusammenhang der Programmiersprachen 1957 1960 1965 1970 Fortran I Lisp Cobol Algol-W Pascal Algol 60 PL/I Algol 68 C Fortran IV Basic Simula 67 BCPL 1975 Fortran 77 Smalltalk 80 1980 Common Ada Modula-2 1985 Lisp C++ ObjectPascal CLOS Ansi-C Delphi 1990 Fortran 90 Oberon-2 Java 1995 Fortran 95 Ada 95 2000 Fortran 2003* C# / .net INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 23 Was Ihnen keiner erzählt … Java ist mit 132.186 km2 die zweitgrößte Insel Sumatras Hauptstadt Jakarta 100 Vulkane Viele Bodenschätze … und Kaffeanbau INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 24 Geschichtliches ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ ▪ Java gibt es seit 1991 – ursprünglich: Oak Sun Microsystems - J. Gosling gedacht zur Steuerung von Haushaltsgeräten und in der Unterhaltungselektronik (Star Seven) 1994: Internet-Boom 1994 → Java, HotJava 1995: Netscape-Navigator 2.0 JavaSoft, http://java.sun.com 1995: Java Version 1.0; 1996: Version 1.1 1998: Version 1.2, Java 2, SE – ME – EE heute 1.4.x – Version 8.0 (Oracle) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 25 JETZT Die erste Tasse Java INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 26 Kommandozeile – 1 ▪ ▪ ▪ ▪ MS DOS-Eingabeaufforderung starten Start – Alle Programme – Zubehör –Eingabeaufforderung z:\ Unterverzeichnis anlegen md javueb1 In das Unterverzeichnis wechseln cd javueb1 Editor starten notepad Hello.java Neue Datei anlegen? – Ja INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 27 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 28 Kommandozeile – 2 public class Hello { public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 29 Kommandozeile – 3 ▪ ▪ ▪ ▪ Datei speichern (Prüfen Sie, ob Sie im Verzeichnis javueb1 speichern) Datei umbenennen (nur dann notwendig, wenn Sie den Editor ohne den Dateinamen als Parameter aufgerufen hatten) ren Hello.java.txt Hello.java Compilieren “c:\programme\java\jdk1.8.0_121\bin\javac“ Hello.java (… bitte warten …) Ausführen java -classpath “.“ Hello INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 30 Kommandozeile – 4 ▪ ▪ ▪ Funktioniert nicht? → Editor, kontrollieren Java unterscheidet Groß-/Kleinschreibung! Probieren Sie: java heLLo Ein paar typische Fehler werden in der Übung noch ausführlich besprochen … INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 31 Kommandozeile – 5 Java Quellcode Compiler ▪ ▪ ▪ Java Bytecode ▪ Virtuelle Maschine Laden, Verifizieren, Interpretieren Prozessor Java-Programme liegen in Form von so genannten Klassen vor. Ein Programm kann aus mehreren Klassen bestehen. Eine Klasse wird als Start-Programmteil festgelegt. (Kommt später) Wir werden zunächst nur mit Programmen arbeiten, die aus einer einzelnen Klasse bestehen. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 32 Achtung! Die erste Tasse Java und ganz viel Neues INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 33 Merke! Eine Klasse = Eine Datei Name Klasse = Name .java Datei INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 34 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 35 Nachbetrachtung! public class Hello { public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } } public, class, static, void, String = Schlüsselwörter Schlüsselwörter = Feststehende Begriffe der Sprache (feststehender Token / Lexik -> Grammatik) INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 36 Nachbetrachtung! public class Hello { class Hello { class = Eine Klasse wird class „Name“ { definiert. INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 37 Nachbetrachtung! public class Hello { public = Zugriffsattribut Zugriffsattribute legen fest, ob und wie andere Klassen auf die eigene Klasse zugreifen können INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 38 Nachbetrachtung! public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } main = Wenn eine Application gestartet wird, wird automatisch die Methode main() aufgerufen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 39 Nachbetrachtung! public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } System.out.println: System ermöglicht Zugriff auf StandardFunktionen des Computer-Systems Objekt out verwaltet Standardausgabe Daten, in “...“ zwischen () an println() übergeben werden, werden auf den Monitor - ausgegeben. INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 40 Nachbetrachtung! public class Hello { public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } } Verwaltung Anweisungen = Eingabe/Verarbeitung/Ausgabe INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 41 Nachbetrachtung! public class Hello { public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } } { } = Kapselung von Anweisungs- und Definitionsblöcken INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 42 Nachbetrachtung! public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } ; Jede Anweisung wird mit ; abgeschlossen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 43 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 44 Eclipse – 1 ▪ ▪ ▪ Eclipse starten Start – Alle Programme – Eclipse 3.x – Eclipse (… Bitte warten bis zu 2 Minuten …) Select a workspace – z:\inf1\workspace – Checkhaken bei Use this as default – Ok Startbildschirm: Der Pfeil rechts oben führt Sie zur Oberfläche. Falls Sie irgendwann zum Startbildschirm zurückkehren wollen: Help – Welcome Anlegen eines neuen Java Projektes ♦ File – New – Project… ♦ New Project: Wizards – Java Project – Next ♦ Eingabe eines Projektnamens, dann Finish INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 45 Eclipse – 2 ▪ ▪ ▪ Anlegen einer Java Klasse ♦ Rechte Maustaste auf dem Projekt, New – Class ♦ Im Name field einen gültigen Klassennamen eingeben ♦ Checkhaken bei public static main (Strings[] args) ♦ Finish In der Methode main folgendes eingeben: System.out.println("Hallo Mannheim!"); Speichern mit STRG-S Dabei wird automatisch compiliert! INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 46 Eclipse – 3 Für Ihre ersten Schritte werden Sie ausschließlich zwischen diesen beiden, automatisch generierten, Klammern programmieren. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 47 Eclipse – 4 ▪ ▪ ▪ ▪ ▪ Run – Run As – Java-Application Im Fenster unten rechts in den Reiter Console umschalten Run in der Toolbuttonleiste zur wiederholten Ausführung oder [STRG]-[F11] Aufpassen bei Projektwechsel! Der Button in der Toolbuttonleiste startet noch das "alte" Projekt. Weiteres zum Umgang mit Eclipse folgt … INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 48 Eclipse – 5 Weitere Informationen unter: ▪ ▪ ▪ ▪ Eclipse FAQ http://wiki.eclipse.org/index.php/Eclipse_FAQs Eclipse Dokumentation http://www.eclipse.org/documentation/ Sehr guter Einführungsartikel in Eclipse, u.a. mit weiterführenden Informationen zum Debugging etc. http://www.cs.umbc.edu/courses/undergraduate/CMS C341/Lectures/Eclipse/intro-to-eclipse.pdf (bis S.35) B. Daum: Java-Entwicklung mit Eclipse 3; dpunkt; ISBN 389864281X; 44,00 € INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 49 Eclipse Eclipse = IDE IDE = Integrierte Entwicklungsumgebung. Ein Anwendungsprogramm zur Entwicklung von Software. (engl. Integrated Development Environment) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 50 IDE IDE ▪ ▪ ▪ ▪ ▪ Texteditor Compiler bzw. Interpreter Linker Debugger Quelltextformatierungsfunktion Meist wird nur eine Programmiersprache unterstützt. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen 51 Vorteile von Eclipse ▪ ▪ ▪ ▪ Vereinfachte Projektabwicklung Fehler werden gleich angezeigt Inkrementeller Compiler Eingebauter Debugger INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen 52 Hilfe in Eclipse INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) 53 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen 54 Das zweite Beispiel – 1 import java.io.*; public class Celsius { public static void main(String[ ] args) throws IOException { // Benötigte Variablen deklarieren String eingabeZeile; double c = 0.0; double f ; // möglich ist auch: double c=0.0, f; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 55 Das zweite Beispiel – 2 // Für die Eingabe von der Tastatur BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in)); // Berechnungsschleife do { // Anleitung ausgeben System.out.println( "Programm endet durch Eingabe von 0"); System.out.println("Eingabe der Celsius-Temperatur: "); // Eingabe, Double-Wer einlesen eingabeZeile = eingabe.readLine(); c = Double.parseDouble(eingabeZeile); INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 56 Das zweite Beispiel – 3 // Umrechnen in Fahrenheit f = c * 9.0/5.0 + 32.0; // Ausgabe des Ergebnis System.out.println("... in Fahrenheit: " + f + " Grad \n"); // Schleife durch Eingabe von 0 verlassen } while ( c != 0 ); System.out.println("... und tschüss"); } } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 57 Wichtig! Neues? INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 58 Schlüsselwort import import java.io.*; Mit import werden “Hilfsmittel” aus “Paketen” ins Programm importiert. java.io und java.util sind Paketnamen. Das Sternchen "*" steht für alle “Hilfsmittel” in diesem Paket. (mehr dazu in späteren Folien...) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 59 Schlüsselwort throws public static void main(String[ ] args) throws IOException { Kann eine methode einen bestimmten Fehler erzeugen muss dieser mit dem Schlüsselwort throws gekennzeichnet werden (mehr dazu in späteren Folien...) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 60 Schlüsselwort do do { ... } while ( c != 0 ); Eine Wiederholung: Schleife “Mache solange Bedingung erfüllt“ (mehr dazu in späteren Folien...) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 61 Variablen & Datentypen String eingabeZeile; double c = 0.0; String, double = Datentypen eingabeZeile, c = Variablen Man muss eine Variable definieren! Mann definiert Sie in dem man ihren Datentyp (bzw. Wert) festlegt. Der Datentyp gibt den “Wertebereich” vor. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 62 Variablen & Datentypen Beispiel Wertebereichs double: 64-bit Gleitpunktzahl Primitive Wertebereich : ±1.79769313486231570 E+308 und ±4.94065645841246544 E-324 63 Bit Bit 0 52 Bit ......... Exponent (e) Vorzeichen (v) Mantisse (1+m) (mehr dazu in späteren Folien...) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 63 Eingabe über Tastatur // Für die Eingabe von der Tastatur BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in)); .. eingabeZeile = eingabe.readLine(); (mehr dazu in späteren Folien...) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 64 Eine Berechnung // Umrechnen in Fahrenheit f = c * 9.0/5.0 + 32.0; Speichere in der Variable f das Ergebnis aus Inhalt der Variablen c mal Neun geteilt durch Fünf plus Zweiunddreißig (mehr dazu in späteren Folien...) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 65 Wichtig! Kommentare INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 66 Kommentaren mit // Kommentare mit // enden am Zeilenende Beispiele Kommentar am Zeilenende f = c * 9.0/5.0 + 32.0; // Umrechnen in Fahrenheit // Ausgabe des Ergebnis System.out.println("... in Fahrenheit: " + f + " Grad \n"); ... Kommentarzeile Bei jeder Code-Änderung in diesem Bereich müssen die Kommentare ständig umformatiert werden, um "schön" auszusehen Negativ-Beispiele f = 0; max = 10; mid = min + (max – min) / 2; i = i + 1; // Hier wird f auf 0 gesetzt // Maximalwert festlegen // Mitte berechnen // die Variable i wird um 1 erhöht Trivialkommentar: Das sieht man ohne Kommentar (später) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 67 Kommentaren mit /* */ Blockkommentare beginnen mit /* und enden mit */ Diese Kommentare können sich über mehrere Zeilen erstrecken /* Beginn des Blocks Beispiel /** * Hauptroutine zur Ausgabe von Hallo Mannheim * */ public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } */ Ende des Blocks INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 68 Kommentare - Warum? Kommentare dienen hauptsächlich der Dokumentation von Programmen damit sie auch Personen, die nicht an der Programmierung beteiligt waren, verstehen können und damit derjenige, der sie programmiert hat, sie besser nachvollziehen, erklären und bei Bedarf ändern kann, wenn er sich einige Zeit nicht mit ihnen beschäftigt hat 60 – 70% aller Entwicklungsarbeiten sind Wartung und Weiterentwicklung! INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 69 Das zweite Beispiel – 4 ▪ ▪ Download unter http://services.informatik.hs-mannheim.de/~mechler/ Unter Eclipse ein Projekt anlegen, markieren und dann ♦ Importieren über File – Import … FileSystem – Directory auswählen – auf der rechten Seite vor Celsius Java einen Checkhaken setzten – Import (dabei muss vorher der entsprechende Projektname im Package Explorer, linkes Fenster, markiert sein!) ♦ oder (Windows) Drag'n'Drop der .java Datei auf das Projekt Icon in Eclipse INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 70 Weiteres Beispiel – 4 ▪ ▪ ▪ Download unter http://services.informatik.hs-mannheim.de/~mechler/ Summe.java Neu hier: StringTokenizer t = new StringTokenizer(eingabeZeile,"+"); Zerteilt einen Text am „+“ INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 71 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 72 JETZT! Programmentwurf Programmentwurf INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 73 Können Sie das lesen? Nach eienr Stidue der Cmabridge Uinverstiät, ist es eagl in wlehcer Reiehnfogle die Bchustebaen in Wöretrn vokrmomen. Es ist nur withcig, dsas der ertse und lettze Bchusatbe an der ricthgien Stlele snid. Der Rset knan total falcsh sein und man knan es onhe Porbelme leesn. Das ist so, wiel das mneschilche Geihrn nciht jeden Bchustbaen liset sodnern das Wrot als gaznes. Krsas oedr? INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 74 Programm ▪ ▪ ▪ Folge von Befehlen (Arbeitspeicher) Selbstständiges Erfüllen von Aufgaben Serielle Abarbeitung Allgemein ein in einer Programmiersprache formulierte Vorschrift mitsamt den zugehörigen Datenbereichen Programm → konkret. Es ist im exakt definierten und eindeutigen Formalismus einer Programmiersprache verfasst, nimmt Bezug auf bestimmte Darstellungen der verwendeten Daten und ist auf einer Rechenanlage ausführbar Häufig auch Teillösungen (Unterprogramme etc.) beiläufig als Programm bezeichnet INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 75 Test! ▪ ▪ ▪▪ ▪▪ Start des Programms Speicher unter Speichere unterdem dem Variablennamen i den Wert 1 Wert Gebe1 den Wert von i aus, bis Ergebnis: 1 2 3 i einensolange Gebe Wert größer den Wert als 100 von i hat. inne aus,Prüfe bis i einen jedochWert vorher, größer ob i denals Wert 10039 inne erreicht, hat. Prüfe jedoch speichere dann vorher, den Wert ob i 61 den Wert unter dem39 Variablennamen erreicht, i. speichere Erhöhe ansonsten dann deni Wert immer um 61 unter dem 1. Variablennamen i. Beende das Programm ... Beende das Programm 100 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 38 39 61 62 ... 76 Struktogramme – 1 ▪ ▪ ▪ ▪ 1973 eingeführt von I. Nassi und B. Shneiderman als Darstellungsmittel für Algorithmen 11 Symbole + Erweiterungen DIN 66261 B etragPruefen Beispiel: Eingabe a Eingabe b a>b? ja nein Ausgabe a Ausgabe b INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 77 Struktogramm – 2 ▪ ▪ ▪ ▪ grafische Darstellung in Form eines geschlossenen Blocks logische Unterstrukturen werden in Unterblöcke unterteilt verschiedene Symbole für verschiedene Operationsarten Betrachtung von oben nach unten (top-down) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 78 Struktogramm – 3 Prozess ▪▪ ▪ Verarbeitung, Prozess Rahmen enthält die weiteren Operationen wie z.B. ♦ Zuweisungen ♦ Ein-/Ausgabebefehle ♦ Unterprogrammaufrufe etc. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 79 Struktogramm – 4 Anweisung ▪ weiteren Operationen wie z.B. ♦ Zuweisungen ♦ Ein-/Ausgabebefehle ♦ Unterprogrammaufrufe etc. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 80 Struktogramm – 5 Anweisung 1 Anweisung 2 Anweisung 3 ▪ ▪ Folge, Sequenz Mehrere Arbeitsschritte werden durch Folge von Strukturblöcken dargestellt INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 81 Struktogramm – 6 Bedingung ja nein Strukturblock 1 Strukturblock 2 Alternative, Verzweigung Stellen einer Bedingung erfüllt → weiter bei Strukturblock 1 nicht erfüllt → weiter bei Strukturblock 2 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 82 Struktogramm – 7 Auswahl 1 Strukturblock 1 2 Strukturblock 2 sonst Alternativblock Fallauswahl, Mehrfachverzweigung Treffen einer Auswahl (z.B. Wert einer Integervariable) jeweils erfüllt → weiter bei jeweiligem Strukturblock nicht erfüllt → weiter bei Alternativblock INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 83 Struktogramm – 8 Wiederholen, solange Eingangsbedingung gilt Strukturblock 1 Strukturblock 1 Wiederholen, solange Bedingung gilt Wiederholung, Schleife Anweisungsblock im Strukturblock wird solange wiederholt, solange die Bedingung erfüllt ist Kopfgesteuerte, abweisende Schleife Fußgesteuerte, annehmende Schleife INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 84 Struktogramm – 9 Unterprogrammaufruf (oder ausgegliederter Strukturblock) Aufruf Unterprogrammaufruf, Funktion, Prozedur aber auch "wenn der Platz nicht reicht" in dem Fall aber besonders kennzeichnen Struktogramme passen auf DIN A4 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 85 Struktogramm – 10 Zielort für Aussprung Aussprung Beendigung eines Programmteils INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 86 Struktogramm – Übung Ziel: Ausgabe der Zahlenreihe: 1 2 3 4 5 6 7 8 9 10 Variante I Variante II i=0 i=1 i = i +1 Ausgabe i Ausgabe i i = i +1 i < 10 STRUKT2 i < 11 i=1 Ausgabe i i = i +1 Variante III i=0 Ausgabe i i < 10 i < 10 Variante IV i=1 i < 11 i = i +1 Ausgabe i Ausgabe i i=i+1 .....viele Wege führen zum Ziel INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 87 StruktEd Hus / StruktEd Drag'n'Drop Sehr gute OnlineHilfe Ausdruck oder: [STRG] + G Achtung! Drucker muss installiert sein! INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 88 Info! ♦ Dafür sorgen, dass für die Übungen alles funktioniert ♦ Eclipse installieren; zuerst Java 8.0, dann Eclipse ♦ Rechtzeitig: Folien, Übung ♦ Literatur INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 89 ??? Fragen Welche Welche Entwurfsmethoden Entwurfsmethoden kennen kennen Sie Sie noch? noch? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 90 Weitere Methoden – 1 ▪ Programmablaufplan, PAP ♦ Flussdiagramm oder ♦ Ablaufdiagramm etc. ♦ DIN 66001 ♦ durch Pfeile (Strukturlaufrichtung) ♦ verbundene Symbole Start Eingabe a Eingabe b Ja a>b? Ausgabe a Nein Ausgabe b Ende INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 91 Weitere Methoden – 2 ▪ Pseudocode ♦ Pascal-ähnliche Notation: begin BetragPruefen Eingabe(a); Eingabe(b); if a > b then Ausgabe(a); else Ausgabe(b); end if end BetragPruefen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 92 Weitere Methoden – 3 ▪ ▪ ▪ ▪ UML Ist: ♦ ♦ Objekt-orientierte (Design-)Methode ♦ Beschreibung sowohl von Software als auch von Geschäftsprozessen. Quasi-Standard bei der objektorientierten SoftwareEntwicklung. UML Ziele: ♦ ♦ ♦ objektorientierte Modellierung von Systemen Verknüpfung von Analyse und Entwurf spezielle Anforderungen bei Entwicklung komplexer Systeme Vielzahl graphischer Darstellungstechniken INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 93 Weitere Methoden – 4 ▪ ▪ OOD (Object Oriented Design, Vorgänger von UML) Jackson- oder Warnier-Orr-Diagramm (8 Basisblöcke) ▪ Entscheidungstabellen ▪ Weitere Strukturdiagramme INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 94 Beispiel – 1 U m r e c h n u n g C e ls iu s F a h r e n h e E in g a b e C e ls iu s F a h r e n h e it = C e ls iu s * 9 /5 + 3 2 A u s g a b e F a h r e n h e it s o la n g e C e ls iu s u n g le ic h 0 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 95 Beispiel – 2 Geldautomat Beginn solange Geldautomat bereit Geldkarte einführen Anzahl Fehlversuche lesen Geldkarte lesbar & Anzahl Fehlversuche < 3 ja nein PIN eingeben PIN ok ? ja nein Anzahl Fehlversuche Anzahl Fehlversuche auf 0 setzen um 1 erhöhen Geldkarte einziehen Geldbetrag wählen Geldkarte entnehmen Geldkarte entnehmen Geld entnehmen Ende INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 96 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 97 JETZT Algorithmen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 98 Algorithmus Begriff: Ein Algorithmus ist ein Verfahren mit einer ♦ präzisen (d.h. in einer genau festgelegten Sprache formulierten) ♦ endlichen Beschreibung unter Verwendung ♦ effektiver (d.h. tatsächlich ausführbarer) ♦ elementarer Verarbeitungsschritte Zu jedem Zeitpunkt der Abarbeitung des Algorithmus benötigt dieser nur endlich viele Ressourcen ▪ ▪ INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 99 Historie ▪ ▪ ▪ Muhammad ibn Musa al-Chwarazmi (* ca. 783; † ca. 850) Buch: Über das Rechnen mit indischen Ziffern (um 825) Erster Computeralgorithmus (1842 von Ada Lovelace, Notizen zu Charles Babbages Analytical Engine) Turingmaschinen und Algorithmusbegriff (Alan Turing 1936) „Berechnungsvorschriften zur Lösung eines Problems heißen genau dann Algorithmus, wenn eine zu dieser Berechnungsvorschrift äquivalente Turingmaschine existiert, die für jede Eingabe, die eine Lösung besitzt, stoppt“ INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 100 Kochbuch INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstantenp 101 Kochbuch Wie koche ich mir (m)einen Algorithmus? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 102 Entwurf Der Entwurf von Algorithmen ist ein kreativer Prozess, der nicht automatisiert werden kann. ▪ ▪ unabhängig Programmiersprachen unabhängig von der Rechner-Hardware INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 103 Beispiel Aufgabe: Summiere alle Zahlen zwischen 1 und 100 Lösung: 1+2+3+4+...+99+100 = 5050 Lösung: 1+100 + 2+99 + 3+98 + .... + 50 + 51 = 50 * 101 = 5050 INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 104 Algorithmus definierte Handlungsvorschrift zur Lösung eines Problems INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 105 Abgrenzung Heuristik (griech.: Kunst des Findens bzw. Erfindens). Informatik: geschickte Lösung mit wenig Aufwand INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 106 Korrektheit/ Terminierung ▪ ▪ Ist das Problem lösbar? Welche Schritte müssen ausgeführt werden, um einen korrekten Algorithmus zu erhalten? Korrekt heißt: ♦ Der Algorithmus erzeugt ein Resultat (ist endlich). ♦ Das Resultat ist das gesuchte. INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 107 Weitere Forderungen ▪ ▪ ▪ ▪ ▪ ▪ ▪ Effizienz Benutzerfreundlichkeit Flexibilität Robustheit/Stabilität Lesbarkeit Wiederverwendbarkeit ... Diese Forderungen sind optional - aber wichtig ! INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 108 Los geht's: Kochen Zutaten Kochwerkzeug Grundrezepte INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 109 Vergleich: Kochen Zutaten Kochwerkzeug Compiler IDE Debugger Variablen Konstanten Felder Schleifen Bedingungen Zuweisungen Bibliotheken Grundrezepte Suchen Sortieren Rekursion usw. usw. usw. INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 110 Resultate Wie erreiche ich beim Kochen ein (gutes) Resultat: ▪ ▪ ▪ (Aus)probieren Erfahrung Rezept INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 111 Analogie Algorithmus → Rezept INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 112 Nachgefragt? Wie komme ich beim Kochen zu einem Rezept? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 113 Nachgefragt? Wie erhalte ich ein Rezept: ▪ ▪ ▪ ▪ Kaufen (Kochbuch) Ausprobieren Erfahrung Verfeinern INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 114 Beispiel Rezept: Spaghetti ▪ ▪ ▪ ▪ ▪ Koche Wasser Gebe Salz und Öl zu Gebe Spaghetti hinzu Warte 10 min Prüfe ob Spaghetti weich, ansonsten warte 1 min Algorithmus: Summiere Zahlen bis 100 ▪ ▪ ▪ ▪ Setzte Summe auf 0 und die Zahl i auf 1 Addiere die Zahl i auf die Summe und erhöhe i um 1 Wiederhole obigen Schritt 100 mal Gib das Ergebnis aus INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 115 bevor ich koche ▪ ▪ Bevor ich koche: ♦ Was will ich kochen? ♦ Für wen? ♦ Wieviel? ♦ Was habe ich zur Verfügung? ♦ usw. Algorithmus: ♦ Spezifikation der Problemstellung (Soll/Ist) INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 116 Beginnen! ▪ ▪ Kochen: ♦ Mit dem Kochen Beginnen Algorithmus: ♦ Auf der Basis der Erkenntnisse implementieren INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 117 Check! ▪ ▪ Kochen: ♦ Resultat genießbar ♦ Resultat war das gewünschte? ♦ Kostengünstig gekocht, schnell? ● Falls nicht: Rezept überdenken Algorithmus: ♦ Resultat erhalten (lösbar) ♦ Resultat entspricht Spezifikation ♦ Algorithmus effizient? ● Falls nicht: Algorithmus beschleunigen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 118 Spiegelei... ▪ ▪ ▪ Eier aufschlagen In die Pfanne warten straightforward INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 119 Große Menüs Gebeizter Lachs mit Kräutersahne Blattsalat und Kartoffelpuffer *** Knusprige Ente mit Blaukraut und Reibeknödel *** Lebkuchenmousse mit Mandarinensorbet INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 120 JETZT Anweisungsfolgen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 121 Zerlegung: Menü ▪ Gebeizter Lachs mit Kräutersahne ♦ Lachs beizen ● Lachs ausnehmen, ... usw., usw. ♦ Kräutersahne herstellen ● Kräuter waschen, ... usw., usw. ▪ Blattsalat und Kartoffelpuffer ♦ Blattsalat herstellen ● Waschen, ... usw., usw. ♦ Kartoffelpuffer, ... usw., usw. ▪ Knusprige Ente .... INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 122 Dessert - Descartes Maxime "Regeln zur Leitung des Geistes" (Descartes franz. Philosoph und Mathematiker, 1628): 1. Übereilung und Vorurteil sind sorgfältig zu meiden. 2. Jede der zu untersuchenden Schwierigkeiten ist in soviele Teile zu zerlegen, wie es möglich und zur besseren Lösbarkeit wünschenswert ist. 3. Mit den einfachsten und faßlichsten Objekten ist zu beginnen und von da aus schrittweise zur Erkenntnis der kompliziertesten fortzuschreiten. 4. Hinreichend vollständige Aufzählungen und allgemeine Übersichten sind anzufertigen, um sicher zu gehen, daß nichts ausgelassen wurde. Dies sind allgemeine Regeln, die jedem Problemlöser kommen. Für den Fall daß das zu entwerfende Verfahren einer Maschine zur Ausführung überantwortet werden soll, nehmen sie eine spezielle Gestalt an ..... INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 123 Von oben oder unten? Variante I: Ich plane das Menü, dann kümmere ich mich um die Gänge Dann die Speisen der Gänge Dann die Zutaten ▪ ▪ ▪ ▪ Variante II: Ich schaue nach den Zutaten Daraus kombiniere ich Speisen Aus den Speisen Gänge Aus den Gängen das Menü ▪ ▪ ▪ ▪ INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 124 Top-down, bottom-up? Top-Down: ♦ Gefahr: Man bemerkt spät Probleme Bottom-Up: ♦ Gefahr: Lösung passt nicht zum Problem ▪ In der Praxis werden die Methoden oft Kombiniert INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 125 bon appétit! Beinahe hätten wir das Beste vergessen: ▪ ▪ Gekochtes essen ! Algorithmus: anwenden INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 126 Vorgehensweise ▪ ▪ ▪ ▪ ▪ ▪ Spezifikation der Problemstellung Bestimmung der Definitionsbereiche Suche nach / Vergleich mit bekannten Algorithmen, eventuell Erweiterung oder Anpassung der bekannten Algorithmen Anwendung von ad-hoc-Lösungsmethoden (mit anschließender Korrektur) Zerlegung des Problems in Teilprobleme ("divide and conquer"Vorgehensweise); auf jeder Zerlegungsebene Verwendung von ♦ ♦ ♦ Sequenz von Schritten Fallunterscheidung (Alternativen) Iteration von Schritten (Schleifen) Wiederhole diese Vorgehensweise für jedes Teilproblem INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 127 Hinkucker... INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 128 JETZT Java Java INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 129 Programmiersprachen Programmiersprachen werden benötigt, um Algorithmen für Computer verständlich zu formulieren Wir unterscheiden Maschinensprache und Assembler von höheren (oder problemorientierten) Programmiersprachen Höhere Sprachen enthalten folgende Sprachkonstrukte (Sprachelemente) Vereinbarungen Anweisungen Ausdrücke Diese Konstrukte existieren in fast allen Sprachen, jedoch in unterschiedlicher Ausprägung Es gibt einige weitere Hilfskonstrukte INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 130 Vereinbarungen Vereinbarungen dienen dazu, Namen für Bestandteile von Programmen (z.B. Typen, Variablen, Methoden) einzuführen Unterschieden werden Definitionen und Deklarationen Bestimmte Vereinbarungen sind in Java bereits vordefiniert; sie werden durch ein Schlüsselwort bezeichnet INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 131 Reservierte Schlüsselwörter abstract case const else for implements interface operator public strictfp throw void boolean cast continue extends future import long outer rest super throws volatile break catch default final generic instanceof native package return switch transient while byte char do finally goto int new private short synchronize try byvalue class double float if inner null protected static this var Obwohl die mit blau gekennzeichneten Wörter zurzeit nicht von Java benutzt werden, können doch keine Variablen dieses Namens definiert werden. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 132 Ausdrücke Alle Ausdrücke haben einen bestimmten Typ, man sagt auch sie sind von einem bestimmten Typ In Ausdrücken werden Werte oder (geschachtelte) Ausdrücke durch Operatoren zu (größeren) Ausdrücken zusammengesetzt INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 133 Anweisungen Anweisungen definieren den Programmablauf, sie enthalten Ausdrücke Zu den Anweisungen gehören je nach Programmiersprache Zuweisungen Anweisungsfolgen Leere Anweisungen Prozedur-, Funktions-, Methoden-Aufrufe Bedingungen Schleifen etc. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 134 Weitere Begriffe (Lexikalische Analyse) Token ♦ zusammenhängendes Wort über einem Alphabet, getrennt vom nächsten Token durch Whitespaces ♦ Alphabet: z.B. Buchstaben, aber auch: Zahlen ♦ Whitespaces: Leerzeichen, Zeilenumbruch, aber auch: Klammern, Komma, Semikolon Literal ♦ konkrete Angabe eines Zahl-, Zeichen- oder Zeichenkettenwertes im Quellcode ♦ Wertkonstante INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 135 Sprachbeschreibung von Java http://docs.oracle.com/javase/specs/ INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 136 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 137 JETZT! Elementare Elementare Datentypen, Datentypen, Operationen Operationen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 138 Wie geht's weiter? Vordefinierte Datentypen Boolean Ganzzahlige Datentypen Operationen auf ganzzahligen Datentypen Reelle Zahlen Operationen auf reellen Zahlen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 139 Vordefinierte Datentypen Java definiert bereits eine Reihe von einfachen oder Elementar-Datentypen Sie werden Primitive Types (im Sinne von "nicht weiter reduzierbar") genannt PrimitiveType: NumericType boolean NumericType: IntegralType FloatingPointType IntegralType: one of byte short int long char FloatingPointType: one of float double INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 140 Der Datentyp boolean – 1 „Almost all true is entirely a lie“ - a Yiddish folk-saying Der Datentyp boolean umfasst die beiden Werte true und false Folgende Operationen sind auf diese Werte anwendbar: ==, !=, ^, !, &, &&, |, ||, ihr Ergebniswert berechnet sich nach den folgenden Regeln Wird == auf zwei Boole'sche Operanden angewendet, ist das Ergebnis genau dann true, wenn beide Operanden true sind oder beide Operanden false sind; sonst ist das Ergebnis false == false true false true false true false true INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 141 Der Datentyp boolean – 2 Wird != auf zwei Boole'sche Operanden angewendet, ist das Ergebnis genau dann true, wenn einer der Operanden true und der andere false ist; sonst ist das Ergebnis false Der Operator ^ liefert das gleiche Ergebnis wie !=, wenn er auf Boole'sche Operanden angewendet wird Wird der einstellige Operator ! auf einen Boole'schen Operanden angewendet, ist das Ergebnis gleich dem negierten Operanden, d.h. aus true wird false und aus false wird true INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 142 Der Datentyp boolean – 3 Wird & auf zwei Boole'sche Operanden angewendet, ist das Ergebnis genau dann true, wenn beide Operanden true sind; sonst ist das Ergebnis false Es werden auf jeden Fall beide Operanden ausgewertet Der Operator && liefert das gleiche Ergebnis wie &, wenn er auf Boole'sche Operanden angewendet wird, aber: Der rechte Operand wird nur ausgewertet, wenn der linke Operand zu true ausgewertet wurde ("unnötige Arbeit" wird vermieden) Man spricht von verkürzter Auswertung INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 143 Der Datentyp boolean – 4 Wird | auf zwei Boole'sche Operanden angewendet, ist das Ergebnis genau dann true, wenn mindestens einer der Operanden true ist; sonst ist das Ergebnis false Es werden auf jeden Fall beide Operanden ausgewertet Der Operator || liefert das gleiche Ergebnis wie |, wenn er auf Boole'sche Operanden angewendet wird, aber: Der rechte Operand wird nur ausgewertet, wenn der linke Operand zu false ausgewertet wurde ("unnötige Arbeit" wird vermieden) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 144 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 145 Ganzzahlige Datentypen – 1 Folgende ganzzahlige Datentypen sind in Java vordefiniert: byte, short, int, long, char Sie werden in Java als Integral Type bezeichnet; sonst spricht man auch von Integer- oder Ordinal-Werten Ihre Wertebereiche sind auf allen Prozessoren und Betriebssystemen identisch definiert (das ist nur durch die Virtuelle Maschine möglich!) Das gleiche gilt für das Rechnen mit diesen Datentypen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 146 Ganzzahlige Datentypen – 2 byte: von -128 bis 127 Das entspricht von –27 bis 27–1 Das entspricht den Werten Byte.MIN_VALUE bis Byte.MAX_VALUE short: von –32.768 bis 32.767 Das entspricht von –215 bis 215 –1 Das entspricht den Werten Short.MIN_VALUE bis Short.MAX_VALUE int: von –2.147.483.648 bis 2.147.483.647 Das entspricht von –231 bis 231 –1 Das entspricht den Werten Integer.MIN_VALUE bis Integer.MAX_VALUE long: von –9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807, also von ca. -9*1018 bis 9*1018 Das entspricht von –263 bis 263 –1 Das entspricht den Werten Long.MIN_VALUE bis Long.MAX_VALUE Die angegebenen Grenzen sind im jeweiligen Wertebereich enthalten INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 147 Notation von Ganzzahl-Literalen Ganze Zahlen im Programm werden (sofern nicht anders gekennzeichnet) intern immer als Wert vom Typ int dargestellt Das gilt auch, wenn ihr Wert in einen byte- oder short-Typ passen würde (Näheres dazu später) Ganze Zahlen, die intern als long dargestellt werden sollen, werden durch ein nachfolgendes "L" oder "l" (kleines "L") gekennzeichnet (Achtung: kein Leerzeichen erlaubt!) Beispiele 12L 123456789L 234l Achtung: das "l" wird gerne mit "1" oder mit "|" verwechselt, → "L" ist zu bevorzugen Ganze Zahlen, die außerhalb der int-Grenzen liegen, müssen mit "L" gekennzeichnet werden INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 148 Operationen auf ganzzahligen Typen – 1 Einstellige Operatoren: - negiert die angegebene Zahl + (hat keinen Effekt) Arithmetische Operatoren + Addition - Subtraktion * Multiplikation / Division: schneidet bei ganzen Zahlen ab, d.h. rundet nicht % Rest einer Ganzzahl-Division Addition und Multiplikation von ganzen Zahlen gleichen Typs in JavaProgrammen sind assoziativ (wenn keine Seiteneffekte bei der Berechnung auftreten) und kommutativ INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 149 Operationen auf ganzzahligen Typen – 2 Im Fall von ungleichen Typen der beteiligten Operanden – Zunächst wird die Zahl des kleineren Typs in die äquivalente Zahl des größeren Typs konvertiert – Dann erst wird gerechnet – Das Ergebnis ist eine Zahl des größeren Typs Im Fall, dass das Ergebnis einer Operation nicht in die Zahl des größeren Typs passt – Die Operation wird durchgeführt – Die oberen (höchstwertigen) Bits des Ergebnisses werden abgeschnitten – Nur diejenige Anzahl von Bits, die entsprechend des Ausdruckstyps dargestellt werden können, wird als Ergebnis geliefert → Achtung: Ein eventueller Integer-Überlauf muss vom Programmierer vermieden werden (die Sprache/die VM sorgen nicht dafür) Verlorengehen kann sonst ein Teil des Ergebniswertes und/oder sein Vorzeichen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 150 Operationen auf ganzzahligen Typen – 3 Beispiele für die ganzzahlige Division 11 / 4 =? 2 11 / -4 → =? -2 -11 / 4 → =? → -11 / -4 = ? -2 → 2 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 151 Operationen auf ganzzahligen Typen – 4 Die Wirkung von % ist festgelegt durch die Gleichung a % b = a – (a / b) * b Wichtig: Übung Beispiele für die Rest-Berechnung bei einer ganzzahligen Division 11 % 4 = ? → 11 – (11 / 4) * 4 = 11 – 8 = 3 11 % -4 = ? → 11 – (11 / -4) * (-4) = 11 – 8 = 3 -11 % 4 = ? → -11 – (-11 / 4) * 4 = -11 – (-8) = -3 -11 % -4 = ? → -11 – (-11 / -4) * (-4) = -11 – (-8) = -3 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 152 Operationen auf ganzzahligen Typen – 5 Java implementiert den ANSI/IEEE 754 - Standard Eine Division (mit / oder %) durch 0 führt zu einer ArithmeticException (entspricht in etwa einem Laufzeitfehler – kann abgefangen werden) Tritt beim Programmlauf eine ArithmeticException auf, so wird das angezeigt und das Programm bricht ab Beispiel: Division durch Null java.lang.ArithmeticException: / by zero at uebung03.GanzeZahlen.main(GanzeZahlen.java:28) Exception in thread "main" Dateiname INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Zeilennummer Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 153 Operationen auf ganzzahligen Typen – 6 Vergleichsoperatoren, oder relationale Operatoren == Test auf Gleichheit != Test auf Ungleichheit < Test auf Kleiner-Als > Test auf Größer-Als <= Test auf Kleiner-oder-Gleich >= Test auf Größer-oder-Gleich Relationale Operatoren liefern ein Ergebnis vom Typ boolean, also true oder false INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 154 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 155 Reelle Zahlen – 1 Java unterscheidet zwei Arten reeller Zahlen, die sich durch ihre Genauigkeit und ihren Wertebereich unterscheiden float Neben der 0.0 sind positive Zahlen im Bereich von 1.40239846 *10-45 bis 3.40282347*10+38 darstellbar, negative entsprechend Das entspricht einer 32-Bit-Zahldarstellung Das entspricht den Werten Float.MIN_VALUE bis Float.MAX_VALUE double Neben der 0.0 sind positive Zahlen im Bereich von 4.94065645841246544*10-324 bis 1.79769313486231570*10+308 darstellbar, negative entsprechend Das entspricht einer 64-Bit-Zahldarstellung Das entspricht den Werten Double.MIN_VALUE bis Double.MAX_VALUE Auch für reelle Zahlen implementiert Java den ANSI/IEEE 754 Standard INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 156 Variablen & Datentypen float: 31 Bit 32-bit Gleitpunktzahl 23 Bit Bit 0 ......... Exponent (e) Vorzeichen (v) double: 63 Bit Mantisse (1+m) 64-bit Gleitpunktzahl 52 Bit Bit 0 ......... Exponent (e) Vorzeichen (v) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Mantisse (1+m) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 157 Variablen & Datentypen Rechenbeispiel (double) -0,75 nach IEEE 754: (- 1)v * (1+ Mantisse)* 2(Exponent + Bias) - 0.75dec = - 3 / 4dec = - 3 / 2 2dec = 11bin / 2 2dec = -11bin * 2-2dec | 1. Umformen sodass eine Binärzahl verbleibt = - 0.11bin = - 0.11bin * 2 0 = -1.1 bin * 2 -1 | 2. Auf Formel unformen und diese benutzen = (- 1)v * (1+ Mantisse)* 2(Exponent + Bias) | 3. Einsetzten = (- 1)1 * (1+ .1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 bin) * 2(-1+1023) = 1 0111 1111 110 1000 0000 0000 0000 0000 . . . 0000 0000 0000 0000 v e 1+m INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 158 Variablen & Datentypen Rechenregeln nach IEEE 754: (- 1)v * (1+ Mantisse)* 2(Exponent + Bias) x = (- 1)v * (1+ Mantisse)* 2(Exponent + Bias) Vorzeichen v: Exponent e: Mantisse m: 0=positiv, 1=negativ e = └log2 (x)┘ ( └ ┘ = aufrunden ) m = (x/2e – 1) * 253 ( e = exponent ) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 159 Reelle Zahlen – 2 (Fast) Jede Programmiersprache (und jeder Computer-Prozessor) beschränkt den Wertebereich und die Genauigkeit der Darstellung von reellen Zahlen (willkürlich) Der Grund dafür ist, dass man sich auf einen "beliebigen", aber festen Speicherbedarf für die Darstellung reeller Zahlen festlegen muss In Java werden zwei verschiedene Zahlentypen angeboten, um den unterschiedlichen Genauigkeitsbedarf widerzuspiegeln Bemerkungen Im Unterschied zu vielen anderen Hochsprachen legt Java den Wertebereich und die Genauigkeit eindeutig fest, unabhängig davon, auf welcher Hardware ein Java-Programm läuft Das ist zum Beispiel in C/C++ nicht der Fall! In Common Lisp sind beliebig genaue Zahlendarstellungen möglich, indem rationale Zahlen als Bruch gespeichert werden können INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 160 Notation reeller Zahlen Reelle Zahlen im Programm werden (sofern nicht anders gekennzeichnet) intern immer als Wert vom Typ double dargestellt Das gilt auch, wenn ihr Wert in einen float-Typ passen würde Reelle Zahlen, die intern als float dargestellt werden sollen, werden durch ein nachfolgendes "F" oder "f" gekennzeichnet (Achtung: kein Leerzeichen erlaubt!) Zur Unterscheidung können reelle Zahlen, die intern als double dargestellt werden sollen, durch ein nachfolgendes "D" oder "d" gekennzeichnet werden (das ist aber unnötig; Achtung: kein Leerzeichen erlaubt!) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 161 Die Syntax reeller Zahlen in Java FloatingPointLiteral: Digits . Digitsopt ExponentPartopt FloatTypeSuffixopt . Digits ExponentPartopt FloatTypeSuffixopt Digits ExponentPart FloatTypeSuffixopt Digits ExponentPartopt FloatTypeSuffix ExponentPart: ExponentIndicator SignedInteger ExponentIndicator: one of eE SignedInteger: Signopt Digits Sign: one of +FloatTypeSuffix: one of fFdD INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 162 Abgekürzte Syntax-Regeln Reelle Zahlen (im Unterschied zu ganzen Zahlen) ... enthalten entweder einen Punkt (Dezimalkomma) oder sie besitzen einen Exponenten oder sie sind als float oder double gekennzeichnet oder sie enthalten eine Kombination daraus. FloatingPointLiteral = Digit+ "." Digit* [ "e" | "E" [ "+" | "-" ] Digit+ ] [ "f" | "F" | "d" | "D" ] | "." Digit+ [ "e" | "E" [ "+" | "-" ] Digit+ ] [ "f" | "F" | "d" | "D" ] | Digit+ | Digit+ ( "e" | "E" [ "+" | "-" ] Digit+ ) [ "f" | "F" | "d" | "D" ] [ "e" | "E" [ "+" | "-" ] Digit+ ] ( "f" | "F" | "d" | "D" ). INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 163 Operationen auf reellen Zahlen – 1 Einstellige Operatoren: - negiert die angegebene Zahl + (hat keinen Effekt) Arithmetische Operatoren + Addition - Subtraktion * Multiplikation / Division Achtung: Addition und Multiplikation von reellen Zahlen in JavaProgrammen sind nicht assoziativ INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 164 Vorsicht FALLE public class Calc1 { public static void main(String[] args) { double a,b; a = 5e-15; b = 1.0; System.out.println("Ergebnis 1: " + (a + a + b)); System.out.println("Ergebnis 2: " + (a + b + a)); } } Ergebnis 1: 1.00000000000001 Ergebnis 2: 1.0000000000000102 INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 165 Operationen auf reellen Zahlen – 2 Im Fall von ungleichen Typen der beteiligten Operanden • Zunächst wird die Zahl des kleineren Typs in die äquivalente Zahl des größeren Typs konvertiert; das Ergebnis ist eine Zahl dieses Typs Ganze Zahlen werden in den nächstliegenden reellen Wert konvertiert • Dann wird exakt (!) gerechnet • Ist die Größenordnung des Ergebnisses darstellbar, wird der exakte Werte hin zur nächsten darstellbaren Zahl des größeren Typs gerundet • Sonst ist ein Überlauf erfolgt, dann ist der Ergebniswert laut ANSI/IEEE 754 als positiv oder negativ unendlich definiert! INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 166 Operationen auf reellen Zahlen – 3 Darstellung von positiv bzw. negativ Unendlich Eine positiv unendliche float-Zahl wird durch Float.POSITIVE_INFINITY dargestellt Eine negativ unendliche float-Zahl wird durch Float.NEGATIVE_INFINITY dargestellt Eine positiv unendliche double-Zahl wird durch Double.POSITIVE_INFINITY dargestellt Eine negativ unendliche double-Zahl wird durch Double.NEGATIVE_INFINITY dargestellt Mit den Unendlich-Werten kann weitergerechnet werden, sie können untereinander und mit anderen Zahlen verglichen werden etc. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 167 Operationen auf reellen Zahlen – 4 Es gibt eine weitere Rechnung, die zu einer besonderen Situation führt: Die durch 0, z.B. 10f / 0f Ergebnistyp: float (+infinity) 5d / 0d Ergebnistyp: double (+infinity) -5f / 0f Ergebnistyp: float (-infinity) -10d / 0d Ergebnistyp: double (-infinity) In diesem Fall ist der Ergebniswert laut ANSI/IEEE 754 als positiv unendlich bzw. negativ undendlich → Es tritt kein Rechenfehler auf! → Bei Operationen auf reellen Zahlen tritt keine Exception auf INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 168 Operationen auf reellen Zahlen – 4 Es gibt eine weitere Rechnung, die zu einer besonderen Situation führt: Die Division von 0 durch 0, z.B. 0f / 0f Ergebnistyp: float 0d / 0d Ergebnistyp: double In diesem Fall ist der Ergebniswert laut ANSI/IEEE 754 als Not-a-Number ("keine Zahl") definiert → Es tritt kein Rechenfehler auf! Java repräsentiert den Wert Not-a-Number als Float.NaN bzw. Double.NaN INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 169 Operationen auf reellen Zahlen – 5 Der Wert „NaN“ ist eine Zahl, aber ungleich zu allen anderen Zahlen und zu sich selbst. Es existieren Testmethoden Float.isNaN( <Ausdruck> ) und Double.isNaN( <Ausdruck> ) Beispiele: Float.isNaN( 0.0f / 0.0f ) // ⇒ true 0.0f / 0.0f == 0.0f / 0.0f // ⇒ false Float.NEGATIVE_INFINITY + Float.POSITIVE_INFINITY // ⇒ NaN INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 170 Operationen auf reellen Zahlen – 6 Rechenregeln für Ausdrücke, bei denen mindestens ein Operand Unendlich oder NaN ist: Alle Vergleiche mit ==, <, <=, >, >=, in denen mindestens einer der Operanden NaN ist, liefern false als Ergebnis Vergleiche mit != in denen mindestens einer der Operanden NaN ist, liefern true als Ergebnis Multiplikation Wenn einer der Operanden NaN ist, ist das Ergebnis NaN Multiplikation eines Unendlich-Wertes mit einem endlichen Wert ergibt einen Unendlich-Wert mit dem entsprechenden Vorzeichen Multiplikation eines Unendlich-Wertes mit 0 ergibt NaN INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 171 Operationen auf reellen Zahlen – 7 Rechenregeln für Ausdrücke, bei denen mindestens ein Operand Unendlich oder NaN ist: Division Wenn einer der Operanden NaN ist, ist das Ergebnis NaN Division eines Unendlich-Wertes durch einen anderen Unendlich-Wert ergibt NaN Division eines Unendlich-Wertes durch einen endlichen Wert ergibt einen Unendlich-Wert mit dem entsprechenden Vorzeichen Division eines endlichen Wertes durch einen Unendlich-Wert ergibt 0 Division von 0 durch 0 ergibt NaN Division eines endlichen Wertes durch 0 ergibt einen Unendlich-Wert mit dem entsprechenden Vorzeichen Divisions-Rest Wenn einer der Operanden NaN ist, ist das Ergebnis NaN Wenn der Dividend ein Unendlich-Wert ist oder der Divisor ist 0 (oder beides), dann ist das Ergebnis NaN Wenn der Dividend endlich ist und der Divisor ist ein Unendlich-Wert, ist das Ergebnis gleich dem Dividend INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 172 Operationen auf reellen Zahlen – 8 Rechenregeln für Ausdrücke, bei denen mindestens ein Operand Unendlich oder NaN ist: Addition und Subtraktion Wenn einer der Operanden NaN ist, ist das Ergebnis NaN Die Summe zweier Unendlich-Werte mit ungleichem Vorzeichen ergibt NaN Die Summe zweier Unendlich-Werte mit gleichem Vorzeichen ergibt den Unendlich-Wert mit diesem Vorzeichen Die Summe eines Unendlich-Wertes und eines endlichen Wertes ergibt den Unendlich-Wert Die Subtraktion entspricht einer Addition, bei der das Vorzeichen des zweiten Operanden invertiert wird INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 173 ??? Fragen Haben Sie Fragen? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 174 JETZT! Struktur von Java Programmen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 175 Struktur ▪ ▪ ▪ Programmkopf ♦ Import von Bibliotheken ♦ Name (Identifikation) Datenbeschreibungen ♦ Konstantenfestlegung ♦ Variablen-Deklaration ♦ Variablen-Initialisierung Funktionsbeschreibungen ♦ Definition von Teilfunktionen ♦ Berechnungen ♦ Ablaufsteuerung ♦ Ein- / Ausgabe INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 176 Beispiel – 1 import java.io.*; import java.util.*; Programmkopf public class Celsius { public static void main(String[] args) throws IOException { // Benötigte Variablen deklarieren String eingabeZeile; double epsilon = 0.005; double c = 0.0, f; // Für die Eingabe von der Tastatur BufferedReader eingabe = Variablenbeschreibung new BufferedReader(new InputStreamReader(System.in)); INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 177 Beispiel – 2 // Eingabe, Double-Wert einlesen eingabeZeile = eingabe.readLine(); StringTokenizer tokens = new StringTokenizer(eingabeZeile); c = Double.parseDouble(tokens.nextToken()); // Umrechnen in Fahrenheit f = c * 9.0/5.0 + 32.0; // Ausgabe des Ergebnis System.out.println("... in Fahrenheit: " + f + " Grad \n"); Funktionsbeschreibung } } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 178 JETZT! Variablen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 179 Variablen-Vereinbarungen Eine Variablen-Deklaration vereinbart einen Namen für einen Speicherbereich an einer bisher freien Adresse im Arbeitsspeicher Variablen werden bei ihrer Deklaration mit einem Typ versehen; dieser wird auch statischer (oder Compilezeit-) Typ genannt Dieser Typ definiert welche Werte die entsprechende Variable annehmen kann, welche Operationen auf dieser Variablen erlaubt sind und die Größe des zu reservierenden Speicherbereichs INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 180 Syntaxregeln Variablen-Vereinbarungen Typen kennen wir bereits: boolean, byte, ... FieldDeclaration: FieldModifiers opt Type VariableDeclarators ; VariableDeclarators: VariableDeclarator VariableDeclarators , VariableDeclarator VariableDeclarator: VariableDeclaratorId VariableDeclaratorId = VariableInitializer VariableDeclaratorId: Identifier VariableDeclaratorId [ ] VariableInitializer: Die ignorieren wir vorerst Expression ArrayInitializer FieldModifiers: FieldModifier FieldModifiers FieldModifier FieldModifier: one of public protected private static final transient volatile INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 181 Beispiele für Variablen-Vereinbarungen boolean a, b, c; int i, j, k; float f; double d1, d2; String name, vorname; byte b; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Das ist ein Namenskonflikt: Namen müssen in ihrem Namensraum immer eindeutig sein Wir werden später sehen, wie Namensräume angelegt werden Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 182 Der Ort von Variablen-Vereinbarungen Eclipse generiert den folgenden Code-Rahmen: class HelloWorld { public static void main(String[] args) { Variablen werden an dieser Stelle vereinbart ... } } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 183 Namen für Variablen Namen in Java beginnen mit einem Buchstaben (keinem Sonderzeichen, keiner Ziffer) gefolgt von null oder mehreren Buchstaben oder Ziffern Die Buchstaben dürfen, da Java Unicode verwendet, aus einem beliebigen Bereich im Zeichensatz stammen, zum Beispiel sind auch deutsche Sonderzeichen erlaubt. (!) Aus "historischen Gründen" dürfen Java-Namen auch mit einem Unterstrich "_" und mit einem Dollar-Zeichen "$" beginnen Beides sollte aber in neu geschriebenen Programmen vermieden werden! In Java können Namen Ziffern beinhalten: Soll eine Zahl unmittelbar auf einen Namen folgen, dann muss sie durch mindestens ein "neutrales" Zeichen davon getrennt sein Namen können keine Leerzeichen und kein Zeilenende beinhalten Die gleichen Regeln gelten auch für alle anderen Namen in Java, zum Beispiel für Klassennamen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 184 Variablen in Ausdrücken – 1 Variablen eines bestimmten Type können in Ausdrücken überall dort verwendet werden, wo auch Werte dieses Type verwendet werden können Voraussetzung: Die Variable besitzt einen Wert Speicher An der Stelle 1 steht ja bereits ein Wert (23) Ein bestimmtes Bit-Muster ist immer vorhanden 1: 23 2: … 3: … 4: 32 5: … INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Problem: Der Speicherinhalt ist ungewiss Damit ist undefiniert, welchen Wert die neue Variable hat Damit ist undefiniert, welchen Wert ein Ausdruck annimmt, in dem die Variable verwendet wird Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 185 Variablen in Ausdrücken – 2 Damit immer definiert ist, welchen Wert eine Variable (in einem Ausdruck) hat, wenn sie verwendet wird, muss jede Variable mit einem (definierten) Wert belegt werden, bevor sie verwendet werden darf Eine Variable kann auf zwei Arten mit einem Wert belegt werden: durch eine Initialisierung oder durch eine Wertzuweisung Der Java-Compiler überprüft, dass Variablen auf (zumindest) eine dieser Arten einen Wert bekommen haben, bevor dieser Wert verwendet wird INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 186 Initialwerte für Variablen Wert-Zuweisung bei der Initialisierung Die Syntaxregel VariableDeclarator: VariableDeclaratorId VariableDeclaratorId = VariableInitializer erlaubt es, jeder Variablen einzeln bei ihrer Deklaration einen Initialwert zu geben Der Initialwert muss zuweisungskompatibel sein Der Compiler überprüft das Beispiele: boolean a = true, b = false, c; int i, j = 0, k = 1; float f = 3.0f; double d1 = 5, d2 = 7.0; String name = "Schmidt", vorname = "Hans"; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 187 Zuweisung an Variablen – 1 Die Wert-Zuweisung als Anweisung (englisch: Statement) wird durch folgende Syntaxregeln beschrieben: AssignmentExpression: ConditionalExpression Das fassen wir als einfachen Ausdruck auf Assignment Assignment: LeftHandSide AssignmentOperator AssignmentExpression LeftHandSide: ExpressionName Die ignorieren wir vorerst FieldAccess ArrayAccess AssignmentOperator: one of = *= /= %= += -= <<= >>= >>>= &= ^= |= INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 188 Zuweisung an Variablen – 2 Der Ergebniswert des Ausdrucks, der einer Variablen zugewiesen werden soll, muss zuweisungskompatibel sein Der Compiler überprüft das Die Wert-Zuweisung in Java ist keine Anweisung im üblichen Sinne, sondern ein Ausdruck: AssignmentExpression Das Ergebnis des Zuweisungs-Ausdrucks ist der zugewiesene Wert → Mehrfach-Zuweisungen sind erlaubt und üblich INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 189 Beispiele für Zuweisungen Beispiele für Wertzuweisungen an Variablen Gegeben seien die folgenden Vereinbarungen: boolean a = true, b = false, c; int i, j = 0, k = 1; float f = 3.0f; double d1 = 5, d2 = 7.0; String name = "Schmidt", vorname = "Hans"; Die folgenden Zuweisungen sind gültig: a = false; c = a == b; i = j + k; d1 = f = Math.abs( f ); name = name + ", " + vorname; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 190 JETZT! Konstanten INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 191 Konstanten vs. Variablen Der Wert von Variablen kann jederzeit während des Programmablaufs durch eine Zuweisung geändert werden Das ist für einige Größen nicht sinnvoll pi, die Kreiskonstante e, die Eulersche Zahl usw. Solche Werte können als konstant vereinbart werden INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 192 Konstanten-Vereinbarung Konstanten werden ähnlich vereinbart wie Variablen, aber sie müssen auf Programm (also Klassen-) Ebene vereinbart werden, sie werden durch die FieldModifier final und static gekennzeichnet und sie müssen bei der Deklaration mit einem Initialwert versehen werden Konstanten eines bestimmten Typs können wie Werte dieses Typs verwendet werden INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 193 Ort der Konstanten-Vereinbarung Eclipse generiert den folgenden Code-Rahmen: class HelloWorld { Konstanten werden an dieser Stelle vereinbart public static void main(String[] args) { ... } } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 194 Beispiel class HelloWorld { Generierter Code static final double PI = 3.141592653589793; static final boolean WAHR = true; KonstantenVereinbarungen public static void main(String[] args) { boolean a = WAHR, b = false, c; int i, j = 0, k = 1; float f = 3.0f; double d1 = 5, d2 = 7.0; String name = "Schmidt", vorname = "Hans"; VariablenVereinbarungen, teils mit Initialisierung a = false; c = a == b; i = j + k; d1 = f = Math.abs( f ); d2 = d1 * PI; name = name + ", " + vorname; Anweisungen } } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 195 JETZT! Zuweisungen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 196 Zuweisungsoperator Zuweisungen schreiben sich <variable> = <wert> Ergebnis dieses Ausdrucks (!) ist wiederum der Wert: Es ist möglich <variable3> = <variable2> = <variable1> = <wert> zu schreiben. Der Ergebniswert von diesen Ausdrücken kann ignoriert werden, d.h. er muss nicht verwendet werden. Passiert „oft“ in Anweisungsfolgen. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 197 Zuweisung elementarer Werte a: ? b: ? c: ? a: 5 b: 5 c: 5 b = 4; a: 5 c = 3; b: 4 c: 3 int a, b, c; a = b = c = 5; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 198 Vertauschen zweier Elemente Wir wollen den Wert von a (2) und von b(3) vertauschen. int a = 2, b = 3; a=b a: 2 b: 3 a: 3 b: 3 Klappt nicht der Wert von 2 ist weg. INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 199 Vertauschen zweier Elemente 2. Versuch: a: 2 b: 3 t: ? t=a; a: 2 Wert von a sichern (in t)! b: 3 t: 2 a=b; a: 3 a überschreiben (mit b)! b: 3 t: 2 b=t; a: 3 b zurücksichern (aus t)! b: 2 t: 2 int int 1 2 3 a = 2, b = 3; t; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 200 Merke! Achtung: Der Zuweisungsoperator in Java schreibt sich Der Test auf Gleichheit in Java schreibt sich → Diese beiden werden leicht verwechselt! = == Der Compiler kann nicht immer Hilfestellung leisten, Beispiel: Aus a = b == c; wird versehentlich leicht a = b = c; Im Falle der Deklarationen boolean a; int b, c; meldet der Compiler einen Typfehler bei der Zuweisung an a Im Falle der Deklarationen boolean a, b, c; kann der Compiler das Versehen nicht feststellen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 201 Zuweisungskompatibilität Wir wissen bereits, dass die Typen von Operanden bei der Verwendung in Ausdrücken zuerst einander angeglichen werden, bevor eine Operation durchgeführt wird Beispiel: 3.0f + 4 → 3.0f + 4.0f → 7.0f Das passiert auch beim Zuweisungsoperator Beispiel: double d; d = 3.0f + 4; → d = 3.0f + 4.0f; → d = 7.0f; → d = 7.0d; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 202 Typ-Konvertierung – 1 Werte elementarer Typen können explizit umgewandelt werden Sogenannte Type Casts können jeden elementaren Typ in jeden anderen elementaren Typ (außer boolean) umwandeln Schreibweise: (<Zieltyp>) <Wert> Beispiele: byte b; short sh = 18; int i; long l; b = (byte) 32; i = (int) 3.14; l = (long) sh; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 203 Typ-Konvertierung – 2 Ist der Zieltyp „größer“ als der Typ des Wertes, dann ist der Cast unnötig, Java macht den Cast implizit: byte → short → int → long → float → double char → int Ist der Zieltyp „kleiner“ als der Typ des Wertes dann ist der Cast explizit notwendig, sonst meldet der Compiler einen Typfehler Die Konvertierungsregeln folgen auf den nächsten Folien INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 204 Typ-Konvertierung – 3 double → float: Es wird bei Bedarf so gerundet, dass eine möglichst geringe Differenz bleibt double → long double → int double → short double → byte float → long float → int float → short float → byte Nachkommastellen werden abgeschnitten INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 205 Typ-Konvertierung – 4 long → int long → short long → byte int → short int → byte short → byte: Überzählige Bitstellen werden abgeschnitten, dabei können Vorzeichenfehler auftreten! Beispiel: (byte)256 ⇒ 0 (byte)120 ⇒ 120 (byte)128 ⇒ -128 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 206 Typ-Konvertierung – 5 Kein Cast ist nötig für folgende Konvertierungen: byte → short byte → int byte → long short → int short → long int → long char → short char → int char → long INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 207 Abkürzende Schreibweisen – 1 Für häufig gebrauchte Operationen gibt es abkürzende Schreibweisen bei der Zuweisung Beispiel a = a + 1; kann geschrieben werden als a += 1; Das erlaubt die (bereits bekannte) Syntaxregel AssignmentOperator: one of = *= /= %= += -= <<= >>= >>>= &= ^= |= Diese Operatoren sind noch nicht bekannt Der Wert einer solchen verkürzten Zuweisung entspricht dem Wert des ursprünglichen Ausdrucks INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 208 Abkürzende Schreibweisen – 2 Für häufig gebrauchte Operationen gibt es weitere abkürzende Schreibweisen bei der Zuweisung Beispiel a = a + 1; oder auch a += 1; kann noch kürzer geschrieben werden als a++; oder ++a; Entsprechend gibt es auch den "--"-Operator Diese Operatoren werden Inkrement und Dekrement genannt Da man sie vor und nach der Variablen schreiben kann, spricht man von Präfix- bzw. Postfix-Inkrement- und Dekrement-Operatoren INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 209 Abkürzende Schreibweisen – 3 Der Unterschied zwischen den Präfix- und den Postfix-Operatoren liegt im Zeitpunkt der Auswertung Tritt ein Präfix-Operator in einem umgebenden Ausdruck auf, so wird das Inkrement/Dekrement ausgeführt, bevor mit dem neuen Wert der Variablen weitergerechnet wird Tritt ein Postfix-Operator in einem umgebenden Ausdruck auf, so wird mit dem alten Wert der Variablen weitergerechnet, bevor das Inkrement/Dekrement ausgeführt wird Beispiel int a, b = 1; a = b++; → b == 2, a == 1 a = ++b; → b == 3, a == 3 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 210 Abkürzende Schreibweisen – 4 Ähnlich wie die Operator-Vorrangregelung ohne Klammerung kann die häufige Verwendung von Präfix-/Postfix-Inkrement und –Dekrement zu Verständnisschwierigkeiten beim Lesen von Programmen führen → Vorsichtig einsetzen! Die beiden Varianten werden hauptsächlich bei der Indizierung von Arrays (Feldern) benutzt (s. später); wir werden dann in Beispielen darauf zurückkommen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 211 Abkürzende Schreibweisen – 5 Die folgende Syntaxregel beschreibt Zuweisungen (Assignment) sowie die vorgestellten abkürzenden Schreibweisen: StatementExpression: Assignment PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression ... INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 212 Allgemeines zu Namenskonventionen Für Programme in der Sprache Java werden genaue Konventionen für die Wahl von Namen angegeben Diese Konventionen werden zum Beispiel in den umfangreichen Bibliotheken, die zu einer Java-Implementierung gehören, angewendet und haben diverse Vorteile gezeigt Sie sollten befolgt werden, sofern irgend möglich (sinnvolle Ausnahmen bestätigen die Regel)! Wichtig ist vor allen Dingen, Konventionen konsistent zu befolgen, z.B. nur englische oder nur deutsche Namen zu benutzen Sie sind auch für die Übungen zur Vorlesung Inf als Vorgabe zu betrachten INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 213 Namenskonventionen: Konstanten Namen für Konstanten sollten als Folge aus einem oder mehreren Worten gewählt werden, alle in Großbuchstaben geschrieben und die einzelnen Worte durch Unterstriche getrennt Namen für Konstanten sollten beschreibend sein und nicht unnötig abgekürzt werden Beispiele: MIN_VALUE MAX_VALUE PI Gruppen von Konstanten, die zusammengehörige Werte kennzeichnen, sollten mit einer gemeinsamen Buchstabenfolge, z.B. einem Akronym, beginnen Beispiele M_START, M_STOP für Start bzw. Stopp einer Maschine WC_BLUE, WC_RED, WC_GREEN für verschiedene Farben eines Fensterrahmens (WindowColor) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 214 Namenskonventionen Variablen – 1 Variablennamen sollten mit einem Kleinbuchstaben beginnen, nachfolgende Wörter sollten dann jeweils mit einem Großbuchstaben beginnen (nicht etwa durch einen Unterstrich abgesetzt sein) Lokale Variablennamen sollten kurz, aber sinnvoll gewählt werden, z.B. als Folge von Kleinbuchstaben, die keine Worte sind Beispiele Akronyme, z.B. "cp" für eine Variable des Typs ColoredPoint Abkürzungen, z.B. "buf" für eine Puffer-Variable Kurzworte, die in ähnlicher Weise immer wieder verwendet werden, z.B. "in" und "out" für Ein- und Ausgabedateien INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 215 Namenskonventionen Variablen – 2 Namen, die nur aus einem Buchstaben ("a", "b", "c") bestehen sollten vermieden werden, wie auch durchnummerierte Namen ("i1", "i2", "i3") Ausnahmen von dieser Regel: temporäre und Schleifenvariablen – typische Beispiele: "c" für einen char-Wert "d" für einen double-Wert "f" für einen float-Wert "i", "j", "k" für int-Werte "s" für einen String INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 216 Eindeutigkeit von Namen Innerhalb eines Namensraumes müssen Namen immer eindeutig sein Bis jetzt gilt: Es dürfen keine zwei gleichnamigen Variablen deklariert werden Es dürfen keine zwei gleichnamigen Konstanten deklariert werden Hat eine Variable den gleichen Namen wie eine Konstante, dann überdeckt die Variable die Konstante; die Konstante ist dann nicht länger sichtbar (also auch nicht zugreifbar) Es gibt an dieser Stelle keinen Namenskonflikt, weil die Variable in einem anderen Namensraum deklariert wird als die Konstante Der Namensraum für die Konstante ist das gesamte Programm (also die Klasse), derjenige für die Variable ist die Methode "main" Die Methode ist in das Programm eingeschachtelt, daher überdeckt die Variable im lokalen Namensraum die Konstante im umgebenden, globalen Namensraum Der Compiler überprüft, ob Namenskonflikte vorliegen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 217 Beispiel Programm (Klasse) final static int k = 2; main (Methode) int k = 15; "main" ist in das Programm eingeschachtelt, daher überdeckt die Variable im lokalen Namensraum die Konstante im globalen Namensraum x = .... + k + ....; Der Namensraum für die Variable k ist die Methode "main" Der Namensraum für die Konstante k ist das gesamte Programm (also die Klasse) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Namensräume Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 218 ??? Fragen Welche Fragen gibt es? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 219 JETZT if - Anweisung INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 220 Bedingungen in Algorithmen Anweisung Bedingung erfüllt Anweisung Bedingung nicht erfüllt Bedingung erfüllt Bedingung nicht erfüllt Alternative Anweisung 1 Anweisung Anweisung INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Alternative Anweisung 2 Anweisung Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 221 Syntaxregeln für Bedingungen in Java Statement: IfThenStatement IfThenElseStatement ... IfThenStatement: if ( Expression ) Statement IfThenElseStatement: if ( Expression ) StatementNoShortIf else Statement Der Ausdruck (Expression) muss vom Typ Boolean sein, sonst lehnt der Compiler die Übersetzung des Programms ab INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 222 3 Formen für Bedingungen in Java – 1 <Anweisung> Anweisung Bedingung erfüllt Bedingung nicht erfüllt if ( <Bedingung> ) <Optionale Anweisung> <Anweisung> Optionale Anweisung Anweisung INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 223 3 Formen für Bedingungen in Java – 2 <Anweisung> Anweisung Bedingung erfüllt Bedingung nicht erfüllt Alternative Anweisung 1 if ( <Bedingung> ) <Alternative Anweisung 1> else <Alternative Anweisung 2> <Anweisung> Alternative Anweisung 2 Anweisung INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 224 3 Formen für Bedingungen in Java – 3 <Anweisung> if ( <Bedingung 1> ) <Alternative Anweisung 1> Anweisung Bedingung1 erfüllt Alternative Anweisung 1 Bedingung1 nicht erfüllt Bedingung2 erfüllt Bedingung2 nicht erfüllt else if ( <Bedingung 2> ) <Alternative Anweisung 2> ... Alternative Anweisung 2 ... else if ( <Bedingung n> ) <Alternative Anweisung n> else <Default-Anweisung> <Anweisung> Anweisung INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 225 Beispiele float f = ...; boolean b = ...; if ( f > 12 ) f = Math.sqrt( f ); if ( b ) System.out.println( f ); else b = Math.sqrt( f ) > 12; if ( b ) System.out.println( "f = " + f ); else if ( f == 7 ) System.out.println( "Reiner Zufall!" ); else f = 7; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 226 Problem: „Dangling Else“ – 1 Beispiel für mögliche Interpretationen: siehe Formatierung if ( <Bedingung1> ) if ( <Bedingung2> ) <Anweisung1> else <Anweisung2> if ( <Bedingung1> ) if ( <Bedingung2> ) <Anweisung1> else <Anweisung2> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 227 Problem: „Dangling Else“ – 2 wert1 = 5; wert2 = 5; ergebnis = 10; if ( wert1 > 10 ) if ( wert2 > 10 ) ergebnis = 100; else ergebnis = 1000; wert1 = 5; wert2 = 5; ergebnis = 10; if ( wert1 > 10 ) if ( wert2 > 10 ) ergebnis = 100; else ergebnis = 1000; → ergebnis == 10 → ergebnis == 1000 Das ist die Java-Interpretation: ein „else“ gehört zum letzten freien „if“ INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 228 Konventionen zur Notation – 1 Prinzipiell werden „einfache“ Anweisungen (Zuweisungen, Aufrufe von Operationen, leere Anweisungen) nach Möglichkeit einzeln in einer Zeile notiert Die optionalen oder alternativen Anweisungen im Rumpf von Bedingungen werden 2 Zeichen (oder 1 Tabulator) eingerückt Ziel dieser Konventionen Man soll auf den ersten Blick erkennen, dass es sich um eine Bedingung handelt und wie weit sich die optionalen oder die alternativen Anweisungen erstrecken Diese Regel gilt auch für andere Programmstrukuren INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 229 Konventionen Allgmein Eine oder mehrere bedingte Anweisung(en) werden eingerückt die nachfolgende (nicht zur Bedingung gehörende) Anweisung oder das else, sofern vorhanden, steht wieder auf Höhe des if Gibt eine oder mehrere Anweisungen im else Teil, so werden diese eingerückt Es werden IMMER geschweifte Klammern um die bedingten Anweisungen gemacht! (Auch wenn es andere Möglichkeiten gibt) Beispiele: if ( <Bedingung> ) { Einrücken <Anweisung> } <Anweisung> if ( <Bedingung> ) { <Anweisung> Einrücken ... <Anweisung> } else { <Anweisung> Einrücken } <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen korrekte Formatierung Ist übungsrelevant! 230 So funktioniert es auch ... Folgt nach einem if eine einzelne Anweisung (d.h. keine Anweisungsfolge), so steht das if mit seiner Bedingung alleine in einer Zeile, die Anweisung wird eingerückt und die nachfolgende Anweisung oder das else, sofern vorhanden, steht wieder auf Höhe des if Beispiele: if ( <Bedingung> ) <Anweisung> <Anweisung> if ( <Bedingung> ) <Anweisung> else ... <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) … aber wir verwenden immer } Klammern Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 231 So funktioniert es auch ... Folgt nach einem if eine Anweisungsfolge, so steht das if mit seiner Bedingung und der öffenden Klammer alleine in einer Zeile, der Inhalt der Anweisungsfolge wird eingerückt und die schließende Klammer und das else, sofern vorhanden, stehen wieder auf Höhe des if Beispiele: if ( <Bedingung> ) { if ( <Bedingung> ) { <Anweisung> <Anweisung> ... ... … aber <Anweisung> wir <Anweisung> verwenden } else } immer ... <Anweisung> } Klammern <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 232 So funktioniert es auch ... Folgt nach einem else eine einzelne Anweisung, so stehen die schließende Klammer, sofern vorhanden, und das else alleine in einer Zeile, die Anweisung wird eingerückt und die nachfolgende Anweisung steht wieder auf Höhe des if Beispiele: if ( <Bedingung> ) <Anweisung> else <Anweisung> <Anweisung> if ( <Bedingung> ) { <Anweisung> ... <Anweisung> } else <Anweisung> <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen … aber wir verwenden immer } Klammern 233 So funktioniert es auch ... Folgt nach einem else eine Anweisungsfolge, so stehen die schließende Klammer, sofern vorhanden, und das else mit der öffnenden Klammer alleine in einer Zeile, der Inhalt der Anweisungsfolge wird eingerückt und die schließende Klammer steht alleine wieder auf Höhe des if Beispiele: if ( <Bedingung> ) <Anweisung> else { <Anweisung> } <Anweisung> … aber wir verwenden immer } Klammern INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) if ( <Bedingung> ) { <Anweisung> ... <Anweisung> } else { <Anweisung> } <Anweisung> Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 234 So funktioniert es auch ... Folgen nach einem else weitere (eingeschachtelte) if-Anweisungen, so werden diese nicht weitere 2 Zeichen eingerückt, sondern das else steht zusammen mit dem nachfolgenden if und seiner Bedingung in einer Zeile und die anderen Konventionen werden entsprechend angewendet, als ob die (eingeschachtelten) if-Anweisungen auf Höhe des ersten if stehen würden Beispiele: if ( <Bedingung> ) <Anweisung> else if ( <Bedingung> ) <Anweisung> <Anweisung> if ( <Bedingung> ) <Anweisung> else if ( <Bedingung> ) { <Anweisung> ... <Anweisung> } else if ( <Bedingung> ) <Anweisung> ... <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) if ( <Bedingung> ) <Anweisung> else if ( <Bedingung> ) { <Anweisung> ... <Anweisung> } else if ( <Bedingung> ) <Anweisung> else if ( ... ... else ... <Anweisung> Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 235 Merke! ▪ ▪ Ziel: Man soll auf den ersten Blick erkennen, dass es sich um eine Bedingung handelt und wie weit sich die optionalen oder die (verschiedenen) alternativen Anweisungen erstrecken Wir verwenden immer Klammern damit wir Fehler vermeinden INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 236 JETZT Anweisungsfolgen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 237 Anweisungsfolgen in Java Eine Anweisungsfolge fasst eine Reihe von Anweisungen zu einer neuen "Super-Anweisung" zusammen Eine Anweisungsfolge darf überall verwendet werden, wo eine "einfache", einzelne Anweisung verwendet werden darf INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 238 Syntaxregeln für Anweisungsfolgen – 1 Anweisungsfolgen in Java werden in geschweifte Klammern eingefasst: Statement: IfThenStatement IfThenElseStatement Block ... Block: { BlockStatements opt } BlockStatements: BlockStatement BlockStatements BlockStatement BlockStatement: Statement LocalVariableDeclarationStatement ... INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 239 Syntaxregeln für Anweisungsfolgen – 2 Anweisungsfolgen in Java dürfen lokale Variablen enthalten: BlockStatement: Statement LocalVariableDeclarationStatement ... LocalVariableDeclarationStatement: Abschließen durch ein LocalVariableDeclaration ; Semikolon ist Pflicht! LocalVariableDeclaration: finalopt Type VariableDeclarators INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 240 Beispiel für Anweisungsfolgen Formal: { <Deklaration> ... <Deklaration> <Anweisung> ... <Anweisung> } Konkret: boolean b; { int i; i = 3; b = i > 10; } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 241 Leere Anweisungen in Java In Java gibt es leere Anweisungen, die durch ein Semikolon abgeschlossen werden müssen Statement: IfThenStatement IfThenElseStatement Block EmptyStatement ... EmptyStatement: ; Abschließen durch ein Semikolon ist Pflicht! INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 242 Vorsicht FALLE! Hier steht ein EmptyStatement! if ( a <10 ) ; Die nächste Zeile wird IMMER ausgeführt! System.out.println(a); if ( b > 10 ); { System.out.println(i); } if (a < 10) ; System.out.println(a); else if System.out.println(0); Hier steht ein EmptyStatement! Die nächste Zeile EINMAL ausgeführt Hier steht ein EmptyStatement! Dies ist in Verbindung mit else if ein Compilerfehler, da das else if nicht auf das if bezieht! INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 243 Ausdrücke, wo Anweisungen stehen In Java dürfen manche Ausdrücke als Anweisungen verwendet werden Statement: IfThenStatement IfThenElseStatement Block EmptyStatement ExpressionStatement ... ExpressionStatement: Abschließen durch ein StatementExpression ; Semikolon ist Pflicht! StatementExpression: Assignment PreIncrementExpression Zuweisungsausdrücke PreDecrementExpression kennen wir schon PostIncrementExpression PostDecrementExpression ... INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 244 Zusammenfassung: Semikolon nach Anweisungen In Java werden folgende "Anweisungen" durch ein Semikolon abgeschlossen: Zuweisungen und ihre verkürzenden Schreibweisen (ExpressionStatement) Leere Anweisungen (EmptyStatement) Variablen-Deklarationen (LocalVariableDeclarationStatements) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 245 Wiederholung: Beispiel wert1 = 5; wert2 = 5; ergebnis = 10; if ( wert1 > 10 ) if ( wert2 > 10 ) ergebnis = 100; else ergebnis = 1000; Ausdruck → durch ";" abgeschlossen Ausdruck → durch ";" abgeschlossen Ausdruck → durch ";" abgeschlossen if-Anweisung ... if-else-Anweisung ... Ausdruck → durch ";" abgeschlossen ... und ihr Rumpf ... und ihr Rumpf Ausdruck → durch ";" abgeschlossen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 246 ??? Fragen Welche Fragen gibt es? INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 247 Abkürzende Schreibweisen int i = 4, j = 5, k; Statt: if (i > j) { k=7; } else { k=2; } kann (kürzer) formuliert werden: k = (i > j) ? 7 : 2 ; Formal: Variable = (BooleanExpression) ? Then-Value : Else-Value ; INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 248 ??? Fragen Welche Fragen gibt es? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 249 JETZT! Schleifen INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 250 Akzeptierende Schleifen – 1 Anweisung 1 Anweisung 2 Bedingung erfüllt Bedingung nicht erfüllt Anweisung 3 Ablauf: 1. Der Schleifenrumpf (Anweisung 2) wird ausgeführt 2. Die Bedingung wird ausgewertet – Ist die Bedingung erfüllt, dann wird das Programm mit Anweisung 2 fortgesetzt; der Schleifenrumpf wird erneut durchlaufen – Ist die Bedingung nicht erfüllt, dann wird das Programm mit Anweisung 3 fortgesetzt Es handelt sich um eine akzeptierende Schleife: Unabhängig von der Bedingung wird der Schleifenrumpf mindestens ein Mal durchlaufen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 251 Akzeptierende Schleifen – 2 Anweisung 1 Anweisung 2 Bedingung erfüllt Bedingung nicht erfüllt Es sind drei Fälle möglich Bereits die erste Auswertung des Ausdrucks liefert false Die wiederholte Auswertung des Ausdrucks liefert eine endliche Folge von true, true, ..., true, false von Ergebnissen Die wiederholte Auswertung des Ausdrucks ergibt immer den Wert true Im 3. Fall spricht man von einer Endlosschleife, das ist erlaubt, aber semantisch selten sinnvoll Anweisung 3 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 252 Syntaxregeln für akzeptierende Schleifen Akzeptierende Schleifen sind Anweisungen Statement: IfThenStatement IfThenElseStatement Block EmptyStatement ExpressionStatement DoStatement ... DoStatement: do Statement while ( Expression ) ; Der Ausdruck (Expression) muss vom Typ Boolean sein, sonst lehnt der Compiler die Übersetzung des Programms ab INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 253 Beispiel – 1 i = 1; do i=1 i++; while ( i < 10 ); System.out.println( i ); i++ i < 10 i >= 10 System.out.println( i ) Ausgabe: 10 INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 254 Beispiel – 2 i=1 i++ System.out.println( i ) i < 10 i = 1; do { i++; System.out.println( i ); } while ( i < 10 ); System.out.println( "Ende" ); Ausgabe: i >= 10 System.out.println("Ende") INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 2 3 4 ... 10 Ende Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 255 Beispiel – 3 int i, summe; summe = 0; i = 0; do { summe += i; i++; } while ( i < 100 ); System.out.println( summe ); INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 256 Abweisende Schleifen – 1 Anweisung 1 Bedingung nicht erfüllt Anweisung 2 Bedingung erfüllt Anweisung 3 Ablauf: • Die Bedingung wird ausgewertet – Ist die Bedingung erfüllt, dann wird der Schleifenrumpf (Anweisung 2) durchlaufen Das Programm wird mit Schritt 1 fortgesetzt – Ist die Bedingung nicht erfüllt, dann wird der Schleifenrumpf übersprungen Es handelt sich um eine abweisende Schleife: Ist die Bedingung gleich zu Beginn nicht erfüllt, wird der Schleifenrumpf nicht ein einziges Mal durchlaufen INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 257 Abweisende Schleifen – 2 Anweisung 1 Bedingung nicht erfüllt Anweisung 2 Bedingung erfüllt Anweisung 3 Es sind drei Fälle möglich Bereits die erste Auswertung des Ausdrucks liefert false Die wiederholte Auswertung des Ausdrucks liefert eine endliche Folge von true, true, ..., true, false von Ergebnissen Die wiederholte Auswertung des Ausdrucks ergibt immer den Wert true Im 3. Fall spricht man von einer Endlosschleife, das ist erlaubt, aber semantisch selten sinnvoll INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 258 Syntaxregeln für abweisende Schleifen Auch Abweisende Schleifen sind Anweisungen Statement: IfThenStatement IfThenElseStatement Block EmptyStatement ExpressionStatement DoStatement WhileStatement ... WhileStatement: while ( Expression ) Statement Der Ausdruck (Expression) muss vom Typ Boolean sein, sonst lehnt der Compiler die Übersetzung des Programms ab INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 259 Beispiel für eine abweisende Schleife – 1 i = 1; while ( i < 10 ) i=1 i++; i >= 10 System.out.println( i ); i < 10 i++ Ausgabe: System.out.println( i ) INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) 10 Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 260 Beispiel für eine abweisende Schleife – 2 Die Anweisungsfolge ist eine Anweisung i = 1; { while ( i < 10 ) i=1 i++; System.out.println( i ); i >= 10 i < 10 ) i++; System.out.println( i } System.out.println( “Ende“ ); System.out.println("Ende") INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Ausgabe: 2 3 4 ... 10 Ende Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 261 Beispiel für eine abweisende Schleife – 3 int i, summe; summe = 0; i = 0; while ( i < 100 ) { summe += i; i++; } System.out.println( summe ); INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 262 Überführung von Schleifen: akzeptierende in abweisende – 1 Anweisung1 Anweisung1 Bedingung erfüllt Bedingung nicht erfüllt Bedingung nicht erfüllt INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Bedingung erfüllt Anweisung1 Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 263 Überführung von Schleifen: akzeptierende in abweisende – 2 do <Anweisung> while ( <Bedingung> ); <Anweisung> while ( <Bedingung> ) <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 264 Überführung von Schleifen: abweisende in akzeptierende – 1 Bedingung erfüllt Bedingung nicht erfüllt Bedingung nicht erfüllt Bedingung erfüllt Anweisung Bedingung erfüllt Anweisung Bedingung nicht erfüllt INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 265 Überführung von Schleifen: abweisende in akzeptierende – 2 while ( <Bedingung> ) <Anweisung> if ( <Bedingung> ) do <Anweisung> while ( <Bedingung> ); INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 266 Konventionen zur Notation Der Rumpf von (akzeptierenden und abweisenden) Schleifen wird 2 Zeichen (oder 1 Tabulator) eingerückt Die Anweisung(an) wird/werden eingerückt und die erste (nicht wiederholte) Anweisung nach der Schleife steht wieder auf Höhe des while Die Anweisung(en) stehen IMMER in geschweiften Klammern Beispiele: <Anweisung> while ( <Bedingung> ) { Einrücken <Anweisung> } <Anweisung> <Anweisung> do { <Anweisung> Einrücken ..... <Anweisung> } while ( <Bedingung> ) <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 267 So funktioniert es auch ... Der Rumpf von (akzeptierenden und abweisenden) Schleifen wird 2 Zeichen (oder 1 Tabulator) eingerückt Besteht der Rumpf einer while-Schleife aus einer einzelnen Anweisung (d.h. nicht aus einer Anweisungsfolge), so steht das while mit der Bedingung in einer Zeile, die Anweisung wird eingerückt und die erste Anweisung nach der Schleife steht wieder auf Höhe des while Beispiel: <Anweisung> while ( <Bedingung> ) <Anweisung> <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen … aber wir verwenden immer } Klammern 268 So funktioniert es auch ... Besteht der Rumpf einer while-Schleife aus einer Anweisungsfolge, so wird die öffnende Klammer nach der while-Bedingung in der gleichen Zeile notiert, der Inhalt der Anweisungsfolge wird eingerückt und die schließende Klammer steht alleine in einer Zeile wieder auf Höhe des while Beispiel: <Anweisung> while ( <Bedingung> ) { <Anweisung> ... <Anweisung> } <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen … aber wir verwenden immer } Klammern 269 So funktioniert es auch ... Besteht der Rumpf einer do-Schleife aus einer einzelnen Anweisung (d.h. nicht aus einer Anweisungsfolge), so steht das do alleine in einer Zeile, die Anweisung wird eingerückt und das while steht mit seiner Bedingung in einer Zeile wieder auf Höhe des do Beispiel: <Anweisung> do <Anweisung> while ( <Bedingung> ); <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen … aber wir verwenden immer } Klammern 270 Konventionen zur Notation Ziel dieser Konventionen: Man soll auf einen Blick erkennen, um welche Schleife es sich handelt und was zum Schleifenrumpf gehört INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 271 ??? Fragen Welche Fragen gibt es? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 272 Schleifen in Algorithmen Neben abweisenden und akzeptierenden Schleifen gibt es in Java auch Zählschleifen Zählschleifen besitzen eine Schleifenvariable Diese kann in der Schleife selbst eingeführt werden Sie wird in der Schleife initialisiert Sie wird in der Schleife regelmäßig erhöht oder erniedrigt Der Abbruch der Schleife wird über den Wert der Schleifenvariablen gesteuert Bemerkung Es ist durchaus möglich, Zählschleifen (fast vollkommen) anders zu verwenden (ein Beispiel wird noch gezeigt) Das ist aber ein sehr schlechter Programmierstil! Stattdessen sollten dann besser while- oder do-Schleifen verwendet werden INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 273 Syntaxregeln für Zählschleifen – 1 Zählschleifen sind Anweisungen Statement: IfThenStatement IfThenElseStatement Block EmptyStatement ExpressionStatement WhileStatement DoStatement ForStatement ... ForStatement: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 274 Syntaxregeln für Zählschleifen – 2 ForStatement: for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement ForInit: StatementExpressionList LocalVariableDeclaration StatementExpressionList: StatementExpression StatementExpressionList , StatementExpression StatementExpression: Assignment PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression ... ForUpdate: StatementExpressionList INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 275 Beispiel für eine for-Schleife – 1 ForInit: StatementExpression (Zuweisung) Expression: • Muss vom Typ Boolean sein • Wenn sie nicht erfüllt ist, wird die Schleife beendet ForUpdate: StatementExpression (Zuweisung) for ( i = 1; i <= 10; i++ ) System.out.println( i ); INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 276 Beispiel für eine for-Schleife – 2 for ( i = 1; i <= 10; i++ ) i=1 System.out.println( i ); i > 10 i <= 10 System.out.println( i ) i++ Äquivalente while-Schleife i = 1; while ( i <= 10 ) { System.out.println( i ); i++; } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 277 Beispiel für eine for-Schleife – 3 2 Variablen, Initialisierungen möglich, aber nur ein Typ erlaubt for ( int i=10, j=0; i >= 0; i--, j++ ) { Beide Variablen können modifiziert werden System.out.println( „Schleifenvariable: “ + i ); System.out.println( „Anzahl der Durchläufe: “ + j ); } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 278 Konventionen zur Notation – 1 Der Rumpf von Zähl-Schleifen wird 2 Zeichen (oder 1 Tabulator) eingerückt steht das for mit der Schleifenkontrolle in einer Zeile, Die wiederholte(n) Anweisung(en) ist/sind eingerückt und stehen IMMER in geschweiften Klammern die erste (nicht wiederholte) Anweisung nach der Schleife steht wieder auf Höhe des for Beispiel: <Anweisung> for ( <Initialisierung>; <Bedingung>; <Update> ) { <Anweisung> } <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 279 So funktioniert es auch ... Besteht der Rumpf einer for-Schleife aus einer Anweisungsfolge, so wird die öffnende Klammer nach der for-Schleifenkontrolle in der gleichen Zeile notiert, der Inhalt der Anweisungsfolge wird eingerückt und die schließende Klammer steht alleine in einer Zeile wieder auf Höhe des for Beispiel: <Anweisung> for ( <Initialisierung>; <Bedingung>; <Update> ) <Anweisung> ... <Anweisung> <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen … aber wir verwenden immer } Klammern 280 Beispiele für Fehler in for-Schleifen { int i; Doppelte Deklaration der Variablen i ... for ( int i=10; i >= 0; i-- ) ... } for ( int i=10; i >= 0; i-- ) { ... } System.out.println( i ); Variable i ist hier nicht bekannt INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 281 Beispiele „entfremdete“ for-Schleifen – 1 Folgende Schleifen sind (gültige) Endlos-Schleifen for ( ; true; ) System.out.println( "forever" ); for ( ; ; ) System.out.println( "forever" ); Steht Programmtext nach einer dieser beiden Schleifen noch mindestens eine Anweisung, so meldet der Compiler einen Fehler, weil dieser Programmteil nie erreicht werden kann In beiden Fällen wäre eine while-Schleife adäquat while ( true ) System.out.println( "forever" ); INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 282 Beispiele „entfremdete“ for-Schleifen – 2 Folgende Schleife wird „künstlich“ beendet boolean stopIt; for ( int i=1; i <= 100; i++ ) { ... stopIt = ...; if ( stopIt ) i = 101; ... } Auf den ersten Blick übersieht man leicht, dass die Schleife eventuell weniger als 100 Durchläufe hat Auch in diesem Fall wäre eine while-Schleife adäquat int i = 1; while ( (i <= 100) & !stopIt ) { ... stopIt = ...; ... i++; } INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 283 Konventionen zur Notation – 1 Der Rumpf von Zähl-Schleifen wird 2 Zeichen (oder 1 Tabulator) eingerückt Besteht der Rumpf einer for-Schleife aus einer einzelnen Anweisung (d.h. nicht aus einer Anweisungsfolge), so steht das for mit der Schleifenkontrolle in einer Zeile, die Anweisung wird eingerückt und die erste Anweisung nach der Schleife steht wieder auf Höhe des for Beispiel: <Anweisung> for ( <Initialisierung>; <Bedingung>; <Update> ) { <Anweisung> } <Anweisung> INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 284 Struktogrammsymbol ▪ ▪ ▪ ▪ Es gibt kein eigenes Symbol für Zählschleifen Es handelt sich bei Zählschleifen ja um abweisende Schleifen Als Bedingung wird die komplette Schleifensteuerung eingetragen Im Strukturblock findet man dann die Anweisungen im Rumpf der for-Schleife (ohne update) for ( int k=0; k<10; k++ ) Strukturblock INF1 – TSIT , Imperative Programmierung - Teil I ( V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 285 ??? Fragen Welche Fragen gibt es? INF1 – TSIT , Imperative Programmierung - Teil I (V5 – 26.10.17) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 286