• Nenhum resultado encontrado

L A TEX

12.2 Speicherung von Arrays

12 Arrays (Felder)

104 12 Arrays (Felder)

Zusammenfassung dieses Kapitels

12.2.2 Zuweisung und Vergleich von Verweistypen

12-18 Zuweisung von Arrays. 12-18

int a;

int[] b = {3,4,5};

int[] c = {1,2}; // Situation 1

c = b; // Situation 2

Situation 1

a b c

3 4 5

1 2

Situation 2

a b c

3 4 5

1 2

12-19 Es gibt unerwartete Effekte bei Zuweisungen von Arrays. 12-19

Wenn man mittelsb = ceiner Arrayvariablebden in einer anderen Arrayvariablecgespei- cherten zuweist, soverweisenbundcauf denselben Array. Ändert man dannb, so ändert man auch gleichzeitigc, was man meistens nicht will.

Vergleicht man Arrayvariablen mittels==, so wird lediglich überprüft, ob die Arrayvariablen auf denselben Array verweisen, undnicht, ob die Arrays dieselben Elemente haben; und auch dies will man meistens nicht.

Moral

1. Zuweisung von Arrays sind mit Vorsicht zu genießen.

2. Vergleiche von Arrays sind mit Vorsicht zu genießen.

Zusammenfassung dieses Kapitels

12-20

I

Der Array-Typ 12-20

Isttypeein Typ, so isttype[]der Typ einesArrays von Werten vom Typtype. In einer Variable vom Typtype[]können Arraysbeliebiger Größegespeichert werden, jedoch hat jedereinzelne Arrayeine feste, unabänderliche Größe.

I

Vergleich von Arrays und Strings Gemeinsamkeiten:

Beide speichern Folgen von Elementen gleichen Typs (bei Stringschars, bei Arrays beliebiger Typ).

Jeder einzelne String/Array hat eine feste Größe.

Die Zählung der Elemente beginnt bei 0.

Unterschiede:

Bei Arrays kann man einzelne Elementeändern, bei Strings nicht.

Man kann Strings mittelt+verketten, Arrays nicht.

Bei Arrays schreibt mana.lengthfür die Länge, bei Stringsa.length().

I

Arrays kann man auf zwei Arten erzeugen int[] a = { 0, 0, 0, 0 };

int[] a = new int [4];

I

Über Arraysiteriertman mit Schleifen int[] a = ...;

for (int i = 0; i < a.length; i = i+1) { ... // tue etwas mit a[i]

}

I

Vergleich von und Zuweisung von Arrays

Die Befehlea = b;unda == bmachen für Arraysnichtdas, was man erwartet.

12 Arrays (Felder)

12.3 Übungen zu diesem Kapitel 105

Übungen zu diesem Kapitel

Übung 12.1 Arrays statt Strings, einfach

Schreiben Sie ein Programm analog zu Übung 11.1, welches die komplementäre Sequenz zu einer Basenfolge berechnet, nur dass die Sequenzen nun alschar-Array statt einem String gespeichert wird:

char[] sequenz = {’t’,’c’,’c’,’t’,’a’,’t’};

char[] komplement = new char[sequenz.length];

Um das Array auszugeben, müssen Sie in einerfor-Schleife jedes einzelne Zeichen ausgeben.

Übung 12.2 Arrays verarbeiten, mittel

Schreiben Sie ein Programm, das zu einem Array von Zahlen das Minimum, das Maximum und den Mittelwert ermittelt. Testen Sie Ihr Programm mit folgendem Array:

int[] numbers = {3, 0, 610, 4181, 1, 89, 377, 13, 34, 2584, 1, 1597, 144, 233, 21, 55, 987, 5, 8, 17711, 6765, 28657, 2, 10946};

Übung 12.3 Codons dekodieren, mittel

Schreiben Sie ein Programm, das zu einer Nukleotidsequenz die Sequenz der dadurch kodierten Ami- nosäuren ausgibt, zum Beispiel als 1-Letter-Codes.

Eine einfache, aber längliche und daher mit viel Tipparbeit verbundene Möglichkeit, diese Aufgabe zu lösen, hat etwas mit 64if-Anweisungen in einerfor-Schleife zu tun. Etwas eleganter geht es so:

Codons kann man auf Zahlen von 0 bis 63 abbilden. Dazu weist man jeder Base eine Zahl von0 bis3zu (z.B. T=0,C=1,A=2,G=3). Den Wert der zweiten Base multipliziert man mit4, den Wert der dritten Base mit16und addiert die drei Werte. ATG(2,0,3)ergibt sich beispielsweise zu2+4·0+16·3=50.

Die Zuordnung zwischen der Zahlendarstellung des Codons und der kodierten Aminosäure kann man gut als Array speichern.

Übung 12.4 Arrays von Strings verstehen, leicht

Eine Reihe verwandter DNA-Sequenzen sei alsArray von Stringsgegeben:

String[] j_region = { "ttatgtcttcggaactgggaccaaggtcaccgtcctag",

"tgtggtattcggcggagggaccaagctgaccgtcctag",

"tgtggtattcggcggagggaccaagctgaccgtcctag",

"ttgggtgttcggcggagggaccaagctgaccgtcctag",

"ttttgtatttggtggaggaacccagctgatcattttag",

"ctgggtgtttggtgaggggaccgagctgaccgtcctag",

"ctgggtgtttggtgaggggacggagctgaccgtcctag",

"taatgtgttcggcagtggcaccaaggtgaccgtcctcg",

"tgctgtgttcggaggaggcacccagctgaccgtcctcg",

"tgctgtgttcggaggaggcacccagctgaccgccctcg" };

Geben Sie Java-Ausdrücke an, mit denen man folgendes erhält:

1. Die fünfte DNA-Sequenz.

2. Die erste Base aus der vierten DNA-Sequenz.

3. Die zehnte Base aus der sechsten DNA-Sequenz.

4. Die letzte Base aus der sechsten DNA-Sequenz.

5. Die letzte Base aus der letzten DNA-Sequenz.

Übung 12.5 Arrays von Strings verarbeiten, mittel

Schreiben Sie ein Java-Programm, das für alle Stellen der Sequenzen aus der vorherigen Übung aus- gibt, an wieviel Prozent dieser Stellen ein Thymin vorkommt. Beispielsweise so:

Stelle 1: 80% Thymin Stelle 2: 50% Thymin ...

106 12 Arrays (Felder)

Übungen zu diesem Kapitel

Übung 12.6 Arrays von Strings verarbeiten, schwer

In Erweiterung der vorherigen Aufgabe ordnen wir nun den Basen Zahlen zu: T=0,C=1,A=2,G= 3. Damit können wir das Programm so erweitern, dass für jede Stelle die relativen Häufigkeitenaller Basengezählt, und in einem Array gespeichert werden.

Erweitern Sie das Programm auf diese Weise, so dass folgende Ausgabe produziert wird:

Stelle 1: 80% Thymin, 20% Cytosin, 0% Adenin, 0% Guanin Stelle 2: 50% Thymin, 0% Cytosin, 10% Adenin, 40% Guanin ...

Prüfungsaufgaben zu diesem Kapitel

Übung 12.7 Syntaxfehler finden, leicht, original Klausuraufgabe, mit Lösung Betrachten Sie folgenden Java-Code:

int[] a = {1,2,3};

int[] b = new int{2*a.length};

for( int i = 0 ; i < a.length() ; i ++ ) {

b[2*i] = a[i];

b[2*i+1] = a[i];

}

1. In zwei Zeilen des Codes befinden sich Syntaxfehler. Wie lauten diese Zeilen richtig?

2. Wie lautet der Inhalt des Arraysbnach Ausführung des (berichtigten) Codes?

Übung 12.8 Abstand zweier Vektoren berechnen, mittel, typische Klausuraufgabe Gegen sind zwei Arrays:

double[] a = {...};

double[] b = {...};

Geben Sie ein Programm an, dass den Abstand zwischen den beidenn-dimensionalen Vektorenaund bbestimmt. Zur Erinnerung: Der Abstand zwischen zwein-dimensionalen Vektoren ist definiert als

distance(a,b) = v u u t

n

X

i=1

|ai−bi|2.

Die Quadratwurzel einer Zahlxerhalten Sie mittelsMath.sqrt(x). Sie dürfen annehmen, dass die Vektoren die gleiche Dimension haben.

Übung 12.9 Nukleotidfrequenzen berechnen, mittel, original Klausuraufgabe

Die Nukleotidfrequenz eines Gens gibt darüber Auskunft, welches Nukleotid in dem Gen wie oft vorkommt. Zum Bespiel kommt in der SequenzGATTACAdas’A’dreimal, das’C’einmal, das’G’

einmal und das’T’zweimal vor. Diese Information kann man in Java in einem Array speichern, hier also{3,1,1,2}(in der Reihenfolge’A’,’C’,’G’,’T’).

Ergänzen Sie den Code der folgenden Methode, so dass die Nukleotidfrequenz in der beschriebenen Array-Form berechnet und zurückgegeben wird! Dabei können Sie davon ausgehen, dass der überge- bene String wirklich nur aus den Zeichen’A’,’C’,’G’und’T’besteht.

int[] nucleotideFrequency( String s ){

int[] r = new int[4];

// Hier Ihr Code.

return r;

}

13 Scoping 107

13-1 13-1

Kapitel 13

Scoping

Globalisierung und Subsidiaritätsprinzip

13-2 13-2

Lernziele dieses Kapitels

1. Scoping verstehen und anwenden können.

2. Die Speicherung von Variablen verstehen.

Inhalte dieses Kapitels

13.1 Problem: Variablennamen 108

13.1.1 Name-Clashing . . . 108 13.1.2 Verwendungsdauer . . . 109

13.2 Lösung: Scoping 110

13.2.1 Der Begriff des Scopes . . . 110 13.2.2 Gültigkeit von Variablen . . . 110 13.2.3 Sichtbarkeit von Variablen . . . 111 13.2.4 Speicherung von Variablen . . . 112

Übungen zu diesem Kapitel 113

Worum es heute geht

Worum es heute geht

Die Bedeutung und Wichtigkeit des Scopings hat die katholische Kirche schon sehr viel früher erkannt als die Informatik:

Ausde.wikipedia.org/wiki/Subsidiarität Die Formulierung des Subsidiaritätsprinzips reicht in die Zeit unmittelbar nach der Reformation zurück und hat ihren Ursprung in der calvinistischen Konzeption des Gemeinwesens. Die Synode in Emden (Ostfriesland, 1571), welche über das entstehende neue Kirchenrecht zu befinden hatte, entschied in Abgrenzung zur bisher geltenden zentralistischen katholischen Kirchenlehre, dass Entscheidungen jeweils auf der niedrigst möglichen Ebene getroffen werden sollen:

Provinzial- und Generalsynoden soll man nicht Fragen vorlegen, die schon früher behandelt und gemeinsam entschieden worden sind [. . . ] und zwar soll nur das auf- geschrieben werden, was in den Sitzungen der Konsistorien und der Classicalver- sammlungen nicht entschieden werden konnte oder was alle Gemeinden der Provinz angeht.

Diese Vorstellung von Subsidiarität wurde 1604 von Johannes Althusius in einer philosophisch- politischen Reflexion über das Wesen des Staates formalisiert. In Aufnahme des biblischen »Bun- des-Gedankens« verstand er die Gesellschaft als verschiedene, miteinander verbundene Gruppen, die jede ihre eigenen Aufgaben und Ziele zu erfüllen haben, die aber in gewissen Bereichen auf die Unterstützung (subsidium) der übergeordneten Gruppe angewiesen sind. Die Unterstützung soll aber nur dort einsetzen, wo sich Unzulänglichkeiten offenbaren, keinesfalls aber die Aufgabe der anderen Gruppe völlig übernehmen. Seine Theorien einer möglichst weit gehenden Autonomie aller Zwischeninstanzen zwischen Individuum und Staat konnte Althusius als Bürgermeister in Emden auch unmittelbar in der Praxis erproben.

Ausgehend von Aristoteles und weiterentwickelt von Thomas von Aquin floss das Subsidiari- tätsprinzip 1891 durch die EnzyklikaRerum novarumdann auch in die katholische Soziallehre ein und markierte eine entscheidende Wende in der katholischen Staatstheorie. Diese gab damit die päpstlich zentralistische Sicht des Staatswesens definitiv auf, das von einem Monarchen mit göttlichen Rechten gelenkt wurde.

Eine klassische Formel des Subsidiaritätsprinzips findet sich in der SozialenzyklikaQuadragesi- mo annovon Papst Pius XI. »über die Gesellschaftliche Ordnung« vom 15. Mai 1931. Hiermit

108 1313.1 ScopingProblem: Variablennamen

schloss Papst Pius XI. an das genannte Rundschreiben Leos XIII.Rerum novarum(1891) an und entwarf unter dem Eindruck zunehmender zentralistischer und totalitärer staatlicher Tendenzen einen Gesellschaftsansatz, der das Individuum im Rahmen seiner individuellen Leistungsfähig- keit zum Maßstab und zur Begrenzung überindividuellen Handelns machte.

Sie sehen nicht sofort, was dies mit Informatik zu tun hat? Nun, das Subsidiaritätsprinzip bedeutet übersetzt für die Informatik: Löse Probleme dort, wo sie entstehen, und nicht auf einer übergeordneten Ebene. In der Informatik heißt dieses KonzeptScoping.