Vorkurs: Java-Einführung Dr. Hui Shi 10. Oktober 2016 1 Überblick 1 Organisatoriches 2 Von Algorithmen zu Programmen Intuitiver Algorithmusbegriff 3 Grundlegende Konzepte der Programmiersprache Java Syntax und Semantik Datentypen in Java und API Steuerungs-Anweisungen in Java 4 Java Programme Einfache Java-Programme Attribute Konstruktoren Methoden Verwendung von Klassen 2 Veranstalterin Dr. Hui Shi: Cartesium 1.53, Tel. 218-64260 [email protected] Literaturempfehlung (optional) R. Sedgewick und K. Wayne: Einführung in die Programmierung mit Java. Pearson Verlag 2011. ISBN 978-3-86894-067-3 3 Termine Termin T1 T2 T3 T4 T5 T6 Datum 10.10. 12.10. 12.10. 12.10. 13.10. 13.10. Zeit 12-14 08-10 10-12 12-14 10-12 14-16 4 Raum MZH 1380/1400 MZH P1 (Windows) MZH P1 (Windows) MZH P1 (Windows) MZH P1 (Windows) MZH P1 (Windows) Von Algorithmen zu Programmen 5 Inhalt Intuitiver Algorithmusbegriff Beispiele für Algorithmen Bausteine der Programmiersprache Java Intuitiver Algorithmusbegriff Algorithmen sind Vorschriften zur Ausführung einer Tätigkeit. Beispiele sind Bedienungsanleitungen, Bauanleitungen, Kochrezepte Definition Ein Algorithmus ist eine präzise (d.h. in einer festgelegten Sprache abgefasste) endliche Beschreibung eines allgemeinen Verfahrens unter Verwendung ausführbarer elementarer Verarbeitungsschritte. Primzahl-Test Test, ob eine gegebene natürliche Zahl eine Primzahl ist Definition: Eine Primzahl ist eine natürliche Zahl mit genau zwei verschiedenen natürlichen Teilern, nämlich 1 und sich selbst. Natürliche Zahlen (Bsp.) 1 2 31 1029 1031 Primzahl? Ein Algorithmus 1 Sei x eine natürliche Zahl, b eine Variable vom Wert wahr oder falsch. 2 Initialisiere b mit wahr. 3 Falls x kleiner als 2, dann weise b false zu. Gehe zu 5. Sonst 4 Sei i eine Variable von natürlicher Zahlen. Initialisiere i mit 2. Solange i kleiner als x ist, führe Schritte i und ii aus. 1 2 5 Falls x durch i teilbar ist, weise b false zu. Gehe zu 5. Sonst erhöhe i um 1. Falls b falsch ist, ist x keine Primzahl, sonst ist x eine Primzahl. Ein Java-Programm: PrimeTest p u b l i c c l a s s PrimeTest { public void isPrime ( int x) { boolean b = true ; i f ( x <2) { b = false ; } else { int i = 2; w h i l e ( i <x ) { i f ( x%i ==0) { b = false ; break ; } e l s e { i = i + 1;} } } i f (! b) { System . o u t . p r i n t l n ( x + ” i s n o t a p r i m e number . ” ) ; } e l s e { System . o u t . p r i n t l n ( x + ” i s a p r i m e number . ” ) ; } } } 10 Bausteine der Programmiersprache Java Typen, z.B. int: natürliche Zahl boolean: Wahrheitswert Variablen, z.B., x, b und i Konstanten, z.B., 1, 2, true und false Operationen, z.B. <: kleiner als, x < 2 und i < x +: Plus, i + 1 %: Restberechnung, x%i ==: Vergleich, x%i == 0 Deklarationen, z.B., int : x, i und boolean : b Anweisungen, z.B. =: Zuweisung, b = true, b = false, i = 2 und i = i + 1 while: solang, while (i < x) if-else: falls-sonst, if ((x%i) == 0) · · · else · · · , if (!b) · · · else · · · break: hier für gehe zu System.out.println: hier für die Ausgabe des Ergebnisses 11 Binärsystem Berechnung der binären Darstellung einer dezimalen Zahl Dezimale Zahl 10 -10 123 -123 Binäre Darstellung (Bsp. 8-Bit) Binärsystem Berechnung der dezimalen Darstellung einer binären Zahl Binäre Zahl (Bsp. 8-Bit) 00000000 00000001 00000010 01111111 11110000 Dezimale Darstellung Übung ueb1.pdf 14 Grundlegende Konzepte der Programmiersprache Java 15 Inhalt Syntax und Semantik Programmiersprache Java Primitive Typen in Java Zeichenfolgen: String Bibliotheken und API Steuerungs-Anweisungen in Java Syntax und Semantik Syntax Die Syntax gibt formale Regeln vor, welche Satzmuster gebildet werden können. Beispiel Die Kinder spielen mit dem Ball. (syntaktisch korrekt) Die Kinder spielen dem Ball mit. (syntaktisch falsch) Semantik Die Semantik legt die Bedeutung fest. Beispiel Die Kinder spielen mit dem Ball. (semantisch korrekt, sinnhaft) Der Ball spielt mit den Kindern. (semantisch falsch, sinnlos) Programmiersprache Java Ausdrucksmittel zur Formulierung von Algorithmen Kommunikation zwischen Menschen und Maschinen verständlich für Menschen und verarbeitbar für Maschinen Generationen maschinenorientierte Sprachen (assembler) prozedurale Sprachen (imperative Sprachen) objektorientierte Sprachen Java: eine objektorientierte Programmiersprache 18 Erstes Java-Programm c l a s s HelloWorld { p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) { System . o u t . p r i n t l n ( ” H e l l o , World ” ) ; } } Java-Programmierung mit BlueJ Projekt erstellen Klasse erzeugen Programm kompilieren Editor Compiler HelloWorld.java HelloWorld.class programm ausführen JVM "Hello, World" Einige Java-Standardbegriffe Klasse: HelloWorld Hauptmethode: public static void main(String args[]) Anweisung: System.out.println(“Hello, World”) Programme mit Parametern class Hello { p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) { String t i t l e = args [ 0 ] ; // d e r e r s t e P a r a m e t e r S t r i n g nachname = a r g s [ 1 ] ; // d e r z w e i t e P a r a m e t e r S t r i n g vorname = a r g s [ 2 ] ; // d e r d r i t t e P a r a m e t e r System . o u t . p r i n t l n ( ” H e l l o , ” + t i t l e + ” ” + vorname + ” ” + nachname ) ; } } Ausführung: {“Mr.”, “Mustermann”, “Max”} Übung: Ein BlueJ-Projekt für das Hello-Programm erstellen, übersetzten und ausführen. 20 Datentypen in Java Datentypen legen die zu bearbeitenden Informationseinheiten fest. Ein Datentyp hat einen Wertebereich und einen dazugehörigen Satz an Operationen. Es gibt zwei Arten von Datentypen in Java: primitive Typen und Referenztypen oder Klassen. Java ist eine stark typisierte Programmiersprache. Der Typ jeder Variable und jedes Ausdrucks ist in der Übersetzungszeit bekannt. Der Typ einer Variable beschränkt die Werte, die die Variable speichern darf. Der Typ eines Ausdrucks beschränkt den Wert, den der Ausdruck produzieren darf. Typen beschränken auch die Operationen und deren Bedeutungen in Ausdrücken. 21 Primitive Datentypen Die primitive Datentypen sind die in der Sprache “eingebauten” Typen zur Speicherung von Werten Numerische Typen für Ganzzahlen, z.B. int Numerische Typen für Gleitkommazahlen, z.B. double Zeichen-Datentyp: char boolescher Datentyp: boolean Beispiele primitiver Datentypen in Java Datentyp int double char boolean Werte (Bsp.) 3, 0, -24 345.7, 3.14 ’a’, ’c’, ’1’ true, false Operation (Bsp.) +, -, *, /, <, >, == +, -, *, /, <, >, == <, >, == ==, !=, &&, ||, ! Einige weitere Java-Standardbegriffe Literale/Werte: 1234, 99.0f, “Hallo“ Variablen: a, b, c Ausdruck: a + b Deklaration: int a, b Zuweisungen: a = 1234; b = 99 Deklaration mit Initialisierung: int c = a + b 23 Zweites Java-Programm c l a s s BasicTypes { p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) { int a , b; a = 1234; b = 99; int c = a + b; System . o u t . p r i n t l n ( ” c = ” + c ) ; } } 24 Zeichenfolgen: String String ist ein Beispiel-Referenztyp Beispiel: “Hello, World” Konkatenationsoperator “+” hängt Zeichenketten aneinander: “Hello, “ + “Shi”, “c = “ + c Gleichheit von Zeichenfolgen “==” vergleicht die Referenzen zweier Zeichenfolgen s1 = “1234”; s2 = s1; s1 == s2 ? “equals(String s)” vergleicht die Inhalte zweier Zeichenfolgen s1 = “1234”; s3 = “”; s3 = s3 + “1234”; s1 == s3 ? s3.equals(s1) ? Zeichenfolgen: String (Beispiel) Der Operator == vergleicht nur Referenzen (Identität). Die Methode equals vergleicht das Objekt (Gleichheit). Beispiel: c l a s s StringEq { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) S t r i n g a = ”So g e h t s ” , b = ” So ” , c = a; b = b + ” gehts ” ; System . o u t . p r i n t l n ( ”a , c == −> ” + System . o u t . p r i n t l n ( ”a , b == −> ” + System . o u t . p r i n t l n ( ”a , b e q u a l s −> } } Welche Ausgaben liefert das Programm? { ( a==c ) ) ; ( a==b ) ) ; ” + a . equals (b )); API – Bibliotheken API – Applications Programming Interface Klassen, deren Attribute und Methoden primär dafür gedacht sind, in anderen Programmen eingesetzt zu werden. Web-Adresse: API Dokumentation unter http://download.oracle.com/javase/ Java-APIs sind durch Pakete organisiert, z.B. “java.lang”, “java.io” Beispiel-Klassen in java.lang und java.io Klasse “PrintStream” public void println(String x) Klasse “Integer” public static int parseInt(String s, int radix) throws NumberFormatException Klasse “Math” public static final double PI Klasse “Object” boolean equals(Object o) Anwendungsbeispiele System.out.println(“Hello, World”) Integer.parseInt(args[0]) Double.parseDouble(args[0]) s3.equals(s1) Math.PI 28 Steuerungs-Anweisungen in Java Sequenzielle Ausführung Die zeitliche Abfolge von Schritten Beenden von Anweisungen durch “;” Beispiel: Zubereitung einer Tasse grüner Tee /∗ ∗ ∗ A tea r e c ip e . ∗ @author Shi @ v e r s i o n 1.0 ∗/ p u b l i c c l a s s GreenTea { p u b l i c s t a t i c v o i d main ( S t r i n g a r g s [ ] ) { S t r i n g step1 , step2 , step3 , step4 , r e c i p e ; s t e p 1 = ” Koche Wasser ” ; s t e p 2 = ” Gib e i n e n h a l b e n TL Tee i n e i n e T a s s e ” ; s t e p 3 = ” Warte , b i s d a s Wasser a u f 80 Grad a b g e k u e h l t i s t ” ; s t e p 4 = ” G i e s s e d a s Wasser i n d i e T a s s e ” ; r e c i p e = s t e p 1+” ; \ n” + s t e p 2+” ; \ n” + s t e p 3+” ; \ n” + s t e p 4 ; System . o u t . p r i n t l n ( r e c i p e ) ; } } 29 Bedingte Ausführungen Auswahl von Schritten aufgrund einer zu testenden Bedingung Variante 1 Variante 2 if (condition) { step(s) } if (condition) { step1(s) } else { step2(s) } Flussdiagramme ja condition nein step1(s) step(s) Beispiele y = x; if (x<0) { y = -x; } ja if (x<0) { y = -x; } else { y = x; } 30 condition nein step2(s) Schleifen: Wiederholung von Schritten aufgrund einer zu testenden Bedingung for-Schleifen Syntax for (init; condition; update) { step(s) } Begriffe Initialisierung von Schleifenvariablen Boolscher Ausdruck als Bedingung, oder Schleifenabbruchbedingung Inkrementierung von Schleifenvariablen Schleifenrumpf Beispiel z = 0; for (i=0; i<10; i++) { z = z + i; } 31 while-Schleifen Syntax while (condition) { step(s) } Beispiel z = 0; i = 0; while (i<10) { z = z + i; i = i + 1; } Flussdiagramm condition ja step(s) 32 nein do-while-Schleifen Syntax do { step(s) } while (condition); Beispiel z = 0; i = 0; do { z = z + i; i = i + 1; } while (i<10); Flussdiagramm step(s) ja condition nein Diskussion Verschachtelte if-Anweisungen if (cond1) if (cond2) step1 else step2 if (cond1) {if (cond2) step1} else step2 Was ist der Unterschied zwischen ++i, i++ und i = i+1? Gibt es Fälle, in denen eine for-Schleife statt einer while-Schleife (beziehungsweise umgekehrt) verwendet werden muss? Was ist der Unterschied zwischen while- und do-while-Schleife? 34 Übung ueb2.pdf 35 Java Programme 36 Inhalt Einfache Java-Programme Attribute Konstruktoren Methoden Ganzzahlige Wurzelberechnung √ z = x ⇒ z · z ≤ x < (z + 1) · (z + 1), wobei x ∈ N Ein Lösungsansatz Sei x eine positive Zahl vom Typ Integer und z eine Variable vom Typ Integer. Initialisiere z mit 0. Solange (z + 1) · (z + 1) ≤ x ist, addiere eine 1 zu z. z ist die Wurzel von x. 38 Ein Programm /∗ ∗ ∗ The c l a s s c o n t a i n s a method w h i c h computes ∗ t h e r o o t o f a p o s i t i v e i n t e g e r number . ∗ @author Shi ∗/ p u b l i c c l a s s Root { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { int x ; x = Integer . parseInt ( args [ 0 ] ) ; int z = 0; i f ( x <0) System . o u t . p r i n t l n ( ” E r r o r ! ” ) ; else { w h i l e ( ( z +1)∗( z+1)<=x ) { z=z +1; } System . o u t . p r i n t l n ( ” D i e Wurzel von ” + x + ” ist ” + z + ”.”); } } } Fragen Was macht die while-Anweisung? Was ist der Unterschied von “+” in x + y und x +00 +00 + y ? Wie läuft die Berechnung ab? Wie oft wird die Zuweisung z = z + 1 durchgeführt? Ist das Programm für eine beliebige Zahl x korrekt? 40 Attribute Eine Klasse mit zwei Attributen class ArtikelPreis1 { S t r i n g a r t i k e l ; // Name d e s A r t i k e l s i n t cent ; // P r e i s i n Euro−Cent } Diskussion Die Klasse ArtikelPreis1 enthält Attribute artikel und cent Mit new() kann Objekte der Klasse erzeugt werden. 41 Konstruktoren Konstruktoren dienen der Erzeugung von Objekten class ArtikelPreis2 { A r t i k e l P r e i s 2 ( S t r i n g a , i n t c ) { // K o n s t r u k t o r artikel = a; cent = c ; } S t r i n g a r t i k e l ; // Name d e s A r t i k e l s i n t cent ; // P r e i s i n Euro−Cent } Diskussion Konstruktor: “ArtikelPreis2(String a, int c)” Erzeugung eines Objekts mit konkreten Werten für die Attribute, z.B. ArtikelPreis2 apfel = new ArtikelPreis2(“Apfel”, 200) Objekt-Zustände 42 Methoden Methoden dienen der Verarbeitung von Attributen class ArtikelPreis3 { A r t i k e l P r e i s 3 ( S t r i n g a , i n t c ) { // K o n s t r u k t o r artikel = a; cent = c ; } S t r i n g a r t i k e l ; // Name d e s A r t i k e l s i n t cent ; // P r e i s i n Euro−Cent d o u b l e umrechnen ( d o u b l e k u r s ) { return cent ∗ kurs ; } b o o l e a n v e r g l e i c h e n ( A r t i k e l P r e i s 3 ap ) { i f ( a r t i k e l . e q u a l s ( ap . a r t i k e l ) && c e n t==ap . c e n t ) { return ( true ); } else { return ( false );} } void ausgeben () { System . o u t . p r i n t l n ( a r t i k e l + ” : ” + c e n t ) ; } } Diskussion Methode hat direkten Zugriff auf Attribute Objekt-Referenzen Verwendung von Klassen public c l a s s Einkaufen { p r i v a t e A r t i k e l P r e i s 3 [ ] warenkorb ; p r i v a t e i n t count ; public Einkaufen () { c o u n t = 0 ; w a r e n k o r b = new A r t i k e l P r e i s 3 [ 1 0 ] ; } public void einkaufen ( ArtikelPreis3 a) { warenkorb [ count ] = a ; count = count + 1 ; } p ub l ic double preisBerechnen () { d o u b l e summe = 0 . 0 ; f o r ( i n t i =0; i <c o u n t ; i ++) { summe += w a r e n k o r b [ i ] . umrechnen ( 0 . 0 1 ) ; } r e t u r n summe ; } p u b l i c void printWarenkorb () { f o r ( i n t i =0; i <c o u n t ; i ++) { warenkorb [ i ] . ausgeben ( ) ; } } } 44 Übung ueb3.pdf 45