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''.