Übungsaufgaben zu den Themen Felder und Funktionen



Kopieren Sie jeweils den unten angegebenen Code in Ihren Editor und ergänzen Sie den Code wie in den Aufgaben vorgegeben. Legen Sie zweckmäßigerweise eine neue HTML-Datei sowie eine neue JavaScript-Datei in Ihrem Projektverzeichnis an und integrieren Sie den JavaScript-Code in der HTML-Datei in einem <script>-Element.

Entwerfen Sie Ihre Lösungen jeweils ohne im JavaScript-Code notierte feste Zahlenwerte für die Anzahl der Feldelemente. Nutzen Sie stattdessen die length-Eigenschaft oder - wie angegeben - for-in-Schleifen.

Aufgabe 1: Feldelementsumme

Betrachten Sie das folgende Codesegment:

var val = [0, 1, 2, 3];
var sum = 0;

// Code einfügen
document.write("Summe aller Zahlen = " + sum + "<br>");

Vervollständigen Sie den Code, sodass die Summe der Zahlen im Feld mit Hilfe einer for-Schleife berechnet wird.

Ausgabe des Programms:

Summe aller Zahlen = 6

Aufgabe 2: Zwei indizierte Felder

Gegeben seien zwei Felder:

var val = [13, -4, 82, 17];
var twice = []; 

Programmausgabe:

Ursprüngliches Feld: 13 -4 82 17
Neues Feld: 26 -8 164 34

Aufgabe 3: Zwei assoziative Felder

Gegeben seien zwei Felder:

var val = [];
val["1. Wert"] = -27;
val["2. Wert"] =  5;
val["3. Wert"] =  13;
val["4. Wert"] =  1056;
val["5. Wert"] = -9;

var twice = []; // assoziatives Feld

Programmausgabe:

Ursprüngliches Feld: 
val["1. Wert"] = -27 val["2. Wert"] = 5 val["3. Wert"] = 13 val["4. Wert"] = 1056 val["5. Wert"] = -9 Neues Feld:
twice["1. Wert"] = -54 twice["2. Wert"] = 10 twice["3. Wert"] = 26 twice["4. Wert"] = 2112 twice["5. Wert"] = -18

Aufgabe 4: Drei indizierte Felder

Gegeben seien drei Felder:

var valA = [13, -22,  82,  17];
var valB = [-12,  24, -79, -13];
var sum = [];

Addieren Sie mit Hilfe einer for-Schleife die Werte der Feldelemente von valA und valB, die den gleichen Index besitzen, und schreiben Sie das Ergebnis in das korrespondierende Feldelement von sum. Nutzen Sie die length-Eigenschaft der Felder.

Geben Sie am Ende das Feld sum mit einer weiteren for-Schleife aus.

Programmausgabe:

Summe: 1 2 3 4

Aufgabe 5: Assoziative und indizierte Felder

Gegeben seien zwei assoziative und ein indiziertes Feld:

var valA = [];
valA["S1"] = -27;
valA["S2"] =   5;
valA["S3"] =  13;
valA["S4"] = -18;
valA["S5"] = -49;

var valB = [];
valB["S1"] =  32;
valB["S2"] =  -1;
valB["S3"] = -10;
valB["S4"] =  20;
valB["S5"] =  50;

var sum = []; // indiziertes Feld

Addieren Sie mit Hilfe einer for-in-Schleife die Werte der Feldelemente der Felder valA und valB und schreiben Sie das Ergebnis jeweils als neues Feldelement mit push() in das indizierte Feld mit dem Namen sum.

Geben Sie am Ende das Feld sum mit einer for-in-Schleife aus.

Programmausgabe:

Summe: 5 4 3 2 1

Aufgabe 6: Feldelemente umkehren

Gegeben seien zwei indizierte Felder:

var valA = [0, 1, 2, 3];
var valB = [];

Schreiben Sie Programmcode, der mit Hilfe einer for-Schleife die Feldelemente in valA in umgekehrter Reihenfolge in das Feld valB schreibt. Nutzen Sie für das Lesen und Schreiben der Feldelemente die Methoden pop() und push().

Geben Sie am Ende das Feld valB mit einer for-in-Schleife aus.

Programmausgabe:

valB: 3 2 1 0

Aufgabe 7: Summen berechnen

Gegeben sei das folgende zweidimensionale Feld:

var arr2D = [
              [3, 2, 5],
              [1, 4, 4, 8, 13],
              [9, 1, 0, 2],
              [0, 2, 6, 3, -1, -8]
            ];

Schreiben Sie Programmcode, der mittels for-Schleifen folgende Zahlenwerte berechnet:

Entwerfen Sie das Programm unter Ausnutzung der length-Eigenschaft, d. h. ohne im Code notierte feste Zahlenwerte für die Anzahl der Zeilen- und Spaltenelemente.

Programmausgabe:

Summe der Feldelemente in Zeile 0: 10
Summe der Feldelemente in Zeile 1: 30
Summe der Feldelemente in Zeile 2: 12
Summe der Feldelemente in Zeile 3: 2
Summe aller Feldelemente: 54

Aufgabe 8: Dynamisches eindimensionales Feld

Schreiben Sie Programmcode, der aus dem in der vorigen Aufgabe gegebenen Feld arr2D mittels for-in-Schleifen und push() dynamisch ein eindimensionales Feld arr1D in der Weise erzeugt, dass die Zeilen des zweidimensionalen Felds nacheinander in das eindimensionale Feld geschrieben werden. Geben Sie danach das Feld arr1D aus.

Programmausgabe:

[3][2][5][1][4][4][8][13][9][1][0][2][0][2][6][3][-1][-8]

Aufgabe 9: Zweidimensionales Feld ausbalancieren

Gegeben sei das folgende zweidimensionale Feld:

var arr2D2 = [
               [1],
               [1, 2],
               [1, 2, 3, 4],
               [1, 2, 3, 4, 5]
             ];

Schreiben Sie Programmcode, der mit Hilfe einer Schleife die Anzahl der Elemente im Feld arr2D2 bestimmt und mit dieser Information ein neues dynamisches zweidimensionales Feld erzeugt, in dem die Elemente von arr2D2 gleichmäßig auf alle Zeilen des neuen Felds verteilt sind. Beide Felder besitzen am Ende die gleiche Anzahl an Zeilen, nur mit verschiedener Zahl von Elementen pro Zeile. Geben Sie danach das neu erzeugte Feld wieder aus.

Entwerfen Sie das Programm unter Ausnutzung der length-Eigenschaft, d. h. ohne im Code notierte feste Zahlenwerte für die Anzahl der Zeilen- und Spaltenelemente.

Programmausgabe:

[1][1][2]
[1][2][3]
[4][1][2]
[3][4][5]

Hinweis: Diese Aufgabe können Sie erst einmal zurückstellen, wenn Sie zu schwer ist.

Aufgabe 10: Closure und anonyme Funktion

Programmieren Sie die Funktion counter() aus der Vorlesung zusammen mit deren Aufruf. Siehe hierzu die Folien "Closure und anonyme Funktion" und "Aufruf".

Aufgabe 11: Addierer

Programmieren Sie eine Funktion adder(), die - entsprechend zu counter() - über eine innere anonyme Funktion verfügt. Im Gegensatz zu der inneren Funktion von counter() verfügt die innere Funktion von adder() über einen Funktionsparameter: function(val). Zahlenwerte, die ihr beim Aufruf über diesen Parameter val geliefert werden, addiert sie zu einer internen Summe sum und gibt den Wert dieser Summe mit return zurück.

Beispielablauf: Der Code

var add = adder();
writeln(add(1)); writeln(add(2)); writeln(add(3));

würde die folgende Ausgabe in eine Webseite schreiben:

1 
3
6 

Dabei ist writeln() die Ausgabefunktion aus der Vorlesung.

Aufgabe 12: Countdown-Funktion

Programmieren Sie eine Funktion countdown() für die Verwaltung eines Countdown-Zählers. Die Funktion verfüge wieder über eine innere anonyme Funktion. Die innere anonyme Funktion besitze einen Funktionsparameter operation. Der Parameter operation legt die Art der in der anonymen Funktion durchzuführenden Operation fest. Hierfür besitzt er folgende Eigenschaften:

Benutzen Sie für die Unterscheidung der verschiedenen Fälle eine switch-Anweisung.

Beispielablauf: Der Beispielcode

var cd = countdown(); 
writeln(cd("start")); 
writeln(cd()); 
writeln(cd("stop")); 
writeln(cd()); 
writeln(cd()); 
writeln(cd());      

würde die folgende Ausgabe in eine Webseite schreiben:

10 
9 
9 
8 
7
6 

Lassen Sie Ihren Zähler soweit herunterzählen, bis Nullen in der Ausgabe erscheinen.

Hinweis: Zeichenketten können in JavaScript für den Vergleich in case-Anweisungen direkt verwendet werden, ohne dass hierfür eine gesonderte Funktion erforderlich wäre. Siehe hierzu die Folie "Beispiel: Kreditkartenfirma abfragen".

Aufgabe 13: Nachgelagerter Aufruf einer inneren Funktion

Schreiben Sie, in Anlehnung an das Beispiel auf der Folie "Nachgelagerter Aufruf der inneren Funktion", eine Funktion operation(op).

Wie im Beispiel besitzt diese eine anonyme innere Funktion mit zwei Parametern. Diese besitzen hier die Namen a und b und bezeichnen die beiden Operanden einer Operation. Die Art der Operation wird durch den Wert des Parameters op der äußeren Funktion operation geliefert.

Berücksichtigen Sie die folgenden Operationen:

Je nach gewählter Operation werden die Parameter a und b der inneren Funktion addiert, subtrahiert, multipliziert oder dividiert und der sich dabei ergebende Wert mit return von der inneren Funktion zurückgegeben.

Benutzen Sie für die Unterscheidung der verschiedenen Operationen eine switch-Anweisung.

Ausgehend von dieser Definition würde beispielsweise der Befehl

writeln(operation("+")(2, 3));

den Wert 5 in eine Webseite ausgeben.