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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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 = ai2 + ai1, 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>
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>
Náhled: