• Nenhum resultado encontrado

L A TEX

13.2 Lösung: Scoping

13.2.1 Der Begriff des Scopes

13-12 Die Lösung aller Probleme: Scopes. 13-12

EinScopeist ein bestimmter Bereich eines Programms, der in Java in der Regel durch ge- schweifte Klammern eingeschlossen wird. Solche Scopes lassen sich schachteln.

13-13 Beispiel eines Programms mit mehreren Scopes. 13-13

class Hello

{ // Start von Scope 1

public static void main (String[] args) { // Start von Scope 2

int i = 0;

while (i < 5)

{ // Start von Scope 3 i = i + 1;

} // Ende von Scope 3

while (i > 0)

{ // Start von Scope 4 i = i - 1;

} // Ende von Scope 4 } // Ende von Scope 2 } // Ende von Scope 1

13.2.2 Gültigkeit von Variablen

13-14 Variablen sind nur innerhalb ihres Scopes gültig. 13-14

...

int sum_n = 0, sun_m = 0;

{

int i;

for (i=0; i<=n; i = i+1) { sum_n = sum_n+i;

} }

// Hier gibt es kein i mehr!

{

int i; // Ok!

for (i=0; i<=m; i = i+1) { sum_m = sum_m+i;

} }

13-15 . Zur Übung 13-15

Welche Variablen sind an den Orten A, B und C gültig?

int n, m;

{

for (int i = 0; i < n; i = i+1) { n = n+m;

}

// Ort A

13 Scoping

13.2 Lösung: Scoping 111

int j;

{

for (j = 0; j < n; j = j+1) { m = m+n;

} }

// Ort B }

// Ort C

13.2.3 Sichtbarkeit von Variablen

13-16 Wer ist gemeint? 13-16

»Die Bank steht in einem Park.«

Copyright by Håstad Svensson, GNU Free Documentation License Copyright by Jean-Jacques Milan, GNU Free Documentation License

13-17 Die Verdeckung von Bezeichnern. 13-17

Bezeichner innerhalb eines Scopesverdeckengleiche Bezeichner weiter außen. Es gilt also immer der Bezeichner, der am weitesten innen deklariert wurde.

13-18 . Zur Übung 13-18

Welchen Werte habeniundjam Ende?

int i = 0;

int j = 0;

{

int i = 5;

j = 0;

{

int j = i;

i = j+1;

j = i-1;

} j = i;

}

112 1313.2 ScopingLösung: Scoping

13.2.4 Speicherung von Variablen

13-19 Scopes helfen dem Übersetzer bei der Speicherreservierung. 13-19

Am Anfang eines Scopes merkt sich der Übersetzer, wie viel Speicherplatz bereits ver- braucht ist. Wird dann eine neue Variable deklariert, so steigt der Speicherverbrauch. Am Ende eines Scopes kann aller Speicher freigegeben werden ab der gemerkten Stelle.

13-20 Speicherbelegung während des Ablaufs eines Programms. 13-20

int a, b; // Zeile 1 int c; // Zeile 2

{ // Zeile 3

int d,e; // Zeile 4 { // Zeile 5 int f; // Zeile 6 } // Zeile 7 int g; // Zeile 8

} // Zeile 9

int h; // Zeile 10

Zeile 1

a b

Zeile 2

a b c

Zeile 3

a b Marke 1 c

Zeile 4

a b Marke 1 c

d e

Zeile 5

a b Marke 1 c

d Marke 2 e

Zeile 6

a b Marke 1 c

d Marke 2 e

f

Zeile 7

a b Marke 1 c

d Marke 2 e

Zeile 8

a b Marke 1 c

d e g

Zeile 9

a b Marke 1 c

Zeile 10

a b c h

13 Scoping

Zusammenfassung dieses Kapitels 113

Zusammenfassung dieses Kapitels

13-21

I

Syntax von Scopes 13-21

Scopes beginnen mit einer geschweiften Klammer und enden bei der zugehörigen schließen- den geschweiften Klammer.

{

int i;

...

}

// Wir sind jetzt außerhalb des Scopes und // i ist damit verschwunden

Ausnahme:foreröffnet direkt einen Scope:

for (int i = 0; ...; ...) { ...

}

// Wir sind jetzt außerhalb des Scopes der For-Schleife // und i ist damit verschwunden

I

Die Regeln hinter dem Scoping

1. Variablenexistierennur innerhalb des Scopes, in dem sie deklariert wurden.

2. Eine Variable kann in einem Scope nur einmal deklariert werden; »Sub-Scopes« dürfen aber Variablen »lokal« neu deklarieren.

3. Gibt es eine Variable gleichen Names mehrmals, so ist immer nur dieinnerste sichtbar.

I

Merke

Am Ende eines Scopes »verschwinden« möglicherweise einige Variable, jedoch ändern die verbliebenennicht ihren Wert.

Übungen zu diesem Kapitel

Übung 13.1 Programmtexte nachvollziehen, mittel, original Klausuraufgabe, mit Lösung Geben Sie die Werte der Variablenw,x,y,zundtmpan den Stellen 1 und 2 im folgenden Java- Programm an.

{

String w = "TOLL", x = "INFO A", y = "IST", z = "CHT", tmp = "";

tmp = z;

z = "NI" + z;

x = x + " " + y;

y = z;

z = w;

y = "E" + tmp;

// Stelle 1 }

String w = "ACCGCGTAG", x = "", y = "", z = "", tmp = "";

for (int i = 0; i < w.length(); i++) { if (w.charAt(i) == ’A’) x = x + "T";

if (w.charAt(i) == ’C’) x = x + "G";

if (w.charAt(i) == ’G’) x = x + "C";

if (w.charAt(i) == ’T’) x = x + "A";

tmp = x.charAt(x.length() - 1) + tmp;

z = z + w.charAt(w.length() - i - 1);

}

// Stelle 2

114 14 Modularisierung im Kleinen

14-1 14-1

Kapitel 14

Modularisierung im Kleinen

Wie man große Probleme in genießbare Häppchen aufteilt

14-2 14-2

Lernziele dieses Kapitels

1. Das Konzept des Unterprogramms/Methode verstehen und anwenden können

2. Java-Syntax der Modularisierung auf Methodenebene beherrschen

Inhalte dieses Kapitels

14.1 Sich wiederholender Code 115

14.1.1 Das Problem . . . 115 14.1.2 Die Lösung . . . 116

14.2 Methoden in Java 116

14.2.1 Die Syntax im Überblick . . . 116 14.2.2 Syntax: Methodenname . . . 117 14.2.3 Syntax: Parameter . . . 117 14.2.4 Syntax: Rückgabetyp . . . 118 14.2.5 Syntax: Aufruf . . . 119

Übungen zu diesem Kapitel 120

Worum es heute geht

Worum es heute geht

Vor einigen Jahren haben mehrere Gruppen von Studierenden im Rahmen ihres Mini-Pro- grammierprojekts einen Horoskopgenerator programmiert. Diese Programme können auf- grund hochkomplexer, wissenschaftlich solide fundierter astrologisch-esoterischer Analy- sen die Zukunft vorhersagen. Dies ist um so erstaunlicher, da Prognosen ja im Allgemeinen schwierig sind, ganz besonders, wenn sie die Zukunft betreffen.

Bekanntermaßen ist aus astrologisch-esoterischer Sicht der Wochentag des Geburtstags ei- nes Menschen ganz besonders wichtig für sein weiteres Schicksal. Aus diesem Grund ist ei- nes der vielen komplexen Problem, die von diesen Programmen immer wieder gelöst werden müssen, zu einem gegebenen Datum den zugehörigen Wochentag zu bestimmen. Tatsächlich ist es ja nicht ganz einfach, den Wochentag eines gegebenen Datums zu bestimmen (welcher Wochentag war zum Beispiel der 22. April 1724?), weshalb man einigen Programmtext hierfür benötigt.

Da Wochentage für die Schicksalsbestimmung so wichtig sind, wird man in einem Horo- skopgenerator immer wieder an verschiedenen Stellen im Programm Wochentage zu gege- benen Daten berechnen wollen. Sehr unschön wäre es, wenn man dazu den Programmtext immer und immer wieder an den verschiedenen Stellen im Programm einbauen müsste: Dies würde viel Schreibarbeit erzeugen und das Programm sehr lang werden lassen. Schließlich wäre es auch schwierig, noch etwas an dem Programmtext zu ändern, denn man müsste dann ja immer alles an allen Stellen ändern, wo der Programmtext auftaucht.

Die Lösung dieses Problems ist, eineMethodefür die Wochentagsberechnung einzuführen.

Eine solche Methode bekommt mehrere Eingaben, in unserem Fall drei Integer-Werte, wel- che den Tag, den Monat und das Jahr darstellen, und liefern als Ausgabe einen neuen Wert, in unserem Fall beispielsweise einen String, der den Tag enthält. Ein solche Methode wird nur einmal aufgeschrieben und kann dann später beliebig oftaufgerufenwerden. Bei einem solchen Aufruf kann man sich vorstellen, dass die Methode angelaufen kommt, ihre Eingabe erhält, fleißig arbeitet, das Ergebnis überreicht und dann brav wieder zurückkehrt, von wo auch immer sie hergekommen ist.

Die Syntax zum Aufschreiben von Methoden ist leider »nicht optimal«, insbesondere ist die

14 Modularisierung im Kleinen