Ocenite etot tekst:








          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容ma 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座av-
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

        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:
<&lt;,  >&gt;,  <&lt;=,  >&gt;=,  ==  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容kty 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容dineny 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. <&lt;h >&gt;h =h !<&lt;h !>&gt;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'. Vzaimodejstvie s kazhdoj cepochkoj v raspredelitele proishodit cherez chetyrehslovnyj zagolovok, soderzhashchij ukaza- teli na nachalo cepochki, ee konec, sleduyushchee mesto dlya zapisi i sleduyushchee mesto dlya chteniya. Svyaz' mezhdu raspredelitelem i dc osushchestvlyaetsya cherez ukazateli k etim zagolovkam. Raspredelitel' pervonachal'no imeet odnu bol'shuyu cepochku v spiske svobodnyh cepochek. Vse zagolovki, isklyuchaya odin, ukazyvayushchij na etu cepochku, imeyutsya v spiske svobodnyh zago- lovkov. Zaprosy na cepochki vypolnyayutsya po razmeru. Razmer fakticheski vydelyaemoj cepochki, est' blizhajshaya sleduyushchaya ste- pen' dvojki. Kogda vypolnyaetsya zapros na cepochku, rasprede- litel' sperva proveryaet svobodnyj spisok, chtoby uvidet', est' li tam cepochka nuzhnogo razmera. Esli nichego ne najdeno, raspredelitel' ishchet bolee dlinnuyu cepochku i rasshcheplyaet ee do teh por, poka ne poluchitsya cepochka nuzhnogo razmera. Ostavsha- yasya chast' cepochki pomeshchaetsya v svobodnyj spisok. Esli ne - 23 - imeetsya cepochek bol'shego razmera, raspredelitel' pytaetsya ob容dinit' svobodnye cepochki men'shego razmera v odnu bol'- shuyu. Tak kak vse cepochki yavlyayutsya rezul'tatom rasshchepleniya bol'shih cepochek, kazhdaya cepochka imeet sosednyuyu s nej v pamyati i, esli sosednyaya cepochka svobodna, to, chtoby uveli- chit' cepochku, mozhno trebuemuyu cepochku ob容dinit' s sosednej. Pri bezuspeshnoj popytke najti cepochku podhodyashchej dliny posle ob容dineniya, raspredelitel' zaprashivaet u sistemy svo- bodnoe mesto. Kolichestvo pamyati v sisteme yavlyaetsya edinst- vennym ogranicheniem na razmer i kolichestvo cepochek v dc. V raspredelitele imeyutsya programmy dlya chteniya, zapisi, kopirovaniya cepochek, sdviga v nachalo, sdviga vpered na shag i sdviga nazad na shag po cepochkam. Vse manipulyacii s cepoch- kami vypolnyayutsya, ispol'zuya eti programmy. Programmy chteniya i zapisi uvelichivayut ukazatel' chteniya ili ukazatel' zapisi tak, chto simvoly cepochki chitayutsya ili pishutsya podryad seriyami vyzovov chteniya ili zapisi. Ukazatel' zapisi yavlyaetsya, po sushchestvu, ukazatelem na konec soderzhashchej informaciyu chasti cepochki i pri popytke prochitat' informaciyu, nahodyashchuyusya za etim ukazatelem, chtenie okazhetsya bezuspeshnym, a programma chteniya v kachestve otveta vernet priznak konca cepochki. Popytka zapisat' za konec cepochki vynudit rasprede- litel' zaprosit' bol'shee prostranstvo i zatem skopirovat' staruyu cepochku v bol'shij blok. 2.2.3. Vnutrennyaya arifmetika Vse arifmeticheskie dejstviya vypolnyayutsya v celyh chislah. Operandy (ili operand), trebuyushchiesya dlya vypolneniya dejstviya izvlekayutsya iz glavnogo steka i u nih otbrasyvaetsya toch- nost', hranyashchayasya vmeste s chislom. Dlya togo, chtoby poluchit' rezul'tat vypolneniya programm vnutrennej arifmetiki s podho- dyashchej tochnost'yu, k operandam dobavlyayutsya nuli ili otbrasyva- yutsya lishnie cifry. Naprimer, esli tochnost' operandov raz- lichna, i trebuetsya vyravnivanie, kak eto byvaet pri slozhe- nii, k operandu s men'shej tochnost'yu dobavlyayutsya nuli. Posle vypolneniya trebuemoj arifmeticheskoj operacii pered tem, kak zanesti rezul'tat v stek, v konec chisla dobavlyaetsya znachenie ego tochnosti Registr, nazyvaemyj scale, ispol'zuetsya v bol'shinstve arifmeticheskih operacij; scale opredelyaet kolichestvo desya- tichnyh cifr v arifmeticheskih vychisleniyah. Znachenie scale mozhet byt' ustanovleno v velichinu, raspolozhennuyu v verhushke steka, s pomoshch'yu komandy k. Dlya togo, chtoby zanesti znachenie scale v stek, ispol'zuetsya komanda K. scale dolzhno byt' ne men'she nulya i men'she 100. Pri opisanii kazhdoj arifmeticheskoj operacii budet pokazano tochnoe vliyanie scale na vychisleniya. - 24 - 2.2.4. Slozhenie i vychitanie Tochnosti predstavleniya dvuh chisel sravnivayutsya, i k chislu s men'shej tochnost'yu dobavlyayutsya posleduyushchie nuli dlya togo, chtoby uravnyat' tochosti oboih chisel. Esli raznica toch- nostej nechetna, to chislo s men'shej tochnost'yu umnozhaetsya na 10. Tochnost' rezul'tata ustanavlivaetsya zatem v velichinu, ravnuyu bol'shej iz dvuh tochnostej. Vychitanie proizvoditsya invertirovaniem znaka chisla dlya togo, chtoby vychitanie zamenit' na slozhenie. Slozhenie vypolnyaetsya cifra za cifroj, nachinaya s mladshih razryadov k starshim. Perenos rasprostranyaetsya obychnym sposo- bom. Rezul'tiruyushchee chislo beretsya v kanonicheskoj forme, pri kotoroj mozhet potrebovat'sya ubrat' lidiruyushchie nuli ili, dlya otricatel'nyh chisel, zamenit' starshie cifry "99 -1" na "-1". V lyubom sluchae cifry, kotorye ne popadayut v interval 0-99, dolzhny byt' privedeny v etot interval, putem rasprostraneniya perenosa ili zaimstvovaniya iz drugih razryadov. 2.2.5. Umnozhenie Tochnosti dvuh operandov zapominayutsya i otbrasyvayutsya. Oba operanda delayutsya polozhitel'nymi. Zatem vypolnyaetsya umnozhenie sposobom cifra za cifroj. Pervoe chislo umnozhaetsya na kazhduyu cifru vtorogo chisla, nachinaya s mladshego razryada. Promezhutochnye rezul'taty nakaplivayutsya v chastnye summy, sum- mirovanie kotoryh daet okonchatel'nyj rezul'tat. Rezul'tat zanositsya v kanonicheskoj forme, a ego znak opredelyaetsya iz znakov operandov. Tochnost' rezul'tata ustanavlivaetsya ravnoj summe toch- nostej dvuh operandov. Esli eta tochnost' bol'she, chem znache- nie vnutrennego registra scale, a takzhe bol'she, chem tochnosti oboih operandov, to tochnost' rezul'tata ustanavlivaetsya v maksimal'noe iz etih treh znachenij. 2.2.6. Delenie Tochnosti oboih operandov otbrasyvayutsya. U delimogo otb- rasyvayutsya lishnie cifry ili dobavlyayutsya nedostayushchie nuli, chtoby sdelat' tochost' rezul'tata celogo deleniya ravnoj zna- cheniyu vnutrennej peremennoj scale. Znaki zapominayutsya i otbrasyvayutsya. Delenie vypolnyaetsya takzhe, kak esli by ono vypolnyalos' vruchnuyu. Vychislyaetsya raznica dlin oboih chisel. Esli deli- tel' dlinnee delimogo, vozvrashchaetsya znachenie nol'. V protiv- nom sluchae dve starshie cifry delimogo delyatsya na starshuyu cifru delitelya. Rezul'tat etogo dejstviya ispol'zuetsya kak pervaya (starshaya) cifra chastnogo. Probnaya cifra umnozhaetsya na delitel', i rezul'tat vychitaetsya iz delimogo, i dlya - 25 - polucheniya ocherednoj cifry chastnogo process povtoryaetsya do teh por, poka ostatok delimogo ne stanet men'she delitelya. V konce processa cifry chastnogo perevodyatsya v kanonicheskuyu formu i, esli eto neobhodimo, proishodit rasprostranenie perenosa. Znak opredelyaetsya iz znakov oboih operandov. 2.2.7. Nahozhdenie ostatka Dlya nahozhdeniya ostatka vyzyvaetsya programma deleniya, i vypolnyaetsya delenie tak, kak eto bylo opisano v predydushchem razdele. Vozvrashchaemyj rezul'tat - est' ostatok ot deleniya posle zaversheniya processa deleniya. Znak ostatka imeet takoj zhe znak, chto i delimoe. Tochnost' ostatka ustanavlivaetsya v maksimal'nuyu iz velichin tochnosti delimogo i tochnosti chast- nogo plyus tochnost' delitelya. 2.2.8. Vychislenie kvadratnogo kornya Iz operanda ubiraetsya tochnost'. Esli neobhodimo, dobavlyayutsya nuli dlya togo, chtoby poluchit' v rezul'tate tre- buemuyu tochnost'. Dlya vychisleniya ispol'zuetsya metod N'yutona s posleduyushchej aproksimaciej po pravilu: x[n+1] = 1/2 (x[n] + y / x[n]) Nachal'noe predpolozhenie beretsya iz rascheta, chto kvadratnyj koren' raven starshim dvum cifram. 2.2.9. Vozvedenie v stepen' Razreshaetsya vozvedenie v stepen' tol'ko s celym pokaza- telem stepeni. Esli pokazatel' stepeni raven nulyu, to rezul'tat raven edinice. Esli pokazatel' stepeni otricate- len, to on delaetsya polozhitel'nym, a na osnovanie delitsya edinica. SHkala rezul'tata otbrasyvaetsya. Celyj pokazatel' stepeni rassmatrivaetsya kak dvoichnoe chislo. Osnovanie posledovatel'no vozvoditsya v kvadrat, a rezul'tat poluchaetsya kak proizvedenie rezul'tatov etih voz- vedenij osnovaniya, kotorye sootvetstvuyut poziciyam v dvoichnom predstavlenii pokazatelya stepeni. CHtoby sdelat' tochnost' rezul'tata takoj zhe, kak i pri umnozhenii (kotoroe na samom dele i vypolnyalos'), otbrasyvaetsya neobhodimoe kolichestvo cifr. 2.2.10. Perevod vvodnyh chisel i vhodnaya sistema schisleniya CHisla preobrazuyutsya vo vnutrennee predstavlenie po mere ih schityvaniya. Tochnost' hranitsya s chislom i yavlyaetsya koli- chestvom desyatichnyh cifr posle zapyatoj. Pered otricatel'nymi chislami stavitsya znak "_" (podcherk). SHestnadcatirichnye cifry A-F sootvetstvuyut chislam 10-15, nezavisimo ot vhodnogo osnovaniya sistemy schisleniya. Dlya izmeneniya osnovaniya sistemy schisleniya vvodimyh chisel ispol'zuetsya komanda i. |ta - 26 - komanda izvlekaet iz steka, usekaet rezul'tiruyushchee chislo do celogo i ispol'zuet ego kak osnovanie sistemy schisleniya dlya posleduyushchego vvoda chisel. Pervonachal'no vhodnaya sistema schisleniya - desyatichnaya. Komanda I zanosit znachenie osnova- niya sistemy schisleniya vvodnyh chisel v stek. 2.2.11. Vyvodnye komandy Komanda p vyzyvaet pechat' verhushki steka. Pri etom ver- hushka steka ne izvlekaetsya. Dlya togo, chtoby vyvesti soderzhi- moe vseh vnutrennih registrov i vsego steka, ispol'zuetsya komanda f. Dlya togo, chtoby izmenit' osnovanie sistemy schis- leniya vyvodnyh chisel, ispol'zuetsya komanda o. Po etoj komande izvlekaetsya verhushka steka, usekaetsya do celogo i eto znachenie ispol'zuetsya v dal'nejshem kak osnovanie sistemy schisleniya dlya vyvodnyh chisel. Sistema schisleniya dlya vyvod- nyh chisel pervonachal'no ustanovlena v desyatichnuyu. Komanda O zanosit znachenie osnovaniya sistemy schisleniya dlya vyvodnyh chisel v stek. 2.2.12. Vyhodnoj format i vyhodnaya sistema schisleniya Vhodnaya i vyhodnaya sistemy schislenij vliyayut tol'ko na interpretaciyu chisel pri vvode i vyvode, no ne vliyayut na arifmeticheskie vychisleniya. Bol'shie chisla vyvodyatsya po 70 cifr na stroke. Esli stroka imeet prodolzhenie, to na eto ukazyvaet znak \ (obratnaya kosaya cherta) v konce stroki. Mozhno rabotat' s lyubymi sistemami schisleniya, hotya ne vse dostatochno celesoobrazny. V chastnosti, naprimer, polezna sistema schisleniya s osnovaniem 1000, pri kotoroj vyvodimye chisla pechatayutsya gruppami po tri cifry. Vos'merichnaya i shestnadcatirichnaya sistemy schisleniya ispol'zuyutsya dlya pere- voda v i iz etih sistem schisleniya. 2.2.13. Vnutrennie registry CHisla ili cepochki mogut byt' zapomneny vo vnutrennih registrah ili zagruzheny v stek iz registrov, ispol'zuya komandy s i l. Po komande sx proishodit izvlechenie zacheniya verhushki steka i zapominanie ego v registre x. x mozhet byt' lyubym simvolom. Po komande lx proishodit zapis' znacheniya registra x v verhushku steka. Komanda l ne izmenyaet soderzhi- moe registra, a komanda s ego izmenyaet. 2.2.14. Stekovye komandy Komanda c chistit stek. Komanda d dubliruet chislo v ver- hushke steka. Komanda z zanosit v stek dlinu steka. Komanda X zamenyaet chislo v verhushke steka ego tochnost'yu. Komanda Z zamenyaet verhushku steka ego dlinoj. - 27 - 2.2.15. Opisaniya i vyzovy funkcij Stroka iz simvolov v kode KOI-8, zaklyuchennaya v kvadrat- nye skobki, zanositsya v stek. Komanda q prekrashchaet rabotu ili, pri vypolnenii po stroke, umen'shaet uroven' vlozhennosti na dva. 2.2.16. Vnutrennie registry - programmirovanie na dc Dlya togo, chtoby programmirovat', rabotaya s programmoj dc, mozhno pol'zovat'sya komandami zagruzki i zapominaniya l i s, zapominaniya strok "[]", komandoj vypolneniya x, komandami proverki <&lt;, >&gt;, =, !<&lt;, !>&gt;, != Komanda x rassmatrivaet ver- hushku steka kak komandu programmy dc i vypolnyaet ee. Komandy proverki sravnivayut dva verhnih elementa steka, i, esli uslovie spravedlivo, to vypolnyaetsya registr x, kotoryj sleduet za operaciej otnosheniya. Naprimer, dlya togo, chtoby napechatat' chisla 0-9, nado nabrat' sleduyushchuyu programmu: [lip1+ si li10>&gt;a]sa 0si lax 2.2.17. Stekovye registry i massivy Sleduyushchie komandy byli razrabotany dlya ispol'zovaniya ne lyud'mi, a kompilyatorom. Oni ohvatyvayut stekovye registry i massivy. Krome steka, s kotorym rabotayut komandy, dc imeet takzhe neskol'ko individual'nyh stekov dlya kazhdogo registra. |ti registry operiruyut s komandami S i L. Sx zanosit verhnee znachenie glavnogo steka v stek dlya registra x. Lx izvlekaet znachenie iz steka registra x i zanosit rezul'tat v osnovnoj stek. Komandy s i l takzhe rabotayut s registrami, no ne kak so stekami. l ne izmenyaet verhushku registrovogo steka, a s razrushaet to, chto tam nahodilos' ranee. K komandam dlya raboty s massivami otnosyatsya : i ;. :x izvlekaet znachenie steka i ispol'zuet ego kak indeks k mas- sivu x. Sleduyushchij element steka zapominaetsya v elemente mas- siva x s etim indeksom. Indeks dolzhen byt' bol'she nulya i men'she 2047. ; - eto komanda dlya zagruzki osnovnogo steka iz massiva x. Znachenie verhushki steka - eto indeks v massive x, otkuda dolzhna proizojti zagruzka. 2.2.18. Prochie komandy Komanda ! interprtiruet ostatok stroki kak komandu DEMOS i peredaet ee sisteme dlya vypolneniya. Drugaya komanda kompilyatora - Q. |ta komanda ispol'zuet verhushku steka kak chislo urovnej rekursii, kotoroe nado propustit'. - 28 - 2.3. Vybor reshenij Osnovnoj prichinoj ispol'zovaniya raspredelitelya dinami- cheskoj pamyati bylo to, chto programma obshchego naznacheniya mogla byt' (i byla na samom dele) ispol'zovana dlya mnozhestva dru- gih zadach. Esli zaranee ne izvestno, kakova budet dlina cepochki, raspredelitel' prinimaet znachenie dlya vvoda i kom- pilyacii (t.e. komandy, zaklyuchennye v kvadratnye skobki [...]). Rezul'tat byl takov, chto pri skromnoj stoimosti vo vremya vypolneniya vse soobrazheniya po povodu raspredeleniya cepochek i razmerov cepochek byli udaleny iz ostavshejsya chasti programmy, i otladka stala bolee legkoj. Ispol'zuemyj metod tratil primerno 25% dostupnoj pamyati. Vybor chisla 100 kak osnovaniya sistemy schsleniya dlya vnutrennej arifmetiki po-vidimomu ne imeet yavnogo preimu- shchestva. Krome togo, osnovanie sistemy schisleniya ne dolzhno prevyshat' 127 iz-za apparatnyh ogranichenij; i pri stoimosti 5% pamyati otladka stala mnogo legche, a desyatichnyj vyvod sushchestvenno bystree. Prichina sozdaniya arifmetiki stekovogo tipa - dat' voz- mozhnost' vsem komandam dc ot slozheniya do vypolneniya podprog- ramm po-sushchestvu vypolnyat'sya odinakovo. Rezul'tatom yavilos' znachitel'noya stepen' logicheskogo razdeleniya konechnoj prog- rammy na moduli s ochen' malen'koj svyaz'yu mezhdu nimi. Iz-za nedostatka vzaimodejstviya mezhdu shkaloj i osnova- niyami sistem schisleniya razumnym bylo obespechit' ponimaemost' sposoba vypolneniya posle izmeneniya shkaly ili osnovaniya, kogda chisla uzhe byli vvedeny. Rannyaya versiya, kotoraya imela glbal'nye ponyatiya shkaly i osnovaniya sistemy schisleniya, ne byla horosho razrabotana. Esli znachenie scale interpretirova- los' v tekushchej vvodnoj ili vyvodnoj sisteme schisleniya, to izmenenie sistemy schisleniya ili shkaly v seredine vychisleniya mog vyzvat' nepravil'nuyu interpretaciyu rezul'tatov. Tekushchaya shema imeet to preimushchestvo, chto znachenie vhodnogo i vyhod- nogo osnovanij sistem schisleniya ispol'zuetsya tol'ko dlya vvody i vyvoda sootvetstvenno, i ignoriruetsya vo vseh drugih dejstviyah. Znachenie shkaly ne ispol'zuetsya dlya lyubyh sushchest- vennyh celej v lyuboj chasti programmy, a ispol'zuetsya tol'ko dlya togo, chtoby predotvratit' uvelichenie kolichestva desyatich- nyh znakov za granicy tekushchej tochnosti. Razumnym resheniem vybora shkaly rezul'tatov arifmetiches- kih dejstvij bylo by to, chto pri yavnom ukazanii pol'zovatelya ni odna znachashchaya cifra ne dolzhna byt' otbroshena. Dejstvi- tel'no, esli pol'zovatel' hochet slozhit' chisla 2.5 i 3.1415, to kazhetsya razumnym dat' emu rezul'tat 5.6415, poskol'ku v ostal'nyh znachashchih cifrah net neobhodimosti. S drugoj storony, pri umnozhenii i vozvedenii v stepen' vyrabatyvaetsya rezul'tat s kolichestvom cifr bol'shim, chem u - 29 - operandov, i kazhetsya razumnym dat' kak mimnimum kolichestvo cifr v operandah, a ne bol'she, esli tol'ko pol'zovatel' ne ukazhet yavno kolichestvo cifr, opredeliv znachenie scale. Kvadratnyj koren' mozhet byt' vychislen tak zhe, kak i umnozhe- nie. Vpolnenie deleniya daet proizvol'noe kolichestvo cifr, i ne tak prosto predpolozhit' pozhelaniya pol'zovatelya otnosi- tel'no kolichestva cifr. V etom sluchae pol'zovatel' dolzhen opredelit' znachenie scale. SHkala ostatka vybrana dlya togo, chtoby mozhno bylo vosstanovit' delimoe iz chastnogo i ostatka. |to legko vypolnit': ni odna cifra ne otbrasyvalas'. - 30 - SODERZHANIE ANNOTACIYA ......................................... 2 1. VVEDENIE .......................................... 2 2. INTERAKTIVNYJ KALXKULYATOR bc ...................... 3 2.1. Prostye dejstviya s celymi chislami ............... 3 2.2. Osnovaniya sistem schisleniya ...................... 4 2.3. Masshtabirovanie ................................. 6 2.4. Funkcii ......................................... 7 2.5. Indeksirovannye peremennye ...................... 8 2.6. Upravlyayushchie operatory ........................... 9 2.7. Nekotorye detali ................................ 11 2.8. Tri vazhnye veshchi ................................. 12 2.9. Detal'noe opisanie .............................. 13 2.9.1. Oboznacheniya ................................... 13 2.9.2. Znaki ......................................... 13 2.9.2.1. Kommentarii ................................. 13 2.9.2.2. Identifikatory .............................. 13 2.9.2.3. Klyuchevye slova .............................. 13 2.9.2.4. Konstanty ................................... 14 2.9.3. Vyrazheniya ..................................... 14 2.9.3.1. Prostye vyrazheniya ........................... 14 2.9.3.1.1. Imenovannye vyrazheniya ..................... 14 2.9.3.1.2. Vyzovy funkcij ............................ 14 2.9.3.1.3. Konstanty ................................. 15 2.9.3.1.4. Kruglye skobki ............................ 15 2.9.3.2. Unarnye operacii ............................ 15 2.9.3.3. Operaciya vozvedeniya v stepen' ............... 16 2.9.3.4. Operacii gruppy umnozheniya ................... 16 2.9.3.5. Operacii gruppy slozheniya .................... 16 2.9.3.6. Operatory prisvaivaniya ...................... 17 2.9.4. Otnosheniya ..................................... 17 2.9.5. Klassy pamyati ................................. 17 2.9.6. Operatory ..................................... 18 2. INTERAKTIVNYJ STEKOVYJ KALXKULYATOR dc ............. 20 2.1. Opisanie sintaksisa ............................. 20 2.2. Detal'noe opisanie .............................. 22 2.2.1. Vnutrennee predstavlenie chisel ................ 22 2.2.2. Raspredelitel' pamyati ......................... 23 2.2.3. Vnutrennyaya arifmetika ......................... 24 2.2.4. Slozhenie i vychitanie .......................... 25 2.2.5. Umnozhenie ..................................... 25 2.2.6. Delenie ....................................... 25 2.2.7. Nahozhdenie ostatka ............................ 26 2.2.8. Vychislenie kvadratnogo kornya .................. 26 2.2.9. Vozvedenie v stepen' .......................... 26 2.2.10. Perevod vvodnyh chisel i vhodnaya sistema schisle- niya ........................................... 26 - 31 - 2.2.11. Vyvodnye komandy .............................. 27 2.2.12. Vyhodnoj format i vyhodnaya sistema schisleniya .. 27 2.2.13. Vnutrennie registry ........................... 27 2.2.14. Stekovye komandy .............................. 27 2.2.15. Opisaniya i vyzovy funkcij ..................... 28 2.2.16. Vnutrennie registry - programmirovanie na dc .. 28 2.2.17. Stekovye registry i massivy ................... 28 2.2.18. Prochie komandy ................................ 28 2.3. Vybor reshenij ................................... 29 - 32 -

Last-modified: Mon, 29 Jun 1998 13:54:30 GMT
Ocenite etot tekst: