Gymnasium Löbau/Vertiefungsklasse 2013/Die Datenstruktur Feld
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Javascript</language>
== Begriff ==
Ein Datenfeld (kurz: Feld oder Array) ist eine komplexe Datenstruktur, bei der mehrere Daten ''eines Datentyps'' in einer definierten Reihenfolge an einen Variablennamen gebunden werden.
<blockquote>
<table border="1" cellspacing ="0" cellpadding="4">
<tr>
<td>Mathematik</td><td>$a_0, a_1, ... , a_n$</td>
</tr>
<tr>
<td>JavaScript</td><td>$a[0], a[1], ... , a[n]$</td>
</tr>
</table>
</blockquote>
Jedem Feldelement kann über seinen ''Feldindex'' ein Wert zugewiesen werden, der natürlich auch geändert oder ausgegeben werden kann.
== Deklaration eines eindimensionalen Feldes ==
<code id="5bdff3f5cb048">
var Feld = new Array();
Feld[0] = "Montag";
Feld[1] = "Dienstag";
Feld[2] = "Mittwoch";
Feld[3] = "Donnerstag";
Feld[4] = "Freitag";
</code>
<run id="5bdff3f5cb131">
Feld;
</run>
== Methoden ==
An die Datenstruktur Feld sind sehr nützliche Methoden gebunden. Teste sie in der mit den nachfolgenden Definitionen:
<code id="5bdff3f5cb0c4">
var n = Feld.length;
var newFeld = Feld.slice(2, 3);
Feld.reverse();
var zk = Feld.join();
</code>
<run id="5bdff3f5cb1a2">
n;
</run>
== Felder mit Zufallszahlen ==
Wir haben in der [[Gymnasium Löbau/Vertiefungsklasse 2013/Wiederholung: Datentypen und Programmstrukturen|Wiederholung von Datentypen und Programmstrukturen]] eine Zufallsfunktion für natürliche Zahlen kennen gelernt, die wir um eine linke Intervallgrenze erweitern wollen:
<code id="5bdff8b72412f">
function zufallszahl(von, bis) {
return Math.floor(Math.random() * (bis - von + 1) + von);
}
</code>
Damit können wir nun Felder mit ganzen Zufallszahlen generieren:
<code id="5be018508eb8a">
function erzeugen(von, bis, anz) {
var feld = new Array();
for (var i = 0; i < anz; i++)
feld[i] = zufallszahl(von, bis);
return feld;
}
var newFeld = erzeugen(-50, 100, 20);
</code>
<run id="5bdff8b724224">
newFeld;
</run>
Felder mit Zufallszahlen können i.A. sehr umfangreich werden. Wir wollen deshalb eine geeignete Ausgabe-Prozedur entwickeln.<br />
''Prozeduren'' sind in JavaScript spezielle Funktionen, die ''keine Werte'' zurückgeben.
<code id="5be869094fc5e">
function ausgabe(feld) {
var maxAnzahl = 25;
var teilFeld = new Array();
var i = 0, j = 0;
while (i < feld.length) {
j = i + maxAnzahl;
if (j < feld.length)
teilFeld = feld.slice(i, j);
else
teilFeld = feld.slice(i, feld.length);
console.log(teilFeld);
i = j;
}
}
var newFeld = erzeugen(1, 1000, 1000);
</code>
<run id="5be00ed718cc8">
ausgabe(newFeld);
</run>
== Sequenzielle Suche ==
Wir wollen umfangreiche numerische Datenfelder näher untersuchen, z.B. ausgewählte Feldelemente suchen, zählen oder ersetzen. Dazu müssen alle Feldelemente nacheinander durchmustert werden. <br />
Prinzipiell stehen uns zwei syntaktische Programmstrukturen zur Verfügung:
<blockquote>
<table border="0" cellspacing ="0" cellpadding="4">
<tr>
<td width="400">
for (var i = 0; i < feld.length; i++) {
//-- Anweisungsteil --
}
</td>
<td width="400">
for (var i in feld) {
//-- Anweisungsteil --
}
</td>
</tr>
</table>
</blockquote>
In der sogenannten <tt>for-in</tt>-Schleife werden allerdings nur Feldelemente berücksichtigt, die auch mit einem Wert belegt sind.
<code id="5be869094fce9">
function elementSuche(element, feld) {
var exist = false;
for (var i in feld)
if (element == feld[i])
exist = true;
return exist;
}
</code>
<run id="5be869094fd78">
var newFeld = erzeugen(1, 100, 50);
var newElement = 47;
ausgabe(newFeld);
if (elementSuche(newElement, newFeld))
console.log("Das Element " + newElement + " ist im Datenfeld vorhanden.");
else
console.log("Das Element " + newElement + " ist im Datenfeld nicht vorhanden.");
</run>
Ein Suchverfahren, in dem ''alle Feldelemente'' nacheinander durchmustert werden, nennt man ''lineare'' oder ''sequenzielle Suche''.