JavaScript – sada příkladů 4

Příklad 4.1

Napište skript, který spočítá kladnou celou mocninu zadaného čísla.

<SCRIPT>
  function Mocnina() {
    var z=parseFloat(document.form1.zaklad.value);  // základ
    var e=parseInt(document.form1.exponent.value);  // exponent
    var s;                                          // dílčí součin
    if (e>0) {                                      // je exponent kladný?
      s=z;
      for (var i=1; i<e; i++)
        s*=z;
    }
    else                                            // pro nulový exponent
      s=1;
    document.form1.vysledek.value=s;
  }
</SCRIPT>

<FORM name="form1">
  <INPUT type="text" name="zaklad" size="5"> základ<BR>
  <INPUT type="text" name="exponent" size="5"> exponent (přirozené číslo)<BR>
  <INPUT type="text" name="vysledek" size="25" readonly> výsledek<BR>
  <INPUT type="button" value="Vypočti" onclick="Mocnina()">
  <INPUT type="reset" value="Smaž"><BR>
</FORM>
základ
exponent (přirozené číslo)
výsledek

Příklad 4.2

Nadefinujte funkci pro výpočet faktoriálu čísla n (pro n < 170). Použijte příkaz cyklu for.

<SCRIPT>
  function Fakt(n) {
    var f=n;
    for (var i=n-1; i>0; i--)
      f*=i;                                 // f=f*i
    return f;
  }
</SCRIPT>

<FORM name="faktfor">
  Číslo
  <INPUT type="text" name="x" size="10">
  <INPUT type="button" value="Faktoriál"
         onclick="this.form.v.value=Fakt(parseInt(this.form.x.value))">
  <INPUT type="text" name="v" size="25" readonly>
</FORM>
Číslo

Příklad 4.3

Nadefinujte funkci pro výpočet faktoriálu čísla n (pro n < 170). Použijte příkaz cyklu while.

<SCRIPT>
  function Faktorial(n) {
    var f=1;
    while (n>0) {
      f*=n;                        // f=f*n
      n--;                         // n=n-1
    }
    return f;
  }
</SCRIPT>

<FORM name="faktwhile">
  Číslo
  <INPUT type="text" name="x" size="10">
  <INPUT type="button" value="Faktoriál"
         onclick="this.form.v.value=Faktorial(parseInt(this.form.x.value))">
  <INPUT type="text" name="v" size="25" readonly>
</FORM>
Číslo

Příklad 4.4

Nadefinujte funkci pro výpočet faktoriálu čísla n rekurzivní metodou (pro n < 170).

<SCRIPT>
  function FaktorialRek(n) {
    if (n<=1)
      return 1;
    else
      return n*FaktorialRek(n-1);
  }
</SCRIPT>

<FORM name="faktRek">
  Číslo
  <INPUT type="text" name="x" size="10">
  <INPUT type="button" value="Faktoriál"
         onclick="this.form.v.value=FaktorialRek(parseInt(this.form.x.value))">
  <INPUT type="text" name="v" size="25" readonly>
</FORM>
Číslo

Příklad 4.5

Nadefinujte funkci, která spočítá ciferný součet čísla x. Např. CifSoucet(5) = 5, CifSoucet(781) = 7 + 8 + 1 = 16 apod.

<SCRIPT>
  function CifSoucet(x) {
    var s=0;                // průběžný součet
    while (x>0) {
      s=s+(x%10);           // přičtení zbytku po dělení deseti
      x=Math.floor(x/10);   // posuv o jeden řád dělením deseti
    }
    return s;               // nakonec vrátíme hodnotu průběžného součtu
  }
</SCRIPT>

<FORM name="cifs">
  Číslo
  <INPUT type="text" name="n" size="10">
  <INPUT type="button" value="Ciferný součet"
         onclick="this.form.cs.value=CifSoucet(parseInt(this.form.n.value))">
  <INPUT type="text" name="cs" size="5" readonly>
</FORM>
Číslo

Příklad 4.6

Následující příklad ilustruje realizaci operací DIV a MOD (celočíselné dělení a zbytek po celočíselném dělení) klasickým odčítáním.

<SCRIPT>
function DivMod() {
  var d=0;
  var a=parseInt(document.deleni.delenec.value);
  var b=parseInt(document.deleni.delitel.value);
  while (a>=b) {
    a-=b;                               // a=a-b
    d++;                                // d=d+1
  }
  document.deleni.podil.value=d;
  document.deleni.zbytek.value=a;
}
</SCRIPT>

<FORM name="deleni">
  <TABLE border="1">
    <TR align="center">
      <TD>Dělenec
      <TD><INPUT type="text" name="delenec" size="10">
      <TD><INPUT type="button" value="Vypočti" onclick="DivMod()">
      <TD>Podíl
      <TD><INPUT type="text" name="podil" size="10" readonly>
    <TR align="center">
      <TD>Dělitel
      <TD><INPUT type="text" name="delitel" size="10">
      <TD><INPUT type="reset" value=" Smaž ">
      <TD>Zbytek
      <TD><INPUT type="text" name="zbytek" size="10" readonly>
  </TABLE>
</FORM>
Dělenec Podíl
Dělitel Zbytek

Příklad 4.7

Nadefinujte funkci Prec, která zaokrouhlí reálné číslo x na daný počet desetinných míst. Zaokrouhlení lze provést podle vztahu Prec(x, p) := Round(x · 10p) / 10p, kde p je daný počet desetinných míst. Použitá funkce Round zaokrouhluje na nejbližší celé číslo (v JavaScriptu můžeme použít metodu round objektu Math).

<SCRIPT>
  function Prec(x,p) {
    var pom=1;
    for (var i=1; i<=p; i++)
      pom*=10;                            // pom=pom*10
    return Math.round(x*pom)/pom;
  }

  function Zaokrouhli() {
    document.fz.vysledek.value=Prec(parseFloat(document.fz.cislo.value),
                                    parseInt(document.fz.presnost.value));
  }
</SCRIPT>

<FORM name="fz">
  <INPUT type="text" name="cislo" size="20"> číslo k zaokrouhlení<BR>
  <INPUT type="text" name="presnost" size="4"> na kolik desetinných míst<BR>
  <INPUT type="button" value="Zaokrouhli" onclick="Zaokrouhli()">
  <INPUT type="reset" value="Smaž"><BR>
  <INPUT type="text" name="vysledek" size="20" readonly> výsledek
</FORM>
číslo k zaokrouhlení
na kolik desetinných míst

výsledek

Příklad 4.8

Spočtěte největšího společného dělitele dvou čísel. Využijte Euklidův algoritmus spočívající v opakovaném odečítání menšího čísla od většího až po dosažení rovnosti.

<SCRIPT>
  function NSD(a,b) {
    while (a!=b) {
      if (a<b)
        b=b-a;
      else
        a=a-b;
    }
    return a;
  }

  function Zpracuj() {
    var x=parseInt(document.formNSD.x.value);
    var y=parseInt(document.formNSD.y.value);
    if ((x>0) && (y>0))
      document.formNSD.vysl.value=NSD(x,y);
    else
      alert("Obě dvě čísla musejí být větší než nula!");
  }
</SCRIPT>

<B>Největší společný dělitel dvou čísel Euklidovým algoritmem</B>
<FORM name="formNSD">
  <INPUT type="text" name="x" size="10"> první číslo<BR>
  <INPUT type="text" name="y" size="10"> druhé číslo<BR>
  <INPUT type="text" name="vysl" size="10" readonly>
  největší společný dělitel<BR>
  <INPUT type="button" value="Vypočti" onclick="Zpracuj()"><BR>
</FORM>
Největší společný dělitel dvou čísel Euklidovým algoritmem
první číslo
druhé číslo
největší společný dělitel

Příklad 4.9

Pro zadané číslo vytiskněte všechny jeho dělitele. Číslo a je dělitelné číslem b právě tehdy, když platí a = INT(a/b)*b, kde INT představuje celou část čísla (v JavaScriptu použijeme metodu floor objektu Math). Pozor – zadávejte maximálně šestimístná čísla. Jinak výpočet trvá dlouhou dobu!

<SCRIPT>
  function VypocetDelitelu() {
    var a=parseInt(document.delitele.cislo.value);
    document.delitele.vystup.value="Dělitelé čísla "+a+" jsou:\n1";
    for (var i=2; i<=a; i++)
      if (Math.floor(a/i)*i==a)
        document.delitele.vystup.value+=", "+i;
  }
</SCRIPT>

<B>Dělitelé čísla</B>
<FORM name="r">
  Číslo <INPUT type="text" name="cislo" size="12">
  <INPUT type="button" value="Vypočti" onclick="VypocetDelitelu()">
  <INPUT type="reset" value="Smaž"><BR>
  <TEXTAREA name="delitele" rows="5" cols="70" readonly>
  </TEXTAREA>
</FORM>
Dělitelé čísla
Číslo

Příklad 4.10

Vytvořte funkci, která zjistí, zda zadané číslo x je prvočíslo. Princip testování spočívá v ověření dělitelnosti dvěma a dále všemi lichými čísly (obecně stačí zkusit dělitelnost pouze prvočísly, ale jejich tabulku nemáme nyní k dispozici). Podmínka cyklu while provede jeho ukončení tehdy, je-li testovaný dělitel n větší než odmocnina za zadaného čísla x, případně po nalezení dělitele, kdy má řídicí booleovská proměnná pr hodnotu false.

<SCRIPT>
  function JePrvocislo(x) {
    var pr;
    if (x==2)
      pr=true;                       // číslo 2 je prvočíslo
    else
      pr=(x%2!=0);                   // otestujeme dělitelnost číslem 2
    var n=3;                         // první liché číslo bude 3
    while ((n<=Math.sqrt(x)) && pr)
      if (x%n==0)                    // je x je dělitelné n?
        pr=false;                    // ano, pak to nemůže být prvočíslo
      else
        n=n+2;                       // ne, otestujeme další liché číslo
    return pr;
  }

  function Otestuj(f) {
    if (JePrvocislo(parseInt(f.cislo.value)))
      f.vysl.value="ANO";
    else
      f.vysl.value="NE";
  }
</SCRIPT>

<FORM name="prvociselnost">
  Číslo
  <INPUT type="text" name="cislo" size="10">
  <INPUT type="button" value="Je prvočíslo?" onclick="Otestuj(this.form)">
  <INPUT type="text" name="vysl" size="6" readonly>
</FORM>
Číslo

Příklad 4.11

Proveďte rozklad zadaného čísla na prvočinitele. Např. 60 = 1 · 2 · 2 · 3 · 5. Rozklad čísla na prvočinitele lze provést postupným dělením počínaje číslem 2 a testováním zbytku. Rozklad je možné urychlit tak, že budeme zkoušet po čísle 2 již jen liché dělitele. Konec rozkladu je indikován tím, že je dělitel větší než rozkládaný dělenec. Povšimněme si, ža algoritmus zaručuje skutečně rozklad až na prvočinitele. Vzhledem k tomu, že postupuje od nejmenších dělitelů k největším není např. možné, aby se jako člen rozkladu vyskytlo číslo složené, jehož prvočinitelé musely již být uvedeny dříve.

<SCRIPT>
  function Rozklad() {
    var a=parseInt(document.fff.cislo.value);
    document.fff.vysledek.value=a+" = 1";
    var n=2;
    while (n<=a)
      if (a%n==0) {                 // je číslo a dělitelné n?
        document.fff.vysledek.value=document.fff.vysledek.value+" * "+n;
        a=a/n;
      }
      else
        if (n==2)
          n=3;                      // na začátku testujeme číslo 3
        else
          n=n+2;                    // dále testujeme jen lichá čísla
  }
</SCRIPT>

<B>Rozklad čísla na prvočinitele</B>
<FORM name="fff">
  Číslo
  <INPUT type="text" name="cislo" size="12">
  <INPUT type="button" value="Rozlož" onclick="Rozklad()">
  <INPUT type="reset" value="Smaž"><BR>
  <INPUT name="vysledek" size="80" readonly>
</FORM>
Rozklad čísla na prvočinitele
Číslo

Příklad 4.12

Vytiskněte n prvků Fibonacciho posloupnosti pro n z intervalu 2 až 100. Fibonacciho posloupnost je posloupnost, jejíž každý prvek je součtem dvou předcházejících: a1 = 1, a2 = 1, ai = ai–2 + ai–1, pro i > 2. Fibonacciho posloupnost má tedy tvar: 1, 1, 2, 3, 5, 8, 13, 21, ...

<SCRIPT>
  function FibPosl() {
    var n=parseInt(document.fib.pocet.value);
    if (isNaN(n) || (n<2) || (n>100)) {
      alert("Počet prvků musí být z intervalu 2 až 100!");
      return;
    }
    var x=1;                           // první prvek
    var y=1;                           // druhý prvek
    var z;
    document.fib.posloupnost.value=x+", "+y;
    for (var i=1; i<=n-2; i++) {
      z=x+y;                           // součet předchozích dvou prvků
      x=y;
      y=z;
      document.fib.posloupnost.value+=", "+z;
    }
  }
</SCRIPT>

<B>Fibonacciho posloupnost</B>
<FORM name="fib">
  Počet členů
  <INPUT type="text" name="pocet" size="8">
  <INPUT type="button" value="Zobraz" onclick="FibPosl()">
  <INPUT type="reset" value="Smaž"><BR>
  <TEXTAREA name="posloupnost" rows="20" cols="70" readonly>
  </TEXTAREA>
</FORM>
Fibonacciho posloupnost
Počet členů

Příklad 4.13

Pro libovolné dvě zadané strany trojúhelníka dopočítejte třetí tak, aby trojúhelník byl pravoúhlý. Výsledek zaokrouhlete na dvě desetinná místa. Ošetřete případy, kdy uživatel zadá pouze jednu stranu nebo všechny tři strany současně (vypíší se chybová hlášení). Ošetření zadání záporných nebo nulových hodnot provádět nemusíte. Dále si uvědomte, že libovolná odvěsna musí být vždy kratší než přepona. Při řešení použijte Pythagorovu větu c2 = a2 + b2.

<SCRIPT>
  function DoplnStranu() {
    var a=parseFloat(document.trojuhelnik.odv1.value);
    var b=parseFloat(document.trojuhelnik.odv2.value);
    var c=parseFloat(document.trojuhelnik.prep.value);

    if (!isNaN(a) && !isNaN(b) && !isNaN(c)) {    // zadány všechny 3 strany
      alert("Musíte zadat pouze dvě strany!");
      return;
    }

    if (isNaN(a))                                 // nebyla zadána odvěsna a
      if (isNaN(b) || isNaN(c)) {
        alert("Musíte správně zadat dvě strany!");
        return;
      }
      else {
        if (b<c)
          document.trojuhelnik.odv1.value=Math.round(Math.sqrt(c*c-b*b)*100)/100;
        else
          alert("Přepona musí být delší než odvěsna!")
      }

    if (isNaN(b))                                 // nebyla zadána odvěsna b
      if (isNaN(a) || isNaN(c)) {
        alert("Musíte správně zadat dvě strany!");
        return;
      }
      else
        if (a<c)
          document.trojuhelnik.odv2.value=Math.round(Math.sqrt(c*c-a*a)*100)/100;
        else
          alert("Přepona musí být delší než odvěsna!")

    if (isNaN(c))                                 // nebyla zadána přepona c
      if (isNaN(a) || isNaN(b)) {
        alert("Musíte správně zadat dvě strany!");
        return;
      }
      else
        document.trojuhelnik.prep.value=Math.round(Math.sqrt(a*a+b*b)*100)/100;
  }

</SCRIPT>

<B>Doplnění na pravoúhlý trojúhelník</B>
<FORM name="trojuhelnik">
  <INPUT type="text" name="odv1" size="10"> odvěsna<BR>
  <INPUT type="text" name="odv2" size="10"> odvěsna<BR>
  <INPUT type="text" name="prep" size="10"> přepona<BR>
  <INPUT type="button" value="Doplň" onclick="DoplnStranu()">
  <INPUT type="reset" value="Smaž"><BR>
</FORM>
Doplnění na pravoúhlý trojúhelník
odvěsna
odvěsna
přepona




Jak si vyzkoušet výše uvedené příklady?
  1. Označte myší zdrojový text libovolné ukázky.
  2. Vybraný text zkopírujte do clipboardu.
  3. Klikněte myší do textového pole uvedeného níže a text sem z clipboardu vložte.
  4. Zdrojový text můžete libovolně upravit.
  5. Poté klikněte na tlačítko Ukázat. V okně náhledu se vám zobrazí dokument, jehož zdrojový text byl zapsán v textovém poli.
  6. Pokud je třeba, aby se dokument otevřel v novém okně, stačí kliknout na tlačítko Ukázat v novém okně.
  7. Tlačítkem Vybrat vše se označí veškerý text zapsaný v textovém poli.
  8. Tlačítkem Smazat můžete obsah celého textového pole vymazat.

Náhled:



Datum poslední modifikace: 9. února 2001. Upozornění na případné chyby zasílejte na adresu vojkuvka.m@fce.vutbr.cz.
© 1999 – 2001, Michal Vojkůvka, AIU FAST VUT v Brně