Obsah
1. Základní informace o aplikaci calc
2. Přednosti a zápory aplikace calc
3. Základy práce s calcem
4. Hodnoty a proměnné
5. Matematické výrazy a operátory
6. Funkce použitelné v matematických výrazech
7. Obsah dalšího pokračování tohoto seriálu
1. Základní informace o aplikaci calc
Na aplikaci calc se můžeme z uživatelského hlediska dívat jako na dosti podstatné rozšíření již dříve popsané utility bc. Jedná se – zejména v porovnání s utilitami dc a bc – o poměrně nový nástroj umožňující programování (skriptování) matematických výpočtů pomocí programovacího jazyka, jenž se především svou syntaxí i sémantikou příkazů do značné míry podobá známému programovacímu jazyku C. Oproti céčku však byly některé jazykové konstrukce odstraněny, například ukazatelová aritmetika. Podobně jako u utilit dc a bc i zde je možné veškerou práci provádět interaktivně, tj. uživatelem zapsané programy (skripty) se nemusí předem explicitně překládat, protože se postupně provádí – interpretují – již při svém zápisu.
Programátorům jsou k dispozici mnohé příkazy známé už z céčka i dalších programovacích jazyků postavených (syntakticky) nad céčkem, tj. C++, Javou, PHP apod: podmínkové příkazy (if, else, switch), smyčky (while, for, do), operátory a výrazy (==, ++, *=) apod. Na rozdíl od staticky (i když slabě) typovaného programovacího jazyka C se však v případě calcu jedná o dynamicky typovaný jazyk, tj. u proměnných, argumentů funkcí ani u jejich návratových hodnot není zapotřebí definovat typ, ten je dán hodnotou, kterou proměnná nese. Veškeré aritmetické výpočty se provádí s čísly majícími prakticky neomezenou přesnost a rozsah.
2. Přednosti a zápory aplikace calc
Mezi největší přednost aplikace calc bezesporu patří značná přehlednost vytvořených skriptů, které se velmi podobají programům zapsaným v jazyku C, a to včetně práce s poli a možnosti zápisu numerických hodnot v osmičkové i šestnáctkové číselné soustavě. Touto vlastností předčí calc dokonce i starší utilitu bc, která se také snažila céčko do určité míry napodobovat. Další předností je podobná koncepce při práci s numerickými hodnotami, jako tomu bylo u předešlých utilit – nepoužívají se primitivní datové typy daného matematického koprocesoru (float, double), ale čísla s prakticky neomezenou přesností. calc také pracuje s řetězci mnohem lépe než utility dc a bc, k dispozici je mnoho funkcí zpracovávajících řetězce včetně funkce printf() sloužící pro formátovaný tisk numerických a řetězcových hodnot. Mimo numerických hodnot a řetězců jsou podporována i pole, seznamy a, jak se na „matematickou“ aplikaci sluší a patří, i matice.
calc má však i své nevýhody. Jednou z nevýhod je to, že se jedná o poměrně nový program, který není zahrnut ve standardu POSIX. Nelze se tedy spoléhat, že skript určený pro calc bude provozovatelný na všech unixových systémech, o dalších typech systémů ani nemluvě, viz například slova autorů o portu na dnes nejrozšířenější desktopový systém:
NOTE: The main developers do not have access to a Windoz based platform. While we will make an effort to not break calc Windoz based system, our lack of a Windoz test environment will mean we will make mistakes from time to time. Hopefully Windowz users can overcome these mistakes. Of course you are welcome to send us any patches that fix your Windoz build environment.
Výše uvedená poznámka není (alespoň pro poslední vydanou verzi) až tak úplně pravdivá, protože pod Microsoft Windows je možné aplikaci calc přeložit a následně zprovoznit, a to buď s Cygwinem, nebo jako samostatnou aplikaci.
Druhým problémem, i když v praxi většinou méně podstatným, je menší rychlost provádění skriptů kromě základních matematických operací, které se provádí zhruba stejnou rychlostí jako u utilit dc a bc. V praxi se však s tímto problémem setkáme jen v ojedinělých případech, například při přesném výpočtu číselných řad nebo určitých integrálů při použití malého integračního kroku.
3. Základy práce s calcem
Před prvními pokusy s calcem je nutné aplikaci nejdříve nainstalovat, samozřejmě pokud se již ve vaší distribuci nenachází. Zdrojové kódy calcu jsou dostupné na adrese http://www.isthe.com/chongo/src/calc/ popř. na adrese http://www.isthe.com/chongo/tech/comp/calc/calc-download.html (stahuje se soubor calc-verze.tar.gz, například calc-2.11.11.tar.gz). Na téže adrese se nachází i balíky RPM, a to jak se zdrojovými kódy, tak i binární verzí a vývojářskou verzí – ta obsahuje hlavičkové soubory a knihovny, které je možné použít pro volání funkcí calcu z jiných aplikací, například z programů napsaných v céčku. V dalším textu budu popisovat instalaci z archivního souboru calc-2.11.11.tar.gz, která je univerzální pro všechny operační systémy:
- Nejprve se archiv rozbalí příkazy: gunzip calc-2.11.11.tar.gz a posléze tar -xvf calc-2.11.11.tar. Po rozbalení vznikne obvyklá adresářová struktura, v níž se mimo céčkových zdrojových souborů nachází i soubor Makefile a v několika podadresářích ukázkové skripty a nápověda (ta je mimochodem v calcu velmi podrobná a obsahuje i informace o vlastnostech, které by mohly překvapit především céčkaře při práci s touto aplikací).
- Další průběh instalace je ovlivněn tím, zda se má aplikace spolu s nápovědou, knihovnami a doprovodnými skripty instalovat do systému, nebo se bude pouze testovat v uživatelově domovském adresáři. Pokud by se mělo jednat o plnohodnotnou instalaci, je zapotřebí upravit nastavení cest v souboru Makefile, při testování se – alespoň na Linuxu – soubor Makefile upravovat nemusí a může se ihned přejít k následujícímu bodu instalace.
- Vlastní překlad je, jak to už v dnešní době bývá obvyklé, velmi jednoduchý: zapíše se příkaz make all a po doběhu překladu ještě make check, který přeloženou aplikaci otestuje pomocí mnoha numerických příkladů. Pokud se má provést instalace calcu do systému, musí se ještě provést příkaz make install.
Po provedeném překladu je možné začít calc používat. Ze začátku si ukážeme práci v interaktivním režimu, calc je však samozřejmě možné použít i s předpřipravenými skripty. Spuštění calcu v interaktivním režimu je velmi jednoduché: prostě se zavolá program calc a program by se měl ohlásit následujícím výpisem (které se může v jiných verzích mírně odlišovat):
C-style arbitrary precision calculator (version 2.11.11)
Calc is open software. For license details type: help copyright
[Type "exit" to exit, or "help" for help.]
Výše vypsané hlášení není zcela přesné, jelikož aplikaci je možné ukončit i příkazem quit, což je příjemné, protože já osobně si ukončovací příkazy mezi jednotlivými interaktivními programy pletu (škoda, že calc nepodporuje ještě archaický bye). Ihned po spuštění calcu je možné zadávat příkazy a aplikace je bude po jejich odeslání klávesou [Enter] provádět. Můžeme si to vyzkoušet na jednoduchých příkladech (podobně jako v předcházejících dílech tohoto seriálu i zde jsou příkazy zadávané uživatelem zvýrazněny tučným písmem):
[root@/usr/bin]:calc
C-style arbitrary precision calculator (version 2.11.11)
Calc is open software. For license details type: help copyright
[Type "exit" to exit, or "help" for help.]
; 1+2
3
; 2*3
6
; 1+2*3+4^5
1031
; 1<2
1
; 1>2
0
; quit
V dalších kapitolách si jednotlivé elementy programovacího jazyka calcu popíšeme podrobněji.
4. Hodnoty a proměnné
Numerické hodnoty (celočíselné či reálné) mohou být zadávány podobným způsobem jako v mnoha dalších programovacích jazycích, reálné hodnoty se zapisují buď svou celou a desetinnou částí nebo pomocí mantisy a exponentu:
0
1
3.14
3e10
Za zmínku stojí informace, že záporná čísla se vyjadřují pomocí své absolutní hodnoty (tj. čísla kladného) a unárního operátoru - zapsaného před absolutní hodnotou. V předchozím příkladu byla všechna čísla zapsána v desítkové soustavě, calc však podporuje i zápis v dalších třech číselných soustavách. Pokud jsou před numerickou hodnotou zapsány znaky 0×, jedná se o číslo zapsané v šestnáctkové (hexadecimální) soustavě, znaky 0b značí soustavu binární (to je užitečné rozšíření oproti céčku a je zajímavé, že céčko jako nízkoúrovňový jazyk tento zápis nepodporuje). A konečně znak 0 (nula) značí soustavu osmičkovou – to mimo jiné znamená, že celé číslo zapsané v desítkové soustavě nesmí začínat nulou. Následující čtyři řádky představují stejnou celočíselnou hodnotu 255 (desítkově):
255
0xff
0b11111111
0377
Kromě celých a reálných čísel pracuje calc i s čísly komplexními, které jsou zapisovány pomocí své reálné a imaginární části; imaginární část přitom musí obsahovat znak i:
1+2i
calc při deklaracích rozlišuje mezi třemi typy proměnných (datový typ proměnné není zapotřebí uvádět, calc si totiž typ odvodí z typu hodnoty do proměnné zapsané). Prvním typem jsou lokální proměnné, které jsou přístupné pouze uvnitř funkcí či příkazových bloků. Druhým typem jsou proměnné globální, ke kterým je možné přistupovat z libovolného místa programu. Třetím a posledním typem jsou statické proměnné, které jsou viditelné pouze uvnitř funkce či příkazového bloku, jejich hodnota je však zachována i po opuštění dané funkce či bloku. Proměnné se deklarují s pomocí klíčových slov local, global a static, viz následující příklad:
global a, b, c;
local x, y, z;
static zx1, zx2, zx3;
Proměnné nemusí obsahovat pouze numerické hodnoty, ale také řetězce nebo se může jednat o složitější datové typy – pole, seznamy, matice či objekty. O proměnných si povíme podrobnější informace v dalším pokračování tohoto seriálu, kde si ukážeme tvorbu funkcí.
5. Matematické výrazy a operátory
Matematické výrazy se v calcu zapisují podobným způsobem jako v programovacím jazyku C. Nejvýraznější rozdíl spočívá v tom, že se v interaktivním režimu na standardní výstup vypisují výsledky výpočtů, není tedy zapotřebí používat funkce print atd. Ve výrazech je možné používat velké množství operátorů, které se většinou zapisují v infixové podobě, tj. vždy mezi dvojicí operandů (těmi může být buď numerická konstanta nebo proměnná). Vzhledem k infixovému zápisu musí být stanovena priorita operátorů, kterou je možné měnit (jako ve většině programovacích jazyků) pomocí kulatých závorek. Přiorita některých operátorů se liší od jazyka C, a to zejména v případech, kdy céčková priorita (která, jak sami tvůrci tohoto jazyka přiznávají, není ideální) vedla k nadbytečné potřebě zápisu mnoha závorek k ovlivnění provádění operací. V první tabulce je uveden výpis všech operátorů, které calc nabízí, v tabulce druhé jsou operátory seřazeny podle své priority (směrem k nejvyšší prioritě).
Operátor | Typ operátoru | Význam |
---|---|---|
+ | binární | aritmetický součet |
– | binární | aritmetický rozdíl |
* | binární | aritmetický součin |
/ | binární | podíl s reálným výsledkem |
// | binární | podíl s celočíselným výsledkem |
% | binární | dělení modulo (u kladných čísel zbytek po dělení) |
^ | binární | mocnina (celočíselná) |
** | binární | mocnina (celočíselná) |
++ | unární | zvýšení hodnoty o jedničku |
-- | unární | snížení hodnoty o jedničku |
+ | unární | kladná hodnota |
– | unární | záporná hodnota (změna znaménka) |
! | unární | negace výrazu |
&& | binární | logický součin |
|| | binární | logický součet |
& | binární | bitový součin (prováděný bit po bitu) |
| | binární | bitový součet |
<< | binární | bitový posun doleva |
>> | binární | bitový posun doprava |
= | binární | operátor přiřazení (vrací přiřazenou hodnotu) |
+= | binární | přiřazení s aritmetickým součtem |
-= | binární | přiřazení s aritmetickým rozdílem |
*= | binární | přiřazení s aritmetickým součinem |
/= | binární | přiřazení s reálným podílem |
//= | binární | přiřazení s celočíselným podílem |
%= | binární | přiřazení s dělením modulo |
^= | binární | přiřazení s celočíselným umocněním |
**= | binární | přiřazení s celočíselným umocněním |
&= | binární | přiřazení s operací and |
|= | binární | přiřazení s operací or |
<<= | binární | přiřazení s bitovým posunem doleva |
>>= | binární | přiřazení s bitovým posunem doprava |
?: | ternární | podmíněný výběr jednoho ze dvou alternativních výrazů |
== | binární | test na relaci „rovná se“ |
!= | binární | test na relaci „nerovná se“ |
< | binární | test na relaci „menší než“ |
> | binární | test na relaci „větší než“ |
<= | binární | test na relaci „menší nebo rovno“ |
>= | binární | test na relaci „větší nebo rovno“ |
. | binární | přístup ke složce objektu |
, | binární | postupné vyčíslení více výrazů |
() | unární | volání funkce |
[] | binární | indexace pole |
[[]] | binární | indexace pole nebo objektu |
Priorita | Operátor |
---|---|
1 | , |
2 | += -= = /= %= //= &= |= <<= >>= ^= **= |
3 | = |
4 | ?: |
5 | || |
6 | && |
7 | == != <= >= < > |
8 | + – (binární operátory) |
9 | / // % |
10 | | |
11 | & |
12 | ^ ** << >> |
13 | + – ! (unární operátory) |
14 | ++ -- |
15 | [] [[]] . () |
6. Funkce použitelné v matematických výrazech
Aplikace calc implementuje velké množství funkcí, které je možné použít v matematických výrazech. Tyto funkce, které jsou rozděleny do několika skupin, jsou podrobně popsané v přiložené dokumentaci, v následující tabulce jsou uvedeny pouze ty nejpoužívanější či nejužitečnější funkce:
Funkce | Popis |
---|---|
sin | sinus |
cos | kosinus |
tan | tangens |
cot | kotangens |
atan2 | arkustangens |
abs | absolutní hodnota |
sqrt | druhá odmocnina |
fact | výpočet faktoriálu |
sum | součet hodnot |
ssq | součet čtverců hodnot |
avg | průměr hodnot |
ln | přirozený logaritmus (Eulerův) |
det | determinant matice |
matsum | součet prvků matice |
mattrans | transpozice matice |
str | převod čísla na řetězec |
strcat | spojení dvou řetězců |
strcmp | porovnání řetězců |
strcpy | kopie řetězce |
strlen | vrací délku řetězce |
strprintf | formátovaný tisk do řetězce |
substr | vrací podřetězec s řetězce |
7. Obsah dalšího pokračování tohoto seriálu
V sedmém pokračování tohoto seriálu se budeme věnovat popisu podmíněných příkazů, počítaných i nepočítaných smyček, vytvářením nových funkcí a dalším vlastnostem, které je možné při psaní skriptů pro calc použít.