Tag 3 Repetitorium Informatik (Java) Dozent: Marius Kamp 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 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 2 / 42
Übersicht Typkonvertierung Implizite Typkonvertierung Explizite Typkonvertierung Mehrfach-Verzweigung: switch/case Schleifen while-schleifen for-schleifen do-while-schleifen Sprünge in Schleifen: break/continue Endlosschleifen Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 3 / 42
Typkonvertierung
Typkonvertierung bekannt: in Java gibt es unterschiedliche Datentypen der Typ bestimmt die Repräsentation und Größe eines Datums im Speicher unterschiedliche Datentypen haben unterschiedliche Wertebereiche jetzt: Typkonvertierung (cast): Überführung eines Wertes eines Datentyps in den entsprechenden Wert eines anderen Datentyps von kleinerem zu größerem Typ: Typerweiterung von größerem zu kleinerem Typ: Typeinschränkung man unterscheidet zwei Arten der Typkonvertierung: implizite Typkonvertierung ( durch den Compiler ) explizite Typkonvertierung ( durch den Programmierer ) Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 5 / 42
Implizite Typkonvertierung implizite Typkonvertierung: nicht direkt aus dem Quelltext des Programms ersichtlich automatisch durch den Compiler an den notwendigen Stellen eingefügt Voraussetzung: durch die Konvertierung entsteht kein Informationsverlust implizite Typkonvertierung nur im Falle einer Typerweiterung Beispiele i n t a = 13; double b = a ; / / i m p l i z i t e Typkonvertierung von i n t nach double double p i = 3.141 f ; / / i m p l i z i t e Typkonvertierung von f l o a t nach double / / ( f kennzeichnet f l o a t Wert ) Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 6 / 42
Explizite Typkonvertierung Was ist, wenn der Ziel-Datentyp kleiner als der Quell-Datentyp ist? Typeinschränkung Informationsverlust! nur mittels expliziter Typkonvertierung durch den Programmierer So nicht... double a = 9. 8 ; i n t b = a ; / / I n f o r m a t i o n s v e r l u s t ( p o s s i b l e loss of p r e c i s i o n ) f l o a t p i = 3.141; / / I n f o r m a t i o n s v e r l u s t ( p o s s i b l e loss of p r e c i s i o n ) So schon double a = 9. 8 ; i n t b = ( i n t ) a ; / / b = 9, Nachkommastellen abgeschnitten! f l o a t p i = ( f l o a t ) 3.141; / / besser : 3.141 f ( siehe oben ) Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 7 / 42
Achtung... (I) Möglicherweise unerwartetes Ergebnis i n t a = 13; double b = a / 2; / / b = 6.0 Was ist denn hier passiert? der Compiler sieht bei der Division zwei ganzzahlige Operanden a als int deklariert ganzzahlig 2 ist int-wert ganzzahlig es wird eine Ganzzahl-Division durchgeführt Ergebnis ist der int-wert 6 erst danach sieht der Compiler, dass in eine double-variable geschrieben wird implizite Typkonvertierung von int nach double in diesem Moment sind die Nachkommastellen aber schon verloren Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 8 / 42
Achtung... (II) Wahrscheinlich erwünschtes Ergebnis i n t a = 13; double b = a / 2. 0 ; / / b = 6.5 / / oder double b = ( ( double ) a ) / 2; / / b = 6.5 Warum funktioniert das jetzt? in beiden Fällen ist jetzt jeweils ein Operand vom Typ double es wird eine Fließkomma-Division durchgeführt Ergebnis ist der double-wert 6.5 Wert wird ohne weitere Konvertierung in die double-variable geschrieben Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 9 / 42
Mehrfach-Verzweigung: switch/case
Bisher... Wie heißt der m-te Monat? i n t m = /... / ; S t r i n g monatsname ; i f (m == 1) { monatsname = " Januar " ; else i f (m == 2) { monatsname = " Februar " ; else i f (m == 3) { / /... else i f (m == 12) { monatsname = " Dezember " ; else { monatsname = " kein Monat " ; Es fällt auf... viele ähnliche Vergleiche immer dieselbe Variable m jeweils Test auf Gleichheit Fälle schießen sich gegenseitig aus Vergleiche mit untersch. Werten es tritt nur einer der Fälle ein Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 11 / 42
Mehrfach-Verzweigung: switch/case (I) für obiges Schema kennt Java eine weitere Kontrollstruktur: switch/case vergleicht einen Ausdruck (Variable,...) auf unterschiedliche Werte Voraussetzung: Datentyp ist Ganzzahl (z.b. int), char oder String Syntax switch ( Ausdruck ) { case Wert1 : Anweisungen1 ; case Wert2 : Anweisungen2 ; / /... default : AnweisungenDefault ; zur Laufzeit passiert folgendes: 1 der Ausdruck wird ausgewertet 2 der passende Fall wird bestimmt 3 die zu dem Fall gehörenden Anweisungen werden ausgeführt Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 12 / 42
Mehrfach-Verzweigung: switch/case (II) Syntax switch ( Ausdruck ) { case Wert1 : Anweisungen1 ; case Wert2 : Anweisungen2 ; / /... default : AnweisungenDefault ; Hinweise zum switch/case die Werte müssen denselben Typ haben wie der Ausdruck die Werte müssen paarweise unterschiedlich sein die Anweisungen können auch aus einem Block in geschweiften Klammern bestehen der default-fall wird ausgeführt, wenn kein anderer Fall zutrifft der default-fall ist optional und kann deshalb entfallen Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 13 / 42
Erster Versuch... Erster Versuch mit switch/case i n t m = 2; S t r i n g monatsname ; switch (m) { case 1: monatsname = " Januar " ; case 2: monatsname = " Februar " ; / /... default : monatsname = " kein Monat " ; System. out. p r i n t l n ( monatsname ) ; / / e r w a r t e t : " Februar " Ausgabe des Programms kein Monat Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 14 / 42
Durchfallen Fehlerhaftes switch/case switch (m) { case 1: monatsname = " Januar " ; case 2: monatsname = " Februar " ; / /... default : monatsname = " kein Monat " ; ein case markiert nur den Anfang eines Falles, nicht das Ende eines anderen es werden auch die Anweisungen der nachfolgenden Fälle ausgeführt sogenanntes Durchfallen (fall through) Ausführung landet irgendwann im default-fall kein Monat Lösung: break-anweisungen bei der Ausführung einer break-anweisung wird switch/case verlassen nachfolgende Fälle werden nicht mehr ausgeführt Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 15 / 42
Bisher... Jetzt... Korrektes switch/case i n t m = 2; S t r i n g monatsname ; switch (m) { case 1: monatsname = " Januar " ; break ; case 2: monatsname = " Februar " ; break ; / /... default : monatsname = " kein Monat " ; break ; System. out. p r i n t l n ( monatsname ) ; / / e r w a r t e t : " Februar " Ausgabe des Programms Februar Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 16 / 42
Schleifen
Schleifen: Motivation (I) Beobachtung Bisher wurden Anweisungen entweder einmal oder keinmal ausgeführt. Beispiel i n t a = 13; / / einmal i n t b = 3; / / einmal i n t a b s D i f f ; / / einmal i f ( a > b ) { / / einmal a b s D i f f = a b ; / / einmal else { a b s D i f f = b a ; / / keinmal Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 18 / 42
Schleifen: Motivation (II) Was tun, wenn Anweisungen mehrfach ausgeführt werden sollen? Beispiel: 10x Hallo Welt ausgeben Idee: Anweisungen einfach mehrfach hintereinder schreiben aufwändig und äußerst unschön klappt nicht, wenn man die Anzahl an Ausführungen vorher nicht kennt Lösung: Schleifen als weitere Kontrollstruktur wiederholte Ausführung von Anweisungen solange Bedingung erfüllt ist Java kennt verschiedene Arten von Schleifen: while-schleife for-schleife do-while-schleife Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 19 / 42
while-schleife Syntax: while-schleife while ( Bedingung ) { / / S c h l e i f e n k o p f Anweisungen ; / / Schleifenrumpf Hinweise der Schleifenrumpf besteht aus den zu wiederholenden Anweisungen die Bedingung ist ein beliebiger boolescher Ausdruck wird vor jedem Schleifendurchlauf ausgewertet falls true: Anweisungen im Schleifenrumpf werden ausgeführt falls false: Schleife wird beendet Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 20 / 42
Ablaufdiagramm der while-schleife Syntax: while-schleife AnweisungenDavor ; while ( Bedingung ) { RumpfAnweisungen ; AnweisungenDanach ; Ablaufdiagramm AnweisungenDavor Bedingung false true RumpfAnweisungen AnweisungenDanach Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 21 / 42
Beispiel: Ausgabe aller Quadratzahlen y (I) Aufgabe Gegeben sei eine positive, ganze Zahl y. Gesucht ist ein Algorithmus, der alle ganzzahligen Quadratzahlen y berechnet und ausgibt. Beispiel y = 42 1, 4, 9, 16, 25, 36 Überlegungen Berechnung der Quadratzahlen: eine Quadratzahl ist eine Zahl q = n n um die nächstgrößere Quadratzahl zu berechnen, wird n um eins inkrementiert Speicherung der Basis n, Berechnung der Quadratzahl q, Inkrementierung von n Bedingung für die zu schreibende Schleife: falls die nächste Quadratzahl größer als y ist: Berechnung abbrechen Rumpf ausführen, solange die nächste Quadratzahl y ist Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 22 / 42
Beispiel: Ausgabe aller Quadratzahlen y (II) Aufgabe Gegeben sei eine positive, ganze Zahl y. Gesucht ist ein Algorithmus, der alle ganzzahligen Quadratzahlen y berechnet und ausgibt. Mögliche Lösung i n t n = 1; / / Basis while ( n n <= y ) { i n t q = n n ; / / Berechnung der a k t u e l l e n Quadratzahl System. out. p r i n t l n ( q ) ; / / Ausgabe der a k t u e l l e n Quadratzahl n = n + 1; / / Inkrementierung der Basis n Tipp Eigene Programme immer auch mit Grenzwerten testen, hier z.b. für y {48, 49, 50. Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 23 / 42
for-schleife Syntax: for-schleife for ( I n i t i a l i s i e r u n g ; Bedingung ; Fortsetzung ) { / / S c h l e i f e n k o p f Anweisungen ; / / Schleifenrumpf Hinweise Schleifenrumpf und Bedingung wie bei der while-schleife die Initialisierung wird einmalig vor Betreten der Schleife ausgeführt kann leer bleiben (Semikolon nicht vergessen!) die Fortsetzung wird nach jedem Schleifendurchlauf ausgeführt kann leer bleiben (Semikolon nicht vergessen!) Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 24 / 42
Ablaufdiagramm der for-schleife Syntax: for-schleife AnweisungenDavor ; for ( I n i t ; Bedingung ; Fortsetzung ) { RumpfAnweisungen ; AnweisungenDanach ; Ablaufdiagramm AnweisungenDavor Init Bedingung false true RumpfAnweisungen Fortsetzung AnweisungenDanach Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 25 / 42
Schleifenvariable, Laufvariable, Zählvariable die Bedingung hängt üblicherweise vom Wert einer ganzzahligen Variable ab Schleifenvariable oder Laufvariable oder Zählvariable eine solche Laufvariable wird üblicherweise...... in der Initialisierung deklariert und initialisiert... in der Fortsetzung inkrementiert oder dekrementiert Beispiel for ( i n t i = 1; i <= 3; ++ i ) { System. out. p r i n t l n ( i ) ; Alternative (unschön!) i n t i = 1; / /... e v t l. weitere Anweisungen... for ( ; i <= 3; ) { System. out. p r i n t l n ( i ) ; ++ i ; Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 26 / 42
Beispiel: Berechnung der n-ten Potenz (I) Aufgabe Gegeben seien zwei positive, ganze Zahlen x und n. Gesucht ist ein Algorithmus, der die n-te Potenz x n von x berechnet und ausgibt. Beispiel x = 3, n = 4 81 Überlegungen = x x x... x = 1 x x x... x in jeder Iteration eine Multiplikation mit x durchführen Variable, um das aktuelle Zwischenergebnis zu speichern Variable mit 1 initialisieren (neutrales Element der Multiplikation) x n wir brauchen n solcher Multiplikationen Laufvariable, die Anzahl an Iterationen mitzählt Bedingung, die die Schleife nach n Iterationen abbricht Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 27 / 42
Beispiel: Berechnung der n-ten Potenz (II) Aufgabe Gegeben seien zwei positive, ganze Zahlen x und n. Gesucht ist ein Algorithmus, der die n-te Potenz x n von x berechnet und ausgibt. Mögliche Lösung i n t potenz = 1; for ( i n t i = 1; i <= n ; ++ i ) { potenz = potenz x ; System. out. p r i n t l n ( potenz ) ; Übliche Lösung i n t potenz = 1; for ( i n t i = 0; i < n ; ++ i ) { potenz = potenz x ; System. out. p r i n t l n ( potenz ) ; Laufvariablen beginnen üblicherweise bei 0 Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 28 / 42
Vergleich for-schleife while-schleife Beide Schleifen-Arten sind gleich mächtig und können ineinander umgewandelt werden. for-schleifen for-schleifen eignen sich inbesondere dann, wenn die Anzahl an Iterationen vor Betreten der Schleife bekannt bzw. berechenbar ist. Beispiel: for-schleife i n t potenz = 1; for ( i n t i = 0; i < n ; ++ i ) { potenz = potenz x ; System. out. p r i n t l n ( potenz ) ; while-schleifen while-schleifen eignen sich inbesondere dann, wenn die Anzahl an Iterationen vor Betreten der Schleife unbekannt bzw. nicht (einfach) berechenbar ist. Beispiel: while-schleife i n t n = 1; while ( n n <= y ) { i n t q = n n ; System. out. p r i n t l n ( q ) ; n = n + 1; Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 29 / 42
do-while-schleife: Motivation bisher (for, while): Überprüfung der Bedingung vor jedem Schleifendurchlauf auch vor dem ersten Schleifendurchlauf! Schleifenrumpf wird unter Umständen gar nicht ausgeführt sogenannte kopfgesteuerte oder abweisende Schleifen jetzt (do-while): Überprüfung der Bedingung nach jedem Schleifendurchlauf erstmalig nach dem ersten Schleifendurchlauf! Schleifenrumpf wird mindestens einmal ausgeführt sogenannte fußgesteuerte oder nicht-abweisende Schleife Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 30 / 42
do-while-schleife Syntax: do-while-schleife do { Anweisungen ; / / Schleifenrumpf while ( Bedingung ) ; / / " S c h l e i f e n f u ß" Hinweise Schleifenrumpf und Bedingung wie bei der while-schleife allerdings andere Auswertungsreihenfolge (siehe oben) Achtung! Semikolon hinter der Bedingung nicht vergessen! Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 31 / 42
Ablaufdiagramm der do-while-schleife Syntax: do-while-schleife AnweisungenDavor ; do { RumpfAnweisungen ; while ( Bedingung ) ; AnweisungenDanach ; Ablaufdiagramm AnweisungenDavor RumpfAnweisungen true Bedingung false AnweisungenDanach Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 32 / 42
Beispiel: Sechser würfeln (I) Aufgabe Gesucht ist ein Programm, das solange würfelt, bis eine 6 fällt. Hinweis Zufallszahl zwischen 1 und 6 erzeugen: Überlegungen in jeder Iteration eine Zahl würfeln 1 + (int )(Math.random() 6) falls 6: Schleife abbrechen falls keine 6: Schleife erneut durchlaufen es muss mindestens einmal gewürfelt werden fußgesteuerte Schleife Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 33 / 42
Beispiel: Sechser würfeln (II) Aufgabe Gesucht ist ein Programm, das solange würfelt, bis eine 6 fällt. Mögliche Lösung i n t wuerfel ; do { wuerfel = 1 + ( i n t ) ( Math. random ( ) 6 ) ; System. out. p r i n t l n ( " es wurde eine " + wuerfel + " gewü r f e l t " ) ; while ( wuerfel!= 6 ) ; Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 34 / 42
Komplexe Schleifenbedingungen für alle drei Schleifen-Arten gilt: Bedingung kann komplexer, zusammengesetzter boolescher Ausdruck sein Aufgabe Programm, das solange würfelt, bis eine 6 fällt, aber maximal 3 Mal. Mögliche Lösung i n t wuerfel ; i n t anzahl = 0; do { wuerfel = 1 + ( i n t ) ( Math. random ( ) 6 ) ; System. out. p r i n t l n ( " es wurde eine " + wuerfel + " gewü r f e l t " ) ; anzahl = anzahl + 1; while ( ( wuerfel!= 6) && ( anzahl < 3 ) ) ; Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 35 / 42
Sprünge in Schleifen: break/continue break-anweisung ganze Schleife abbrechen Beim Erreichen einer break-anweisung wird die Ausführung der gesamten Schleife frühzeitig abgebrochen. continue-anweisung aktuellen Durchlauf abbrechen Beim Erreichen einer continue-anweisung wird die Ausführung des aktuellen Schleifendurchlaufs frühzeitig abgebrochen und (falls Schleifenbedingung erfüllt) mit dem nächsten Durchlauf weitergemacht. Bei einer for-schleife wird die Fortsetzung ausgeführt. Schlechter Stil... Die Verwendng von break und continue gilt als schlechter Stil, wenn dadurch der reale Ablauf der Schleife schwer nachvollziehbar wird. Wenn möglich, sollte auf die Verwendung von break und continue verzichtet werden. Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 36 / 42
Beispiel zu break Aufgabe Zahlen von 1 bis 30 bis zur ersten durch 5 oder 7 teilbaren Zahl ausgeben. Mögliche Lösung (geht auch schöner ohne break!) for ( i n t i = 1; i <= 30; ++ i ) { System. out. p r i n t ( i + " " ) ; i f ( ( i % 5 == 0) ( i % 7 == 0 ) ) { break ; Ausgabe 1 2 3 4 5 Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 37 / 42
Beispiel zu continue Aufgabe Zahlen von 1 bis 30 ausgeben, die nicht durch 5 oder 7 teilbar sind. Mögliche Lösung (geht auch schöner ohne continue!) for ( i n t i = 1; i <= 30; ++ i ) { i f ( ( i % 5 == 0) ( i % 7 == 0 ) ) { continue ; System. out. p r i n t ( i + " " ) ; Ausgabe 1 2 3 4 6 8 9 11 12 13 16 17 18 19 22 23 24 26 27 29 Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 38 / 42
Endlosschleifen für alle Schleifen-Arten gilt: Ausführung des Schleifenrumpfes ist abhängig von einer Bedingung Wiederholung des Schleifenrumpfes solange die Bedingung erfüllt ist Abbruch der Schleife sobald die Bedingung nicht mehr erfüllt ist wenn die Bedingung immer erfüllt ist, also nie false wird: Schleifenrumpf wird unendlich oft ausgeführt Endlosschleife Unerwünschtes Verhalten Bei einer Endlosschleife terminiert das Programm nicht. In den allermeisten Fällen ist dieses Verhalten unerwünscht! Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 39 / 42
Beispiele für Endlosschleifen Offensichtliche Endlosschleife while ( true ) { System. out. p r i n t l n ( " Hallo, Welt! " ) ; Weniger offensichtliche Endlosschleife i n t i = 1; while ( i <= 30) { i f ( ( i % 5 == 0) ( i % 7 == 0 ) ) { continue ; System. out. p r i n t ( i + " " ) ; i = i + 1; Informatik-Repetitorium Tag 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 40 / 42
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 3 WS 2016/2017 Lehrstuhl für Informatik 2 (Programmiersysteme) 42 / 42