Tag 4 Repetitorium Informatik (Java)

Dozent: Patrick Kreutzer – Lehrstuhl für Informatik 2 (Programmiersysteme) Friedrich-Alexander-Universität Erlangen-Nürnberg Wintersemester 2016/2017

Willkommen zum Informatik-Repetitorium! •

auf Grund der hohen Teilnehmerzahlen: •

bitte zusammenrücken und keine Plätze in der Mitte freilassen



Videoübertragung in mehrere Hörsäle: •



mit eigenem Notebook laut eigener Angabe im EST: • Nachname A–R ; Hörsaal H5 • Nachname S–Z ; Hörsaal H6

ohne eigenes Notebook laut eigener Angabe im EST: • Nachname A–J ; Hörsaal H15 • Nachname K–Sch ; Hörsaal H16 • Nachname Sd–Z ; Hörsaal H6



bei Bild- oder Tonausfall bitte im Hörsaal H15 melden



für Zwischenfragen liegt auf dem Pult ein Mikrofon bereit

Informatik-Repetitorium – Tag 4

|

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

2 / 28

Übersicht Arrays (Reihungen) Deklaration von Arrays Verwendung Ungültige Indizes Mehrdimensionale Arrays Kommandozeilen-Argumente Konstanten Deklaration von Konstanten mittels final Konstante Arrays

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

3 / 28

Arrays (Reihungen)

Problem mit einfachen Variablen... •



bisher: •

pro zu speicherndem Wert eine Variable (mit jeweils eigenem Bezeichner)



Probleme: • Was tun bei vielen gleichartigen Werten? • Was tun, wenn die Anzahl der Werte zur Entwicklungszeit unbekannt ist?

jetzt: Array (Reihung, Feld) •

erlaubt Speicherung mehrerer Werte desselben Datentyps • vereinfacht: Array in einer Variable mit einem Bezeichner gespeichert



einmalige Festlegung der Anzahl der zu speichernden Werte • allerdings: Element-Anzahl kann Wert sein, der erst zur Laufzeit feststeht

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

5 / 28

Arrays Beispiel: int-Array der Größe 6



Index

0

1

2

3

4

5

Wert

13

-3

0

42

98

-110

die einzelnen Elemente werden über einen Index adressiert

Achtung: in Java beginnt die Indizierung immer bei 0 ; ein Array der Länge n hat Elemente mit Indizes {0, 1, . . . , n − 1} •



werden die Elemente nicht explizit gesetzt, haben sie einen Standard-Wert • abhängig vom Datentyp, bei int beispielsweise 0

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

6 / 28

Deklaration von Arrays •

wie bei primitiven Datentypen: Array muss vor Verwendung deklariert werden • dabei Angabe von Basis-Datentyp und Bezeichner der Array-Variable

Beispiele für die Deklaration von Arrays i n t [ ] zahlen ; char [ ] buchstaben ;



/ / e c k i g e Klammern [ ] kennzeichnen A r r a y

anders als bei primitiven Datentypen: Array muss zusätzlich erzeugt werden • dabei Angabe der Anzahl an Elementen

Array-Erzeugung: Möglich

Array-Erzeugung: Üblich

i n t [ ] zahlen ; zahlen = new i n t [ 1 0 0 ] ;

i n t [ ] zahlen = new i n t [ 1 0 0 ] ;

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

7 / 28

Deklaration mit Wertzuweisung •

weitere Möglichkeit für die Array-Erzeugung: Deklaration mit Wertzuweisung • dabei werden die Array-Elemente bei der Array-Erzeugung initialisiert • die Array-Größe ergibt sich implizit aus der Element-Anzahl

Beispiel: Deklaration mit Wertzuweisung i n t [ ] zahlen = { 1 3 , −3, 0 , 42 , 98 , − 110};

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

8 / 28

Zugriff auf einzelne Elemente •

lesender und schreibender Zugriff auf ein Element über seinen Index • Syntax: []

Beispiele für den Array-Zugriff i n t [ ] zahlen = { 1 3 , −3, 0 , 42 , 98 , − 110}; System . o u t . p r i n t l n ( zahlen [ 0 ] ) ;

/ / 13

zahlen [ 0 ] = zahlen [ 1 ] + 1 0 ; System . o u t . p r i n t l n ( zahlen [ 0 ] ) ;

// 7

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

9 / 28

Größe eines Arrays bestimmen •

jedes Array „kennt“ seine eigene Größe, die man abfragen kann • Syntax: .length

Beispiel für die Bestimmung der Array-Größe i n t [ ] zahlen = { 1 3 , −3, 0 , 42 , 98 , − 110}; System . o u t . p r i n t l n ( zahlen . l e n g t h ) ;

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

// 6

Lehrstuhl für Informatik 2 (Programmiersysteme)

10 / 28

Beispiel: Berechnung von Quadratzahlen Ziel Programm, das die ersten x Quadratzahlen berechnet und in einem Array speichert.

Mögliche Lösung i n t [ ] q u a d r a t z a h l e n = new i n t [ x ] ; f o r ( i n t i = 0 ; i < q u a d r a t z a h l e n . l e n g t h ; ++ i ) { quadratzahlen [ i ] = i ∗ i ; }

Array-Elemente nach der Ausführung der Schleife Index

0

1

2

3

Wert

0

1

4

9

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

x −1

...

Lehrstuhl für Informatik 2 (Programmiersysteme)

(x − 1)2

11 / 28

Ausgabe von Arrays Ausgabe eines Arrays Weil ein Array kein primitiver Wert ist, ist die Ausgabe eines Arrays anders als erwartet...

Beispiel für die Ausgabe eines Arrays i n t [ ] zahlen = { 1 3 , −3, 0 , 42 , 98 , − 110}; System . o u t . p r i n t l n ( zahlen ) ; System . o u t . p r i n t l n ( j a v a . u t i l . A r r a y s . t o S t r i n g ( zahlen ) ) ;

Ausgabe [ I@2a139a55 [13 , -3 , 0 , 42 , 98 , -110]

Informatik-Repetitorium – Tag 4

|

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

12 / 28

Ungültige Array-Indizes Was geht hier schief? i n t [ ] zahlen = { 1 3 , −3, 0 , 42 , 98 , − 110}; System . o u t . p r i n t l n ( " Anfang . " ) ; System . o u t . p r i n t l n ( zahlen [ 6 ] ) ; System . o u t . p r i n t l n ( " Ende . " ) ;

Bei der Ausführung... benutzer@faui06a:∼/ordner$ javac Zahlen.java benutzer@faui06a:∼/ordner$ java Zahlen Anfang. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 at Zahlen.main(Zahlen.java:5)

Erklärung Ein ungültiger Array-Index hat eine sog. ArrayIndexOutOfBoundsException zur Folge. Ohne weitere Maßnahmen bricht das Programm mit einer Fehlermeldung ab. Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

13 / 28

Mehrdimensionale Arrays •

Arrays können in Java auch mehrdimensional sein • Array von Arrays von Arrays . . . von Arrays eines Basistyps

Beispiel für ein mehrdimensionales Array char [ ] [ ] t i c T a c T o e = new char [ 3 ] [ 3 ] ; / / 3 " Z e i l e n " und 3 " S p a l t e n " t i c T a c T o e [ 1 ] [ 2 ] = ’X ’ ; / / " Z e i l e " 1 und " S p a l t e " 2

Array-Elemente nach der Ausführung 1

2

X

2

1

0

0

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

14 / 28

Ausgabe von Mehrdimensionalen Arrays (I) Ausgabe eines Mehrdimensionalen Arrays Die Verwendung von toString() führt bei mehrdimensionalen Arrays nicht zum gewünschten Ergebnis...

Beispiel für die Ausgabe eines Mehrdimensionalen Arrays char [ ] [ ] t i c T a c T o e = new char [ 3 ] [ 3 ] ; t i c T a c T o e [ 1 ] [ 2 ] = ’X ’ ; System . o u t . p r i n t l n ( j a v a . u t i l . A r r a y s . t o S t r i n g ( t i c T a c T o e ) ) ; System . o u t . p r i n t l n ( j a v a . u t i l . A r r a y s . deepToString ( t i c T a c T o e ) ) ;

Ausgabe [[ C@2a139a55 , [ C@15db9742 , [ C@6d06d69c ] [[ , , ] , [ , , X ] , [ , , ]] Informatik-Repetitorium – Tag 4

|

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

15 / 28

Ausgabe von Mehrdimensionalen Arrays (II) Eigene Implementierung char [ ] [ ] t i c T a c T o e = new char [ 3 ] [ 3 ] ; t i c T a c T o e [ 1 ] [ 2 ] = ’X ’ ; f o r ( i n t z = 0 ; z < 3 ; ++z ) { System . o u t . p r i n t ( " . " ) ; f o r ( i n t s = 0 ; s < 3 ; ++s ) { System . o u t . p r i n t ( t i c T a c T o e [ z ] [ s ] ) ; System . o u t . p r i n t ( " . " ) ; } System . o u t . p r i n t l n ( ) ; }

Ausgabe . . . . . . .X. . . . .

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

16 / 28

Kommandozeilen-Argumente

Kommandozeilen-Argumente •



bei Programmstarts können Kommandozeilen-Argumente übergeben werden •

Beispiel: javac Foo.java • javac: Programmname • Foo.java: Kommandozeilen-Argument für das Programm javac



die Argumente werden durch ein Leerzeichen voneinander getrennt • Argumente mit Leerzeichen: in doppelte Anführungszeichen einschließen

auch Java-Programmen können beim Start Argumente übergeben werden • landen als Zeichenketten im args-Parameter der main-Methode

; einfache Möglichkeit der Benutzereingabe

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

18 / 28

Beispiel: Echo Aufgabe Programm, das das erste Kommandozeilen-Argument ausgibt.

Mögliche Lösung public class Echo { public s t a t i c void main ( S t r i n g [ ] args ) { i f ( args . l e n g t h >= 1 ) { / / n i c h t vergessen ! System . o u t . p r i n t l n ( args [ 0 ] ) ; } } }

Aufrufe des Echo-Programms benutzer@faui06a:∼/ordner$ java Echo benutzer@faui06a:∼/ordner$ java Echo "Repetitorium Informatik" RIP Repetitorium Informatik Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

19 / 28

Beispiel: Summe (I) Aufgabe Programm, das die Summe aller als Kommandozeilen-Argumente übergebenen Zahlen berechnet und ausgibt.

Problem Die Kommandozeilen-Argumente werden stets als Zeichenketten (d.h. vom Typ String) übergeben. Für Berechnungen müssen diese erst explizit in Zahlen konvertiert werden.

String 7→ int

String 7→ double

i n t wert = Integer . parseInt ( string ) ;

double w e r t = Double . parseDouble ( s t r i n g ) ;

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

20 / 28

Beispiel: Summe (II) Mögliche Lösung public class Summe { public s t a t i c void main ( S t r i n g [ ] args ) { double summe = 0 . 0 ; f o r ( i n t i n d e x = 0 ; i n d e x < args . l e n g t h ; ++ i n d e x ) { summe = summe + Double . parseDouble ( args [ i n d e x ] ) ; } System . o u t . p r i n t l n (summe ) ; } }

Aufrufe des Summe-Programms benutzer@faui06a:∼/ordner$ java Summe 0.0 benutzer@faui06a:∼/ordner$ java Summe 13 3 5 8 29.0 Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

21 / 28

Konstanten

Konstanten •

Konstante: einmalig festgelegter Wert ; nicht mehr veränderbar • lesende Verwendung wie bei einer „normalen“ Variable • aber: einer Konstanten kann nur einmalig geschrieben werden

Verwendung von Konstanten erhöht die Lesbarkeit und Wartbarkeit • häufig verwendete konstante Werte als Konstante deklarieren ; muss bei einer Änderung nur an einer Stelle geändert werden • kann dabei helfen, Fehler zu vermeiden • der Compiler meldet Fehler, wenn in eine Konstante geschrieben wird • Konstanten erlauben dem Compiler, gewisse Optimierungen durchzuführen ; Verwendung von Konstanten kann zu schnelleren Programmen führen •

Daumenregel Alles, was nicht veränderbar sein muss, als Konstante deklarieren. Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

23 / 28

Deklaration und Definition von Konstanten Syntax: Deklaration und Definition einer Konstanten f i n a l Datentyp Konstantenname = Wert ;

Hinweise • Schlüsselwort • Angabe des • der

final markiert Variable als Konstante

Datentyps wie bei einer „normalen“ Variable

Konstantenname entspricht dem Variablennamen

• Konventionen: Verwendung von Großbuchstaben, Unterstrich zur Worttrennung • Beispiele: PI, MAX_VALUE • der

Wert muss nicht schon zur Übersetzungszeit feststehen

• kann das Ergebnis einer Berechnung sein, das erst zur Laufzeit feststeht • Beispiel: der Wert kann dem ersten Kommandozeilen-Argumente entsprechen

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

24 / 28

Beispiel: Konstanten So nicht! double r a d i u s = 1 3 . 0 3 ; double f l a e c h e = r a d i u s

∗ radius ∗ 3.14159;

So schon! f i n a l double PI = 3 . 1 4 15 9 ; double r a d i u s = 1 3 . 0 3 ; double f l a e c h e = r a d i u s

∗ r a d i u s ∗ PI ;

Hinweise Wenn sich radius nicht ändert, kann radius auch als Konstante deklariert werden. PI sollte besser als Klassenvariable bzw. -konstante deklariert werden (siehe Tag 7).

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

25 / 28

Konstante Arrays auch Array-Variablen können als Konstante deklariert werden • Bedeutung ist anders als vielleicht vermutet: • die Elemente in einem konstanten Array dürfen verändert werden! • aber: es darf kein neues Array erzeugt und i. d. Variable gespeichert werden •

Geht nicht f i n a l i n t [ ] zahlen = new i n t [ 1 3 ] ; zahlen = new i n t [ 3 ] ; / / Fehler , w e i l ’ zahlen ’ b e r e i t s i n i t i a l i s i e r t

Geht schon f i n a l i n t [ ] zahlen = new i n t [ 1 3 ] ; zahlen [ 0 ] = 3 ; / / e r l a u b t , denn es w i r d nur e i n Element v e r ä n d e r t

Informatik-Repetitorium – Tag 4 |

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

26 / 28

Fragen? Fragen! (hilft auch den anderen)

Jetzt: Praktische Übungen mit eigenem Notebook: • Nachname A–R ; Hörsaal H5 • Nachname S–Z ; Hörsaal H6 ; bitte erstmal sitzen bleiben!





ohne eigenes Notebook in den Rechnerräumen: • Tutoren verteilen Gruppenzettel am Ausgang • die Einteilung ist zunächst fest für das gesamte Repetitorium

Informatik-Repetitorium – Tag 4

|

WS 2016/2017

|

Lehrstuhl für Informatik 2 (Programmiersysteme)

28 / 28