Programovatelná a interaktivní kalkulačka bc

Petr Krčmář 3. 2. 2010

Pravděpodobně se vám už stalo, že jste museli použít svůj počítač k tomu, od čeho je odvozeno jeho jméno – k počítání. Možná jste sáhli po nějaké jednoduché grafické kalkulačce a jednoduchý výpočet vyřídili velmi rychle. Nebo jste narazili na to, že byste potřebovali sofistikovanější a mocnější nástroj.

Trojjediné bc

Mocný nástroj bc je tu s námi už velmi dlouho. Jedná se vlastně o matematický programovací jazyk, s jehož pomocí můžete provádět jednoduché, ale i velmi komplexní matematické výpočty. Existuje ve třech základních variantách: POSIX bc je původní a pevně definovaný bc jazyk, ze kterého se postupně vytvořily dialekty GNU bc a Plan 9 bc. Dnes je jednoznačně nejrozšířenější GNU bc, který naleznete zcela jistě ve své oblíbené distribuci.

Domovská stránka programu se nachází na webu FSF, kde můžete samozřejmě získat zdrojové kódy pod licencí GNU GPL. Díky naprosto minimálním nárokům na závislosti je možné bc provozovat na všech unixových systémech. Díky projektu GnuWin32 je možné bc provozovat i na MS Windows.

Pokud si chcete vše v tomto článku vyzkoušet bez instalace bc, můžete dokonce vyzkoušet plně funkční online variantu. Všechny zmíněné instalace GNU bc vycházejí z jedněch zdrojových kódů (aktuální je verze 1.06) a nabízejí shodné možnosti.

Jednoduché bc

Samotný příkaz můžete využít jak v řádkovém režimu, tak i v zajímavějším interaktivnějším. Na začátku můžeme využít především základní operátory jako součet (+), rozdíl (-), násobení (*) a dělení (/). Kromě toho tu máme také třeba zbytek po celočíselném dělení (%) nebo mocninu (^). Použití v řádce je jednoduché:

$ echo "(3+4)*7" | bc
49

Takto je možné utilitu využít například ve skriptech, kde potřebujeme jednoduše provádět složitější výpočty. Pro nás bude ale zajímavější interaktivní režim. K tomu přejdeme jednoduše tak, že příkaz spustíme bez parametrů.

Octneme se v jeho interaktivní konzole, ve které můžeme vytvářet základní výpočty. Příklad jako obvykle napoví nejvíce:

$ bc
4+7
11

5*5
25

14/7
2

(37-12)*3
75
quit

Vidíte, že jednoduché výpočty je možné provádět vlastně bez znalosti jazyka bc. Pokud chcete rychle spočítat několik čísel, jedná se o poměrně příjemnou cestu. Navíc si program pamatuje historii, ve které se můžete pohybovat pomocí kurzorových kláves, jak jsme na to zvyklí v shellu.

Mocnější bc

Jelikož se jedná o jazyk, pravděpodobně tušíte, že toho bude umět podstatně více. Základem jsou například proměnné, kterých je možné využít k ukládání výsledků a výpočty tak snadno řetězit a propojovat.

$ bc
cislo=12*2
druhe=cislo+7
druhe
31
quit

Vidíte, že jsem do proměnné cislo uložil výsledek výrazu 12*2, pak jsem vytvořil další proměnnou a k výpočtu její hodnoty jsem využil první proměnnou. Výsledek jsem pak vypsal pouhým zapsáním názvu proměnné. V bc existuje ještě jedna speciální proměnná, kterou reprezentuje znak tečky. Tečka obsahuje výsledek posledního výpočtu.

$ bc
7+3
10
.-7
3
quit

Samozřejmě je možné tečku využívat jako každou jinou proměnnou a můžete s ní tedy provádět další výpočty. Zatím jsme si ukázali jednoduché celočíselné výpočty. Program bc ale dovoluje pracovat se zcela libovolnou přesností. Ta se řídí proměnnou scale, která určuje, na kolik desetinných míst budou výpočty probíhat. Standardně je nastavena na nulu, takže je třeba ji v případě potřeby zvýšit.

& bc
scale


7/4
1

scale=2
7/4
1.75

scale=10
7/3
2.3333333333
quit

Ještě mocnější bc

Celá syntaxe bc je odvozena od programovacího jazyka C. Můžete tak využívat i dalších obvyklých operátorů jako ++, --, +=, -=, *=, /=, ^= a %=.

$ bc
a=10
a+=5
a
15

a-=9
a
6

a%=5
a
1

a++
2

quit

Zároveň můžeme použít i operátory pro porovnání, jako je rovnost (==), méně (<), více (>), více nebo rovno (>=), méně nebo rovno (<=) či nerovnost (!=). Zároveň je možné porovnání kombinovat klasicky pomocí and (&&) či or (||). Pokud jste zvyklí na syntaxi C, budete se v bc cítit jako doma.

Hustodémonsky krutopřísné bc

Od jednoduché matematiky se pak můžete přesunout k samotnému programovacímu jazyku. My si z něj ukážeme jen malý kousek jako demonstraci ohromných možností bc. To zvládá například takové věci jako jsou cykly.

$ bc
for(a=0;a<10;++a){
a;
}

1
2
3
4
5
6
7
8
9
quit

Využít můžete ale také smyček, jako například while.

$ bc
a=0
while(a<10{
a;
void ++a;
}

1
2
3
4
5
6
7
8
9
quit

V bc je možné definovat také vlastní funkce. Jejich zápis je opět velmi povědomý:

$ bc
define funkce(a){
return(a * a);
}
funkce(3)
9
quit

Delší sekvence příkazů samozřejmě nemusíte zapisovat a spouštět přímo, ale můžete si je zapsat do textového souboru a jeho jméno pak předat bc jako parametr. Program se spustí a bude načítat obsah souboru řádek po řádce, jako byste vše znovu opisovali ručně.

A ještě dál

Tím jsme ani zdaleka nevyčerpali možnosti a schopnosti bc. Pomocí silného jazyka je možné vytvářet podstatně komplexnější programy. K dispozici jsou například funkce pro práci s datem a časem a další užitečné možnosti. Pro poslední ukázku jsem si vypůjčil příklad z jednoho pokročilejšího tutoriálu:

# addgrg yyyymmdd days - adds days to yyyymmdd and outputs new yyyymmdd

if [ $# != 2 ]
 then
    echo "Not enough arguments"
    echo "Syntax addgrg yyyymmdd [-]days"
    exit
 fi

bc < 0 ; ++m){
      n = m(y,m);
      d -= n;
   }
   void --m;
   d+=n;
   g= (y*10000)+(m*100)+d;
   return(g);
}
/* convert gregorian (yyyymmdd) to julian(yyyyddd)*/
define j(g){
   auto y,m,d,x,i,j;
   y=g/10000;
   m=(g/100) % 100;
   d=g%100;
   for(x=1;xi){
      y+=1;
      d-=i;
      i=y(y);
   }
   while(d<1){
      y-=1;
      i=y(y);
      d+=i;
   }
   r= (y*1000)+d;
   return(r);

}
/* add positive or negative days to a greg date - returns new date */
define a(g,a){
   auto j,r;
   j=j(g);
   j=b(j,a);
   r=g(j)
   return(r);
}

 /* call add to greg using the two command line arguments*/
 a($1,$2)

quit
END-OF-INPUT

Tento ukázkový program umí pracovat s datem (ve formátu yyyymmdd) a dokáže k němu přičíst libovolný počet dnů. Jeho výstup pak vypadá takto:

addgrg 19980101 -1
19971231
addgrg 20000101 60
20000301
addgrg 20000101 59
20000229
addgrg 19000101 365
19010101
addgrg 20001231 -365
20000101

Výkonný, jak zrovna potřebujete

Výhodou bc je jeho opravdu široký záběr. Můžete jej považovat za příjemně jednoduchou kalkulačku s možností ukládání do proměnných, které podstatně zvyšují možnosti výpočtu. Můžete jej ale také brát jako komplexní prostředí pro složitou matematiku, které můžete zakomponovat do svých velkých skriptů. Tady máte nástroj. Využití je už na vás.

Další zdroje ke studiu

Našli jste v článku chybu?
120na80.cz: Víte, co je svobodná menstruace?

Víte, co je svobodná menstruace?

Měšec.cz: Platíme NFC mobilem. Konečně to funguje!

Platíme NFC mobilem. Konečně to funguje!

Lupa.cz: Olympiáda zakázala GIFy. Moc to nepomáhá

Olympiáda zakázala GIFy. Moc to nepomáhá

Měšec.cz: Investiční pasti. Děláte to, co ostatní, ale proděláváte

Investiční pasti. Děláte to, co ostatní, ale proděláváte

Vitalia.cz: Očkování je nutné, říká homeopatka

Očkování je nutné, říká homeopatka

Měšec.cz: Co s reklamací, když e-shop krachuje?

Co s reklamací, když e-shop krachuje?

Lupa.cz: Co najdete uvnitř kosmické sondy?

Co najdete uvnitř kosmické sondy?

DigiZone.cz: ČTÚ červenec: rušení trochu vzrostlo

ČTÚ červenec: rušení trochu vzrostlo

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

Lupa.cz: Kdo vykrádá LinkedIn? Zjistit to má soud

Kdo vykrádá LinkedIn? Zjistit to má soud

Podnikatel.cz: OSA zdraží, ale taky přidá nový poplatek

OSA zdraží, ale taky přidá nový poplatek

DigiZone.cz: AXN u FreeSatu měsíc zdarma

AXN u FreeSatu měsíc zdarma

DigiZone.cz: Hodlá Markíza skončit v DVB-T?

Hodlá Markíza skončit v DVB-T?

Podnikatel.cz: Kauza z Vinohrad pokračuje. Policie se omlouvá

Kauza z Vinohrad pokračuje. Policie se omlouvá

Podnikatel.cz: Česká pošta vycouvala ze služby ČP Cloud

Česká pošta vycouvala ze služby ČP Cloud

Měšec.cz: Test: Výběry z bankomatů v cizině a kurzy

Test: Výběry z bankomatů v cizině a kurzy

Root.cz: Xiaomi má vlastní notebook podobný Macu

Xiaomi má vlastní notebook podobný Macu

Vitalia.cz: 9 potravin, které nesmí chybět v jídelníčku těhotné

9 potravin, které nesmí chybět v jídelníčku těhotné

Lupa.cz: Hackujete? Můžete mít problém sehnat práci

Hackujete? Můžete mít problém sehnat práci

Měšec.cz: Na návštěvě na exekutorském úřadě

Na návštěvě na exekutorském úřadě