Hlavní navigace

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?

3. 2. 2010 9:46

Velmi casto koncim v pythonu – dovod je prosty – umi bitwise operace a to zapisem stejnym jako C :-)

Ve skriptech lze casto s uspechem pouzit to co umi sam shell, echo $((1+1)). Ale jinak bc rulez.

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

120na80.cz: Stoná vaše dítě často? Upravte mu jídelníček

Stoná vaše dítě často? Upravte mu jídelníček

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: 9 největších mýtů o mase

9 největších mýtů o mase

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Měšec.cz: Jak levně odeslat balík přímo z domu?

Jak levně odeslat balík přímo z domu?

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

Vitalia.cz: 4 pravidla pro návštěvu čerta

4 pravidla pro návštěvu čerta