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>&gt;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®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. <&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'. Vzaimodejs