Grundlagen der Informatik Bachelor of Arts: Sprache, Kultur, Translation Teil 1 : Grundlagen, Historie und imperative Programmierung Stephan Mechler 1. Vorlesung 25.10.2010 Übersicht Einführung Einführung in die Programmierung ▪ ▪ ▪ ▪ ▪ Was Ist Informatik ♦ ♦ ♦ ♦ ♦ Was ist ein Computer? Was Ist Information? Felder der Informatik Betriebssysteme Programmiersprachen Java Einführung ♦ ♦ ♦ ♦ ♦ Java Beispiel Eclipse IDE Algorithmen Programmentwurf Java Sprachaufbau ♦ ♦ ♦ ♦ ♦ ♦ Datentypen Java Struktur Variablen und Konstanten Zuweisungen Bedingungen: if Schleifen Java Beispiel: Celsius Kommentare GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme → 2 Übersicht Was ist Informatik? ▪ ▪ Informatik ♦ Englisch: Computer Science, Wissenschaft vom Computer Was ist ein Computer? ♦ ...mehr dazu in Kapitel 3 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme → 3 Rechnerarchitektur - I Pascaline (1642 ) Soroban ~ 1600 Mac MAC IBM-Thinkpad Resulta BS 7 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ 4 Rechnerarchitektur - I Schema: Prozessor Speicher Controller/Bus Bus Peripherie VNA: ALU + Steuereinheit Speicherwerk Eingabe-/Ausgabewerk PC (schematisch): RAM +Northbridge FSB CPU Southbridgbe PCI/PCIe •Karten •Steckplätze •Interne Karten GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ 5 Rechnerarchitektur - I PC (Stand 2004): GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Informatik → Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ 6 Elementare Begriffe - 1 Was ist der Unterschied zwischen Daten und Information? ♦ Daten = physikalische Zustände + ihre Interpretation ♦ Information = Daten + ihre Bedeutung GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen 7 Elementare Begriffe – 2 Beispiel: 0010 1001 Speicherzustand Interpretation 2 9 Daten Bedeutung 29 °C Information GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was ist ein Computer? → Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen 8 Elementare Begriffe – 1 Informatik(IT) 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. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 9 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 10 Teildisziplinen Angewandte Informatik/Realisierung Technische Informatik Praktische Informatik Theoretische Informatik GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 11 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. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 12 Technische Informatik Hardwareseitigen Grundlagen der Informatik ♦ Rechnerarchitektur ● Mikroprozessor ● Speicher ● Controller ● Peripherie ♦ Rechnerkommunikation ● Verteilten Systeme ● Grid-Computing ● Middleware GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 13 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.) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 14 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) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 15 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.) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Was Ist Information? → Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung 16 Betriebssysteme ▪ Was ist ein Betriebssystem: ♦ Software, die den Betrieb des Computers ermöglicht. ♦ Verwaltet Betriebsmittel wie Speicher, Einund Ausgabegeräte ♦ steuert die Ausführung von Programmen. ▪ Englisch operating system (OS) ▪ ...mehr dazu später GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Felder der Informatik → Betriebssysteme→ Programmiersprachen → Java Einführung → Java Beispiel 17 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Betriebssysteme→ Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE 18 AUSBLICK ▪ ▪ Java „Crash-Kurs“ Elementare Begriffe der Programmierung GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 19 ??? Fragen Welche Fragen haben Sie? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 20 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 21 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 22 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 5.0 (Tiger Edition) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Programmiersprachen → Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius 23 JETZT Die erste Tasse Java GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 24 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 25 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 26 Kommandozeile – 2 public class Hello { public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } } GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 27 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 cd c:\programme\java\jdk1.6.0_14\bin c:javac z:\javueb1\Hello.java (… bitte warten …) Ausführen java Hello GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 28 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 … GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 29 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. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 30 Achtung! Die erste Tasse Java und ganz viel Neues GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 31 Merke! Eine Klasse = Eine Datei Name Klasse = Name .java Datei GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 32 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 33 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) GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 34 Nachbetrachtung! public class Hello { class Hello { class = Eine Klasse wird class „Name“ { definiert. GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 35 Nachbetrachtung! public class Hello { public = Zugriffsattribut Zugriffsattribute legen fest, ob und wie andere Klassen auf die eigene Klasse zugreifen können GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 36 Nachbetrachtung! public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } main = Wenn eine Application gestartet wird, wird automatisch die Funktion main() aufgerufen GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 37 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. GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 38 Nachbetrachtung! public class Hello { public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } } Verwaltung Anweisungen = Eingabe/Verarbeitung/Ausgabe GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 39 Nachbetrachtung! public class Hello { public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } } { } = Kapselung von Anweisungs- und Definitionsblöcken GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 40 Nachbetrachtung! public static void main(String[ ] args) { System.out.println(“Hallo Mannheim!“); } ; Jede Anweisung wird mit ; abgeschlossen GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 41 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Einführung → Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare 42 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 43 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! GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 44 Eclipse – 3 Für Ihre ersten Schritte werden Sie ausschließlich zwischen diesen beiden, automatisch generierten, Klammern programmieren. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 45 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 … GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 46 Eclipse – 5 Weitere Informationen unter: ▪ ▪ ▪ ▪ Pflicht ! Eclipse FAQ http://www.eclipse.org/eclipse/faq/eclipse-faq.html Eclipse Dokumentation http://www.eclipse.org/documentation/main.html Sehr guter Einführungsartikel in Eclipse, u.a. mit Pflicht ! weiterführenden Informationen zum Debugging etc. http://www.onjava.com/pub/a/onjava/2002/12/ 11/eclipse.html?page=1 B. Daum: Java-Entwicklung mit Eclipse 3; dpunkt; ISBN 389864281X; 44,00 € GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 47 Eclipse Eclipse = IDE IDE = Integrierte Entwicklungsumgebung. Ein Anwendungsprogramm zur Entwicklung von Software. (engl. Integrated Development Environment) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel → Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf 48 IDE IDE ▪ ▪ ▪ ▪ ▪ Texteditor Compiler bzw. Interpreter Linker Debugger Quelltextformatierungsfunktion Meist wird nur eine Programmiersprache unterstützt. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen 49 Vorteile von Eclipse ▪ ▪ ▪ ▪ Vereinfachte Projektabwicklung Fehler werden gleich angezeigt Inkrementeller Compiler Eingebauter Debugger GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen 50 Hilfe in Eclipse GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) 51 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Eclipse → IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen 52 Das zweite Beispiel – 1 import java.io.*; import java.util.*; 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; GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 53 Das zweite Beispiel – 2 // Für die Eingabe von der Tastatur BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in)); // Berechnungsschleife do { // Anleitungausgeben System.out.println( "Programm endet durch Eingabe von 0"); System.out.println("Eingabe der Celsius-Temperatur: "); // Eingabe, Double-Wert einlesen eingabeZeile = eingabe.readLine(); c = Double.parseDouble(eingabeZeile); GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 54 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 ( Math.abs(c) > 0 ); System.out.println("... und tschüss"); } } GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 55 Wichtig! Neues? GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 56 Schlüsselwort import import java.io.*; import java.util.*; 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...) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 57 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...) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 58 Schlüsselwort do do { ... } while (Math.abs(c) > 0 ); Eine Wiederholung: Schleife “Mache solange Bedingung erfüllt“ (mehr dazu in späteren Folien...) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 59 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. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 60 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...) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 61 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...) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 62 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...) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) IDE → Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau 63 Wichtig! Kommentare GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 64 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 65 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 66 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! GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 67 Das zweite Beispiel – 4 ▪ ▪ Download unter http://www.informatik.fh-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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 68 Weiteres Beispiel – 4 ▪ ▪ ▪ Download unter http://www.informatik.fh-mannheim.de/~mechler/ Summe.java Neu hier: StringTokenizer t = new StringTokenizer(eingabeZeile,"+"); Zerteilt einen Text am „+“ GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 69 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Beispiel: Celsius → Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen 70 JETZT! Programmentwurf Programmentwurf GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 71 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? GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 72 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 73 Ein Ablaufplan ja nein Funktioniert der PC? Bloß nicht mehr dran rumbasteln? Hat's jemand gemerkt? Hast du dran rumgespielt? ja Oh NEIN! nein nein ja Unauffällig pfeifen und verschwinden ja Wird dich jemand verantworlich machen? Große KATASTROPHE!!! nein ja nein Kannst du jemand die Schuld zuschieben? Kümmere dich nicht drum! ja ALLES KLAR! GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 74 Test! ▪ ▪ ▪ ▪ Start des Programms Speicher unter dem Variablennamen i den Wert 1 Ergebnis: 1 2 3 Gebe solange den Wert von i aus, bis i einen Wert größer als 100 inne hat. Prüfe jedoch vorher, ob i den Wert 39 erreicht, speichere dann den Wert 61 unter dem Variablennamen i. ... Beende das Programm 100 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 38 39 61 62 ... 75 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 76 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) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 77 Struktogramm – 3 Prozess ▪▪ ▪ Verarbeitung, Prozess Rahmen enthält die weiteren Operationen wie z.B. ♦ Zuweisungen ♦ Ein-/Ausgabebefehle ♦ Unterprogrammaufrufe etc. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 78 Struktogramm – 4 Anweisung ▪ weiteren Operationen wie z.B. ♦ Zuweisungen ♦ Ein-/Ausgabebefehle ♦ Unterprogrammaufrufe etc. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 79 Struktogramm – 5 Anweisung 1 Anweisung 2 Anweisung 3 ▪ ▪ Folge, Sequenz Mehrere Arbeitsschritte werden durch Folge von Strukturblöcken dargestellt GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 80 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 81 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 82 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 83 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 84 Struktogramm – 10 Zielort für Aussprung Aussprung Beendigung eines Programmteils GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 85 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 86 StruktEd StruktEd www.strukted.de Drag'n'Drop Sehr gute OnlineHilfe Ausdruck oder: [STRG] + G Achtung! Drucker muss installiert sein! GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 87 Info! ♦♦ Dafür Dafürsorgen, sorgen,dass dassfür fürdie dieÜbungen Übungenalles alles funktioniert funktioniert ♦♦ Eclipse Eclipseinstallieren; installieren;zuerst zuerstJava Java6.0, 6.0,dann dannEclipse Eclipse ♦♦ Rechtzeitig: Rechtzeitig:Folien, Folien,Übung Übung ♦♦ Literatur Literatur GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 88 ??? Fragen Welche Welche Entwurfsmethoden Entwurfsmethoden kennen kennen Sie Sie noch? noch? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 89 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 90 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 91 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 92 Weitere Methoden – 4 ▪ ▪ OOD (Object Oriented Design, Vorgänger von UML) Jackson- oder Warnier-Orr-Diagramm (8 Basisblöcke) ▪ Entscheidungstabellen ▪ Weitere Strukturdiagramme GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 93 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 94 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 95 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Kommentare → Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur 96 JETZT Algorithmen GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 97 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 ▪ ▪ GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 98 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“ GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 99 Kochbuch GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 100 Kochbuch Wie koche ich mir (m)einen Algorithmus? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 101 Entwurf Der Entwurf von Algorithmen ist ein kreativer Prozess, der nicht automatisiert werden kann. ▪ ▪ unabhängig Programmiersprachen unabhängig von der Rechner-Hardware GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 102 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 GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 103 Algorithmus definierte Handlungsvorschrift zur Lösung eines Problems GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 104 Abgrenzung Heuristik (griech.: Kunst des Findens bzw. Erfindens). Informatik: geschickte Lösung mit wenig Aufwand GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 105 Korrektheit ▪ ▪ 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. GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 106 Weitere Forderungen ▪ ▪ ▪ ▪ ▪ ▪ ▪ Effizienz Benutzerfreundlichkeit Flexibilität Robustheit/Stabilität Lesbarkeit Wiederverwendbarkeit ... Diese Forderungen sind optional - aber wichtig ! GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 107 Los geht's: Kochen Zutaten Kochwerkzeug Grundrezepte GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 108 Resultate Wie erreiche ich beim Kochen ein (gutes) Resultat: ▪ ▪ ▪ (Aus)probieren Erfahrung Rezept GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 109 Analogie Algorithmus → Rezept GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 110 Nachgefragt? Wie komme ich beim Kochen zu einem Rezept? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 111 Nachgefragt? Wie erhalte ich ein Rezept: ▪ ▪ ▪ ▪ Kaufen (Kochbuch) Ausprobieren Erfahrung Verfeinern GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 112 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 GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 113 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) GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 114 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 GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 115 Spiegelei... ▪ ▪ ▪ Eier aufschlagen In die Pfanne warten straightforward GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 116 Große Menüs Gebeizter Lachs mit Kräutersahne Blattsalat und Kartoffelpuffer *** Knusprige Ente mit Blaukraut und Reibeknödel *** Lebkuchenmousse mit Mandarinensorbet GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 117 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 .... GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 118 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 ..... GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 119 Von oben oder unten? Variante I: Ich plane das Menü, dann kümmere ich mich um die Gänge Dann die Speißen der Gänge Dann die Zutaten ▪ ▪ ▪ ▪ Variante II: Ich schaue nach den Zutaten Daraus kombiniere ich Speißen Aus den Speisen Gänge Aus den Gängen das Menü ▪ ▪ ▪ ▪ GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 120 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 GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 121 bon appétit! Beinahe hätten wir das Beste vergessen: ▪ ▪ Gekochtes essen ! Algorithmus: anwenden GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 122 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 GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 123 Hinkucker... GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Programmentwurf → Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten 124 JETZT Java Java GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 125 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 126 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 127 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. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 128 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 129 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. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 130 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 131 Sprachbeschreibung von Java http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 132 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Algorithmen→ Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen 133 JETZT! Elementare Elementare Datentypen, Datentypen, Operationen Operationen GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 134 Wie geht's weiter? Vordefinierte Datentypen Boolean Ganzzahlige Datentypen Operationen auf ganzzahligen Datentypen Reelle Zahlen Operationen auf reellen Zahlen GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 135 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 136 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 137 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 138 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 139 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) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 140 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 141 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 142 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 143 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 144 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 145 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 146 Operationen auf ganzzahligen Typen – 3 Beispiele für die ganzzahlige Division 11 / 4 =? 2 11 / -4 → =? -2 -11 / 4 → =? → -11 / -4 = ? -2 → 2 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 147 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 148 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Zeilennummer Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 149 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 150 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 151 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 152 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) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Mantisse (1+m) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 153 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 = - 0.11bin = - 0.11bin * 2 0 = -1.1 bin * 2 -1 | 1. Umformen das eine Binärzahl verbleibt | 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 154 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 ) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 155 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 156 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!) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 157 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 158 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" ). GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 159 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 160 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 GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 161 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! GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 162 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. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 163 Operationen auf reellen Zahlen – 4 Es gibt eine weitere Rechnung, die zu einer besonderen Situation führt: Die Division durch 0, z.B. 1f / 0f Ergebnistyp: float 1d / 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 → Bei Operationen auf reellen Zahlen tritt keine Exception auf GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 164 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 165 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 166 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 167 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 168 ??? Fragen Haben Sie Fragen? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Java Sprachaufbau → Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if 169 JETZT! Struktur von Java Programmen GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 170 Struktur ▪ ▪ ▪ Programmkopf ♦ Import von Bibliotheken ♦ Name (Identifikation) Datenbeschreibungen ♦ Konstantenfestlegung ♦ Variablen-Deklaration ♦ Variablen-Initialisierung Funktionsbeschreibungen ♦ Definition von Teilfunktionen ♦ Berechnungen ♦ Ablaufsteuerung ♦ Ein- / Ausgabe GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 171 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)); GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 172 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 } } GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 173 JETZT! Variablen GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 174 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 175 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 176 Beispiele für Variablen-Vereinbarungen boolean a, b, c; int i, j, k; float f; double d1, d2; String name, vorname; byte b; GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) 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 177 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 ... } } GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 178 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 179 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: … GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) 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 180 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 181 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"; GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 182 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 = *= /= %= += -= <<= >>= >>>= &= ^= |= GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 183 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 184 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; GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 185 JETZT! Konstanten GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 186 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 187 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 188 Ort der Konstanten-Vereinbarung Eclipse generiert den folgenden Code-Rahmen: class HelloWorld { Konstanten werden an dieser Stelle vereinbart public static void main(String[] args) { ... } } GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 189 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 } } GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 190 JETZT! Zuweisungen GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 191 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. GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 192 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; GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 193 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 GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 194 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; GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 195 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; GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 196 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 197 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 198 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 199 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 200 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 201 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 202 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 203 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 204 Abkürzende Schreibweisen – 5 Die folgende Syntaxregel beschreibt Zuweisungen (Assignment) sowie die vorgestellten abkürzenden Schreibweisen: StatementExpression: Assignment PreIncrementExpression PreDecrementExpression PostIncrementExpression PostDecrementExpression ... GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 205 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 206 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) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 207 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 208 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 209 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 210 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) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Namensräume Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 211 ??? Fragen Welche Fragen gibt es? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen – Bedingungen: if → Schleifen 212 JETZT if - Anweisung GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 213 Bedingungen in Algorithmen Anweisung Bedingung erfüllt Anweisung Bedingung nicht erfüllt Bedingung erfüllt Bedingung nicht erfüllt Alternative Anweisung 1 Anweisung Anweisung GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Alternative Anweisung 2 Anweisung Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 214 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 215 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 216 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 217 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 218 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; GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 219 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> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 220 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“ GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 221 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 222 Konventionen zur Notation – 2 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> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 223 Konventionen zur Notation – 3 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> ... ... <Anweisung> <Anweisung> } else } ... <Anweisung> <Anweisung> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 224 Konventionen zur Notation – 4 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> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 225 Konventionen zur Notation – 5 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> if ( <Bedingung> ) { <Anweisung> ... <Anweisung> } else { <Anweisung> } <Anweisung> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 226 Konventionen zur Notation – 6 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> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) 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 227 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 GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 228 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 ; GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 229 ??? Fragen Welche Fragen gibt es? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 230 JETZT! Schleifen GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 231 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 232 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 233 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 234 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 235 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") GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) 2 3 4 ... 10 Ende Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 236 Beispiel – 3 int i, summe; summe = 0; i = 0; do { summe += i; i++; } while ( i < 100 ); System.out.println( summe ); GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 237 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 238 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 239 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 240 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 ) GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) 10 Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 241 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") GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Ausgabe: 2 3 4 ... 10 Ende Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 242 Beispiel für eine abweisende Schleife – 3 int i, summe; summe = 0; i = 0; while ( i < 100 ) { summe += i; i++; } System.out.println( summe ); GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 243 Überführung von Schleifen: akzeptierende in abweisende – 1 Anweisung1 Anweisung1 Bedingung erfüllt Bedingung nicht erfüllt Bedingung nicht erfüllt GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Bedingung erfüllt Anweisung1 Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 244 Überführung von Schleifen: akzeptierende in abweisende – 2 do <Anweisung> while ( <Bedingung> ); <Anweisung> while ( <Bedingung> ) <Anweisung> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 245 Ü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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 246 Überführung von Schleifen: abweisende in akzeptierende – 2 while ( <Bedingung> ) <Anweisung> if ( <Bedingung> ) do <Anweisung> while ( <Bedingung> ); GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 247 Konventionen zur Notation – 1 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> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 248 Konventionen zur Notation – 2 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> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 249 Konventionen zur Notation – 3 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> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 250 Konventionen zur Notation – 4 Besteht der Rumpf einer do-Schleife aus einer Anweisungsfolge, so wird das do mit der öffnenden Klammer alleine in einer Zeile notiert, der Inhalt der Anweisungsfolge wird eingerückt und die schließende Klammer steht mit dem while und seiner Bedingung in einer Zeile und wieder auf Höhe des do Beispiel: <Anweisung> do { <Anweisung> ... <Anweisung> } while ( <Bedingung> ); <Anweisung> Ziel dieser Konventionen: Man soll auf einen Blick erkennen, um welche Schleife es sich handelt und was zum Schleifenrumpf gehört GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 251 ??? Fragen Welche Fragen gibt es? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 252 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 253 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 254 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 255 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 ); GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 256 Beispiel für eine for-Schleife – 2 for ( i = 1; i <= 10; i++ ) i=1 System.out.println( i ); i > 10 i <= 10 Äquivalente while-Schleife System.out.println( i ) i++ GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) i = 1; while ( i <= 10 ) { System.out.println( i ); i++; } Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 257 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 ); } GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 258 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 259 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" ); GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 260 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++; } GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 261 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> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 262 Konventionen zur Notation – 2 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> GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 263 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 GDI – TSK , Imperative Programmierung - Teil I ( V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 264 ??? Fragen Welche Fragen gibt es? GDI – TSK , Imperative Programmierung - Teil I (V4 – 26.09.10) Datentypen→ Java Struktur → Variablen und Konstanten → Zuweisungen → Bedingungen: if → Schleifen 265