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