Škôlka jazyka C

Fórum o programovaní v jazyku C založené 3. januára 2012

Aktuálny čas je 25 Apr 2024, 09:54

Všetky časy sú v GMT + 1 hodina




Vytvoriť novú tému Odpovedať na tému  [ Príspevok: 1 ] 
Autor Správa
 Predmet príspevku: 5. lekcia JS - funkcie
PoslaťNapísal: 20 Aug 2016, 11:54 
Offline
Stredoškolák
Stredoškolák
Obrázok užívateľa

Registrovaný: 06 Jan 2012, 19:26
Príspevky: 458
Bydlisko: pod Pátrovom
Udelené body: 228 bodov
Získané body: 21 bodov
Funkcie v JS sú podobné ako v céčku.
Nebudeme sa zdržiavať teórioiu a prejdeme hneď k praxi.

Vytvorme si html súbor funkcie.html
Kód:
<!DOCTYPE html>

<html lang="sk">
<head>
  <meta charset="utf-8" />
  <link rel="stylesheet" href="css/style.css" type="text/css" />
  <script type="text/javascript" src="js/jquery.js"></script>
  <script type="text/javascript" src="js/funkcie.js"></script>
  <title>Funkcie v JS</title>
</head>
<body>
  <h2>Aký to je deň v týždni?</h2>
  <a>Zadaj dátum (napr. 1.2.1967): </a>
  <input type="text" id="datum" size="5" />
  <br><br>
  <h2 id="vysledok"></h2>
</body>
</html>


Ďalej súbor style.css
Kód:
p {
  font-size: 1.3em;
}

input {
  width: 100px;
  text-align: center;
}

.modry {
  color: blue;
}


Takže funkcie sú ako v céčku, ale predsa sa len niečím líšia.
Funkcia môže môže vyzerať takto:
Kód:
function nazovFunkcie(vstupnyParameter1, vstupnyParameter2, vstupnyParameter3, ...) {
    vykonávací kód;
    // ak chceme niečo vrátiť
    return vysledok;
}

Ako vidíte, v JS sa nepíšu typy premenných, ani vstupné ani výstupný.
Prečo to je tak by ste už mali vedieť z predchádzajúcich lekcií.
Ďalším rozdielom oproti céčku je to, že aj keď je definovaných viac vstupných parametrov, pri použití funkcie ich môžete zadať menej, alebo žiadny. Ak je nejaký zadaný, berie sa v poradí ako vstupný parameter zľava.
Príklad:
Kód:
function pokus(a, b, c) {
   var vys1 = a + 2;
   var vys2 = b + 7;
   var vys3 = c + 3;
   console.log(vys1);
   console.log(vys2);
   console.log(vys3);
}
$(function() {
   pokus(5, 6);
});

Výpis:
7
13
NaN // not a number (nie je číslo)

Ak náhodou ešte niekto nepoužíva konzolu (výpis console.log()), stlačte klávesu F12.
Mimochodom toto sa najčastejšie používa na ladenie scriptov v JS. Keď niečo nefunguje, konzola väčšinou vypíše, kde je problém.

Ďalším rozdielom je, že môžeme použiť tzv. anonymnú funkciu. To znamená, že funkciu uložíme do premennej.
Napríklad takto:
Kód:
var pokus = function (a, b, c) {
   var vys1 = a + 2;
   var vys2 = b + 7;
   var vys3 = c + 3;
   console.log(vys1);
   console.log(vys2);
   console.log(vys3);
}

Používa sa a pracuje úplne rovnako ako predchádzajúca.
Aký to má teda zmysel?
Je to na vytváranie tzv. callback-u.
Ide o vloženie parametra (funkcie) do druhej funkcie.
Príklad:
Kód:
function zavolajFunkciu(funkcia, a, b, c) {
           console.log("Som funkcia a volám funkciu, ktorá mi prišla do parametru v premennej.");
           console.log("Ako parameter jej dám premenné a, b, c, ktoré mi prišli ako 2., 3. a 4. parameter");
           funkcia(a, b, c, d);
}

Zavolanie funkcie:
Kód:
zavolajFunkciu(pokus, 5, 6);

Výpis:
7
13
NaN

Fajn.
Teraz si napíšeme nejakú reálnu funkciu, ktorá má aj nejaký význam.
Povedzme, že chceme zistiť aký bol deň v týždni, keď sme sa narodili.

Vytvoríme si funkciu s jediným vstupným parametrom, a to dátum.
Kód:
function vratDenTyzdna(datum) {
    return ...;
}

Objekt Date() má na vrátenie dňa v týždni metódu getDay(), ktorá vráti číslo 0 – 6, teda nedeľa až sobota.
Na to aby sa vypisovali názvy dní a nie len čísla, vytvoríme pole.
Kód:
var dni = new Array("Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota");

Teraz potrebujeme nastaviť zadaný dátum.
Robí sa to takto:
Kód:
var d = new Date(rok, mesiac, deň, hodín, mimút, sekúnd, millisekúnd);

s tým, že nemusíme zadať všetky atribúty.
Nám bude stačiť len rok, mesiac a deň.
V html máme požiadavku, aby bol dátum zadaný vo formáte napr. 1.2.1955, čiže čísla sú oddelené botkami.
Z lekcie o premenných vieme, že reťazec vieme rozdeliť do poľa metódou split(), tak ju tu použijeme.
Kód:
var d = datum.split("."); // rozdelí na (d[0] => 1, d[1] => 2, d[2] => 1955

Teraz vytvoríme nevý objekt Date() so zadanými hodnotami.
Kód:
var date = new Date(d[2], (d[1] - 1), d[0]); // (d[1] - 1) preto, že mesiace sú od 0

Nakoniec použijeme metódu getDay(), ale tak, aby sme hneď číslo previedli na názov dňa a toto vrátime.
Kód:
return dni[date.getDay()];

Celá funkcia bude teda vyzerať takto:
Kód:
function vratDenTyzdna(datum) {
    var dni = new Array("Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota");
    var d = datum.split(".");
    var date = new Date(d[2], (d[1] - 1), d[0]);
    return dni[date.getDay()];
}

Hlavnú (spúšťaciu) funkciu napíšeme takto:
Kód:
$(function() {
    $("#datum").change(function(){ // pri zmene obsahu políčka (enter, klik)
        var dat = $('#datum').val(); // do premennej sa uloží obsah políčka
        $('#vysledok').text(vratDenTyzdna(dat)); // do podnadpisu <h2> sa vloží návratová hodnota funkcie vratDenTyzdna()
    });
});

Keď otvoríme stránku, zadáme dátum a stlačíme enter, vypíše sa konkrétny deň v týždni na základe zadaného dátumu.
Máme hotovo alebo nie?
Jasne že nemáme!
Užívateľ je tvor nevyspytateľný a preto do políčka zadá čokoľvek, dokonca sa môže pokúsiť zadať aj nejaký kód, aby sa nabúral do našej stránky.
Čo s tým?
Musíme VŽDY ošetriť vstup od užívateľa.
Schválne si vyskúšajte rôzne zadania, teda 32.2.2016, .... Budete vidieť, že aj to vypíše nejaký deň, ale to my nechceme.
Vzhľadom na to, že február má niekedy 28 a inokedy 29 dní, musíme vedieť, koľko dní má zadaný mesiac v danom roku a na to si napíšeme funkciu.
Použijeme metódu getDate() na posledný deň mesiaca zadaného roku.
Kód:
function pocetDniMesiaca(rok, mesiac) {
   return new Date(rok, mesiac, 1, -1).getDate(); // prvý deň v mesiaci mínus 1 hodina je posledný deň predchádzajúceho a ten si vrátime .getDate()
}

Celý script funcie.js bude nakoniec vyzerať takto:
Kód:
/** funkcie.js **/
/**
 * vráti názov dňa v týždni zo zadaného dátumu
 * @param dátum
 * @return deň v týždni / Taký dátum neexistuje!
 */
function vratDenTyzdna(datum) {
    var dni = new Array("Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota");
    var d = datum.split("."); // rozdelí teťazec na základe separátora "."
    var pocet = pocetDniMesiaca(d[2], d[1]); // vráti počet dní zadaného mesiaca
    /**
    * podmienka:
    * deň v mesiaci musí byť menší alebo rovný počtu dní v mesiaci a zároveň väčší ako nula
    * a zároveň mesiac musí byť menší alebo rovný 12 a zároveň väčší ako nula
    * a zároveň rok musí mať 4 číslice
    */
   if (d[0] <= pocet && d[0] > 0 && d[1] <= 12 && d[1] > 0 && d[2].length == 4) {
        var date = new Date(d[2], (d[1] - 1), d[0]);
        return dni[date.getDay()];
    }
    else
        return "Taký dátum neexistuje!";
}
/**
 * vráti počet dní mesiaca zo zadaného dátumu
 * @param rok
 * @param mesiac
 * @return pocetDní
 */
function pocetDniMesiaca(rok, mesiac) {
   return new Date(rok, mesiac, 1, -1).getDate(); // prvý deň v mesiaci mínus 1 hodina je posledný deň predchádzajúceho a ten si vrátime .getDate()
}
/**
 * hlavná funkcia - spustí sa až po načítaní stránky
 */
$(function() {
    $("#datum").change(function(){ // pri zmene obsahu políčka (enter, klik)
        var dat = $('#datum').val(); // do premennej sa uloží obsah políčka
        $('#vysledok').text(vratDenTyzdna(dat)); // do podnadpisu <h2> sa vloží návratová hodnota funkcie vratDenTyzdna()
    });
});

Tak a máme hotovo.
Teraz môžete skúšať rôzne zadania a už by nemal byť žiadny problém.

Nabudúce si povieme niečo o udalostiach v JS, ale pri použití jQuery.

_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.


Detaily príspevku Upozorniť užívateľa
Hore
 Profil  
 
Zobraziť príspevky z predchádzajúceho:  Zoradiť podľa  
Vytvoriť novú tému Odpovedať na tému  [ Príspevok: 1 ] 

Všetky časy sú v GMT + 1 hodina


Kto je on-line

Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 0 hostia


Rýchla úprava:
Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre
Nemôžete zasielať súbory v tomto fóre

Hľadať:
Skočiť na:  
cron
Powered by phpBB® Forum Software © phpBB Group

Hosted by FreeSpace SK