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: Cestovní nevolnost. Co pomůže?

Cestovní nevolnost. Co pomůže?

Vitalia.cz: Jeďte do lázní, to je holistika

Jeďte do lázní, to je holistika

DigiZone.cz: Světlé zítřky gaučových sportovců

Světlé zítřky gaučových sportovců

120na80.cz: Aktivita klíšťat: stupeň 9

Aktivita klíšťat: stupeň 9

DigiZone.cz: Prima Max bude mít letní kino. Na střeše...

Prima Max bude mít letní kino. Na střeše...

DigiZone.cz: Pardubicko: Výrazně posílen Mux 3

Pardubicko: Výrazně posílen Mux 3

Vitalia.cz: Jíme přesolené potraviny. Zrovna tyhle

Jíme přesolené potraviny. Zrovna tyhle

Vitalia.cz: 3× o tucích: proč je potřebujeme?

3× o tucích: proč je potřebujeme?

120na80.cz: Proč komáři létají hlavně večer?

Proč komáři létají hlavně večer?

DigiZone.cz: Soud zakázal šíření TV Markíza v ČR

Soud zakázal šíření TV Markíza v ČR

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

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

Vitalia.cz: Jelení farma produkuje kvalitní maso

Jelení farma produkuje kvalitní maso

DigiZone.cz: HbbTV KinoSvět: už jede na dalších TV

HbbTV KinoSvět: už jede na dalších TV

DigiZone.cz: ČTÚ květen: rušení TV vysílání narůstá

ČTÚ květen: rušení TV vysílání narůstá

DigiZone.cz: Skylink: Nova Sport volně

Skylink: Nova Sport volně

DigiZone.cz: Náhrada za nevrácená zařízení?

Náhrada za nevrácená zařízení?

DigiZone.cz: Markíza: tady je předběžné opatření

Markíza: tady je předběžné opatření

DigiZone.cz: Mobilní aplikace pro DVTV je tady

Mobilní aplikace pro DVTV je tady

Vitalia.cz: Máte chutě? Nejezděte do světa, ale do Dobřichovic

Máte chutě? Nejezděte do světa, ale do Dobřichovic

DigiZone.cz: Slováci první, Češi třetí. Krásný...

Slováci první, Češi třetí. Krásný...