Dostęp do tej strony wymaga podania poprawnych danych użytkownika i hasła.
Jeśli ich nie znasz - skontaktuj się z prowadzącym zajęcia:
wyślij e-mail do prowadzącego

Materiały dla studentów

Język JavaScript – wprowadzenie

Uwaga. Do uruchomienia i przetestowania rozwiązań poniższych zadań użyj środowiska Node.js. Zweryfikuj poprawność kodu każdego z rozwiązań za pomocą narzędzia JSHint z domyślnym zestawem opcji.

Przed weryfikacją, na początku kodu umieść następujące dwie linijki:

/*jshint globalstrict: true */
'use strict';

Powyższy zabieg wymusza stosowanie „sensownego podzbioru” JS. Opcja JSHint globalstrict: true pozwala użyć pojedynczą frazę use strict dla całego skryptu. Takie podejście wiąże się z pewnym niebezpieczeństwem, ale podczas dzisiajeszych ćwiczeń nie będziemy się tym przejmowali.

Jeśli używasz polecenia console.log(…) to dodać musisz jeszcze jedną opcję JSHint:

/*jshint globalstrict: true, devel: true */
'use strict';

Zadanie 1. (Weryfikacja typów w JS „dla ubogich”)

Korzystając z tego, że funkcje w języku JavaScript są również obiektami zdefiniuj dwie funkcje:

Przetestuj działanie swojego rozwiązania stosując np. konstrukcję:

try {
    console.log(appFun(myfun, 12, 15));
} catch (e) {
    console.log(e.typerr);
}

Wskazówki:

Zadanie 2. (Wyrażenia regularne)

Stwórz metodę o nazwie nbsp, która dla dowolnego łańcucha znaków (obiektu „typu String”)

  var tekst = 'Ala i As poszli w las';

powoduje zamianę odstępów występujących pomiędzy „samotnymi” znakami ze zbioru {a, i, o, u, w, z} i następującymi po nich fragmentami tekstu, na „niełamliwą spację” języka HTML ( ). W zamyśle, ma to zapobiec dzieleniu przez przeglądarkę wierszy w sposób niezgodny z przyjętymi dla języka polskiego zasadmi typograficznymi.

  console.log(tekst.nbsp());
  // efekt: Ala i As poszli w las

Uwaga. Pamiętaj, że łańcuch znaków może też zawierać zmiany wiersza, które również należy traktować jako odstępy.

Zadanie 3. (Wyrażenia regularne)

Rozważmy następujący fragment „szablonu” dokumentu HTML-owego

var szablon =
  '<table border="{border}">' +
  '  <tr><td>{first}</td><td>{last}</td></tr>' +
  '</table>';

Napisz funkcję podstaw, która dla dowolnego szablonu powyższej postaci oraz dowolnego obiektu, np. postaci:

var dane = {
    first: "Jan",
    last:  "Kowalski",
    pesel: "97042176329"
};

dokona podstawienia: za parametr {param} – wartość atrybutu o nazwie param. Jeśli w obiekcie nie wystąpi atrybut o potrzebnej nazwie, to parametr powinien pozostać w szablonie. Wywołanie powinno mieć postać:

szablon.podstaw(dane);

Dla przedstawionych powyżej danych wynikiem powinien być kod:

<table border="{border}">
  <tr><td>Jan</td><td>Kowalski</td></tr>
</table>

Zadanie 4. (Ciąg Fibonacciego z zapamiętywaniem)

Ciąg Fibonacciego zdefiniować można za pomocą funkcji:

 var fib = function fib(arg) {
    if (arg <= 0) {
        return 0;
    }
    if (arg === 1) {
        return 1;
    }
    return fib(arg - 1) + fib(arg - 2);
};

Uzupełnij definicję funkcji memo

var memo = function (cache, fun) {
    ...
};

tak, aby dla dowolnej liczby naturalnej n zachodziła równość

fibonacci(n) === fib(n)

gdzie funkcja fibonacci zdefiniowana jest następująco:

var fibonacci = memo([0, 1], function (recur, n) {
    return recur(n - 1) + recur(n - 2);
});

Pierwszy argument funkcji memo jest więc, jak widać, tablicą przechowującą już obliczone wartości funkcji. Pozwala on uniknąć wielokrotnego powtarzania już raz wykonanych obliczeń.

Różnicę w wydajności obu sposobów obliczania wyrazów ciągu Fibonacciego możesz łatwo zaobserwować, próbując wywołać obie funkcje np. dla wartości >30.

Zadanie 5. (funkcja oceny)

Dane są dwa ciągi liczb o jednakowej długości – Z[1..N] i R[1..N]. Napisz funkcję

var ocena = function (zadanie, ruch) {
    // ...
    return wynik;
};

Oba ciągi liczb należy porównać i „ocenić” według podanej poniżej zasady.

W swoim rozwiązaniu nie używaj instrukcji pętli (for ani while). Zamiast nich wykorzystaj oferowane przez język JavaScript metody tablicowe.

w.pawlowski@pja.edu.pl