JavaScript – sada příkladů 6

Příklad 6.1

Vytiskněte prvních 100 prvočísel. V proměnné pocet máme uloženo, kolik prvočísel počínaje číslem 2 se má vytisknout. Proměnná i slouží jako řídicí proměnná cyklu, proměnná jePrvocislo nabývá v programu logických hodnot true a false. Proměnná n nabývá postupně hodnot 1, 3, 5, 7, 9, ... – tedy pouze lichá čísla, neboť sudá čísla s výjimkou čísla 2 nejsou prvočísly a nemá význam je testovat. Do pole p potom budeme postupně ukládat všechna nalezená prvočísla. Tedy p[0]=2, p[1]=3, p[2]=5, p[3]=7, p[4]=11, ... , p[96]=509, p[97]=521, p[98]=523, p[99]=541. Každé testované číslo n potom budeme postupně dělit těmito prvky pole. Proměnná max plní funkci jakési zarážky, neboť v ní máme uložen maximální index již zaplněné části pole.

<SCRIPT>
  var pocet=100;
  var i, jePrvocislo;
  var n=1;
  var max=0;
  var p=new Array(pocet);
  p[0]=2;                           // první uložené prvočíslo bude 2
  while (max<pocet-1) {
    n+=2;
    jePrvocislo=true;               // předpokládáme, že n bude prvočíslo
    i=0;
    while ((i<=max) && jePrvocislo)
      if (n%p[i]==0)                // je n dělitelné p[i] beze zbytku?
        jePrvocislo=false;          // ano je, nemůže být tedy prvočíslo
      else
        i++;                        // není, zvýšíme i a zkoušíme dál
    if (jePrvocislo) {              // je testované číslo n prvočíslo?
      max++;                        // ano je, zvýšíme index zarážky max
      p[max]=n;                     // a uložíme sem číslo n
    }
  }
  for (i=0; i<max; i++)             // všechna čísla uložená v poli
    document.write(p[i]+", ");      // vytiskneme
  document.write(p[max]);           // za posledním číslem už nebude čárka
</SCRIPT>

Pokuste se zamyslet nad tím, jak by šel tento algoritmus generování prvočísel zefektivnit.

Příklad 6.2

Symbol čárového kódu nalezneme dnes prakticky na každém zboží, které si zakoupíme v obchodě. Kód EAN-13 je čárový kód pevné délky obsahující 13 numerických znaků. Prvních 12 číslic určuje zemi původu, výrobce a číslo výrobku (např. všechny výrobky pocházející z České republiky začínají číslem 859, ze Slovenské republiky 858 atd). Poslední 13. číslice je tzv. kontrolní číslice, která slouží k určení, zda se čárový kód přečetl v pořádku. Číslici kontrolního součtu vypočteme tak, že

  1. Sečteme hodnoty číslic na sudých pozicích a výsledek vynásobíme třemi.
  2. Sečteme hodnoty číslic na lichých pozicích.
  3. Obě výsledné hodnoty sečteme a připočteme kontrolní číslici takovou, aby byl výsledný součet dělitelný deseti.

Příklad výpočtu kontrolní číslice pro kód 859123412345:

Součet číslic na sudých pozicích: 5 + 1 + 3 + 1 + 3 + 5 = 18
Vynásobení třemi: 18 · 3 = 54
Součet číslic na lichých pozicích: 8 + 9 + 2 + 4 + 2 + 4 = 29
Součet obou hodnot 54 + 29 = 83
Přičtení kontrolní číslice tak, aby součet byl dělitelný deseti: 83 + 7 = 90

Kontrolním znakem bude tedy číslice 7, výsledný čárový kód bude 8591234123457.

<SCRIPT>
  function ean13(form) {
    if (form.vstup.value.length!=12) {
      alert("Pozor!\nUveďte všech 12 počátečních číslic čárového kódu!");
      form.vysledek.value="CHYBA!";
      return;
    }
    var k=1;
    var suma=0;
    for (var i=0; i<12; i++) {
      suma=suma+parseInt(form.vstup.value.substring(i,i+1))*k;
      k=4-k;
    }
    var kontrCislice=(10-(suma%10))%10;
    form.vysledek.value=form.vstup.value+kontrCislice;
  }
</SCRIPT>

<B>Výpočet kontrolní číslice čárového kódu EAN-13</B>
<FORM>
  <INPUT type="text" name="vstup" size="13" maxlength="12">
  <INPUT type="button" value="Vypočti" onclick="ean13(this.form)">
  <INPUT type="reset" value="Smaž">
  <INPUT type="text" name="vysledek" size="14" readonly>
</FORM>
Výpočet kontrolní číslice čárového kódu EAN-13

Příklad 6.3

Vytvořte jednoduchou kalkulačku, která umožní zadat a vyhodnotit určitý aritmetický výraz.

<SCRIPT>
  function Pridej(znak) {
    document.kalkulacka.displej.value+=znak;
  }

  function Smaz() {
    document.kalkulacka.displej.value="";
  }

  function Vyhodnot() {
    document.kalkulacka.displej.value=eval(document.kalkulacka.displej.value);
  }
</SCRIPT>

<FORM name="kalkulacka">
  <TABLE border="5" bgcolor="silver" cellpadding="5" align="center">
    <TR align="center">
      <TD colspan="4" bgcolor="gray">
        <INPUT type="text" name="displej" size="30">
    <TR align="center">
      <TD><INPUT type="button" value="   7   " onclick="Pridej('7')">
      <TD><INPUT type="button" value="   8   " onclick="Pridej('8')">
      <TD><INPUT type="button" value="   9   " onclick="Pridej('9')">
      <TD><INPUT type="button" value="   +   " onclick="Pridej('+')">
    <TR align="center">
      <TD><INPUT type="button" value="   4   " onclick="Pridej('4')">
      <TD><INPUT type="button" value="   5   " onclick="Pridej('5')">
      <TD><INPUT type="button" value="   6   " onclick="Pridej('6')">
      <TD><INPUT type="button" value="   -   " onclick="Pridej('-')">
    <TR align="center">
      <TD><INPUT type="button" value="   1   " onclick="Pridej('1')">
      <TD><INPUT type="button" value="   2   " onclick="Pridej('2')">
      <TD><INPUT type="button" value="   3   " onclick="Pridej('3')">
      <TD><INPUT type="button" value="   *   " onclick="Pridej('*')">
    <TR align="center">
      <TD><INPUT type="button" value="   0   " onclick="Pridej('0')">
      <TD><INPUT type="button" value="   (   " onclick="Pridej('(')">
      <TD><INPUT type="button" value="   )   " onclick="Pridej(')')">
      <TD><INPUT type="button" value="   /   " onclick="Pridej('/')">
    <TR align="center">
      <TD><INPUT type="button" value="   C   " onclick="Smaz()">
      <TD><INPUT type="button" value="   .   " onclick="Pridej('.')">
      <TD colspan="2">
        <INPUT type="button" value="         =        " onclick="Vyhodnot()">
  </TABLE>
</FORM>

Dále se pokuste tuto kalkulačku doplnit pamětí. Asi nejsnadnějším způsobem je nadefinovat další textové pole, které bude trvale zobrazovat obsah paměti. Toto textové pole umístěte do stejného formuláře v jakém jsou všechny ostatní prvky kalkulačky. Poté nadefinujte příslušná tlačítka pro práci s pamětí: MS (Memory Store), MR (Memory Read) a MC (Memory Clear). Kliknutím na tlačítko MS se pouze zkopíruje obsah textového pole displeje do textového pole paměti, funkce spojená s tlačítkem MR zkopíruje obsah paměti do displeje. Tlačítko MC vloží do textového pole paměti prázdný řetězec – obdoba funkce Smaz(). Pokud i tento úkol bude pro vás příliš jednoduchý, vytvořte pamětí několik, mezi kterými se uživatel bude moci přepínat. Dále se pokuste vytvořit tlačítko BACK, které umožní vrátit naposled provedenou akci.

Příklad 6.4

Naprogramujte hru "Přidej/uber". Počítač vygeneruje náhodné celé číslo z intervalu 1 až 100 a cílem uživatele je toto číslo uhodnout. Při každém zadání počítač vypisuje, zda je třeba přidat či ubrat. Po uhodnutí čísla program vypíše toto číslo a celkový počet pokusů uživatele.

<SCRIPT>
  function HadejCislo() {
    var pocetPokusu=0;
    var zadaneCislo=0;
    var nahodneCislo=Math.random();  // náhodné reálné č. z intervalu 0 až 1
    nahodneCislo=Math.ceil(nahodneCislo*100);  // převod na int. 1 až 100
    while (zadaneCislo!=nahodneCislo) {
      pocetPokusu++;
      zadaneCislo=prompt("Zadej číslo od 1 do 100.");
      if (zadaneCislo>nahodneCislo) {
        alert("Uber!");
      }
      if (zadaneCislo<nahodneCislo) {
        alert("Přidej!");
      }
      if (zadaneCislo==nahodneCislo)
        alert("     ***  GRATULUJI  ***\n\nČíslo "+nahodneCislo+
	      " jsi uhodl na "+pocetPokusu+". pokus.");
    }
  }
</SCRIPT>

<B>HÁDEJ ČÍSLO</B><BR>
Klikni na tlačítko <I>Nová hra</I> a hádej celé číslo od 1 do 100.
<FORM>
  <INPUT type="button" value="Nová hra" onclick="HadejCislo()">
</FORM>
HÁDEJ ČÍSLO
Klikni na tlačítko Nová hra a hádej celé číslo od 1 do 100.


Příklad 6.5

Napište skript, který "odvysílá" zadaný text v Morseově abecedě. Pro zjednodušení předpokládejte, že vstupní abeceda obsahuje jen anglická písmena a mezeru.

<SCRIPT>
  function vysilej() {
    znakyNorm = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
    znakyMorse = new Array(
      ".-",    "-...",  "-.-.",  "-..",   ".",            // A, B, C, D, E,
      "..-.",  "--.",   "....",  "..",    ".---",         // F, G, H, I, J,
      "-.-",   ".-..",  "--",    "-.",    "---",          // K, L, M, N, O,
      ".--.",  "--.-",  ".-.",   "...",   "-",            // P, Q, R, S, T,
      "..-",   "...-",  ".--",   "-..-",  "-.--",         // U, V, W, X, Y,
      "--..",  " "                                        // Z, mezera
    );
    document.morseovka.vystup.value = "";        // smaž výstupní text. pole
    textVstup = document.morseovka.vstup.value;  // zjisti vstupní text
    textVystup = "";
    for (i = 0; i < textVstup.length; i++) {
      znak = textVstup.charAt(i);              // vezmi znak na i-té pozici
      znak = znak.toUpperCase();               // převeď ho na velké písmeno
      pozice = znakyNorm.indexOf(znak);   // zjisti pozici znaku v znakyNorm
      if (pozice == -1) {                      // takový znak tam není
        alert("Nepovolený znak " + znak + " ve vstupním textu!");
        return;                                // skonči
      }
      else           // pozice znaku v řetězci znakyNorm odpovídá indexu pole
        textVystup += znakyMorse[pozice] + "|"; // vypiš prvek pole s indexem
    }                                           // pozice a oddělovač
    document.morseovka.vystup.value = textVystup;    // zobraz výst. řetězec
  }
</SCRIPT>

<FORM name="morseovka">
  <B>Napište text, který chcete odvysílat</B><BR>
  povolené znaky: a, b, c, ... , y, z, mezera<BR>
  <TEXTAREA name="vstup" cols="50" rows="3"></TEXTAREA><BR>
  <INPUT type="button" value="Převeď" onClick="vysilej()">
  <INPUT type="reset" value="Smaž"><BR>
  <TEXTAREA name="vystup" cols="50" rows="3" readonly></TEXTAREA>
</FORM>
Napište text, který chcete odvysílat
povolené znaky: a, b, c, ... , y, z, mezera


Příklad 6.6

Napište skript, který bude počítat součet dvou čtvercových matic A a B řádu n.

  <SCRIPT>
  n=3;

  function soucet() {
    var A=new Array(n);
    for (i=0; i<n; i++)
      A[i]=new Array(n);
    var B=new Array(n);
    for (i=0; i<n; i++)
      B[i]=new Array(n);
    var C=new Array(n);
    for (i=0; i<n; i++)
      C[i]=new Array(n);

    for (i=0; i<n; i++)
      for (j=0; j<n; j++) {
        A[i][j]=parseFloat(document.matice1.elements[n*i+j].value);
        B[i][j]=parseFloat(document.matice1.elements[n*i+j+n*n].value);
        C[i][j]=A[i][j]+B[i][j];
        document.matice1.elements[2*n*n+n*i+j+1].value=C[i][j];
      }
  }
</SCRIPT>

<FORM name="matice1">
  <TABLE>
    <TR>
      <TH>Matice A
      <TH> 
      <TH>Matice B
      <TH> 
      <TH>Matice C = A + B
    <TR>
      <TD>
        <TABLE>
<SCRIPT>
  for (i=0; i<n; i++) {
    document.write("<TR>")
    for(j=0; j<n; j++)
      document.write("<TD><input type='text' size='3'>")
  }
</SCRIPT>
        </TABLE>
    <TD><B>+</B>
    <TD>
      <TABLE>
<SCRIPT>
  for (i=0; i<n; i++) {
    document.write("<TR>")
    for(j=0; j<n; j++)
      document.write("<TD><input type='text' size='3'>")
  }
</SCRIPT>
      </TABLE>
    <TD>
      <INPUT type="button" value="  =  " onclick="soucet()">
    <TD>
      <TABLE>
<SCRIPT>
  for (i=0; i<n; i++) {
    document.write("<TR>")
    for(j=0; j<n; j++)
      document.write("<TD><input type='text' size='3' readonly>")
  }
</SCRIPT>
      </TABLE>
  </TABLE>
</FORM>
Matice A   Matice B   Matice C = A + B
+

Příklad 6.7

Napište skript, který bude počítat součin dvou čtvercových matic A a B řádu n.

<SCRIPT>
  n=3;

  function soucin() {
    var A=new Array(n);
    for (i=0; i<n; i++)
      A[i]=new Array(n);
    var B=new Array(n);
    for (i=0; i<n; i++)
      B[i]=new Array(n);
    var C=new Array(n);
    for (i=0; i<n; i++)
      C[i]=new Array(n);

    for (i=0; i<n; i++)
      for (j=0; j<n; j++) {
        A[i][j]=parseFloat(document.matice2.elements[n*i+j].value);
        B[i][j]=parseFloat(document.matice2.elements[n*i+j+n*n].value);
      }
    for (i=0; i<n; i++)
      for(j=0; j<n; j++) {
        C[i][j]=0;
        for(k=0; k<n; k++)
          C[i][j]+=A[i][k]*B[k][j];
        document.matice2.elements[2*n*n+n*i+j+1].value=C[i][j];
      }
  }
</SCRIPT>

<FORM name="matice2">
  <TABLE>
    <TR>
      <TH>Matice A
      <TH> 
      <TH>Matice B
      <TH> 
      <TH>Matice C = A x B
    <TR>
      <TD>
        <TABLE>
<SCRIPT>
  for (i=0; i<n; i++) {
    document.write("<TR>")
    for(j=0; j<n; j++)
      document.write("<TD><input type='text' size='3'>")
  }
</SCRIPT>
        </TABLE>
    <TD><B>x</B>
    <TD>
      <TABLE>
<SCRIPT>
  for (i=0; i<n; i++) {
    document.write("<TR>")
    for(j=0; j<n; j++)
      document.write("<TD><input type='text' size='3'>")
  }
</SCRIPT>
      </TABLE>
    <TD>
      <INPUT type="button" value="  =  " onclick="soucin()">
    <TD>
      <TABLE>
<SCRIPT>
  for (i=0; i<n; i++) {
    document.write("<TR>")
    for(j=0; j<n; j++)
      document.write("<TD><input type='text' size='3' readonly>")
  }
</SCRIPT>
      </TABLE>
  </TABLE>
</FORM>
Matice A   Matice B   Matice C = A x B
x



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ě