Programmieren 1 – VL 2 Spaß am Programmieren Bachelor Medieninformatik Winteremester 2015 Dipl.-Inform. Ilse Schmiedecke [email protected] Schmiedecke – Programmieren 1 1 Erinnern Sie sich an Eliza? public class Eliza { public static void main(String[] args) { System.out.println(„Hello, I‘m Eliza," +" – what‘s your name?"); String input = Console.readln(); System.out.println(„Nice to meet you, " + input + "! How are you today?"); input = Tastatur.readln(); System.out.println(„Really? Why?"); input = Console.readln(); System.out.println(„What do you mean by: " + input + "?"); } } Programm, das nur einen Algorithmus implementiert interaktiv es Batch-Programm: Es läuft durch und endet. Schmiedecke – Programmieren 1 2 2 Wir haben etwas über Programmstruktur gelernt Was bedeutet: class method main method statement sequence alternative loop variable String assignation Schmiedecke – Programmieren 1 3 3 Schreiben wir ein paar "typische" Programme Einige Algorithmen-Aufgaben: Das Haufenspiel Berechnen der Zahl Pi Berechnen der Zahl E Berechnen der ersten 100 Primzahlen Schmiedecke – Programmieren 1 4 4 Wir brauchen Zahlen und Rechenoperationen... • • • • Bisher waren alle unsere Daten Texte, d.h. vom Typ String jetzt brauchen wir Ganzzahlen (engl. integers) vom Typ int und Bruchzahlen (engl. floating point numbers) vom Typ double (oder float) Alle üblichen arithmetischen Operatoren, wie + und *, sind in Java vorhanden Beispiele: int schachtelgroesse = 20*12*14; // in cm double tempoAnrechnung = tempoMessung * 0.98; // 2% Toleranz Daumenregel: Datentypen nicht mischen.... Schmiedecke – Programmieren 1 5 5 Wir brauchen Verzweigungen "Wenn x kleiner ist als 0, multipliziere es mit -1" if (x<0) { x = x*(-1); } "Wenn x kleiner ist als null, multipliziere es mit -1, sonst kopiere den Wert nach y und setze x auf 0." if (x<0) x = x*(-1); else { y = x; x = 0; } // {..} nicht nötig, weil nur 1 Befehl Schmiedecke – Programmieren 1 6 6 Wir brauchen Schleifen (Wiederholungen) Solange x kleiner als 100 ist, verdoppele den Wert. while (x<100) { x = x*2; } Achtung: Endlosschleife, falls (x <=0) !! Kombination: if (x<=0) x=1; while (x<100) { x = x*2; } Schmiedecke – Programmieren 1 7 7 Das Haufenspiel 2 Spieler räumen einen Haufen Streichhölzer ab. Der erste Spieler kann beliebig viele Streichhölzer abräumen, es müssen nur mind. 2 übrigbleiben. Danach ziehen die Spieler abwechselnd: Jeder entnimmt mindestens ein Holz und max. eins mehr als der Spieler vor ihm. Wer das letzte Holz nimmt, hat verloren Schmiedecke – Programmieren 1 8 8 Strategie 1 Nimm soviele Hölzer wie möglich, Lass genau 2 übrig. Schmiedecke – Programmieren 1 9 9 Haufenspiel: Der Dialog public class Heap { static int heapSize; static int myRemoval; static int otherRemoval; public static void main(String[] args) { setHeapSize(); while (heapSize>1) { askForRemoval(); otherRemoval=Integer.parseInt(Console.readln()); checkRemoval(); heapSize=heapSize-otherRemoval; draw(); // and find out about end of game } } Schmiedecke – Programmieren 1 10 10 Hilfsprozeduren private static void setHeapSize() { System.out.println("How many matches do we play with?"); heapSize=Integer.parseInt(Console.readln()); myRemoval = heapSize-3; } private static void askForRemoval() { System.out.println("Our heap contains "+heapSize+" matches"); System.out.println("Don't take more than "+(myRemoval+1)); System.out.println("How many do you take? "); } private static void checkRemoval() { if (otherRemoval<=0 | otherRemoval >heapSize | otherRemoval >myRemoval+1) { System.out.println(""+removal+ "was not allowed."+ " So you take 1!"); otherRemoval=1; } Schmiedecke – Programmieren 1 11 11 Haufenspiel: der strategische Kern private static void draw() { if (heapSize==1) System.out.println("I lost. Well done!"); else if (heapSize==0) System.out.println("You lost, too bad :("); else { findOptimum(); System.out.println("I take "+ myRemoval); heapSize=heapSize- myRemoval; if (heapSize==1) System.out.println("You lost, too bad :("); } } private static void findOptimum() // 1st strategy { if (heapSize-otherRemoval-1 >= 2) myRemoval=otherRemoval+1; else (if heapSize > 2) myRemoval=heapSize-2; else myRemoval = 1; } Schmiedecke – Programmieren 1 12 12 Strategie 2 Kontrolliere die Optionen des anderen Spielers, indem du je nach Haufenbestand 1-3 Hölzer nimmst, Damit wird die Runde auf 1-5 Hölzer heruntergebrochen: Teile den Haufen durch 5 und betrachte den Teilungsrest ("modulo" genannt, geschrieben %) Wenn der Teilungsrest 3 oder größer ist, versuche, den Teilungsrest minus 1 zu nehmen. Andernfalls nimm 1. Schmiedecke – Programmieren 1 13 13 Haufenspiel: Dialog und Hilfsprozeduren unverändert ....... Schmiedecke – Programmieren 1 14 14 Haufenspiel: der strategische Kern public static void findOptimum() // 2nd strategy { if (heapSize%5==3) myRemoval=2; else if (heapSize%5==4 & otherRemoval>=2) myRemoval=3; else myRemoval=1; } Nur diese Prozedur wird ausgetauscht Schmiedecke – Programmieren 1 15 15 Nun ein bisschen Mathe Die Leibnitz-formel für Pi Pi/4= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - ... Reihenentwicklung für die Eulersche Zahl e ex= x + 1 + x2/2! + x3/3! + x4/4! + ... einfach für x=1 Schmiedecke – Programmieren 1 16 16 Euler public class FindE { /* this program calculates Euler's number e * according to the formula * e^x = x + 1 + x^2/2! + x^3/3! + x^4/4! + ... * using x=1 */ static double factorial = 1; static double e = 2; // start value x +1 public static void main(String[] args) { int numTerms = 2; // two terms in start value while (numTerms <1000){ factorial = factorial * numTerms; e = e + 1 / factorial; numTerms = numTerms +1; System.out.format("%4d e = %21.20f",numTerms, e); System.out.println(); } } } Schmiedecke – Programmieren 1 17 17 Pi public class FindPi { /* This program calculates the number pi according to * Leibnitz's formula: * Pi/4= 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + 1/13 - ... * * The max number of terms is preset to 10000; * */ static double piBy4 = 0; static double denominator = 1; static double factor = 1; static int maxTerms = 100000; Schmiedecke – Programmieren 1 18 18 Pi - Fortsetzung public static void main(String[] args) { int numTerms = 0; while (numTerms <= maxTerms) { double term = factor / denominator; piBy4 = piBy4 + term; factor = -factor; // either 1 or -1 denominator = denominator +2; numTerms = numTerms + 1; System.out.format("%4d pi = %21.20f", numTerms, piBy4*4); System.out.println(); } } } Schmiedecke – Programmieren 1 19 19 Programmiersprachen Java ist eine formale Sprache. Sie konnten Heap, FindE, FindE von Hand ausführen. Wieso? Weil sie <ein bisschen> Java "sprechen" D.h. Sie verstehen die <grundlegende> Struktur der Sprache Syntax und die Ausführungsbedeutung des Java-Textes Semantik Schmiedecke – Programmieren 1 20 20 Java Syntax: Klasse Class declaration class header class body <option> <sequence> public class class name { declaration } <choice> Identifier <sequence> method declaration attribute declaration <choice> letter letter digit hint: <sequence> means 0 or more elements Schmiedecke – Programmieren 1 <choice> exactly one element 21 21 Java Syntax: Methoden-Deklaration method declaration method header <option> method body <option> Access static <choice> public private return type method name <choice> Identifier ( <sequence> ) { statement method call void } ; type Schmiedecke – Programmieren 1 22 22 Syntax Definition in Backus Naur Form (BNF) ClassDeclaration :: ClassHeader, ClassBody ClassHeader :: [ "public" ], "class", ClassName ClassName :: Identifier Identifier :: Letter , { Letter | Digit} * Digit :: "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ClassBody :: "{", Declaration*, "}" Declaration :: MethodDeclaration | AttributeDeclaration Legend: :: {} [] definition grouping option * | 0 or more repetions choice Schmiedecke – Programmieren 1 23 23 Test Welches sind gültige Identifier? toysRus MAMAMIA 12345 12-March-2005 Ist dies eine gültige Klassendeklaration? class MAMAMIA {} Sind dies gültige Methodendeklarationen? private method() { } void main() { Console.println("") } Schmiedecke – Programmieren 1 24 24 Freier Text Kommentare ermöglichen das Einfügen beliebiger (erläuternder) Texte in den Code. Sie werden vom Compiler ignoriert. Zwei Sorten von Kommentaren: Zeilenkommentar: alles von // bis zum Zeilenende ist ein Kommentar public int age; // max 100 Mehrzeilenkommentar: Alles zwischen /* und */ ist ein Kommentat public /* static not allowed */ int age; /* otherwise all Objects * would have * the same age */ Schmiedecke – Programmieren 1 25 25 ... und Konventionen Die Java Community hat sich auf die Einhaltung einiger Konventionen geeinigt: Nur Klassennamen werden groß geschrieben Worttrennung in Namen durch "CamelCase" MyFirstJavaProgram Öffnende und schließende geschweifte Klammer in derselben Spalte (auch zulässig: öffende Klammer am Zeilenende, dann Einrückung) Einrücken bei jeder öffnenden geschweiften Klammer! Für jede Anweisung eine neue Zeile Schmiedecke – Programmieren 1 Konventionen unterstützen die Lesbarkeit 26 26 Programme sollten immer lesbar sein! Schmiedecke – Programmieren 1 27 27 Der Programm-Entwicklungsprozess Problem: Strukturierter Text Löungskonzept: Spezifikation: Text und/oder Zeichnung Programm-Prototyp: Erstimplementierung, lauffähig und dokumentiert Programm gründlich gestestet! Schmiedecke – Programmieren 1 28 28 Das Haufenspiel 2 Spieler räumen einen Haufen Streichhölzer ab. Der erste Spieler kann beliebig viele Streichhölzer abräumen, es müssen nur mind. 2 übrigbleiben. Danach ziehen die Spieler abwechselnd: Jeder entnimmt mindestens ein Holz und max. eins mehr als der Spieler vor dir. Wer das letzte Holz nimmt, hat verloren Nicht wirklich genau genug! - Wieviele Steichhölzer? - Wer spielt als erster? - ... Schmiedecke – Programmieren 1 29 29 ategy Teile den Haufen durch 5 und betrachte den Teilungsrest ("modulo" genannt, geschrieben %) Wenn der Teilungsrest 3 oder größer ist, versuche, den Teilungsrest minus 1 zu nehmen. Andernfalls nimm 1. Wenn Zahl % 5 größer oder gleich 3 , versuche Zahl % 5-1 zu nehmen. Beachte die Obergrenze letzter Zug +1. Sonst nimm 1 Modell des Algorithmus Schmiedecke – Programmieren 1 30 30 Implementierung Schreibe den Java-Code und kompiliere ihn. Korrigiere die Syntaxfehler! Bringe das Programm zu Laufen! Das war noch nicht alles! Tut das Programm das Richtige? Tut es das immer? Schmiedecke – Programmieren 1 31 31 Teste das Programm gründlich! Es wird sich falsch benehmen, jedenfalls manchmal!! teste mit verschiedenen Haufengrößen versuche es mit negativer Haufengröße versuche verbotene Züge versuche, seltsame Eingaben zu machen .... Dann endlich ist es einProgramm Schmiedecke – Programmieren 1 32 32 Übesetzung Java ist eine besondere Sprache: Java wird kompiliert UND interpretiert. Java wird nicht nach Assembler kompiliert sondern nach JavaByteCode. JavaByteCode kann auf jeder Maschine sehr effizient interpretiert werden. Kompilierte Java-Programme können auf verschiedenen Rechern laufen: Plattform-Unabhängigkeit Schmiedecke – Programmieren 1 Hat das etwas mit dem Internet zu tun? 33 33 Interpretation vs. Kompilation Progr. Source Interpreter Output plattformunabhängig langsam Input Progr. Source Program Compiler load Input Interpretation Program Schmiedecke – Programmieren 1 Output Kompilation und Ausführung plattformabhängig schnell 34 34 Java-Übersetzung und Ausführung JavaSource Compiler ByteCode Kompilation und ByteCode Interpreter Input platform specific Schmiedecke – Programmieren 1 Output Interpretation: plattformunabhängig schnell 35 35 Ihr Entwicklungs-Werkzeugkoffer Task Tool Result Type or correct program, save in file (1 file per class) Editor e.g Notepad++, Textpad Text file (ASCII) Name.java Translate program into ByteCode Compiler javac.exe Bytecode file (binary) Name.class Execute bytecode, Test program Interpreter java.exe Program output Preparation: set search paths, provide libraries, track versions, etc. Operating System, File System adapted working environment Schmiedecke – Programmieren 1 36 36 Integrated Programming Tools simplify program development and reduce errors Großartige IDE(e)! Integrated Development Environment ein Multi-Tool – all in one... Dateien zusammengefasst zu Projekten (incl. Textdateien, Daten, Medien,...) Automatische Einrichtung der Arbeitsumgebung (classpath...) Editieren, Übersetzen, Ausführen, Debuggen – alles in einem Werkzeug ... und noch viel mehr... Schmiedecke – Programmieren 1 37 37 Wir benutzen Eclipse In Java geschrieben, läuft auch auf Ihrem Rechner!! Schmiedecke – Programmieren 1 38 38 Schmiedecke – Programmieren 1 39 39 Schwindelig im Kopf? Wir haben die Passhöhe erreicht... Jetzt geht es in kleineren Schritten voran. Schmiedecke – Programmieren 1 40 40