Programmy dlya vychisleniya s proizvol'noj tochnost'yu bc i dc
Proizvodstvenno-vnedrencheskij kooperativ
"I N T E R F E J S"
Dialogovaya Edinaya Mobil'naya
Operacionnaya Sistema
Demos/P 2.1
Programmy dlya vychisleniya
s proizvol'noj tochnost'yu
bc i dc
Moskva
1988
ANNOTACIYA
Programma bc pozvolyaet proizvodit' arifmeticheskie
vychisleniya s proizvol'noj tochnost'yu nad chislami proizvol'noj
velichiny, a takzhe soderzhit nekotorye yazykovye vozmozhnosti.
Imeyutsya sredstva dlya perevoda chisel iz odnoj sistemy schisle-
niya v druguyu.
Programma dc takzhe pozvolyaet proizvodit' arifmeticheskie
dejstviya s chislami proizvol'noj velichiny i tochnosti, a takzhe
realizuet drugie vozmozhnosti, predostavlyaemye programmoj bc.
Otlichie sostoit v tom, chto programma dc ispol'zuet obratnuyu
pol'skuyu zapis'.
1. VVEDENIE
bc - eto yazyk i kompiliruyushchaya programma dlya vypolneniya
arifmeticheskih operacij s proizvol'noj tochnost'yu v operaci-
onnoj sisteme DEMOS.
YAzyk imeet zavershennuyu strukturu upravleniya, rezhim
nemedlennogo vypolneniya operacij. Mogut byt' opredeleny i
sohraneny funkcii dlya posleduyushchego ih vypolneniya.
Imeetsya svojstvo masshtabirovaniya, kotoroe pozvolyaet
ispol'zovat' zapis' s desyatichnoj tochkoj, a takzhe vozmozhnost'
dlya vvoda i vyvoda chisel v sistemah schisleniya, otlichnyh ot
desyatichnoj. CHisla mogut byt' perevedeny iz desyatichnoj sis-
temy schisleniya (naprimer, v vos'merichnuyu) prosto ustanovkoj
vyhodnogo osnovaniya sistemy schisleniya v 8.
Dostupen nebol'shoj nabor bibliotechnyh funkcij, takih
kak sin, cos, arctan, log, exp i funkcii Besselya celochislen-
nogo poryadka.
bc rekomenduetsya primenyat', kogda neobhodimo osushchest-
vit' vychisleniya s bol'shimi celymi chislami s ochen' vysokoj
tochnost'yu i kogda neobhodimy preobrazovaniya chisel iz odnoj
sistemy schisleniya v druguyu.
Fakticheskij predel kolichestva cifr, kotorye mogut byt'
obrabotany, zavisit ot ob®ema pamyati, dostupnoj na mashine.
Manipulyacii s chislami s bolee chem sotnej cifr vozmozhny dazhe
na minimal'nyh versiyah DEMOS.
Dva chisla, sostoyashchie iz pyati soten cifr mogut byt'
peremnozheny, i rezul'tat, sostoyashchij iz tysyachi cifr, budet
poluchen primerno cherez pyatnadcat' sekund.
Sintaksis yazyka bc v znachitel'noj mere pohozh na sintak-
sis yazyka Si. Te, kto znakom s yazykom Si, legko osvoyat yazyk
bc.
dc - eto arifmeticheskij paket takzhe dlya vychislenij s
proizvol'noj tochnost'yu. On rabotaet po principu stekovogo
kal'kulyatora, ispol'zuya obratnuyu pol'skuyu zapis'. Obychno dc
operiruet s celymi desyatichnymi chislami, no on takzhe mozhet
rabotat' s chislami v sistemah schisleniya otlichnyh ot desyatich-
noj, a takzhe s chislami s drobnoj chast'yu.
Kompilyator bc vosprinimaet programmy, napisannye na
yazyke bc i kompiliruet vyvod, kotoryj interpretiruetsya prog-
rammoj dc. Nekotorye iz komand, o kotoryh rasskazyvaetsya v
opisanii dc, byli razrabotany dlya vzaimodejstviya kompilyato-
rov i trudny dlya vospriyatiya chelovekom.
CHisla, kotorye vvodyatsya v dc, pomeshchayutsya v stek.
Komandy dc proizvodyat dejstviya nad dvumya verhnimi chislami v
steke i pomeshchayut rezul'tat obratno v stek.
Esli v komandnoj stroke DEMOS ukazan argument, kotoryj
yavlyaetsya imenem fajla, to snachala schityvaetsya etot fajl ili
fajly, a zatem vvod pereklyuchaetsya na standartnyj (klaviaturu
terminala).
2. INTERAKTIVNYJ KALXKULYATOR bc
2.1. Prostye dejstviya s celymi chislami
Prostejshim tipom vyrazheniya yavlyaetsya arifmeticheskoe
vyrazhenie v samoj stroke. Naprimer, esli vy vvedete stroku:
123456789+987654321
programma pochti mgnovenno vydaet otvet:
1111111110
Mogut ispol'zovat'sya sleduyushchie operacii +, -, *, /, %,
i ^, kotorye oznachayut dejstviya slozheniya, vychitaniya, umnozhe-
niya, deleniya, opredeleniya ostatka i vozvedeniya v stepen'
sootvetstvenno. Rezul'tatom deleniya celyh chisel yavlyaetsya
celoe chislo bez drobnoj chasti. Pri delenii na nol' poyavlya-
etsya soobshchenie ob oshibke.
Pered lyubym chlenom vyrazheniya mozhet stoyat' znak minus,
kotoryj ukazyvaet na to, chto dannyj chlen otricatelen (unar-
nyj znak minus). Vyrazhenie:
1985+-R68
oznachaet, chto chislo -68 dolzhno byt' dobavleno k chislu 1985.
Bolee slozhnye vyrazheniya s neskol'kimi operaciyami i
skobkami interpretiruyutsya takzhe kak i v Fortrane. Operaciya
- 3 -
^ (vozvedenie v stepen') imeet naibol'shij prioritet vypolne-
niya, zatem sleduyut operacii * (umnozhenie), % (nahozhdenie
ostatka), / (delenie) i nakonec, operacii + (slozhenie) i -
(vychitanie). V pervuyu ochered' ocenivaetsya soderzhimoe vyrazhe-
nij, stoyashchih v skobkah. Vozvedenie v stepen' vypolnyaetsya
sprava nalevo, a ostal'nye operacii sleva napravo. Sleduyu-
shchie dva vyrazheniya:
a^b^c i a^(b^c)
ekvivalentny, takzhe kak ekvivalentny i vyrazheniya:
a*b*c i (a*b)*c
Dlya zapominaniya chisel ispol'zuyutsya vnutrennie registry
(peremennye), kotorye imeyut imena, sostoyashchie iz odnoj stroch-
noj latinskoj bukvy. Registru mozhet byt' obychnym sposobom
prisvoeno znachenie vyrazheniya. Vyrazhenie:
s=s+10
vypolnyaet uvelichenie na 10 znacheniya, soderzhashchegosya v
registre s imenem s. Esli, kak i v dannom sluchae, samym
vneshnim yavlyaetsya operator =, to osushchestvlyaetsya prisvaivanie,
no rezul'tat ne pechataetsya. Razreshaetsya ispol'zovat' ne
bolee 26 registrov.
Imeetsya vstroennaya funkciya izvlecheniya kvadratnogo kornya
(sqrt), prichem drobnaya chast' rezul'tata otbrasyvaetsya
(vychisleniya s bol'shej tochnost'yu opisany v razdele "Masshtabi-
rovanie"). Esli vvesti sleduyushchie stroki
q=sqrt(624)
q
to napechataetsya rezul'tat
24
2.2. Osnovaniya sistem schisleniya
Sushchestvuyut special'nye vnutrennie peremennye, nazyvae-
mye ibase i obase. Soderzhimoe ibase, pervonachal'no ustanov-
lennoe v 10, opredelyaet osnovanie sistemy schisleniya, ispol'-
zuemoe dlya vvodimyh chisel. Naprimer, v rezul'tate vypolneniya
sleduyushchih strok:
ibase=9
11
poyavitsya vyhodnaya stroka:
- 4 -
10
i, ustanoviv takim obrazom osnovanie sistemy schisleniya vvo-
dimyh chisel v 9, mozhno budet osushchestvlyat' preobrazovaniya iz
devyatirichnoj sistemy v desyatichnuyu. Zametim, chto nel'zya ver-
nut' obratno vhodnoe osnovanie v desyatichnoe, nabrav stroku
ibase=10
tak kak chislo 10 budet interpretirovat'sya kak devyatirichnoe,
i vhodnoe osnovanie ostanetsya bez izmeneniya.
CHtoby rabotat' v shestnadcatirichnoj sisteme schisleniya,
ispol'zuyutsya simvoly A-F dlya oboznacheniya cifr 10-15, soot-
vetstvenno. Ispol'zovanie simvolov A-F razreshaetsya v
kachestve chisel nezavisimo ot togo, kakaya sistema schisleniya
ustanovlena v dannyj moment.
Vyrazhenie
ibase=A
izmenit na desyatichnoe vhodnoe osnovanie, nezavisimo ot togo,
kakim bylo tekushchee osnovanie. Vvod proizvol'nyh chisel v
osnovaniyah men'she edinicy i bol'she shestnadcati ne podderzhi-
vaetsya.
Soderzhimoe obase pervonachal'no ustanovlennoe v 10,
ispol'zuetsya, kak osnovanie dlya vyvodimyh chisel. Tak, napri-
mer, vvedya stroki
obase=16
654321
poluchim v rezul'tate
9FBF1
chto yavlyaetsya, kak my i hoteli, pyatiznachnym shestnadcatirichnym
chislom. Ochen' bol'shie vyhodnye osnovaniya dopustimy, i oni
inogda byvayut polezny. Naprimer, bol'shie chisla mogut byt'
vyvedeny v gruppah po tri cifry, esli ustanovit' obase v
1000. Naprimer, esli vvesti sleduyushchie stroki
obase=1000
1234567890987654321234567890
to rezul'tat napechatetsya v vide
1 234 567 890 987 654 321 234 567 890
Neobychnye (t.e. 1, 0 ili otricatel'nye) osnovaniya takzhe
vosprinimayutsya.
- 5 -
Ochen' bol'shie chisla rasshcheplyayutsya pri vyvode na pechat'
po 70 simvolov na stroku. Stroki, ne yavlyayushchiesya poslednimi,
okanchivayutsya simvolom \. Desyatichnyj rezul'tat vyvoditsya
prakticheski mgnovenno, no vyvod ochen' bol'shih chisel (t.e.
bolee chem 100 cifr) s drugimi osnovaniyami proishodit
dovol'no medlenno. Vyvod v nedesyatichnyh osnovaniyah osushchestv-
lyaetsya primerno so skorost'yu 100 cifr za shest' sekund.
Rekomenduem zapomnit', chto na process vnutrennih vychis-
lenij ibase i obase ne vliyayut, tak kak vychisleniya vypolnya-
yutsya v desyatichnoj sisteme schisleniya, a ibase i obase ispol'-
zuyutsya tol'ko vo vremya perevoda v nuzhnuyu sistemu schisleniya
pri vvode i vyvode, sootvetstvenno.
2.3. Masshtabirovanie
Eshche odna special'naya vnutrennyaya peremennaya, nazyvaemaya
scale ispol'zuetsya dlya togo, chtoby opredelit' kolichestvo
znakov posle zapyatoj pri vychisleniyah. CHisla mogut soderzhat'
do 99 desyatichnyh cifr posle zapyatoj. |to kolichestvo znakov
sohranyaetsya v dal'nejshih vychisleniyah do teh por, poka ne
budet izmeneno.
Kogda nad dvumya masshtabirovannymi chislami proizvoditsya
odno iz arifmeticheskih dejstvij, rezul'tat imeet tochnost',
opredelyaemuyu sleduyushchimi pravilami. Dlya slozheniya i vychitaniya
tochnost' rezul'tata - bol'shaya iz tochnosti operandov. V etom
sluchae rezul'tat nikogda ne usekaetsya. Dlya umnozheniya toch-
nost' rezul'tata nikogda ne men'she, chem maksimum tochnostej
dvuh operandov, i ne bol'she, chem summa tochnostej operandov.
Tochnost' chastnogo ravna znacheniyu vnutrennej peremennoj
scale. Tochnost' ostatka est' summa tochnostej chastnogo i
delitelya. Rezul'tat vozvedeniya v stepen' masshtabiruetsya tak
zhe, kak i pri umnozhenii. Pokazatel' stepeni dolzhen byt'
celym. Tochnost' kvadratnogo kornya ustanavlivaetsya maksimal'-
noj iz tochnosti argumenta i scale.
Vse vnutrennie dejstviya fakticheski vypolnyayutsya v celyh
s otbrasyvaniem cifr, esli neobhodimo. V kazhdom sluchae, gde
otbrasyvayutsya cifry, proizvoditsya usechenie, a ne okruglenie.
Soderzhimoe scale dolzhno byt' ne bol'she 99 i ne men'she
nulya. Pervonachal'no ona ustanavlivaetsya v 0. V sluchae,
kogda trebuetsya bolee 99 drobnyh cifr, vy mozhete prisposo-
bit' svoe sobstvennoe masshtabirovanie.
Vnutrennie peremennye scale, ibase, obase mogut ispol'-
zovt'sya v vyrazheniyah takzhe kak i drugie peremennye. Stroka
scale=scale+1
uvelichivaet znachenie scale na edinicu a stroka
- 6 -
scale
vyzyvaet pechat' znacheniya scale.
Pri vychisleniyah znachenie scale ispol'zuetsya, kak koli-
chestvo desyatichnyh cifr, dazhe esli ibase i obase ne ravny 10.
Napomnim eshche raz, chto vnutrennie vychisleniya proizvodyatsya v
desyatichnoj sisteme schisleniya, a perevod v nuzhnuyu sistemu
schisleniya osushchestvlyaetsya pri vvode i vyvode chisla.
2.4. Funkcii
Imya funkcii takzhe sostoit iz odnoj strochnoj latinskoj
bukvy. Razreshaetsya, chtoby imena funkcij i peremennyh sovpa-
dali. Mozhno imet' dvadcat' shest' razlichnyh funkcij takzhe,
kak i dvadcat' shest' razlichnyh peremennyh. Stroka
define a(x){
nachinaet opredelenie funkcii s odnim argumentom. Za etoj
strokoj dolzhny sledovat' odno ili bolee predlozhenij, kotorye
sostavlyayut telo funkcii, okanchivayushcheesya pravoj figurnoj
skobkoj }. Vozvrat iz funkcii osushchestvlyaetsya togda, kogda
vypolnyaetsya operator return ili dostigaetsya konec funkcii.
Operator return mozhet byt' v odnoj iz dvuh form
return
return(x)
V pervom sluchae znacheniem funkcii yavlyaetsya nol', a vo vtorom
znachenie vyrazheniya v skobkah.
Peremennye, ispol'zuemye v funkciyah, mogut byt' ob®yav-
leny, kak avtomaticheskie, ispol'zuya vyrazhenie tipa
auto x,y,z
V funkcii mozhet byt' tol'ko odno vyrazhenie auto, i ono
dolzhno byt' pervym v opredelenii. Avtomaticheskie peremennye
razmeshchayutsya v pamyati i inicializiruyutsya v nol' pri vhode v
funkciyu i sbrasyvayutsya pri vyhode iz nee. Znacheniya lyubyh
peremennyh s imenami, sovpadayushchimi s imenami peremennyh v
funkcii, ne portyatsya, tak kak peremennye v funkciyah yavlyayutsya
lokal'nymi. Funkcii mogut byt' vyzvany rekursivno, i avtoma-
ticheskie peremennye na kazhdom urovne vyzova zashchishcheny. Imena
parametrov v opredelenii funkcii obrabatyvayutsya takim zhe
obrazom, chto i avtomaticheskie peremennye s edinstvennym isk-
lyucheniem, chto im prisvaivayutsya konkretnye znacheniya pri vhode
v funkciyu. Primer opredeleniya funkcii:
- 7 -
define f(x,y){
auto z
z=x*y
return(z)
}
Znachenie etoj funkcii, kogda ona budet vyzvana poluchitsya iz
proizvedeniya dvuh ee argumentov.
Funkciya vyzyvaetsya pri poyavlenii ee imeni, za kotorym
sleduyut argumenty, zaklyuchennye v skobki i razdelennye zapya-
tymi. Esli ispol'zovalos' nevernoe chislo argumentov, to
rezul'tat nepredskazuem.
Funkcii bez argumentov opredelyayutsya i vyzyvayutsya,
ispol'zuya pustye skobki: p().
Esli nabrat' stroku
f(3.14159,2,71828)
gde f - funkciya, kotoraya byla opisana vyshe, to napechataetsya
rezul'tat:
8.53972
a esli nabrat'
y=f(f(12,34),56)
to peremennoj y prisvoitsya znachenie 22848.
2.5. Indeksirovannye peremennye
Imya peremennoj, sostoyashchee iz odnoj strochnoj latinskoj
bukvy, za kotorym sleduet vyrazhenie, zaklyuchennoe v kvadrat-
nye skobki, nazyvaetsya indeksirovannoj peremennoj (element
massiva). Imya peremennoj nazyvaetsya imenem massiva, a vyra-
zhenie v kvadratnyh skobkah nazyvaetsya indeksom. Dopuskayutsya
tol'ko odnomernye massivy. Imena massivov mogut peresekat'sya
s imenami prostyh peremennyh i imenami funkcij. Esli u zna-
cheniya indeksa imeetsya drobnaya chast', to ona otbrasyvaetsya
pered ispol'zovaniem. Indeks dolzhen byt' bol'she libo raven
nulyu i men'she libo raven 2047.
Indeksirovannye peremennye mogut svobodno ispol'zo-
vat'sya v vyrazheniyah, v vyzovah funkcij i v operatorah
return.
Imya massiva mozhet ispol'zovat'sya, kak argument funkcii,
ili mozhet byt' opisano, kak avtomaticheskoe v opisanii funk-
cii, ispol'zuya pustye kvadratnye skobki:
- 8 -
p(c[])
define p(c[])
auto c[]
Kogda imya massiva ispol'zuetsya takim obrazom, kopiru-
etsya vse soderzhimoe massiva dlya ispol'zovaniya v funkcii i
vydaetsya ves' massiv pri vyhode iz funkcii. Dlya ukazaniya
vsego massiva v celom mozhno pol'zovat'sya tol'ko takimi spo-
sobami.
2.6. Upravlyayushchie operatory
Operatory if, while i for mogut ispol'zovat'sya dlya
togo, chtoby izmenyat' poryadok vypolneniya dejstvij v programme
ili vyzvat' povtorenie vypolneniya opredelennyh posledova-
tel'nostej. Telo kazhdogo iz etih operatorov - eto operator
ili sostavnoj operator, sostoyashchij iz neskol'kih operatorov,
zaklyuchennyh v figurnye skobki. Oni pishutsya sleduyushchim obra-
zom:
if(uslovie) operator
while(uslovie) operator
for(vyrazh1;uslovie;vyrazh2) operator
ili
if(uslovie) {operatory}
while(uslovie) {operatory}
for(vyrazh1;uslovie;vyrazh2) {operatory}
Uslovie v lyubom iz upravlyayushchih operatorov - eto vyrazhe-
nie v forme
m>>n
gde dva vyrazheniya svyazany odnoj iz shesti operacij otnosheniya:
<<, >>, <<=, >>=, == ili !=. Otnoshenie == oznachaet ekviva-
lentno, a otnoshenie != oznachaet ne ekvivalentno. Znachenie
ostal'nyh operacij otnosheniya yasno i tak.
Bud'te vnimatel'ny pri ispol'zovanii operacij = i ==,
tak kak nekorrektnoe ispol'zovanie odnoj operacii vmesto
drugoj ne mozhet byt' vyyavleno kompilyatorom, a pri ispol'zo-
vanii pervoj proizojdet prisvaivanie, a pri ispol'zovanii
vtoroj - sravnenie.
Operator if vyzovet vypolnenie svoego tela togda i
tol'ko togda, kogda uslovie istinno. Zatem upravlenie pere-
dastsya sleduyushchemu operatoru v posledovatel'nosti.
- 9 -
Operator while vyzovet mnogokratnoe vypolnenie svoego
tela do teh por, poka uslovie istinno. Uslovie proveryaetsya
pered kazhdym vypolneniem tela, i, esli uslovie lozhno, uprav-
lenie peredaetsya operatoru, sleduyushchemu za telom operatora
while.
Operator for nachinaetsya s vypolneniya vyrazh1. Zatem pro-
veryaetsya uslovie, i, esli ono istinno, vypolnyayutsya operatory
v tele operatora for. Zatem vypolnyaetsya vyrazh2. Proveryaetsya
uslovie i tak dalee. Tipichnoe ispol'zovanie operatora for -
eto upravlyaemoe povtorenie, takoe, naprimer, kak v operatore
for(i=1;i<=20;i=i+2)i
kotoryj budet pechata' celye nechetnye chisla v intervale ot 1
do 20. Dalee predstavleny neskol'ko primerov ispol'zovaniya
upravlyayushchih operatorov.
define f(n){
auto i, p
p=1
for(i=1;i<=n;i=i+1) p=p*i
return(p)
}
Togda, nabrav stroku
f(h)
poluchim pechat' znacheniya faktoriala chisla h, esli h celoe
polozhitel'noe. A eto opredelenie funkcii, kotoraya budet
vychislyat' znacheniya binomial'nyh koefficientov (predpolaga-
etsya, chto s i t - celye polozhitel'nye).
define b(s,t){
auto i, p
p=1
for(i=1;i<=t;i=i+1) p=p*(s-i+1)/i
return(p)
}
Sleduyushchaya funkciya vychislyaet znachenie eksponencial'noj funk-
cii summirovaniem sootvetstvuyushchego ryada, ne uchityvaya vozmozh-
- 10 -
nye oshibki otbrasyvaniya:
scale=25
define e(z){
auto a, b, c, d, n
a=1
b=1
c=1
d=0
n=1
while(1==1){
a=a*z
b=b*n
c=c+a/b
n=n+1
if(c==d) return(c)
d=c
}
}
2.7. Nekotorye detali
Sushchestvuyut nekotorye yazykovye osobennosti, o kotoryh
znaet kazhdyj pol'zovatel', dazhe, esli on ne pol'zovalsya imi.
Obychno operatory nabirayutsya po odnomu na stroke. Pozvo-
lyaetsya takzhe nabirat' neskol'ko operatorov na stroke, razde-
lyaya ih tochkoj s zapyatoj (;).
Esli operator prisvaivaniya zaklyuchen v kruglye skobki,
togda ego znachenie mozhno ispol'zovat', tam zhe, gde mozhno
ispol'zovat' vyrazhenie. Naprimer, esli nabrat' sleduyushchuyu
stroku
(y=y+123)
to proizojdet ne tol'ko ukazannoe prisvaivanie, no i napecha-
taetsya rezul'tiruyushchee znachenie.
A eto primer ispol'zovaniya znacheniya operatora prisvai-
vaniya, kogda on ne zaklyuchen v kruglye skobki:
p=n[k=k*3]
V etom sluchae znachenie n budet prisvoeno peremennoj p, a
takzhe k budet uvelicheno v tri raza pered tem, kak k budet
ispol'zovano kak indeks.
Sleduyushchie konstrukcii rabotayut v bc tak zhe, kak oni
vypolnyayutsya v yazyke Si. Podrobnee ukazano v "Detal'nom opi-
- 11 -
sanii" ili v rukovodstve po yazyku Si.
x=y=z to zhe, chto i x=(y=z)
x=+y x=x+y
x=-y x=x-y
x=*y x=x*y
x=/y x=x/y
x=%y x=x%y
x=^y x=x^y
x++ (x=x+1)-1
x-- (x=x-1)-1
++x x=x+1
--x x=x-1
PREDUPREZHDENIE! V nekotoryh iz etih konstrukcij sushchest-
venno nalichie ili otsutstvie probelov. Sushchestvuet razlichie
mezhdu a=-b i a= -b. V pervom sluchae peremennoj a budet
prisvoeno znachenie a-b", a vo vtorom -b.
2.8. Tri vazhnye veshchi
1. CHtoby vyjti iz programmy bc naberite quit.
2. Imeetsya vozmozhnost' vvodit' kommentarij, tak zhe, kak i v
yazykah Si i PL/1. Kommentarij nachinaetsya s "/*" i okan-
chivaetsya "*/".
3. Imeetsya biblioteka funkcij, kotoraya mozhet byt' ispol'zo-
vana, esli nabrat' pri vyzove komandy bc
bc -l
|ta komanda vyzovet zagruzku nebol'shgogo nabora biblio-
technyh funkcij, kotoryj soderzhit: sinus (nazvaetsya s),
kosinus (c), arktangens (a), natural'nyj logarifm (l),
eksponentu (e) i funkciyu Besselya celogo poryadka
(j(n,x)"). Nesomnenno, chto budut napisany i drugie funk-
cii. |ta biblioteka ustanavlivaet tochnost', ravnuyu 20
znakam posle zapyatoj. Vy mozhete pereustanovit' ee, esli
vam nado.
Bsli vy naberete
bc fajl ...
to bc prochitaet i vypolnit ukazannyj fajl ili fajly pered
tem, kak peredat' upravlenie na klaviaturu. Takim obrazom vy
mozhete zagruzit' svoi lyubimiye programmy i opredeleniya funk-
cij. Ispol'zovanie lichnyh fajlov ne isklyuchaet vozmozhnosti
ispol'zovaniya bibliotechnyh funkcij.
- 12 -
2.9. Detal'noe opisanie
2.9.1. Oboznacheniya
Na sleduyushchih stranicah sintaksicheskie kategorii obozna-
chayutsya strochnymi russkimi bukvami, vydelennymi kursivom
(naprimer vyrazhenie); klyuchevye slova - zhirnymi latinskimi
(naprimer scale); to, chto nahoditsya v kvadratnyh skobkah
yavlyaetsya neobyazatel'nym.
2.9.2. Znaki
Znaki sostoyat iz klyuchevyh slov, identifikatorov, kons-
tant, operatorov i razdelitelej. Razdelitelem znakov mogut
byt' probely, simvoly tabulyacii ili kommentarii. Simvol
novoj stroki ili tochka s zapyatoj razdelyayut predlozheniya.
2.9.2.1. Kommentarii
Kommentarii nachinayutsya simvolami /* i konchayutsya simvo-
lami */.
2.9.2.2. Identifikatory
Imeetsya tri vida identifikatorov - obychnye identifika-
tory, identifikatory massivov i identifikatory funkcij. Vse
tri tipa imeyut imena, sostoyashchie iz edinstvennoj strochnoj
latinskoj bukvy. Posle identifikatora massiva sleduyut kvad-
ratnye skobki, vozmozhno zaklyuchayushchie vyrazhenie, opredelyayushchee
indeks. Massivy odnomerny i mogut soderzhat' do 2048 elemen-
tov. Indeksirovanie nachinaetsya s nulya, poetomu massiv mozhet
imet' indeksy ot 0 do 2047. Znacheniya indeksov usekayutsya do
celogo. Za identifikatorom funkcii sleduyut kruglye skobki,
vozmozhno soderzhashchie argumenty. Imena treh tipov identifika-
torov ne peresekayutsya: programma mozhet imet' peremennuyu z,
massiv z i funkciyu z.
2.9.2.3. Klyuchevye slova
Sleduyushchie slova yavlyayutsya zarezervirovannymi klyuchevymi
slovami
ibase if
obase break
scale define
sqrt auto
length return
while quit
for
- 13 -
2.9.2.4. Konstanty
Konstanty sostoyat iz proizvol'noj dliny chisel s neobya-
zatel'noj desyatichnoj tochkoj. Dopuskayutsya takzhe shestnadcati-
richnye cifry A-F, kotorye imeyut znacheniya 10-15, sootvetst-
venno.
2.9.3. Vyrazheniya
Znachenie vyrazheniya pechataetsya, esli osnovnoj operator
ne operator prisvaivaniya. Starshinstvo operatorov takoe zhe,
kak i poryadok poyavleniya pri opisanii dalee v dokumente, s
naivysshim prioritetom u togo, kto poyavlyaetsya pervym.
2.9.3.1. Prostye vyrazheniya
2.9.3.1.1. Imenovannye vyrazheniya
Imenovannye vyrazheniya - eto vyrazheniya, kotorye hranyat
kakoe-libo znachenie. Proshche govorya, imenovannye vyrazheniya -
levaya chast' operatora prisvaivaniya. Znachenie imenovannogo
vyrazheniya - eto znachenie, hranimoe v imenovannom meste.
identifikatory
Prostye identifikatory - eto imenovannye vyrazheniya.
Oni imeyut nachal'noe nulevoe znachenie.
imya-massiva[vyrazhenie]
|lementy massiva - eto imenovannye vyrazheniya. Oni
imeyut nachal'noe nulevoe znachenie.
scale, ibase i obase
Vnutrennie registry scale, ibase i obase - eto imeno-
vannye vyrazheniya. scale - eto kolichestvo cifr posle
desyatichnoj tochki, kotoroe ispol'zuetsya v arifmeticheskih
dejstviyah. scale imeet nachal'noe nulevoe znachenie.
ibase i obase - eto osnovaniya sistem schisleniya vvodimyh
i vyvodimyh chisel, sootvetstvenno. Kak ibase, tak i
obase imeyut nachal'noe znachenie 10.
2.9.3.1.2. Vyzovy funkcij
imya-funk.([vyr.[,vyr...]])
Vyzov funkcii sostoit iz imeni funkcii, za kotorym sle-
duyut kruglye skobki, soderzhashchie razdelennyj zapyatymi
spisok vyrazhenij, kotorye yavlyayutsya argumentami funkcii.
Dopuskaetsya ispol'zovat', kak argument, ves' massiv,
esli pri ego opredelenii za imenem sleduyut pustye kvad-
ratnye skobki. Vse argumenty funkcii peredayutsya po
znacheniyu, poetomu izmeneniya, proizvodimye nad formal'-
nymi parametrami, ne imeyut vozdejstviya na fakticheskie.
Esli funkciya preryvaetsya vypolneniem operatora return,
to znachenie funkcii - eto znachenie vyrazheniya v skobkah
- 14 -
operatora return ili nul', esli vyrazhenie otsutstvuet
ili net operatora return.
sqrt(vyrazhenie)
Rezul'tatom yavlyaetsya kvadratnyj koren' iz vyrazheniya.
Rezul'tat usekaetsya do poslednej znachashchej desyatichnoj
cifry. Tochnost'yu rezul'tata yavlyaetsya bol'shaya velichina
iz tochnosti vyrazheniya ili scale.
length(vyrazhenie)
Rezul'tatom yavlyaetsya obshchee chislo desyatichnyh cifr v
vyrazhenii. Tochnost' rezul'tata - nol' znakov posle
zapyatoj.
scale(vyrazhenie)
Rezul'tatom yavlyaetsya tochnost' vyrazheniya. Tochnost'
rezul'tata - nol' znakov posle zapyatoj.
2.9.3.1.3. Konstanty
Konstatnty - eto prostye vyrazheniya.
2.9.3.1.4. Kruglye skobki
Vyrazhenie, okruzhennoe kruglymi skobkami - est' prostoe
vyrazhenie. Skobki ispol'zuyutsya dlya togo, chtoby izmenit'
obychnyj poryadok destvij.
2.9.3.2. Unarnye operacii
Unarnye operacii vypolnyayutsya sprava nalevo.
-vyrazhenie
Rezul'tatom yavlyaetsya vyrazhenie s protivopolozhnym znakom
++imenovannoe vyrazhenie
Imenovannoe vyrazhenie uvelichivaetsya na edinicu.
Rezul'tatom yavlyaetsya znachenie imenovannogo vyrazheniya
posle uvelicheniya.
--imenovannoe_vyrazhenie
Imenovannoe vyrazhenie umen'shaetsya na edinicu. Rezul'-
tatom yavlyaetsya znachenie imenovannogo vyrazheniya posle
umen'sheniya.
imenovannoe_vyrazhenie++
Imenovannoe vyrazhenie uvelichivaetsya na edinicu.
Rezul'tatom yavlyaetsya znachenie imenovannogo vyrazheniya
pered uvelicheniem.
imenovannoe_vyrazhenie--
Imenovannoe vyrazhenie umen'shaetsya na edinicu. Rezul'ta-
tom yavlyaetsya znachenie imenovannogo vyrazheniya pered
- 15 -
umen'sheniem.
2.9.3.3. Operaciya vozvedeniya v stepen'
Operaciya vozvedeniya v stepen' vypolnyaetsya sprava
nalevo.
vyrazhenie^vyrazhenie
Rezul'tatom yavlyaetsya pervoe vyrazhenie, vozvedennoe v
stepen' vtorogo vyrazheniya. Vtoroe vyrazhenie dolzhno byt'
celym. Esli a - eto tochnost' levogo vyrazheniya, a b -
absolyutnoe znachenie pravogo vyrazheniya (pokazatelya ste-
peni), to tochnost' rezul'tata vychislyaetsya po formule
min(a*b,max(scale,a))
2.9.3.4. Operacii gruppy umnozheniya
Operacii *, /, % vyolnyayutsya sleva napravo.
vyrazhenie*vyrazhenie
Rezul'tatom yavlyaetsya proizvedenie dvuh vyrazhenij. Esli
a i b - tochnosti oboih vyrazhenij, to tochnost' rezul'-
tata vychislyaetsya po formule
min(a+b,max(scale,a,b))
vyrazhenie/vyrazhenie
Rezul'tatom yavlyaetsya chastnoe ot deleniya dvuh vyrazhenij.
Tochnost' rezul'tata - znachenie scale.
vyrazhenie%vyrazhenie
Operaciya % vyrabatyvaet ostatok ot deleniya dvuh vyrazhe-
nij. Bolee tochno, a%b - eto a-a/b*b. Tochnost' rezul'-
tata - eto summa tochnosti delitelya i znacheniya scale.
2.9.3.5. Operacii gruppy slozheniya
Operacii gruppy slozheniya vypolnyayutsya sleva napravo.
vyrazhenie+vyrazhenie
Rezul'tatom yavlyaetsya summa dvuh vyrazhenij. Tochnost'
rezul'tata - eto maksimal'naya iz tochnostej oboih vyra-
zhenij.
vyrazhenie-vyrazhenie
Rezul'tatom yavlyaetsya raznost' dvuh vyrazhenij. Tochnost'
rezul'tata - eto maksimal'naya iz tochnostej oboih vyra-
zhenij.
- 16 -
2.9.3.6. Operatory prisvaivaniya
Operatory prisvaivaniya vypolnyayutsya sprava nalevo.
imenovannoe_vyrazhenie=vyrazhenie
|to vyrazhenie prisvaivaet znachenie vyrazheniya sprava
imenovannomu vyrazheniyu sleva.
imenovannoe_vyrazhenie=+vyrazhenie
imenovannoe_vyrazhenie=-vyrazhenie
imenovannoe_vyrazhenie=*vyrazhenie
imenovannoe_vyrazhenie=/vyrazhenie
imenovannoe_vyrazhenie=%vyrazhenie
imenovannoe_vyrazhenie=^vyrazhenie
Rezul'tat ukazannyh vyshe vyrazhenij ekvivalenten
imenov. vyr.=imenov. vyr. OP vyr.
gde OP - znak operacii posle znaka =.
2.9.4. Otnosheniya
V otlichie ot drugih operacij, operacii otnosheniya dopus-
timy tol'ko, kak ob®ekty operatorov if, while ili vnutri
operatora for.
vyrazhenie<vyrazhenie
vyrazhenie>vyrazhenie
vyrazhenie<=vyrazhenie
vyrazhenie>=vyrazhenie
vyrazhenie==vyrazhenie
vyrazhenie!=vyrazhenie
2.9.5. Klassy pamyati
V bc imeetsya tol'ko dva klassa pamyati - global'nyj i
avtomaticheskij (lokal'nyj). Komandoj auto trebuetsya opisy-
vat' tol'ko te identifikatory, kotorye yavlyayutsya lokal'nymi
dlya funkcij. Argumenty funkcij yavlyayutsya dlya nih lokal'nymi.
Vse drugie identifikatory podrazumevayutsya global'nymi i dos-
tupny dlya vseh funkcij. Vse identifikatory - global'nye i
lokal'nye - imeyut nulevoe nachal'noe znachenie.
- 17 -
Identifikatory, opisannye kak auto, razmeshchayutsya v pamyati pri
vhode v funkciyu i osvobozhdayutsya pri vyhode iz nee. Poetomu,
oni ne sohranyayut svoe znachenie mezhdu dvumya vyzovami funkcii.
Avtomaticheskie massivy opredelyayutsya imenem massiva, za koto-
rym sleduyut pustye kvadratnye skobki.
2.9.6. Operatory
Operatory dolzhny razdelyat'sya tochkoj s zapyatoj ili sim-
volom novoj stroki. Operatory vypolnyayutsya posledovatel'no,
za isklyucheniem teh sluchaev, gde poryadok ukazyvaetsya upravlya-
yushchimi operatorami.
Operatory vyrazhenij
Kogda operator est' vyrazhenie, esli glavnyj (vneshnij)
operator vyrazheniya ne est' operator prisvaivaniya, to
pechataetsya znachenie vyrazheniya, a za nim simvol novoj
stroki.
Sostavnye operatory
Operatory mogut byt' ob®edineny vmeste, kogda oni okru-
zheny figurnymi skobkami {}.
Strokovye operatory, zaklyuchennye v kavychki
"lyubaya_stroka"
|tot operator pechataet to, chto zaklyucheno v kavychki.
Operator if
if(uslovie)operator
Esli uslovie verno, to vypolnyaetsya operator.
Operator while
while(uslovie)operator
Operator vypolnyaetsya do teh por, poka uslovie istinno.
Proverka usloviya osushchestvlyaetsya pered kazhdym vypolne-
niem operatora.
Operator for
for(vyrazh.;uslovie;vyrazh.)operator
Operator for vypolnyaet te zhe dejstviya, chto i posledova-
tel'nost'
- 18 -
pervoe_vyrazhenie
while(uslovie){
operator
poslednee_vyrazhenie
}
Vse tri vyrazheniya dolzhny obyazatel'no prisutstvovat'.
Operator break
break
break vyzvaet preryvanie vypolneniya operatorov while
ili for
Operator auto
auto identifikator[,identifikator]
Operator auto vyzyvaet zavedenie znachenij identifikato-
rov v steke. Identifikatory mogut byt' obychnymi iden-
tifikatorami ili identifikatorami massiva. Identifika-
tor massiva opredelyaetsya tem, chto za imenem massiva
sleduyut pustye kvadratnye skobki. Operator auto dolzhen
byt' pervym operatorom v opredelenii funkcii.
Operator define
define([parametr[,parametr...]]){
operatory}
Operator define opredelyaet funkciyu. Parametry mogut
byt' prostymi identifikatorami ili imenami massivov.
Za imenami massivov dolzhny sledovat' pustye kvadratnye
skobki.
Operator return
return
return(vyrazhenie)
Operator return vyzyvaet okonchanie raboty funkcii, izv-
lechenie iz steka ee avtomaticheskih peremennyh i oprede-
lenie rezul'tata funkcii. Pervaya forma ekvivalentna
return(0). Rezul'tatom funkcii yavlyaetsya rezul'tat vyra-
zheniya v skobkah.
Okonchanie raboty
Operator quit ostanavlivaet vypolnenie programmy bc i
vozvrashchaet upravlenie sisteme DEMOS v tot moment, kogda
on poyavlyaetsya. Operator quit ne mozhet ispol'zovat'sya v
opredeleniyah funkcij ili v operatorah if, for ili
- 19 -
while.
2. INTERAKTIVNYJ STEKOVYJ KALXKULYATOR dc
2.1. Opisanie sintaksisa
V dannoj glave opisyvayutsya komandy dc, kotorye prednaz-
nacheny dlya ispol'zovaniya lyud'mi. Dopolnitel'nye komandy,
kotorye prednaznacheny dlya vyzova kompilyatrom, opisany v
"Detal'nom opisanii".
Na stroke dopuskaetsya lyuboe kolichestvo komand. Simvoly
probelov i novoj stroki ignoriruyutsya, isklyuchaya mest vnutri
chisel i teh mest, gde ozhidaetsya imya registra.
Vosprinimayutsya sleduyushchie konstrukcii:
chislo
Znachenie chisla pomeshchaetsya v stek. CHislo - eto nepreryvae-
maya cepochka cifr 0-9 i bol'shih latinskih bukv A-F, kotorye
rassmatrivayutsya kak znacheniya cifr 10-15, sootvetstvenno.
Dlya oboznacheniya otricatel'nogo chisla ispol'zuetsya znak
podcherk (_), kotoryj dolzhen predshestvovat' chislu. CHisla
mogut soderzhat' desyatichnuyu tochku.
+ - * / % ^
Verhnie dva znacheniya steka skladyvayutsya (+), vychitayutsya
(-), umnozhayutsya (*), delyatsya (/), ishchetsya ostatok ot dele-
niya pervogo na vtoroe (%) ili vozvodyatsya v stepen' (^).
Dva elementa izvlekayutsya iz steka, rezul'tat pomeshchaetsya
obratno v stek, v ego verhushku. Rezul'tat deleniya useka-
etsya do celogo otbrasyvaniem drobnoj chasti. Pri vozvede-
nii v stepen' pokazatel' stepeni dolzhen byt' celym. V
detal'nom opisanii opisyvaetsya, kak rabotat' s chislami s
desyatichnoj tochkoj.
sx
Verhushka osnovnogo steka izvlekaetsya i zapominaetsya v
registre s imenem x, gde x mozhet byt' lyubym simvolom.
Esli s - propisnaya bukva, to x vosprinimaetsya kak stek, i
znachenie pomeshchaetsya v nego. V imeni registra dopuskayutsya
lyubye simvoly, dazhe probely ili simvoly novoj stroki.
- 20 -
lx
Znachenie registra x zanositsya v stek. Znachenie registra
ne izmenyaetsya. Esli l - propisnaya bukva, to x vosprinima-
etsya kak stek, i ego verhnee znachenie izvlekaetsya i pome-
shchaetsya v osnovnoj stek.
Vse registry imeyut nachal'noe pustoe znachenie, kotoroe
vosprinimaetsya kak nulevoe komandoj l i kak oshibochnoe koman-
doj L.
d
Dubliruetsya znachenie verhushki steka.
p
Pechataetsya verhnee znachenie steka. Verhushka ostaetsya bez
izmenenij.
f
Pechatayutsya vse znacheniya v steke i v registrah.
h
Verhnij element steka rassmatrivaetsya kak cepochka simvo-
lov, izvlekaetsya iz steka i vypolnyaetsya, kak komandnaya
stroka dc.
[...]
Pomeshchaet cepochku simvolov, zaklyuchennuyu v kvadratnye skobki
v verhushku steka.
q
Vyhod iz programmy. Esli q vstretilos' pri vypolnenii
cepochki, to uroven' rekursii umen'shaetsya na dva. Esli q -
propisnaya bukva, to uroven' vlozhennosti steka umen'shaetsya
na velichinu verhushki steka.
<<h >>h =h !<<h !>>h !=h
Izvlekayutsya i sravnivayutsya dva verhnih elementa steka.
Esli ustanovlennoe otnoshenie spravedlivo, vypolnyaetsya
registr h, Vosklicatel'nyj znak oznachaet otricanie.
v
Zamenyaetsya verhnee znachenie steka na ego kvadratnyj
koren'. Kvadratnyj koren' celogo chisla usekaetsya do
celogo. Obrabotka chisel s desyatichnoj tochkoj opisyvaetsya v
- 21 -
detal'nom opisanii.
!
Ostavshayasya chast' stroki interpretirutesya kak komanda
DEMOS. Upravlenie vozvrashchaetsya v programmu dc, kogda
komanda zavershitsya.
c
Izvlekayutsya vse znacheniya steka; stek ochishchaetsya.
i
Izvlekaetsya verhnee znchenie steka, kotoroe rassmatrivaetsya
kak osnovanie sistemy schisleniya dlya posleduyushchih vvodimyh
chisel. Esli i - propisnaya bukva, to znachenie osnovaniya
sistemy schisleniya vvodimyh chisel zanositsya v stek. Osno-
vaniya sistem schisleniya men'she edinicy i bol'she 16 ne pod-
derzhivayutsya.
o
Izvlekaetsya verhnee znachenie steka, kotoroe rassmatriva-
etsya kak osnovanie sistemy schisleniya dlya posleduyushchih vyvo-
dimyh chisel. Esli o - propisnaya bukva, to znachenie osno-
vaniya sistemy schisleniya vyvodimyh chisel zanositsya v stek.
k
Izvlekaetsya verhnee znachenie steka, i eto znachenie ispol'-
zuetsya kak tochnost' vychislenij, kotoraya yavlyaetsya kolichest-
vom cifr posle zapyatoj pri vypolnenii umnozheniya, deleniya i
vozvedeniya v stepen'. Tochnost' dolzhna byt' bol'she libo
ravna nulyu i men'she 100. Esli k - propisnaya bukva, to zna-
chenie tochnosti zanositsya v stek.
z
Znachenie glubiny steka zanositsya v stek.
?
Stroka vvoda beretsya iz ishodnogo vvoda (obychno konsol') i
vypolnyaetsya.
2.2. Detal'noe opisanie
2.2.1. Vnutrennee predstavlenie chisel
CHisla zapominayutsya vnutri, ispol'zuya dinamicheskij rasp-
redelitel' pamyati. CHisla hranyatsya v forme cepochek cifr v
sisteme schisleniya s osnovaniem 100 po odnoj cifre na bajt
- 22 -
(storichnaya cifra). CHisla hranyatsya v poryadke ot mladshih cifr
k starshim. Naprimer, chislo 1234 imeet predstavlenie
"34 12". Posle lyuboj arifmeticheskoj operacii nad chislom
tshchatel'no proveryaetsya, chtoby vse cifry nahodilis' v inter-
vale ot 0 do 99 i ne bylo lidiruyushchih nulej. CHislo nol'
predstavlyaetsya pustoj cepochkoj.
Otricatel'nye chisla predstavleny zapis'yu storichnogo
dopolneniya (cifry predstavleny kak raznost' mezhdu 100 i
sootvetstvuyushchej cifroj), kotoroe analogichno zapisi dvoichnogo
dopolneniya dlya dvoichnyh chisel. Samaya starshaya cifra otrica-
tel'nogo chisla vsegda -1, a vse drugie cifry v intervale
0-99. Cifra, predshestvuyushchaya samoj starshej cifre -1, nikogda
ne mozhet byt' 99. Predstavlenie chisla -157 vo vnutrennej
forme: "43 98 -1". My nazovem etu formu kanonicheskoj formoj
chisla. Preimushchestvom etogo predstavleniya yavlyaetsya legkost'
slozheniya otricatel'nyh chisel. Kogda slozhenie vypolnyaetsya
cifra za cifroj, rezul'tat formal'no korrekten. Rezul'tat
tol'ko trebuet modifikacii, esli neobhodimo, dlya perevoda v
kanonicheskuyu formu.
Tak kak naibol'shee dopustimoe chislo 99, a v bajte mozhno
predstavlyat' vdvoe bol'shie chisla, to slozhenie mozhet vypol-
nyat'sya s perenosom.
Za samoj starshej cifroj hranitsya dopolnitel'nyj bajt,
pokazyvayushchij chislo dopustimyh desyatichnyh cifr posle zapyatoj.
Predstavlenie chisla .001: 1,3; chislo posle zapyatoj, pokazy-
vaet, chto eto chislo ne est' znachashchaya cifra. Znachenie etogo
dopolnitel'nogo chisla nazyvaetsya tochnost'yu chisla.
2.2.2. Raspredelitel' pamyati
Dlya vnutrennego hraneniya chisel, komand i dr. dc ispol'-
zuet dinamicheskij raspredelitel' pamyati cepochek. Vse schity-
vaemye i zapisyvaemye chisla prohodyat cherez etot raspredeli-
tel'. Vzaimodejs