Obsah stránky sa číta, prosím čakajte…
Tvorba webových stránok – Manuál k redakčnému systému Rheia 1.0, Roman Horváth, © 2015, powered by Rheia
TWS – Manuál k RS Rheia 1.0 – Obsah | Výpočty a iné úpravy obsahu « Výpočty a iné úpravy obsahu | Jednoduchý operatívny výpočet »
Funkcie modulu jednoduchého tabuľkového kalkulátora, calc
, umožňujú jednoduché spracovanie číselných údajov v tabuľkách. Môže ísť napríklad o súčet hodnôt v stĺpci tabuľky, podmienený súčet hodnôt v stĺpci tabuľky, sčítanie viacerých hodnôt v aktuálnom riadku tabuľky a podobne.
Rozdiel oproti jednoduchému operatívnemu výpočtu je taký, že spracovanie údajov pomocou modulu calc
prebieha v čase spracovania zdrojového textu stránky, takže počas opakovaného zobrazovania spracovanej informácie nie je stroj systému Rheia výpočtovo zaťažovaný. Naproti tomu výpočty nemôžu byť aktualizované, napríklad podľa dátumu a času, ako to je pri jednoduchom operatívnom výpočte.
V ďalšom texte budeme rozlišovať medzi zachytením a vyhodnotením údajov modulom calc
. Zachytenie údajov znamená vloženie nových údajov do tabuľky údajov modulu a vyhodnotenie údajov znamená vypočítanie hodnôt vzorcov modulu s prípadným využitím zachytených údajov. Akcie zachytenia a vyhodnotenia vyžadujú, aby bol modul aktívny, ale nemusia byť na sebe bezprostredne závislé.
Pod termínom spracovanie údajov modulom sa ukrývajú viaceré akcie. Modul prednostne vyhľadá a vyhodnotí všetky vzorce v riadku. Potom môže (podľa stavu) zjednodušiť tvar údajov pre svoje potreby a zachytiť (uložiť) ich do svojej internej tabuľky údajov.
Modul calc
reaguje na každý riadok, ktorý sa začína prefixom #calc:
. Za týmto prefixom nasleduje inštrukcia modulu calc
, za ktorou môžu nasledovať údaje, ktoré sú spracúvané dvojako – jednak modulom calc
a jednak jadrom RS Rheia, ktoré z nich generuje HTML kód stránky. (Ak je potrebné, aby boli údaje spracované len modulom calc
, dajú sa s výhodou využiť komentáre. Modul berie do úvahy aj riadky komentárov, pričom prípadne inštrukcie upravujúce správanie modulu musia byť uvedené pred znakom komentára.)
Po aktivácii modulu direktívou #calc:start
(prípadne #calc:resume
) sa systém začne správať tak, ako keby sa každý riadok začínal prefixom #calc:
. To znamená, že riadky obsahujúce samostatné inštrukcie modulu sa do jadra systému Rheia nedostanú vôbec a prefixy reprezentujúce ďalšie inštrukcie modulu budú tiež odstránené ešte pred spracovaním jadrom RS Rheia.
Direktívy (s inštrukciami modulu calc
) #calc:start
alebo #calc:resume
je vhodné umiestniť pred prvým riadkom zo skupiny riadkov tabuľky, ktoré majú vstúpiť do spracovania. V nasledujúcej tabuľke sú uvedené všetky inštrukcie modulu. Keď nie je aktívny cyklus spracúvania, tak je pred nimi (samozrejme) nevyhnutné uviesť prefix #calc:
.
Inštrukcia | Opis |
---|---|
start |
začne nový cyklus spracúvania a zachytávania údajov modulom calc (vyprázdni pri tom prípadné dovtedy zachytené údaje z tabuľky údajov modulu) |
pause |
pozastaví zachytávanie údajov modulom calc (vyhľadávanie a vyhodnocovanie vzorcov v texte bude pokračovať) |
resume |
obnoví zachytávanie údajov a prípadne aj vyhodnocovanie vzorcov modulom calc (to znamená, že keď nie je aktívny cyklus spracúvania, tak ho táto inštrukcia opätovne spustí, ale na rozdiel od inštrukcie start nevymaže dovtedy zachytené údaje) |
stop |
zastaví spracúvanie údajov modulom calc |
dump |
na účely ladenia vygeneruje tabuľku údajov, ktoré boli dovtedy zachytené modulom calc ; tabuľka má očíslované riadky a stĺpce poradovými číslami a nastavené triedy štýlov podľa direktívy #tables: (pozri kapitolu Štýly tabuliek; inštrukcia dump berie do úvahy len direktívu #tables: , ostatné direktívy slúžiace na úpravu vzhľadu tabuliek sú touto inštrukciou ignorované) |
empty: «text» |
nastaví nový text, ktorý bude zobrazený namiesto prázdneho (prípadne chybného) výsledku |
skip: «riadok» |
nespracuje riadok modulom calc (preskočí ho) a posunie ho na spracovanie zvyšku stroja systému Rheia (dá sa využiť aj na ignorovanie komentárov) |
calc: «riadok» |
vyhodnotí vzorce modulu calc v riadku a bez ohľadu na aktuálny stav spracovania nezaradí tento riadok medzi zachytené údaje |
capt: «riadok» |
vyhodnotí vzorce modulu calc v riadku a bez ohľadu na aktuálny stav spracovania zaradí tento riadok medzi zachytené údaje |
Na lepšie pochopenie toho ako modul calc
pracuje s údajmi zobrazíme inštrukciou dump
v nasledujúcom príklade výsledok tabuľky zachytených údajov.
Zdrojový text tabuľky doplnený o inštrukcie modulu calc
:
*# → # → ||Hlavička* #calc:start O → 5 → 6 M1 → /8/ → 9 V → 1 → code()−8 L → 4 → 2 *R → 7 → code()*10* 3D → 1,7 → 6 A2,4 → 1 → 6 O → 9 → 6,8 0,5J → 1 → 1 ; Komentár → s tabulátormi → 10 E → 1 → 10 skip:; úplne ignorovaný komentár E*L*M → 2 → 9 */MEL/* → 3 → 8 stop #calc:dump
Výsledok (prvú tabuľku vytvorila Rheia podľa klasických pravidiel tvorby tabuliek, druhú vytvorila inštrukcia dump
modulu calc
):
Hlavička | ||
---|---|---|
O | 5 | 6 |
M1 | 8 | 9 |
V | 1 | −8 |
L | 4 | 2 |
R | 7 | 10 |
3D | 1,7 | 6 |
A2,4 | 1 | 6 |
O | 9 | 6,8 |
0,5J | 1 | 1 |
E | 1 | 10 |
ELM | 2 | 9 |
MEL | 3 | 8 |
1. | 2. | 3. | |
---|---|---|---|
1. | "O" | (5) | (6) |
2. | "M1" | (8) | (9) |
3. | "V" | (1) | (−8) |
4. | "L" | (4) | (2) |
5. | "R" | (7) | (10) |
6. | "3D" | (1,70) | (6) |
7. | "A2,4" | (1) | (6) |
8. | "O" | (9) | (6,80) |
9. | "0,5J" | (1) | (1) |
10. | "Komentár" | "s tabulátormi" | (10) |
11. | (0,00) | (1) | (10) |
12. | "E*L*M" | (2) | (9) |
13. | "MEL" | (3) | (8) |
Druhá tabuľka ukazuje zoznam údajov, ktoré modul calc
rozpoznáva, a naznačuje ako s nimi pracuje. Inštrukcia dump
označuje aj typ údajov v bunkách – textové hodnoty sú uzavreté v strojopisných úvodzovkách " a číselné v oblých zátvorkách ().
Modul calc
pri spracovaní odfiltruje krajné formátovacie značky buniek a rozpozná číselné údaje, pričom číslo môže pozostávať z ľubovoľnej kombinácie znakov:
- znamienok
+
,-
(modul hľadá aj rôzne kombinácie iných znakov pripomínajúcich znamienko mínus, napríklad pomlčku–
a pod.), - číslic
0
až9
, - písmen
e
aleboE
(pre exponent) - a znakov
,
a.
(pre desatinnú čiarku, resp. „bodku“).
Pri syntaktickej chybe je výsledná hodnota rovná nule (všimnite si, že modul rozpoznal ako číslo aj samostatný text E
v prvom stĺpci na riadku s poradovým číslom 11 – syntax takého „čísla“ je chybná, preto je výsledná hodnota v bunke rovná nule). Textové údaje v bunkách sú použiteľné na podmienené výpočtové operácie, ktoré sú vysvetľované nižšie.
Keď je v spracúvanom riadku nájdený vzorec (reprezentujúci funkciu alebo operáciu) v tvare calc(
«kľúčové slovo»;
«argumenty»)
, modul ho vyhodnotí podľa opisu v nasledujúcej tabuľke. Tabuľka obsahuje zoznam funkcií, ktoré pracujú s celými stĺpcami zachytených hodnôt (ide o funkcie avg
až maxThis
) a zoznam binárnych operácií (add
až pow
), ktoré sú vyhodnotené úplne na záver celého procesu vyhodnotenia a ktoré pracujú priamo s číselnými hodnotami prijatých argumentov. Ďalšie podrobnosti o spôsobe vyhodnotenia údajov sú pod tabuľkou funkcií.
Kľúčové slovo | Význam | Zoznam a význam argumentov | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
avg |
priemer |
|
|||||||||||||
cnt |
počet | ||||||||||||||
pdt |
súčin (produkt) | ||||||||||||||
sum |
súčet (suma) | ||||||||||||||
min |
minimum | ||||||||||||||
max |
maximum | ||||||||||||||
aif |
podmienený priemer | «číslo 1»
Ak sú hodnoty určené druhým a tretím argumentom zhodné, tak je hodnota určená prvým argumentom zarátaná do výpočtu, inak bude vynechaná. Čísla sú provnávané ako reťazce. |
|||||||||||||
cif |
podmienený počet | ||||||||||||||
pif |
podmienený súčin | ||||||||||||||
sif |
podmienený súčet | ||||||||||||||
mif |
podmienené minimum | ||||||||||||||
xif |
podmienené maximum | ||||||||||||||
avgThis |
priemer v riadku |
Zoznam je oddelený bodkočiarkami, rozsahy sú vymedzené pomlčkou (–) alebo spojovníkom (‑). Príklad: |
|||||||||||||
cntThis |
počet v riadku | ||||||||||||||
pdtThis |
súčin v riadku | ||||||||||||||
sumThis |
súčet v riadku | ||||||||||||||
minThis |
minimum v riadku | ||||||||||||||
maxThis |
maximum v riadku | ||||||||||||||
add |
súčet dvoch hodnôt | «číslo 1»
|
|||||||||||||
sub |
rozdiel dvoch hodnôt | ||||||||||||||
mul |
súčin dvoch hodnôt | ||||||||||||||
div |
podiel dvoch hodnôt | ||||||||||||||
mod |
zvyšok po delení | ||||||||||||||
pow |
n‑tá mocnina | ||||||||||||||
get |
vypísať hodnotu |
Tieto inštrukcie pracujú s konkrétnymi bunkami vnútornej tabuľky hodnôt modulu |
|||||||||||||
set |
vložiť hodnotu | ||||||||||||||
put |
vložiť a vypísať hodnotu |
Vzorce (funkcie/operácie) sú vyhodnocované v skupinách. Spracovanie každého riadka prebieha v troch cykloch, v prvom sú vyhodnocované prvé dve skupiny funkcií (avg
až xif
), v druhom tretia skupina funkcií (avgThis
až maxThis
) a v poslednom sú vyhodnotené všetky binárne operácie (add
až pow
). Inštrukcie get
až put
sú spracúvané vo všetkých cykloch.
Každý cyklus vyhodnotenia je vykonávaný dovtedy, kým sú (v rámci ním spracúvaných skupín) nachádzané syntakticky platné vzorce modulu calc
. (Pre úplnosť – všetky cykly majú limit sto opakovaní, ale nie je pravdepodobné, že by jeden riadok obsahoval toľko vzorcov.)
Dôsledkom vyššie uvedených princípov je, že argumentom operácí (add
až pow
) môžu byť všetky funkcie a operácie uvedené v tabuľke. Opakované vyhodnotenie spôsobí, že nakoniec vstúpi do operácie číselná hodnota, ktorá bude modulom akceptovaná.
Inštrukcie get
až put
slúžia na manipuláciu s tabuľkou hodnôt modulu calc
. Inštrukcia get
sa pokúsi prečítať hodnotu z bunky určenej poradovým číslom riadka a stĺpca. Ak hodnota jestvuje, vloží sa do zdrojového textu. Inštrukcia set
zapíše hodnotu do určenej bunky a inštrukcia put
vykoná obidva úkony, pričom hodnotu najprv zapíše a do textu vloží výsledok.
Modul calc
je prednostne určený na prácu s číslami a na vykonávanie výpočtov. Do buniek tabuľky údajov modulu je možné vložiť aj reťazec, ale len v rámci pravidiel spracovania údajov modulom, ktoré prinášajú určité obmedzenia. Okrem iného sú všetky znaky pripomínajúce mínus pri kažom ukladaní údajov prevedené na znak spojovníka (‑), ktorý je z technického pohľadu vo všetkých bežných programovacích jazykoch chápaný ako záporné znamienko a pri vyberaní údajov z tabuľky sú spojovníky prevedené na znak mínus (−).
Pri práci s číslami sú navyše spracúvané aj dvojice znakov čiarka (,
) a bodka (.
), pri ktorých ide o prevod medzi slovenským zápisom, ktorý používa Rheia a anglickým zápisom, ktorý je používaný v programovacom jazyku PHP , v ktorom je Rheia naprogramovaná.
Upozornenie: | Keďže niektoré výpočty sú vykonávané cez zobrazenie v zdrojovom texte, môže počas procesu vyhodnocovania pri práci s reálnymi hodnotami dochádzať k zaokrúhleniu na dve desatinné miesta. |
---|
Príklad – majme vzorec zložený výhradne z binárnych operácií:
#calc:calc(add; calc(div; 4; 2); calc(sub; calc(mod; 15; calc(pow; 2; 3)); 1))
Čo bude výsledkom? Priebeh vyhodnotenia ukazuje nasledujúca tabuľka (pre lepšiu prehľadnosť boli operácie prepísané do čitateľného tvaru):
(4 : 2) + (15 mod 23 − 1) | ||
---|---|---|
4 : 2 = 2 | → | 2 + (15 mod 23 − 1) |
23 = 8 | → | 2 + (15 mod 8 − 1) |
15 mod 8 = 7 | → | 2 + (7 − 1) |
7 − 1 = 6 | → | 2 + 6 |
2 + 6 = 8 | → | 8 |
Ako bolo povedané, ostatné funkcie prijímajú poradové čísla stĺpcov – ide o poradové čísla stĺpcov v tabuľke údajov zachytených modulom calc
, z ktorej sú potrebné hodnoty čerpané.
Nasledujúci príklad ukazuje zápis výpočtu podmieneného súčinu a súčtu, pričom údaje sú čerpané z tabuľky hodnôt uvedenej vyššie v rámci tejto kapitoly:
Požadované hodnoty sú: #calc:calc(pif; 2; 1; "O"), #calc:calc(sif; 3; 1; "E*L*M").
Výsledok:
Požadované hodnoty sú: 45, 9.
Ak výpočet niektorej z funkcií alebo operácií zlyhá, výsledkom je buď prázdny reťazec, alebo text nastavený inštrukciou empty
. Modul calc
je aktivovaný ešte pred spracovaním riadka systémom Rheia, takže text môže obsahovať aj formátovacie značky RS Rheia.
Príklad (opäť využíva tabuľku údajov vytvorenú v rámci tejto kapitoly vyššie):
#calc:empty:||– * → 2. stĺpec pre 2D → 2. stĺpec pre 3D → 3. stĺpec pre 2D → 3. stĺpec pre 3D* #calc:*Počet: → calc(cif; 2; 1; "2D") → calc(cif; 2; 1; "3D")↩ → calc(cif; 3; 1; "2D") → calc(cif; 3; 1; "3D") #calc:*Súčet: → calc(sif; 2; 1; "2D") → calc(sif; 2; 1; "3D")↩ → calc(sif; 3; 1; "2D") → calc(sif; 3; 1; "3D")
Výsledok (hodnota 2D sa v prvom stĺpci nevyskytuje vôbec, preto je výsledkom vzorcov, ktoré s ňou súvisia vystredená pomlčka definovaná inštrukciou empty
vyššie):
2. stĺpec pre 2D | 2. stĺpec pre 3D | 3. stĺpec pre 2D | 3. stĺpec pre 3D | |
---|---|---|---|---|
Počet: | – | 1 | – | 1 |
Súčet: | – | 1,70 | – | 6 |
Príklad použitia modulu calc
Nasledujúca tabuľka je tabuľkou údajov o fiktívnych predmetoch. V prvom stĺpci je záväznosť (Z) – povinné predmety sú označené skratkou P, povinne voliteľné PV a výberové V. V druhom stĺpci je počet kreditov (K) a v treťom stĺpci týždenná hodinová dotácia predmetu (H).
Z | K | H |
---|---|---|
P | 4 | 4 |
PV | 2 | 3 |
P | 3 | 4 |
PV | 2 | 3 |
PV | 1 | 2 |
V | 1 | 1 |
V | 1 | 1 |
Do zdrojového textu stránky vložíme inštrukcie start
a stop
modulu calc
presne tak, aby ohraničovali len riadky s údajmi. V skrátenej podobe by zdrojový text vyzeral takto:
*Z → K → H* #calc:start P → 4 → 4 … V → 1 → 1 #calc:stop
Výstupom inštrukcie dump
modulu calc
je nasledujúce zobrazenie ním zachytených údajov:
1. | 2. | 3. | |
---|---|---|---|
1. | "P" | (4) | (4) |
2. | "PV" | (2) | (3) |
3. | "P" | (3) | (4) |
4. | "PV" | (2) | (3) |
5. | "PV" | (1) | (2) |
6. | "V" | (1) | (1) |
7. | "V" | (1) | (1) |
Predpokladajme, že chceme zo zachytených údajov vypočítať súčet kreditov a hodinových dotácií všetkých povinných, povinne voliteľných a výberových predmetov. Na vykonanie podmieneného súčtu slúži funkcia sif
, ktorej prvým argumentom je poradové číslo stĺpca, ktorého údaje majú byť sčítané (v našom prípade to bude najprv 2
a potom 3
), druhým argumentom poradové číslo stĺpca, ktorého hodnoty majú byť porovnávané (v našich prípadoch je to vždy 1
) a tretím argumentom je porovnávaný reťazec (v našom prípade sú to reťazce P
, PV
alebo V
). Zdrojový text tabuľky s výpočtami môže vyzerať napríklad takto:
#calc:resume pause *∑KP: → calc(sif; 2; 1; "P") → @ → *∑HP: → calc(sif; 3; 1; "P") *∑KPV: → calc(sif; 2; 1; "PV") → @ → *∑HPV: → calc(sif; 3; 1; "PV") *∑KV: → calc(sif; 2; 1; "V") → ∘ → *∑HV: → calc(sif; 3; 1; "V") stop
Výsledná tabuľka bude vyzerať takto:
∑KP: | 7 | ∑HP: | 8 | |
---|---|---|---|---|
∑KPV: | 5 | ∑HPV: | 8 | |
∑KV: | 2 | ∑HV: | 2 |
Súvisiace kapitoly:
Otázky a úlohy:
- Na čo sa dá použiť modul jednoduchého tabuľkového kalkulátora Rheia
calc
? - S akými typmi údajov pracuje modul jednoduchého tabuľkového kalkulátora Rheia
calc
? - Stručne opíšte ako fungujú nasledujúce inštrukcie modulu
calc
RS Rheia:get
,set
aput
. - Aký je význam (ako fungujú) tie funkcie modulu
calc
RS Rheia, ktoré sa končia slovomThis
(napríkladavgThis
,maxThis
a pod.)