Ü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 = [];
- Geben Sie die Feldelemente von
val mit Hilfe einer
for-Schleife aus
- Schreiben Sie mit Hilfe einer zweiten
for-Schleife
Werte in das vorgegebene Feld twice, die jeweils doppelt
so groß sind wie die korrespondierenden Werte in val
- Geben Sie die Feldelemente von
twice mit Hilfe einer
dritten for-Schleife aus
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
-
Geben Sie die Feldelemente des assoziativen Felds val
mit Hilfe einer for-in-Schleife aus
-
Schreiben Sie mit Hilfe einer zweiten for-in-Schleife
Werte in twice, die jeweils doppelt so groß sind wie
die korrespondierenden Werte in val. twice verfüge
über die gleichen Schlüsselnamen wie val.
-
Geben Sie die Feldelemente von twice mit Hilfe einer
dritten for-in-Schleife aus.
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:
- Die Summe aller Feldelemente im Feld
arr2D.
- Die Summe der Feldelemente in jeder Zeile des Felds
arr2D.
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:
-
Wird für den Parameter operation beim
Aufruf der inneren Funktion der Wert "start" übergeben,
so wird ein interner Countdown-Zähler auf den Startwert 10 gesetzt
und dieser Startwert mit return von der inneren
Funktion zurückgegeben.
-
Wird für den Parameter operation beim
Aufruf der inneren Funktion kein Wert übergeben, so wird der Wert
des internen Zählers dekrementiert und dieser neue Wert
mit return von der inneren Funktion
zurückgegeben. Dekrementiert wird
der Zähler allerdings
nur, bis er den Wert 0 erreicht hat. Danach
wird nur noch der Wert 0 zurückgegeben.
-
Wird für den Parameter operation beim
Aufruf der inneren Funktion der Wert "stop" übergeben,
so wird der interne Zähler nicht dekrementiert, sondern nur sein
aktueller Wert mit return von der inneren Funktion
zurückgegeben.
- Andere Werte, als die oben angegebenen, müssen nicht berücksichtigt werden.
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:
- Addition:
"+", Subtraktion: "-",
Multiplikation: "*" und Division: "/".
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.