• Keine Ergebnisse gefunden

Nachname . . . . Vorname . . . . Matrikelnummer . . . . Studienfach . . . . Angestrebter Abschluss . . . . Fachsemester . . . .

N/A
N/A
Protected

Academic year: 2021

Aktie "Nachname . . . . Vorname . . . . Matrikelnummer . . . . Studienfach . . . . Angestrebter Abschluss . . . . Fachsemester . . . ."

Copied!
16
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Ludwig-Maximilians-Universit¨at M¨unchen WS 2012/13 Institut f¨ur Informatik 19.04.2013, 12:00–14:30 Uhr Prof. Dr. R. Hennicker, A. Klarl

Nachholklausur (9 ECTS): L¨ osungsvorschlag Einf¨ uhrung in die Informatik:

Programmierung und Software-Entwicklung

Nachname . . . . Vorname . . . . Matrikelnummer . . . . Studienfach . . . . Angestrebter Abschluss . . . . Fachsemester . . . .

Hilfsmittel jeder Art sind nicht zugelassen. Schreiben Sie Ihren Namen und Ihre Matrikelnum- mer auf jedes Blatt. Die Klausurangabe mit allen L¨osungen und alle verwendeten Bl¨atter sind injedem Fall nach der Klausur wieder abzugeben.

Diese Klausur soll gewertet werden: JA NEIN

Hinweis:Wenn keines der beiden Felder angekreuzt ist, wird JA angenommen.

Mit meiner Unterschrift erkl¨are ich die Richtigkeit und Vollst¨andigkeit der obigen Angaben.

. . . .

Nicht von dem/der Studierenden auszuf¨ullen

1 2 3 4 5 6 7 8 9 Σ Note

von 9 von 7 von 12 von 11 von 14 von 7 von 6 von 5 von 9 von 80

(2)

Aufgabe 1 EBNF-Grammatik und Syntaxdiagramm 3 + 6 = 9 Punkte Gegeben sei folgende EBNF-Grammatik, die Namen mit voran gestelltem akademischen Grad im deutschen Sprachraum beschreibt.

Name = [ Titel ] Vorname Nachname Titel = [ "Prof." ] "Dr." { "Dr." } Vorname = Nachname

Nachname = Großbuchstabe { Kleinbuchstabe } Großbuchstabe = "A" | "B" | ... | "Z"

Kleinbuchstabe = "a" | "b" | ... | "z"

a) Welche der folgenden Zeichenketten sind g¨ultige Worte der oben definierten Sprache? Im Fall von nicht-g¨ultigen Worten ist eine Begr¨undung anzugeben.

L¨osung:

Prof. Toni Maurer: nicht g¨ultig, da man keinen Prof.-Titel ohne Dr.-Titel haben kann (1 Punkt)

Genoveva Bauer: g¨ultig (0.5 Punkte)

Prof. Dr. Dr. Abcde Zxhast: g¨ultig (0.5 Punkte)

Lisa m¨uller: nicht g¨ultig, da der Nachname mit einem Kleinbuchstaben beginnt (1 Punkt)

b) Erstellen Sie zu der oben definierten EBNF-Grammatik ein ¨aquivalentes Syntaxdiagramm.

Diagramme f¨ur die Nichtterminale Großbuchstabe und Kleinbuchstabe brauchen nicht angegeben zu werden.

L¨osung:

Name : -

- Titel

- Vorname - Nachname -

Titel : -

-

Prof.

-

Dr.

6 -

Dr.

-

Vorname : - Nachname -

Nachname : - Großbuchstabe

6

-

- Kleinbuchstabe -

(nach Regeln: 1.5 Punkte, 2 Punkte, 1 Punkt, 1.5 Punkte)

(3)

Aufgabe 2 Ausdr¨ucke in Java 7 Punkte Wir verwenden die Klassen Bank und BankKonto aus der Vorlesung, die hier in UML-Notation angegeben sind.

Seien Bank bank; und BankKonto konto; lokale Variablendeklarationen (z.B. in einer main- Methode). Geben Sie f¨ur die folgenden Ausdr¨ucke an, ob sie vom Java-Compiler akzeptiert werden oder nicht. Im positiven Fall ist der Typ des Ausdrucks anzugeben, im negativen Fall ist zu begr¨unden, warum der Ausdruck zu einem ¨Ubersetzungsfehler f¨uhrt.

a) new Bank("MeineBank") == bank L¨osung:

new Bank("MeineBank") == bank ist nicht korrekt, da der Konstruktor zwei Parameter erwartet. (1 Punkt)

b) konto.kontoStand(5) L¨osung:

konto.kontoStand(5)ist nicht korrekt, da das AttributkontoStandnicht mit einem Para- meter aufgerufen werden kann bzw. die MethodekontoStandnicht f¨ur die KlasseBankKonto definiert ist. (1 Punkt)

c) bank.kontoStand(123) < konto.getKontoStand() L¨osung:

bank.kontoStand(123) < konto.getKontoStand() ist korrekt und vom Typ boolean.

(2 Punkte)

d) new BankKonto(konto.getKontoStand()) L¨osung:

new BankKonto(konto.getKontoStand())ist korrekt und vom TypBankKonto. (2 Punkte) e) bank.einzahlen(11, 300)

L¨osung:

bank.einzahlen(11, 300)ist korrekt und vom Typboolean. (1 Punkt)

(4)

Aufgabe 3 Wiederholungsanweisungen 12 Punkte Der Igel m¨ochte in einem Wettlauf gegen den Hasen antreten. Naturgem¨aß hat der Igel eine k¨urzere Schrittl¨ange als der Hase: der Igel hat eine Schrittl¨ange von 5.3 cm, der Hase hat eine Schrittl¨ange von 10.8 cm. Um diesen Vorteil des Hasens auszugleichen, bekommt der Igel einen Vorsprung von 270 cm.

Schreiben Sie einemain-Methode, die berechnet, nach wie vielen Schritten der Hase den Igel trotz des Vorsprungs ¨uberholt hat. Ihr Programm soll f¨ur jeden Schritt in einer neuen Zeile ausgeben, (1) wie weit der Hase insgesamt vorw¨arts gekommen ist und (2) wie weit der Igel zuz¨uglich seines Vorsprungs vorw¨arts gekommen ist. Diese Ausgabe soll letztmals erfolgen, wenn der Hase den Igel ¨uberholt hat.

F¨ur die obigen Werte soll folgender Text auf der Kommandozeile ausgegeben werden:

Nach 1 Schritten: Hase 10.8cm, Igel 275.3cm Nach 2 Schritten: Hase 21.6cm, Igel 280.6cm Nach 3 Schritten: Hase 32.4cm, Igel 285.9cm ...

Nach 50 Schritten: Hase 540.0cm, Igel 535.0cm

Vervollst¨andigen Sie die unten stehende main-Methode. Zun¨achst sind geeignete Variablen zu deklarieren und zu initialisieren.

L¨osung:

Alternative 1:

1 p u b l i c c l a s s H a s e U n d I g e l {

2 p u b l i c s t a t i c void m a i n ( S t r i n g [] a r g s ) {

3

4 // 1.5 P u n k t e : k o r r e k t e I n i t . a l l e r V a r i a b l e n

5 double s c h r i t t l a e n g e H a s e = 1 0 . 8 ;

6 double s c h r i t t l a e n g e I g e l = 5 . 3 ;

7 double v o r s p r u n g = 2 7 0 . 0 ;

8

9 double s t r e c k e H a s e = 0 . 0 ; // 1 P u n k t

10 double s t r e c k e I g e l = v o r s p r u n g ; // 1 P u n k t

11

12 i n t s c h r i t t e = 0; // 1 P u n k t

13

14 while ( s t r e c k e I g e l >= s t r e c k e H a s e ) {

15 // 0.5 P u n k t : while mit r i c h t i g e r K l a m m e r u n g

16 // 1.5 P u n k t e : k o r r e k t e r A b b r u c h

17 // 1.5 P u n k t e

18 s t r e c k e H a s e = s t r e c k e H a s e + s c h r i t t l a e n g e H a s e ;

19 // 1.5 P u n k t e

20 s t r e c k e I g e l = s t r e c k e I g e l + s c h r i t t l a e n g e I g e l ;

21

22 s c h r i t t e ++; // 1.5 P u n k t e

23

24 // 1 P u n k t

25 S y s t e m . out . p r i n t l n ( " N a c h " + s c h r i t t e + " S c h r i t t e n : H a s e "

26 + s t r e c k e H a s e + " cm , I g e l " + s t r e c k e I g e l + " cm " );

27 }

28 }

29 }

−1 Punkt bei falscher Syntax

(5)

Alternative 2:

1 p u b l i c c l a s s H a s e U n d I g e l {

2 p u b l i c s t a t i c void m a i n ( S t r i n g [] a r g s ) {

3

4 // 1.5 P u n k t e : k o r r e k t e I n i t . a l l e r V a r i a b l e n

5 double s c h r i t t l a e n g e H a s e = 1 0 . 8 ;

6 double s c h r i t t l a e n g e I g e l = 5 . 3 ;

7 double v o r s p r u n g = 2 7 0 . 0 ;

8

9 i n t s c h r i t t e = 0; // 0.5 P u n k t e

10 boolean i g e l N o c h V o r n e = true;

11

12 while ( i g e l N o c h V o r n e ) {

13 // 0.5 P u n k t : while mit r i c h t i g e r K l a m m e r u n g

14 // 1.5 P u n k t e : k o r r e k t e r A b b r u c h

15 // 2.5 P u n k t e

16 double s t r e c k e H a s e = s c h r i t t e * s c h r i t t l a e n g e H a s e ;

17 // 2.5 P u n k t e

18 double s t r e c k e I g e l = v o r s p r u n g + s c h r i t t e * s c h r i t t l a e n g e I g e l ;

19

20 s c h r i t t e ++; // 1 P u n k t

21

22 // 1 P u n k t

23 i g e l N o c h V o r n e = s t r e c k e H a s e <= s t r e c k e I g e l ;

24

25 // 1 P u n k t

26 S y s t e m . out . p r i n t l n ( " N a c h " + s c h r i t t e + " S c h r i t t e n : H a s e "

27 + s t r e c k e H a s e + " cm , I g e l " + s t r e c k e I g e l + " cm " );

28 }

29 }

30 }

−1 Punkt bei falscher Syntax

(6)

Aufgabe 4 Arrays 7 + 4 = 11 Punkte a) Eine Wetterstation misst jeden Tag um die gleiche Uhrzeit die Temperatur. Diese Daten werden der Reihe nach in einem Array vom Typ double gespeichert. Schreiben Sie eine Methode mit folgendem Kopf:

public static double groessterTemperaturSprung(double[] array)

Die Methode soll den gr¨oßten Temperatursprung zwischen zwei aufeinander folgenden Tagen berechnen. Beispielweise soll f¨ur das Array [−5.0,1.7,19.0,16.9] der Wert 17.3 ausgegeben werden und f¨ur das Array [13.3,12.0,12.5] der Wert 1.3. Es kann davon ausgegangen werden, dass das Array mindestens zwei Elemente enth¨alt.

Hinweis: Mit Hilfe der Methode Math.absk¨onnen Sie den Absolutbetrag einer Zahl berech- nen. Beispielsweise ergibt Math.abs(-1.3)den Wert 1.3.

L¨osung:

1 p u b l i c s t a t i c double g r o e s s t e r T e m p e r a t u r S p r u n g (double[] a r r a y ) {

2 double g r o e s s t e r S p r u n g = 0 . 0; // 0.5 P u n k t e

3 f o r (i n t i = 1; i < a r r a y . l e n g t h ; i ++) {

4 // 1 P u n k t f¨ur k o r r e k t e V e r w e n d u n g der f o r- S c h l e i f e

5 // 1 P u n k t e f¨ur I n i t i a l i s i e r u n g mit i =1

6 ( o d e r nur bis a r r a y . lenght -1)

7 double d i f f e r e n z = M a t h . abs ( a r r a y [ i - 1] - a r r a y [ i ]);

8 // 1 P u n k t f¨ur D i f f e r e n z b e r e c h n u n g

9 // 1 P u n k t f¨ur A b s o l u t b e t r a g

10 i f ( d i f f e r e n z > g r o e s s t e r S p r u n g ) {

11 // 2 P u n k t e f¨ur g e s a m t e s i f- K o n s t r u k t

12 g r o e s s t e r S p r u n g = d i f f e r e n z ;

13 }

14 }

15 return g r o e s s t e r S p r u n g ; // 0.5 P u n k t e

16 }

b) Schreiben Sie eine main-Methode, in der f¨ur das Array [−5.0,1.7,19.0,16.9] die Methode groessterTemperaturSprungaus Teilaufgabe a) aufgerufen wird und das Ergebnis auf der Kommandozeile ausgegeben wird.

Hinweis: Sie k¨onnen davon ausgehen, dass die main-Methode zur selben Klasse geh¨ort wie die MethodegroessterTemperaturSprung.

L¨osung:

1 p u b l i c s t a t i c void m a i n ( S t r i n g [] a r g s ) {

2 double[] a r r a y = { -5.0 , 1.7 , 19.0 , 1 6 . 9 }; // 1.5 P u n k t e

3 double w e r t = g r o e s s t e r T e m p e r a t u r S p r u n g ( a r r a y ); // 1.5 P u n k t e

4 S y s t e m . out . p r i n t l n ( w e r t ); // 1 P u n k t

5 }

(7)

Aufgabe 5 Klassen und Vererbung 6 + 6 + 2 = 14 Punkte Eine Bank braucht ein neues Verwaltungsprogramm f¨ur ¨Uberweisungen. Zusammen mit dem Bankmanager entwickeln Sie folgendes Programm.

a) F¨ur Ihr Programm wollen Sie die KlasseBankKontoaus der Vorlesung verwenden. Zus¨atzlich haben Sie eine Klasse¨Uberweisungentworfen, die hier zusammen mit der KlasseBankKonto in UML-Notation angegeben ist.

Mit einer ¨Uberweisung kann ein Geldbetrag von einem Konto auf ein anderes Konto verscho- ben werden. In der Klasse ¨Uberweisungwird das Quellkonto in dem ¨offentlichen Attribut quellkonto und das Zielkonto in dem ¨offentlichen Attribut zielkonto gespeichert. Beide Attribute werden mit dem angegebenen Konstruktor initialisiert. F¨ur beide Attribute gibt es außerdem jeweils eine “Getter”-Methode. Die ¨Uberweisung von einem Geldbetragbetrag vom Quellkonto auf das Zielkonto wird durch die Methode ¨uberweisen ausgef¨uhrt. Dabei wird der Geldbetrag betragvom Quellkonto abgehoben und auf das Zielkonto eingezahlt.

Implementieren Sie nur die Klasse ¨Uberweisungmit Konstruktor und allen Methoden in Java. Sie k¨onnen davon ausgehen, dass die KlasseBankKonto in Java implementiert ist und k¨onnen diese verwenden.

L¨osung:

1 // 0.5 P u n k t e f¨ur p r i v a t e und p u b l i c bei den A t t r i b u t e n und M e t h o d e n

2 p u b l i c c l a s s ¨U b e r w e i s u n g {

3

4 // 1 P u n k t f¨ur a l l e A t t r i b u t e

5 p u b l i c B a n k K o n t o q u e l l k o n t o ;

6 p u b l i c B a n k K o n t o z i e l k o n t o ;

7

8 // 1 P u n k t

9 p u b l i c ¨U b e r w e i s u n g ( B a n k K o n t o q u e l l k o n t o , B a n k K o n t o z i e l k o n t o ) {

10 t h i s. q u e l l k o n t o = q u e l l k o n t o ;

11 t h i s. z i e l k o n t o = z i e l k o n t o ;

12 }

13

14 // 1.5 P u n k t e f¨ur b e i d e G e t t e r

15 p u b l i c B a n k K o n t o g e t Q u e l l k o n t o () {

16 return t h i s. q u e l l k o n t o ;

17 }

18

19 p u b l i c B a n k K o n t o g e t Z i e l k o n t o () {

20 return t h i s. z i e l k o n t o ;

21 }

22

23 // 2 P u n k t e

24 p u b l i c void ¨u b e r w e i s e n (double b e t r a g ) {

25 t h i s. q u e l l k o n t o . a b h e b e n ( b e t r a g );

26 t h i s. z i e l k o n t o . e i n z a h l e n ( b e t r a g );

27 }

28 }

29

30 −1 P u n k t bei f a l s c h e r S y n t a x o d e r f a l s c h e r K l a s s e n d e k l a r a t i o n

(8)

b) Die Bank m¨ochte nun auch Uberweisungen ins Ausland vornehmen k¨¨ onnen. Zur Uberweisung zwischen zwei Konten unterschiedlicher L¨¨ ander verwenden wir eine Subklasse Auslands¨uberweisungder Klasse ¨Uberweisungaus Teilaufgabe a), die wie folgt in UML- Notation angegeben ist.

F¨ur Auslands¨uberweisungen wird eine Geb¨uhr erhoben. Das Attributgebuehrgibt an, wie hoch die Geb¨uhr bei einer ¨Uberweisung ist. Im angegebenen Konstruktor werden alle geerb- ten und eigenen Attribute der KlasseAuslands¨uberweisunginitialisiert. Eine ¨Uberweisung wird durch die Methode ¨uberweisen der Klasse Auslands¨uberweisung ausgef¨uhrt, wobei die Geb¨uhr vom Quellkonto abgezogen wird.

Implementieren Sie die Klasse Auslands¨uberweisung mit Konstruktor und der Metho- de ¨uberweisen in Java. Sie k¨onnen davon ausgehen, dass die Klasse BankKonto und

¨Uberweisungaus Teilaufgabe a) bereits implementiert sind und k¨onnen diese verwenden.

L¨osung:

Alternative 1:

1 // 1 P u n k t f¨ur extends

2 p u b l i c c l a s s A u s l a n d s ¨u b e r w e i s u n g extends ¨U b e r w e i s u n g {

3 // 0.5 P u n k t e

4 p r i v a t e double g e b u e h r ;

5

6 p u b l i c A u s l a n d s ¨u b e r w e i s u n g ( B a n k K o n t o q u e l l k o n t o , B a n k K o n t o z i e l k o n t o ,

7 double g e b u e h r ) {

8 t h i s. q u e l l k o n t o = q u e l l k o n t o ; // 0.5 P u n k t e

9 t h i s. z i e l k o n t o = z i e l k o n t o ; // 0.5 P u n k t e

10 t h i s. g e b u e h r = g e b u e h r ; // 0.5 P u n k t e

11 }

12

13 // 3 P u n k t e ( mit 1 P u n k t f¨ur A d d i t i o n )

14 p u b l i c void ¨u b e r w e i s e n (double b e t r a g ) {

15 t h i s. q u e l l k o n t o . a b h e b e n ( b e t r a g + t h i s. g e b u e h r );

16 t h i s. z i e l k o n t o . e i n z a h l e n ( b e t r a g );

17 }

18 }

(9)

Alternative 2:

1 // 1 P u n k t f¨ur extends

2 p u b l i c c l a s s A u s l a n d s ¨u b e r w e i s u n g extends ¨U b e r w e i s u n g {

3 // 0.5 P u n k t e

4 p r i v a t e double g e b u e h r ;

5

6 p u b l i c A u s l a n d s ¨u b e r w e i s u n g ( B a n k K o n t o q u e l l k o n t o ,

7 B a n k K o n t o z i e l k o n t o , double g e b u e h r ) {

8 super( q u e l l k o n t o , z i e l k o n t o ); // 1 P u n k t

9 t h i s. g e b u e h r = g e b u e h r ; // 0.5 P u n k t e

10 }

11

12 // 3 P u n k t e

13 p u b l i c void ¨u b e r w e i s e n (double b e t r a g ) {

14 super. ¨u b e r w e i s e n ( b e t r a g );

15 t h i s. q u e l l k o n t o . a b h e b e n (t h i s. g e b u e h r );

16 }

17 }

−1 Punkt bei falscher Syntax oder falscher Klassendeklaration

c) Die KlasseBankMainverwendet die Klassen aus den Teilaufgaben a) und b), die als gel¨ost vorausgesetzt werden k¨onnen.

1 p u b l i c c l a s s B a n k M a i n {

2 p u b l i c s t a t i c void m a i n ( S t r i n g [] a r g s ) {

3 B a n k K o n t o q u e l l e = new B a n k K o n t o ( 1 0 ) ;

4 B a n k K o n t o z i e l = new B a n k K o n t o ( 0 ) ;

5

6 ¨U b e r w e i s u n g ¨u b e r w e i s u n g =

7 new A u s l a n d s ¨u b e r w e i s u n g ( quelle , ziel , 0 . 0 2 ) ;

8 ¨u b e r w e i s u n g . ¨u b e r w e i s e n ( 5 ) ;

9

10 S y s t e m . out . p r i n t l n ( " Q u e l l k o n t o : " + q u e l l e . g e t K o n t o S t a n d ( ) ) ;

11 S y s t e m . out . p r i n t l n ( " Z i e l k o n t o : " + z i e l . g e t K o n t o S t a n d ( ) ) ;

12 }

13 }

Geben Sie an, was in Zeile 10und 11 genau auf der Konsole ausgegeben wird.

L¨osung:

Quellkonto: 4.98 // 1 Punkt Zielkonto: 5.0 //1 Punkt

(10)

Aufgabe 6 Grafische Benutzeroberfl¨achen 2 + 5 = 7 Punkte In dieser Aufgabe sollen Sie mit AWT/Swing eine grafische Benutzeroberfl¨ache f¨ur eine kleine Anwendung implementieren, die den Benutzer begr¨ußt. Die grafische Benutzeroberfl¨ache soll wie folgt aussehen:

Eine Implementierung der grafischen Benutzeroberfl¨ache ist durch folgenden Programmaus- schnitt angedeutet:

1 p u b l i c c l a s s B e g r u e s s u n g s F r a m e extends J F r a m e implements A c t i o n L i s t e n e r {

2 p r i v a t e J B u t t o n n a m e B u t t o n ;

3 p r i v a t e J B u t t o n g r u s s B u t t o n ;

4 p r i v a t e J T e x t A r e a a u s g a b e B e r e i c h ;

5

6 p r i v a t e S t r i n g n a m e ;

7

8 p u b l i c B e g r u e s s u n g s F r a m e () {

9 t h i s. s e t T i t l e ( " B e g r ¨u ß u n g s F r a m e " );

10 t h i s. s e t S i z e (400 , 2 0 0 ) ;

11

12 t h i s. n a m e B u t t o n = new J B u t t o n ( " N a m e e i n g e b e n " );

13 t h i s. g r u s s B u t t o n = new J B u t t o n ( " B e g r ¨u ß u n g a u s g e b e n " );

14 t h i s. a u s g a b e B e r e i c h = new J T e x t A r e a (150 , 3 0 0 ) ;

15 ... // Der w e i t e r e A u f b a u der GUI ist h i e r u n w e s e n t l i c h

16 17

18 ... // in T e i l a u f g a b e a ) zu i m p l e m e n t i e r e n

19 20

21 t h i s. s e t D e f a u l t C l o s e O p e r a t i o n ( J F r a m e . E X I T _ O N _ C L O S E );

22 }

23

24 p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) {

25 O b j e c t s o u r c e = e . g e t S o u r c e ();

26

27 ... // in T e i l a u f g a b e b ) zu i m p l e m e n t i e r e n

28 29

30 }

31 }

a) Welche Anweisungen m¨ussen im Konstruktor der Klasse BegruessungsFrame eingef¨uhrt werden, so dass die Benutzeroberfl¨ache auf Knopfdr¨ucke reagieren kann.

L¨osung:

t h i s. n a m e B u t t o n . a d d A c t i o n L i s t e n e r (t h i s); // 1 P u n k t

(11)

b) Wird der Button mit der Aufschrift “Name eingeben” gedr¨uckt, soll der Benutzer mit Hilfe der Methode JOptionPane.showInputDialog(String message) nach seinem Namen ge- fragt werden. Dieser soll im Attribut name gespeichert werden. Wird der Button mit der Aufschrift “Begr¨ußung ausgeben” gedr¨uckt, soll der Benutzer mit dem gespeicherten Na- men im Ausgabebereich der Benutzeroberfl¨ache mit “Hallo ...” begr¨ußt werden. Erg¨anzen Sie den Rumpf der MethodeactionPerformed so, dass die oben gew¨unschte Reaktion f¨ur beideButtons erfolgt.

L¨osung:

1 p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) {

2 O b j e c t s o u r c e = e . g e t S o u r c e ();

3 i f ( s o u r c e == t h i s. n a m e B u t t o n ) { // 1 P u n k t

4 // 1 P u n k t f¨ur A b f r a g e mit J O p t i o n P a n e

5 // 1 P u n k t f¨ur Z u w e i s u n g an t h i s. n a m e

6 t h i s. n a m e = J O p t i o n P a n e . s h o w I n p u t D i a l o g ( " N a m e e i n g e b e n : " );

7 }

8 e l s e i f ( s o u r c e == t h i s. g r u s s B u t t o n ) { // 1 P u n k t

9 // 0.5 P u n k t e f¨ur r i c h t i g e B e n u t z u n g des A u s g a b e b e r e i c h s

10 // 0.5 P u n k t e f¨ur r i c h t i g e B e n u t z u n g von t h i s. n a m e

11 t h i s. a u s g a b e B e r e i c h . s e t T e x t ( " H a l l o " + t h i s. n a m e );

12 }

13 }

(12)

Aufgabe 7 Quicksort 3 + 3 = 6 Punkte a) Beschreiben Sie die Idee des Quicksort-Algorithmus, indem Sie die drei wesentlichen, in der

Vorlesung angegebenen Schritte des Algorithmus kurz beschreiben.

L¨osung:

Falls das zu sortierende Array mindestens zwei Elemente hat:

1. W¨ahle irgendein Element aus dem Array als Pivotelement. (1 Punkt)

2. Partitioniere das Array in einen linken und einen rechte Teil, so dass alle Elemente im linken Teil kleiner-gleich dem Pivotelement sind und alle Elemente im rechten Teil gr¨oßer-gleich dem Pivotelement sind. (1 Punkt)

3. Wende das Verfahren (rekursiv) auf die beiden Teilarrays an. (1 Punkt)

b) Geben Sie die Ordnung der Zeitkomplexit¨at des Quicksort-Algorithmus (i) im durchschnitt- lichen und (ii) im schlechtesten Fall an! Bei welcher Eigenschaft des zu sortierenden Arrays tritt der schlechteste Fall ein, wenn als Pivot immer das erste Element des Arrays genommen wird?

L¨osung:

durchschnittlicher Fall: O(n∗log2(n)) (1 Punkt) schlechtester Fall: O(n2) (1 Punkt)

Der schlechteste Fall tritt ein, wenn das Array schon sortiert ist. (1 Punkt)

(13)

Aufgabe 8 Rekursion 5 Punkte Sie wollen in Ihrer Dachgeschosswohnung eine Einweihungsparty geben. Da Ihr Haus keinen Aufzug hat, m¨ussen Sie alle Getr¨ankeflaschen selbst hochtragen. Falls Sie alle Flaschen auf einmal hochtragen k¨onnen, brauchen Sie nur einen Gang und sind fertig. Solange Sie weitere G¨ange brauchen, gilt: Falls Sie beim aktuellen Gang mehr als eine Flasche hochtragen, dann k¨onnen Sie - aus Konditionsgr¨unden - beim folgenden Gang nur eine Flasche weniger hochtragen.

Falls Sie beim aktuellen Gang nur eine Flasche hochtragen, dann k¨onnen Sie beim n¨achsten Gang wieder eine Flasche hochtragen. Wenn Sie beispielsweise 40 Flaschen einkaufen und zu Beginn 20 Flaschen auf einmal hochtragen k¨onnen, m¨ussen Sie insgesamt dreimal hochgehen.

Beim ersten Mal tragen Sie 20 Flaschen, beim zweiten Mal nur noch 19 Flaschen und beim letzten Mal eine Flasche. Wenn Sie beispielsweise 3 Flaschen einkaufen und zu Beginn nur eine Flasche hochtragen k¨onnen, m¨ussen Sie insgesamt auch dreimal hochgehen. Jedesmal tragen Sie eine Flasche.

Um zu berechnen, wie oft Sie zu Ihrer Wohnung hochgehen m¨ussen, damit alle Flaschen oben sind, soll die unten angegebene Methode flaschenHochtragen verwendet werden. Der Para- meter flaschenNochHoch gibt an, wie viele Flaschen Sie noch in Ihre Wohnung hochtragen m¨ussen; der ParameterflaschenAktGang gibt an, wie viele Flaschen Sie beim aktuellen Gang hochtragen k¨onnen. Es kann davon ausgegangen werden, dass Sie immer mindestens eine Flasche hochtragen k¨onnen.

1 p u b l i c s t a t i c i n t f l a s c h e n H o c h t r a g e n (i n t f l a s c h e n N o c h H o c h ,

2 i n t f l a s c h e n A k t G a n g ) {

3 i f ( f l a s c h e n N o c h H o c h <= f l a s c h e n A k t G a n g )

4

5 return

6

7 // a ) e r s t e r E r g e b n i s - A u s d r u c k

8

9 e l s e i f ( f l a s c h e n A k t G a n g > 1)

10

11 return

12

13 // b ) z w e i t e r E r g e b n i s - A u s d r u c k

14

15 e l s e

16

17 return

18

19 // c ) d r i t t e r E r g e b n i s - A u s d r u c k

20

21 }

22 }

Der Rumpf der Methode enth¨alt Fallunterscheidungen. Tragen Sie an den Stellen a), b) und c) geeignete Ergebnis-Ausdr¨ucke ein, die zu einer rekursiven L¨osung des Problems f¨uhren. Die Ergebnis-Ausdr¨ucke sollen also ggf.rekursiveAufrufe der Methode flaschenHochtragenent- halten.

L¨osung:

1 p u b l i c s t a t i c i n t f l a s c h e n H o c h t r a g e n (i n t f l a s c h e n N o c h H o c h ,

2 i n t f l a s c h e n A k t G a n g ) {

3 i f ( f l a s c h e n N o c h H o c h <= f l a s c h e n A k t G a n g )

4 return 1; // 1 P u n k t

5 e l s e i f ( f l a s c h e n A k t G a n g > 1)

6 return 1 + f l a s c h e n H o c h t r a g e n ( f l a s c h e n N o c h H o c h - f l a s c h e n A k t G a n g ,

7 f l a s c h e n A k t G a n g - 1 ) ; // 2 P u n k t e

8 e l s e

9 return 1 +

(14)

10 f l a s c h e n H o c h t r a g e n ( f l a s c h e n N o c h H o c h - f l a s c h e n A k t G a n g , 1); // 2 P u n k t e

11 }

12 }

(15)

Aufgabe 9 Verkettete Listen und Ausnahmen 4 + 3 + 2 = 9 Punkte Gegeben seien die Klassen zur Implementierung einfach-verketteter Listen mit Werten vom Typ double, wie in der Vorlesung besprochen:

a) Implementieren Sie die MethoderemoveFirstder KlasseMyList, die das erste Element der Liste entfernt und den Wert des entfernten Elements zur¨uckgibt. Dabei sollen nur die oben angegebenen Attribute und Methoden verwendet werden. Sie k¨onnen in dieser Teilaufgabe davon ausgehen, dass die Liste mindestens ein Element enth¨alt.

L¨osung:

1 p u b l i c double r e m o v e F i r s t () {

2 double v a l u e = t h i s. f i r s t . g e t V a l u e (); // 1 P u n k t

3 t h i s. f i r s t = t h i s. f i r s t . g e t N e x t (); // 2 P u n k t e

4 return v a l u e ; // 1 P u n k t

5 }

b) Es sei nun folgende Ausnahmeklasse gegeben:

1 p u b l i c c l a s s L e e r e L i s t e A u s n a h m e extends E x c e p t i o n {

2 }

Modifizieren Sie Ihre Methode removeFirst aus Teilaufgabe a) so, dass die Ausnahme LeereListeAusnahmeausgel¨ost wird, wenn die Liste leer ist.

L¨osung:

1 p u b l i c double r e m o v e F i r s t () throws L e e r e L i s t e A u s n a h m e { // 1 P u n k t

2 i f (t h i s. f i r s t == n u l l) { // 1 P u n k t

3 throw new L e e r e L i s t e A u s n a h m e (); // 1 P u n k t

4 }

5 double v a l u e = t h i s. f i r s t . g e t V a l u e ();

6 t h i s. f i r s t = t h i s. f i r s t . g e t N e x t ();

7 return v a l u e ;

8 }

c) Mit folgender main-Methode wollen Sie Ihre Methode removeFirst aus Teilaufgabe b) testen:

Modifizieren Sie diese main-Methode so, dass die Ausnahme LeereListeAusnahme an ge- eigneter Stelle abgefangen und behandelt wird und eine Fehlermeldung ¨uber die Ursache des Fehlers auf der Kommandozeile ausgegeben wird.

L¨osung:

(16)

1 p u b l i c s t a t i c void m a i n ( S t r i n g [] a r g s ) {

2 M y L i s t l i s t = new M y L i s t ();

3

4 // 2 P u n k t e f¨ur a l l e s

5 try {

6 double d = l i s t . r e m o v e F i r s t ();

7 }

8 catch ( L e e r e L i s t e A u s n a h m e e ) {

9 S y s t e m . out . p r i n t l n ( " Die L i s t e ist l e e r . " );

10 }

11 }

Referenzen

ÄHNLICHE DOKUMENTE

Bitte alle Bl¨ atter mit Namen versehen, fortlaufend numerieren und am Schluß der Klausur in das in der Mitte einmal gefaltete Aufgabenblatt legen. Das Schreiben mit Bleistift ist

Geben Sie einen Tipp, was der Nutzer tun kann oder was in diesen Systemen ver¨andert wer- den muss, damit die Sicherheitsziele f¨ ur den Nutzer trotzdem umgesetzt werden k¨onnen...

• Geben Sie bitte am Ende der Klausur alle Bl¨ atter inklusive der Aufgabenbl¨ atter ab.. Anzahl Punkte

Stimmt Stimmt nicht Wenn R stark konfluent ist, dann ist R auch lokal konfluent. x Die Teiltermrelation D ist monoton, stabil, reflexiv

Schreiben Sie Ihren Namen, Vornamen, Studiengang und Studienfach so- wie Ihre Matrikelnummer (oder eine frei wählbare ID) leserlich auf alle Klausurbögen, die Sie für Ihre

Schreiben Sie Ihren Namen, Vornamen, Studiengang und Studienfach so- wie Ihre Matrikelnummer (oder eine frei wählbare ID) leserlich auf alle Klausurbögen, die Sie für Ihre

Schreiben Sie Ihren Namen, Vornamen, Studiengang und Studienfach so- wie Ihre Matrikelnummer leserlich auf alle Klausurbögen, die Sie für Ihre Lösung verwenden – bevor Sie mit

Schreiben Sie Ihren Namen, Vornamen, Studiengang und Studienfach so- wie Ihre Matrikelnummer leserlich auf alle Klausurbögen, die Sie für Ihre Lösung verwenden – bevor Sie mit