Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:blc:informatik:ffprg2-2024:arrays [2024/08/30 08:26] – Ivo Blöchliger | lehrkraefte:blc:informatik:ffprg2-2024:arrays [2024/08/30 09:21] (current) – [Ausgabe] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Arrays ====== | ||
| + | ===== Initialisierung und Zugriff ===== | ||
| + | Eindimensionale Arrays, Grundlagen | ||
| + | <code javascript> | ||
| + | a = [7, | ||
| + | console.log(a); | ||
| + | console.log(`Das erste Element ist a[0]=${a[0]}`); | ||
| + | console.log(`Das Array hat a.length=${a.length} Elemente`); | ||
| + | console.log(`Das letzte Element ist a[a.length-1]=${a[a.length-1]}`); | ||
| + | console.log(" | ||
| + | a[1] = ' | ||
| + | console.log(a); | ||
| + | </ | ||
| + | |||
| + | Initialisierung mit .push | ||
| + | <code javascript> | ||
| + | // Array befüllen mit push | ||
| + | a = []; // Leeres Array | ||
| + | for (let i=0; i<10; i++) { | ||
| + | | ||
| + | } | ||
| + | console.log(a); | ||
| + | </ | ||
| + | |||
| + | Initialisierung mit [[https:// | ||
| + | |||
| + | Das erste Argument ist ein Objekt, das die // | ||
| + | |||
| + | Das zweite Argument ist eine Funktion, die als zweiten Parameter den jeweiligen Index bekommt. Der erste Parameter wäre das i-te Element vom Objekt, das aber hier einfach ignoriert wird (und sowieso '' | ||
| + | <code javascript> | ||
| + | a = Array.from({length: | ||
| + | console.log(a); | ||
| + | </ | ||
| + | |||
| + | ===== Mehrdimensionale Arrays ===== | ||
| + | <code javascript> | ||
| + | // Drei Punkte, gegeben als Array von 2 Koordinaten | ||
| + | dreieck = [[1,2], [5,3], [2,-1]]; | ||
| + | console.log(dreieck); | ||
| + | console.log(`Zweiter Punkt dreieck[1]=${dreieck[1]}`); | ||
| + | console.log(`x-Koordinate vom 3. Punkt ist dreieck[2][0]=${dreieck[2][0]}`); | ||
| + | // Distanz zwischen den Punkten | ||
| + | for (let i=0; i<3; i++) { | ||
| + | for (let j=(i+1); j<3; j++) { | ||
| + | let l=0; | ||
| + | for (let k=0; k<2; k++) { | ||
| + | l+=(dreieck[i][k]-dreieck[j][k])**2; | ||
| + | } | ||
| + | l=l**0.5; | ||
| + | console.log(`Distanz von Punkt ${i} zu Punkt ${j} ist ${l}`); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Initialisierung | ||
| + | <code javascript> | ||
| + | wuerfel = []; | ||
| + | for (let x=0; x<2; x++) { | ||
| + | for (let y=0; y<2; y++) { | ||
| + | for (let z=0; z<2; z++) { | ||
| + | | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | console.log(wuerfel); | ||
| + | |||
| + | // Variante mit Bitoperationen und Array.from | ||
| + | // (i>> | ||
| + | // & 1 rechnet bitweise UND, d.h. alle ausser das niederwertigste Bit werden gelöscht. | ||
| + | wuerfel = Array.from({length: | ||
| + | |||
| + | // Variante für n Dimensionen | ||
| + | n = 4; | ||
| + | tesseract = Array.from({length: | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Pascal-Dreieck ===== | ||
| + | ==== Erzeugung ==== | ||
| + | |||
| + | Erster Schritt: Aus einer Zeile die nächste generieren. | ||
| + | <code javascript> | ||
| + | zeile = [1, | ||
| + | neu = [1]; // Zeile startet mit 1 | ||
| + | for (let i=0; i< | ||
| + | neu.push(zeile[i]+zeile[i+1]); | ||
| + | } | ||
| + | neu.push(1); | ||
| + | console.log(neu); | ||
| + | </ | ||
| + | |||
| + | Als Funktion verpacken und verwenden | ||
| + | <code javascript> | ||
| + | function nextline(zeile) { | ||
| + | let neu = [1]; // Zeile startet mit 1 | ||
| + | for (let i=0; i< | ||
| + | neu.push(zeile[i]+zeile[i+1]); | ||
| + | } | ||
| + | neu.push(1); | ||
| + | return neu; | ||
| + | } | ||
| + | pascal = []; | ||
| + | zeile = [1]; | ||
| + | pascal.push(zeile); | ||
| + | for (let i=0; i<10; i++) { | ||
| + | zeile = nextline(zeile); | ||
| + | | ||
| + | } | ||
| + | console.log(pascal); | ||
| + | </ | ||
| + | |||
| + | ==== Ausgabe ==== | ||
| + | Hilfsfunktionen: | ||
| + | * String mit einer gegebenen Anzahl Leerschlägen erzeugen | ||
| + | * Zahl mit Leerschlägen auf gegebene Länge auffüllen. | ||
| + | |||
| + | <code javascript> | ||
| + | function wiederholen(n, | ||
| + | let s = ""; | ||
| + | for (let i=0; i<n; i++) { | ||
| + | s += zeichen | ||
| + | } | ||
| + | return s; | ||
| + | } | ||
| + | </ | ||
| + | Oder very fancy: | ||
| + | <code javascript> | ||
| + | function wiederholen(n, | ||
| + | return Array.from({length: | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | Zahlen mit nötigen Leerschlägen ausgeben: | ||
| + | <code javascript> | ||
| + | function fuellen(zahl, | ||
| + | let s = zahl.toString(); | ||
| + | s += wiederholen(n-s.length); | ||
| + | return s; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Oder zentriert: | ||
| + | <code javascript> | ||
| + | function fuellen(zahl, | ||
| + | zahl = zahl.toString(); | ||
| + | let fehlen = n-zahl.length; | ||
| + | let vorne = Math.floor(fehlen/ | ||
| + | return wiederholen(vorne)+zahl+wiederholen(fehlen-vorne); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Und jetzt die flexible Ausgabe: | ||
| + | <code javascript> | ||
| + | function ausgabe(pascal) { | ||
| + | let n = pascal.length-1; | ||
| + | let space = pascal[n][Math.floor(n/ | ||
| + | let s = ""; | ||
| + | for (let i=0; i<=n; i++) { | ||
| + | s += wiederholen(Math.floor((n-i)*space/ | ||
| + | s += pascal[i].map((e)=> | ||
| + | s += " | ||
| + | } | ||
| + | return s; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ==== Pascaldreieck direkt erzeugen ==== | ||
| + | <code javascript> | ||
| + | // = n*(n-1)*(n-2)*...*(n-k+1) / (1*2*3*...*k) | ||
| + | function binomial(n, | ||
| + | if (k<0 || k>n) return 0; | ||
| + | if (k==0 || k==n) return 1; | ||
| + | if (k>n/2) return binomial(n, | ||
| + | let r=n; | ||
| + | for (let i=1; i<k; i++) { | ||
| + | r*=(n-i); | ||
| + | r/=i+1; | ||
| + | } | ||
| + | return r; | ||
| + | } | ||
| + | |||
| + | d = Array.from({length: | ||
| + | </ | ||
| + | |||
| + | ==== Screencast ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | <hidden Code vom Screencast> | ||
| + | <code javascript> | ||
| + | function nextLine(zeile) { | ||
| + | let neu = [1]; | ||
| + | for (let i=0; i< | ||
| + | neu.push(zeile[i]+zeile[i+1]); | ||
| + | } | ||
| + | neu.push(1); | ||
| + | return neu; | ||
| + | } | ||
| + | |||
| + | function dreieck(n) { | ||
| + | pascal = []; | ||
| + | zeile = [1]; | ||
| + | pascal.push(zeile); | ||
| + | for (let i=0; i<n; i++) { | ||
| + | zeile = nextLine(zeile); | ||
| + | pascal.push(zeile); | ||
| + | } | ||
| + | return pascal; | ||
| + | } | ||
| + | |||
| + | function wiederholen(n, | ||
| + | return Array.from({length: | ||
| + | } | ||
| + | |||
| + | function zahlfuellen(zahl, | ||
| + | zahl = zahl.toString(); | ||
| + | let fehlt = n-zahl.length; | ||
| + | let vorne = Math.floor(fehlt/ | ||
| + | return wiederholen(vorne)+zahl+wiederholen(fehlt-vorne); | ||
| + | } | ||
| + | |||
| + | function ausgabe(n) { | ||
| + | let d = dreieck(n); | ||
| + | let largest = d[n][Math.floor(n/ | ||
| + | let space = largest.toString().length+1; | ||
| + | let s = ""; | ||
| + | for (let i=0; i<=n; i++) { | ||
| + | s += wiederholen(space*(n-i)/ | ||
| + | s += d[i].map((e)=> | ||
| + | s += " | ||
| + | } | ||
| + | return s; | ||
| + | } | ||
| + | |||
| + | console.log(ausgabe(10)); | ||
| + | </ | ||
| + | </ | ||