lehrkraefte:blc:informatik:ffprg1-2024:random

Zufallszahlen

Die JavaScript-Funktion Math.random() liefert eine Zufallszahl zwischen 0 (inklusive) und 1 (exklusive).

Damit lassen sich aus ganzzahlige Zufallszahlen generieren (Funktion und Name sind der entsprechenden Python-Funktion nachempfunden):

// Liefert eine ganzzahlige Zufallszahl von 0 bis n-1
function randRange(n) {
  return Math.floor(Math.random()*n));  // floor rundet ab
}

Es ist Ienhn wahrscheinlich bkeannt, dsas man Ttxee imemr ncoh flüsisg lseen knan, wnen zewi Buchstaebn innrehalb eenis Wtros vertaushct wreden. Irhe Aufgbae bhsteet nun dairn, ein Prmgraom zu progarmmieren, das eienn Txet so medifiziort.

Sie werden 5 Funktionen schreiben, die jeweils Teilaufgaben erfüllen. Testen Sie jede Funktion ausführlich, bevor Sie weiterfahren.

Schreiben Sie eine Funktion randIn(a,b), die eine ganzzahlige Zufallszahl zwischen a und b inklusive generiert.

Lösungsvorschlag

Lösungsvorschlag

// Ganzzahlige Zufallszahl von a bis und mit b
function randIn(a,b) {
    return Math.floor(Math.random()*(b-a+1))+a;
}
// Test-Code
for (let i=0; i<20; i++) {
  console.log(randIn(11,16));
}

Schreiben Sie eine Funktion vertausche(wort, a, b), die ein einem Wort die Buchstaben an zwei gegebenen Stellen vertauscht.

Z.B. soll vertausche('Buch', 1, 2) den String Bcuh liefern. Die Buchstaben im String sind von 0 bis Länge-1 indiziert.

Verwenden Sie dafür die String-Methode substring und den Zugriff auf einzelne Buchstaben mit eckigen Klammern.

Lösungsvorschlag

Lösungsvorschlag

function vertauschen(wort, a, b) {
    if (a==b) return wort;  // Nix tun, wenn a==b
    if (a>b) { // Vertauchen, so dass immer a<b
        let h = a;
        a = b;
        b = h;
    }
    return wort.substring(0,a)+wort[b]+wort.substring(a+1,b)+wort[a]+wort.substring(b+1,wort.length);
}
// Test-Code
console.log(`vertauschen('Buch', 1, 2) liefert ${vertauschen('Buch', 1, 2)} (sollte Bcuh sein)`);
console.log(`vertauschen('Reise', 1, 3) liefert ${vertauschen('Reise', 1, 2)} (sollte Rsiee sein)`);

Schreiben Sie eine Funktion wortwuerfeln, die zufällig zwei innere Buchstaben vertauscht (wenn das Wort mindestens 4 Zeichen lang ist, ansonsten soll einfach das Wort zurückgegeben werden).

Diese Funktion soll die Funktionen randIn und vertausche aufrufen.

Lösungsvorschlag

Lösungsvorschlag

// Verwürfelt zwei Buchstaben eines Worts
function wortwuerfeln(wort) {
    if (wort.length<4) {
        return wort;   // Nichts zu tun, Funktion beenden.
    }
    // Hier ist kein else nötig, weil die Funktion im if beendet wird. => Gute Praxis!
    let n = wort.length-2; // Index von vorletzter Stelle
    let position1 = randIn(1,n);
    let position2 = randIn(1,n);
    while (position1==position2) {  // Würfeln bis verschieden...
        position2 = randIn(1,n);
    }
    return vertauschen(wort, position1, position2);
}
// Test Code
console.log(wortwuerfeln("Orange"));

Schreiben Sie eine Funktion wortzeichen(zeichen) die true oder false liefert, je nachdem, ob das zeichen Teil eines Worts ist. Der Einfachheit halber betrachten wir nur Buchstaben von a-z als Teil eines Worts. Mit der String-Methode toLowerCase können Sie einen String in Kleinbuchstaben umwandeln, damit nur mit Buchstaben zwischen 'a' und 'z' verglichen werden muss.

Lösungsvorschlag

Lösungsvorschlag

function wortzeichen(z) {
    return z.toLowerCase()>='a' && z.toLowerCase()<='z';
}

Die letzte Funktion textwuerfeln(text) soll Wörter innerhalb eines Texts verwürfeln und den neuen Text als Resultat zurückgeben. Die Funktion soll wie folgt vorgehen:

  • Man initialisiert das Resultat auf den Leerstring.
  • Man hängt dem Text ein Nicht-Wortzeichen hinzu (z.B. den Leerschlag).
  • Man merkt sich die letzte Position lastOut eines Zeichens, das nicht in einem Wort vorkommt. Anfangs ist das -1.
  • Man geht jede Position im Text durch:
    • Ist es kein Wortzeichen, dann
      • Das Wort zwischen lastOut+1 und aktueller Position verwürfeln und dem Resultat anfügen.
      • Das aktuelle Zeichen dem Resultat anfügen
  • Man entfernt das letzte Zeichen vom Resultat und gibt es zurück.

Lösungsvorschlag

Lösungsvorschlag

// Ganzzahlige Zufallszahl von a bis und mit b
function randIn(a,b) {
    return Math.floor(Math.random()*(b-a+1))+a;
}
 
function vertauschen(wort, a, b) {
    if (a>b) { 
        let h = a;
        a = b;
        b = h;
    }
    return wort.substring(0,a)+wort[b]+wort.substring(a+1,b)+wort[a]+wort.substring(b+1,wort.length);
}
 
// Verwürfelt zwei Buchstaben eines Worts
function wortwuerfeln(wort) {
    if (wort.length<4) {
        return wort;   // Nichts zu tun, Funktion beenden.
    }
    // Hier ist kein else nötig, weil die Funktion im if beendet wird. => Gute Praxis!
    let n = wort.length-2; // Index von vorletzter Stelle
    let position1 = randIn(1,n);
    let position2 = randIn(1,n);
    while (position1==position2) {  // Würfeln bis verschieden...
        position2 = randIn(1,n);
    }
    return vertauschen(wort, position1, position2);
}
 
function wortzeichen(z) {
    return z.toLowerCase()>='a' && z.toLowerCase()<='z';
}
 
 
 
function textwuerfeln(text) {
    let neu = "";
    lastOut = -1;  //
    text+=" ";  // Nicht-Wort-Buchstaben anhängen
    for (let p=0; p<text.length; p++) {
        if (!wortzeichen(text[p])) { // Kein Wortbuchstabe?
            neu += wortwuerfeln(text.substring(lastOut+1, p));
            neu += text[p];
            lastOut=p;
        }
    }
    // Leerschlag wieder entfernen
    return neu.substring(0,neu.length-1);
}
// Aufruf:
console.log(textwuerfeln("Es ist Ihnen wahrscheinlich bekannt, dass man Texte immer noch flüssig lesen kann, wenn zwei Buchstaben innerhalb eines Worts vertauscht werden. Ihre Aufgabe besteht nun darin, ein Programm zu programmieren, das einen Text so modifiziert."))
  • lehrkraefte/blc/informatik/ffprg1-2024/random.txt
  • Last modified: 2024/04/05 13:10
  • by Ivo Blöchliger