1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
|
.\"
.\" bc.1 - the *roff document processor source for the bc manual
.\"
.\" This file is part of bc written initially for MINIX.
.\" Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
.\"
.\" This program is free software; you can redistribute it and/or modify
.\" it under the terms of the GNU General Public License as published by
.\" the Free Software Foundation; either version 2 of the License , or
.\" (at your option) any later version.
.\"
.\" This program is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public License
.\" along with this program; see the file COPYING. If not, write to
.\" the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
.\"
.\" You may contact the author by:
.\" e-mail: phil@cs.wwu.edu
.\" us-mail: Philip A. Nelson
.\" Computer Science Department, 9062
.\" Western Washington University
.\" Bellingham, WA 98226-9062
.\"
.\"
.TH bc 1 .\" "Kziknyv" v1.03 "Nov 2, 1994"
.SH NV
bc \- Lebegpontos kalkultor nyelv
.SH TTEKINTS
\fBbc\fR [ \fB-lws\fR ] [ \fI fjl ...\fR ]
.SH VERZI
Ez a kziknyv lap a GNU bc 1.03-as verzijt rja le.
.SH LERS
\fBbc\fR egy olyan nyelv, amely lebegpontos szmolst nyjt, interaktv
vgrehajtssal. Van nmi hasonlsg a C programozsi nyelvvel. Egy standard
matematikai knyvtr megadhat parancssor paramterknt. Ha szksges, a
matematikai knyvtrat definilni kell, mieltt brmilyen ms fjlt
feldolgoznnk. A \fBbc\fR a megadott fjlokban lev kdot a megads
sorrenjben dolgozza fel. Miutn minden fjlt feldolgozott a \fBbc\fR
a szabvnyos bemenetrl vr tovbbi utastsokat. Minden kdot a beolvass
pillanatban vgrehajt. (Ha egy fjlban olyan utasts tallhat, amely
meglltja a feldolgozt, a \fBbc\fR nem fog a szabvnyos bemenetrl olvasni.
.PP
A \fBbc\fR ezen implementcija sok bvtssel rendelkezik a POSIX
standardhoz kpest. Parancssor opcival megadhat, hogy a program ezeknl
figyelmeztessen, vagy dobja vissza ket. Ez a dokumentum az ezen feldolgoz
ltal elfogadott nyelvet rja le. A kiterjesztsek termszetesen jellsre
kerlnek.
.SH OPCIK
.IP -l
Definilja a standard matematikai knyvtrat.
.IP -w
Figyelmeztet a POSIX \fBbc\fR-hez kpest hasznlt kiterjesztsekre.
.IP -s
Csak a pontos POSIX \fBbc\fR nyelvet dolgozza fel.
.SH SZMOK
A \fBbc\fR legalapvetbb eleme a szm. A szmok pontossga brmekkora lehet.
Ez a pontossg mind az egsz, mind a trt rszre vonatkozik. Minden szm belsleg
decimlisan troldik, s a szmtsok is decimlisan hajtdnak vgre.
(Ez a verzi az osztsnl s a szorzsnl csonkt.) A szmoknak kt
jellemzje van, a hossz s a lptk. A hossz a szignifikns decimlis
szmjegyek szmt jelenti, a lptk pedig a tizedspont utn levkt.
Pldul:
.nf
.RS
.000001 szmnak a hossza s a lptke is 6.
mg az 1935.000 szmnak a hossza 7, a lptke 3.
.RE
.fi
.SH VLTOZK
A szmokat kt fajta vltozban lehet trolni, egyszer vltozban
vagy tmbben. Mind az egyszer, mind a tmbvltoznak van neve. A
neveknek betvel kell kezddnik, ezt kvethetik szmok, betk vagy
alhzsok. Minden betnek kisbetnek kell lennie. (A teljes
alfanumerikus nevek mr egy kiterjeszts. A POSIX \fBbc\fR-ben minden
nv egy kisbetbl ll.) A vltoz tpusa a kontextusbl tisztn kiderl,
mivel minden tmb vltozt egy szgletes zrjel pr ([]) kvet.
.PP
Ngy specilis vltoz van, \fBscale, ibase, obase,\fR s
\fBlast\fR. A \fBscale\fR azt definilja, hogy nhny mvelet a
tizdes pont utn hny szmjegyet hasznljon. A \fBscale\fR
alaprtelmezett rtke 0. Az \fBibase\fR s az \fBobase\fR definilja
a bemeneti s a kimeneti szmrendszer konverzit. Az alaprtelmezett
szmrendszer mind a bemenetre, mind a kimenetre 10-es. A \fBlast\fR
(kiterjeszts) vltozban az utols kirt rtk szerepel. Ez
ksbb kerl rszletezsre. Ezeknek vtlozknak lehet rtket adni, de
kifejezsben is hasznlhatak.
.SH MEGJEGYZS
A megjegyzsek a \fBbc\fR-ben a \fB/*\fR karakterekkel kezddnek s a
\fB*/\fR karakterek jelzik a vgt. A megjegyzsek brhol megjelenhetnek,
s a bemenetben egy szkzt jelentenek. (Ez azt jelenti, hogy a megjegyzsek
elhatrolnak ms objektumokat. Pldul, egy megjegyzs nem lehet egy vltoznv
kzepn.) A megjegyzsekben brmennyi jsor lehet (sor vge), a
megjegyzs kezdete s vge kztt.
.SH KIFEJEZSEK
A szmokat kifejezsekkel s utastsokkal lehet manipullni. Mivel a
nyelvet interaktvra ksztettk, az utastsok s a kifejezsek rgtn
vgrehajtdnak. Nincs "f" program (main fggvny). A kd olyan
sorrendben hajtdik vgre, ahogy a \fBbc\fR beolvassa. (A fggvnyek,
ksbb kerlnek lersra, a beolvass sorrendjben kerlnek definilsra.)
.PP
Egy egyszer kifejezs egy konstans. A \fBbc\fR a konstanst az \fBibase\fR
vltozban megadott bemeneti szmrendszer szerint decimlis szmm
konvertlja. (Kivtel a fggvnyeknl.) Az \fBibase\fR rvnyes
rtkei 2-tl 16-ig terjednek. Ezen a hatron tli rtket megadva
az \fBibase\fR vltoznak, a vltoz rtke 2 vagy 16 lesz. A bemen
szmok a 0-9-ig s az A-F-ig terjed karaktereket tartalmazhatjk.
(Megjegyzs: Nagybetknek kell lennik. A kisbetk a vltozknak
vannak fenntartva.) Az egy szmjegy szmoknak mindig a szmjegy az
rtke, az \fBibase\fR vltoztl fggetlenl (pl.: A = 10). A tbb
szmjegy szmoknl a \fBbc\fR az \fBibase\fR-nl nagyobb szmjegyeket
\fBbc\fR - 1-re cserli. Ezltal, a \fBFFF\fR mindig a lehet legnagyobb
hromjegy szmot jelenti.
.PP
A teljes kifejezsek hasonlak a tbbi magas szint nyelvben levkhz.
Mivel csak egyetlen tpus szm van, nincs szably a tpusok keversnek
kezelsre. Minden kifejezsnek van egy pontossga. Ez az eredeti szmokbl,
az elvgzett mveletekbl s mg sok egybbl tevdik ssze, az rtke a
\fBscale\fR vltozban tallhat. Ezen vltoz leglis rtkei a 0-tl
a C nyelvben egsz szmnak megadhat legnagyobb rtkig terjednek.
.PP
Itt kvetkezik a legalis kifejezsek lersa, az "expr" a teljes kifejezsre,
a "var" pedig egy egyszer, vagy egy tmb vltozra vonatkozik.
Egy egyszer vltozra a
.RS
\fIname\fR
.RE
mg egy tmbre a
.RS
\fIname\fR[\fIexpr\fR]
.RE
lersval hivatkozhatunk.
Hacsak msknt nem specifikljuk, az eredmny pontossga
a kifejezsek pontossgnak a maximuma lesz.
.IP "- expr"
Az eredmny a kifejezs negltja.
.IP "++ var"
A vltoz rtke eggyel n, s az eredmny a vltoz j rtke lesz.
.IP "-- var"
A vltoz rtke eggyel cskken, s az eredmny a vltoz j rtke lesz.
.IP "var ++"
A kifejezs eredmnye a vltoz eredeti rtke, majd a vltoz rtke
n eggyel.
.IP "var --"
A kifejezs eredmnye a vltoz eredeti rtke, majd a vltoz rtke
cskken eggyel.
.IP "expr + expr"
Az eredmny a kt kifejezs sszege.
.IP "expr - expr"
Az eredmny a kt kifejezs klnbsge.
.IP "expr * expr"
Az eredmny a kt kifejezs szorzata.
.IP "expr / expr"
Az eredmny a kt kifejezs hnyadosa. Az eredmny pontossgt a
\fBscale\fR vltoz rtke hatrozza meg.
.IP "expr % expr"
Az eredmny a "maradk", amely a kvetkezkppen kerl kiszmolsra.
Az a%b kiszmolshoz elszr, kiszmolsra kerl az a/b, \fBscale\fR
szmjegyre. Az eredmny a kvetkezkppen addik: a-(a/b)*b, a pontossga
a \fBscale\fR+scale(b) s scale(a) kzl a nagyobb lesz. Ha a \fBscale\fR
egyenl nullval, vagy mindkt kifejezs egsz, a maradk is egsz lesz.
.IP "expr ^ expr"
Az eredmny az els kifejezs a msodikra emelve. A msodik kifejezsnek
egsznek kell lennie. (Ha a msodik kifejezs nem egsz, egy figyelmeztets
generldik, s az rtk egsz rtkre csonkoldik.) Az eredmny pontossga
\fBscale\fR lesz, ha a kitev negatv. Ha a kitev pozitv, az eredmny
pontossga az els kifejezs pontossgnak s a kitev rtknek a szorzata
s - az els kifejezs s a \fBscale\fR vltoz rtke kzl a nagyobb -
kzl a kisebb lesz. (Pl. scale(a^b) = min(scale(a)*b, max( \fBscale,\fR scale(a))).)
Megjegyezend, hogy az expr^0 mindig 1 rtkkel tr vissza.
.IP "( expr )"
Ez megvltoztatja a kifejezs kirtkelsnek standard precedencijt.
.IP "var = expr"
A vltoz rtke a kifejezs lesz.
.IP "var <op>= expr"
Ez ekvivalens a "var = var <op> expr" kifejezssel, azzal a kivtellel,
hogy a "var" rsz csak egyszer rtkeldik ki. Ez akkor okozhat
klnbsget, ha a "var" egy tmb.
.PP
A relcis kifejezsek specilis kifejezs fajtk, amelyek
mindig 0-t, vagy 1-et adnak vissza, 0-t, ha a relci hamis,
s 1-et, ha igaz. Ezek brmilyen leglis kifejezsben megjelenhetnek.
(A bc POSIX vltozatban, hogy a relcis kifejezsek csak if,
while s for utastsokban szerepelhetnek, illetve csak egy tesztelsk
lehetsges.) A relcis opertorok a kvetkezk:
.IP "expr1 < expr2"
Az eredmny 1, ha az expr1 kisebb, mint az expr2.
.IP "expr1 <= expr2"
Az eredmny 1, ha az expr1 kisebb, vagy egyenl, mint az expr2.
.IP "expr1 > expr2"
Az eredmny 1, ha az expr1 nagyobb, mint az expr2.
.IP "expr1 >= expr2"
Az eredmny 1, ha az expr1 nagyobb, vagy egyenl, mint az expr2.
.IP "expr1 == expr2"
Az eredmny 1, ha az expr1 egyenl az expr2-vel.
.IP "expr1 != expr2"
Az eredmny 1, ha az expr1 nem egyenl az expr2-vel.
.PP
A boolean mveletek is leglisak. ( A POSIX \fBbc\fR-ben nincsenek
boolean mveletek.) Minden boolean mveletnek az rtke 0, vagy 1
(hamis, vagy igaz), mint a relcis mveleteknl. A boolean
mveletek a kvetkezek:
.IP "!expr"
Az eredmny 1, ha a kifejezs 0.
.IP "expr && expr"
Az eredmny 1, ha a mindkt kifejezs nem 0.
.IP "expr || expr"
Az eredmny 1, ha a brmelyik kifejezs nem 0.
.PP
A kifejezsek precedencija a kvetkez (alacsonytl a magas fel):
.nf
.RS
|| opertor, balrl asszociatv
&& opertor, balrl asszociatv
! opertor, nem asszociatv
Relcis opertorok, balrl asszociatv
rtkad opertor, jobbrl asszociatv
+ s - opertorok, balrl associative
*, / s % opertorok, balrl asszociatv
^ opertor, jobbrl asszociatv
unris - opertor, nem asszociatv
++ s -- opertorok, nem asszociatv
.RE
.fi
.PP
Ez a precedencia gy van megvlasztva, hogy a POSIX \fBbc\fR al
programok is korrekten fussanak. Emiatt, a relcis s logikai
opertorokat az rtkad opertoroknl nha szokatlan eredmny is
kijhet. Lsd a kvetkez kifejezst:
.RS
a = 3 < 5
.RE
.PP
A legtbb C programoz ezt gy rtelmezi, hogy a "3 < 5" (az rtke 1)
kerl az "a" vltozba. A \fBbc\fR itt a kvetkezt csinlja, hozzrendeli
a 3-at az "a" vltozhoz, majd a 3-at sszehasonltja az 5-tel. A legjobb,
hogyha rtkad opertort hasznlsz relcis, s logikai opertorokkal,
akkor hasznlsz zrjeleket.
.PP
Van nhny egyb specilis kifejezs, amelyet mg a \fBbc\fR nyjt.
Ezek a felhasznl ltal definilhat fggvnyek, s a standard
fggvnyek hvsa. Ezek a kvetkez alakban jelennek meg:
\fIname\fB(\fIparameters\fB)\fR
A fggvnyekhez lsd mg a felhasznl ltal definilt fggvnyek
fejezetet. A standard fggvnyek a kvetkezek:
.IP "length ( expression )"
A length fggvny rtke a kifejezsben megadott szm rtkes jegyeinek
szma.
.IP "read ( )"
A read fggvny (kiterjeszts) beolvas egy szmot a szabvnyos bemenetrl,
fggetlenl attl, hogy a fggvny hol tallhat. Figyelmeztets: ez
problmt okozhat, ha mind a program, mind az adatok a standard bementrl
jnnek. A legjobb, ha ezt a fggvnyt csak elre megrt programoknl
hasznljuk, amely adatokat kr a felhasznltl, de nem engedi meg, hogy
a felhasznl program kdot is berjon. A read fggvny rtke a
szabvnyos bemenetrl beolvasott szm rtke, az \fBibase\fR vltoz rtkt,
mint szmrendszert hasznlva a konverzi alapjul.
.IP "scale ( expression )"
A scale fggvny rtke a kifejezs tizedespont mgtt szerepl
szmjegyeinek szma.
.IP "sqrt ( expression )"
Az sqrt fggvny rtke a kifejezs rtknek a ngyzetgykvel egyenl.
Ha a kifejezs negatv, egy futsi hiba generldik.
.SH UTASTSOK
Az utastsok (mint a legtbb algebrai nyelvnl) hatrozzk meg a kifejezsek
kirtkelsnek sorrendjt. A \fBbc\fR-ben az utastsok akkor hajtdnak
vgre, amint "arra md van". A vgrehajts akkor trtnik meg, mikor az
interpreter j sor karakterrel tallkozik, illetve, mikor egy, vagy
tbb komplett utasts felpl. Ezen azonnali vgrehajts miatt, az
jsorok nagyon fontosak a \fBbc\fR-ben. Valjban, mind a pontosvessz,
mind az jsor hasznlhat utastselvlasztknt. Egy rossz helyre rakott
jsor szintaktikai hibt okoz. Mivel az jsorok utasts elhatrolk,
el lehet ket rejteni, a backslash karakter segtsgvel. A "\e<nl>"
karaktersorozattal, ahol az <nl> az jsort jelenti, az jsor csak
egy szkzknt jelenik meg a \fBbc\fR-ben. Egy utasts lista a
pontosvesszvel, vagy jsorral elvlasztott utastsok sorozata.
Itt kvetkeznek a \fBbc\fR utastsai, s az, hogy mit csinlnak:
(A szgletes zrjelbe ([]) zrt rszek az utastsbl elhagyhatak.)
.IP "expression"
Ez az utasts ktfle kppen is megjelenhet. Az egyik, mikor a
kifejezs "<vltoz> <rtkads> ...", ez egy rtkadsi utasts.
Ha a kifejezs nem rtkadsi utasts, akkor kirtkelse utn kapott
eredmny kirsra kerl a szabvnyos kimenetre. A szm kirsa utn egy
jsor is kirsra kerl. Pldul, az "a=l" egy rtkadsi utasts,
mg az "(a=l)" egy kifejezs, amelyben van egy rtkads. Minden
szm az \fBobase\fR vltozban trolt szmrendszer alapjn kerl
kirsra. Az \fBobase\fR vltoz leglis rtkei 2-tl a
BC_BASE_MAX konstansban trolt rtkig mehetnek. (Lsd mg
a HATRRTKEK fejezetet.) A 2-estl a 16-os szmrendszerig a
szmok kirsa a szoksos mdon trtnik. 16-osnl nagyobb
szmrendszereknl a \fBbc\fR tbb karakterbl ll szmjegyeket
hasznl, ahol minden magasabb szmrendszerbeli szmjegynek a tizes
szmrendszerbeli szmkpe rdik ki. A tbb karakteres szmjegyeket
egymstl a program szkzkkel vlasztja el. Minden szmjegy annyi
karakterbl ll, amennyi az "obase-1" szm kirshoz kell, 10-es
szmrendszerben. Mivel a szmok vltoz pontossgak, elfordulhat, hogy
nhny szm kirsa nem fr ki egy sorba. Ezeket a hossz szmokat
a program sorokra trdeli, a sorok vgn egy-egy "\e" karakterrel.
Az egy sorba kirt karakterek maximlis szma 70. A \fBbc\fR
interaktivitsa miatt, az utols kirt szmot eltrolja egy
specilis vltozban. gy az utoljra kirt szm megkapshoz
nem szksges jra lerni az egsz kifejezst, hanem csak a
\fBlast\fR vltoz rtkt kell elszedni. A \fBlast\fR vltoznak
rtket is lehet adni, ez esetben a benne trolt utols rtk
egyszeren fellrdik. Ez az rtk addig marad meg benne, amg
a kvetkez szm kirsra nem kerl, vagy ms rtket nem adnak
neki. (Nmelyik implementci megengedi, hogy a \fBlast\fR
vltozra egy egyedli ponttal ("."), amely nem rsze szmnak,
hivatkozzunk.)
.IP "string"
A string a kimenetre rdik ki. A stringek idzjellel kezddnek, s
brmilyen karaktert tartalmazhatnak a kvetkez idzjelig. Egyetlen
karakter sem kerl rtelmezsre, mg az jsor karakter sem. A string
kirsa utn nem rdik ki jsor karakter.
.IP "\fBprint\fR list"
A print utasts (kiterjeszts), a kirs egy jabb mdozatt knlja.
A "list" egy string s kifejezs lista, vesszvel elvlasztva. Minden
string vagy kifejezs a lista sorrendjben rdik ki. Zr jsor nem
rdik ki. A kifejezsek kirtkeldnek, s az eredmnyk a \fBlast\fR
vltozban trolsra kerl. A stringek pedig egyszeren kirsra kerlnek,
specilis karaktereket is tartalmazhatnak. A specilis karakterek a
backslalsh karakterrel kezddnek (\e). A specilis karakterek a
kvetkezek: "a" (figyelmeztets, vagy bip), "b" (backspace),
"f" (lapdobs), "n" (jsor), "r" (kocsi vissza), "q" (idzjel),
"t" (tabultor) s "\e" (backslash). Minden ms, a backslash utn
lev karaktert figyelmen kvl hagy a program.
.IP "{ utasts_lista }"
Ez egy sszetett utasts. Ennek segtsgvel lehet tbb vgrehajtand
utastst egybekapcsolni.
.IP "\fBif\fR ( kifejezs ) \fBthen\fR utasts1 [\fBelse\fR utasts2]"
Az if kirtkeli a kifejezst, s vgrehajtja az utasts1-et, vagy
az utasts2-t, a kifejezs rtktl fggen. Ha a kifejezs eredmnye
nem nulla, az utasts1 hajtdik vgre. Ha az utasts2 ltezik, s a
kifejezs eredmnye nulla, az utasts2 hajtdik vgre. (Az else g
kiterjeszts.)
.IP "\fBwhile\fR ( kifejezs ) utasts"
A while utasts mindaddig vgrehajtja az utastst, amg a kifejezs
eredmnye nem nulla. Az utasts minden vgrehajtsa eltt kirtkeli
a kifejezst. A ciklus akkor fejezdik be, ha a kifejezs eredmnye
nulla lesz, vagy ha vgrehajtdik egy break utasts.
.IP "\fBfor\fR ( [kifejezs1] ; [kifejezs2] ; [kifejezs3] ) utasts"
A for utasts egy utasts ismtelt vgrehajtst vezrli. A kifejezs1
a ciklus eltt kirtkeldik. A kifejezs2 az utasts minden vgrehajtsa
eltt kirtkeldik. Ha nem nulla, az utasts vgrehajtdik, ha nulla, a
ciklus vget r. Az utasts minden vgrehajtsa utn, a kifejezs3
kirtkeldik, mieltt a kifejezs2 kiszmoldna. Ha a kifejezs1
s a kifejezs3 hinyzik, a kirtkeldsk helyn semmi nem fog trtnni.
Ha a kifejezs2 hinyzik, az olyan, mintha a kifejezs2 helyn egy olyan
kifejezs lenne, amelynek az eredmnye mindig 1. (Az opcionlis kifejezsek
egy kiterjeszts.) A kvetkez ekvivalens kdokat ad a for utastsra:
.nf
.RS
kifejezs1;
while (kifejezs2) {
utasts;
kifejezs3;
}
.RE
.fi
.IP "\fBbreak\fR"
Ezzel az utastssal ki lehet lpni a legbels while, vagy for utastsbl.
.IP "\fBcontinue\fR"
Ez az utasts (kiterjeszts) azt eredmnyezi, hogy a legbels for utasts
egy j ciklust kezd.
.IP "\fBhalt\fR"
Ez az utasts (kiterjeszts), ha vgrehajtdik, azt eredmnyezi, hogy
a \fBbc\fR kilp.
.IP "\fBreturn\fR"
Nulla rtkkel tr vissza egy fggvnybl (lsd mg a fggvnyek fejezetet).
.IP "\fBreturn\fR ( expression )"
A kifejezs eredmnyvel tr vissza a fggvnybl (lsd mg a fggvnyek
fejezetet).
.SH PSZEUDO UTASTSOK
Ezek az utastsok a tradicionlis rtelemben nem utastsok. Nem
hajtdnak vgre. Funkcijukat "fordtsi" idben fejtik ki.
.IP "\fBlimits\fR"
Kirja a \fBbc\fR adott verzija ltal hasznlt hatrokat. Kiterjeszts.
.IP "\fBquit\fR"
Ha a quit utastst beolvassa, a \fBbc\fR feldolgoz kilp. Nem
szmt, hogy az utasts hol tallhat (pl. az "if (0 == 1) quit"
hatsra is kilp a \fBbc\fR.)
.IP "\fBwarranty\fR"
Kirja a figyelmeztet zenetet. Kiterjeszts.
.SH FGGVNYEK
A fggvnyekkel definilhatunk szmtsokat, amelyeket csak ksbb
kvnunk vgrehajtani. A fggvnyek a
.B bc
-ben mindig egy rtket szmolnak, s azt visszaadjk a hvnak. A fggvny
defincija "dinamikus" abban az rtelemben, hogy mindaddig definilatlan,
amg a feldolgoz nem tallkozik vele a bemeneten. Ez a definc mindaddig
hasznlhat, amg egy ugyanezen nv fggvny definicval nem tallkozik.
Az j definci fellrja a rgit. Egy fggvny defincija a kvetkezkppen
nz ki:
.nf
.RS
\fBdefine \fIname \fB( \fIparameters \fB) { \fInewline
\fI auto_list statement_list \fB}\fR
.RE
.fi
A fggvnyhvs is egy kifejezs, a kvetkez formban:
"\fIname\fB(\fIparameters\fB)\fR".
.PP
A paramterek szmok, vagy tmbk lehetnek (kiterjeszts). A fggvny defincjban
nulla, vagy tbb paramter definilhat, vesszvel elvlasztva. A szmok
csak rtk szerinti tadssal, a tmbk csak cm szerinti tadssal hvdnak
meg. A tmbket a paramterek kztt a "\fInv\fB[]\fR" mdon kell
specifiklni. A fggvnyhvsnl a szm paramterek teljes kifejezsek
lehetnek. A tmbknl ugyanaz a jells hasznland, mint a definilskor.
A nevesitett tmbk cm szerinti tadssal kerlnek a fggvnyhez.
Mivel a fggvny defincija dinamikus, a paramterek szma s
tpusa csak a hvs pillanatban kerl ellenrzsre. Ha ebben eltrs
mutatkozik, egy futsi-hiba vltdik ki. Futsi-hiba vltdik ki
akkor is, ha egy nem ltez fggvnyt hvunk meg.
.PP
Az \fIauto_list\fR egy opcionlis vltoz lista, amely "helyi"
vltozkat tartalmazza. A szintaxisa: "\fBauto \fInv\fR, ... ;".
(A pontosvessz opcionlis.) Minden \fInv\fR egy auto vltoz
neve. Tmbk is definilhatak gy, a szoksos mdon. Ezek
a vltozk a vermen kapnak helyet, a fggvny belpse utn.
A vltozk ezutn inicializlsra kerlnek nulla kezdrtkkel,
s a fggvny vgrehajtsa sorn hasznlhatak. Amikor a fggvny
kilp, ezeket a vltozkat eltvoltja a verembl, gy az
eredeti rtkk helyrelltdik. A paramterek is auto vltozk,
amelyek a fggvny meghvsakor kapjk meg rtkket. Az auto
vltozk klnbznek a tradcionlis helyi vltozktl a
kvetkez dologban: ha A meghvja a B fggvnyt, B ltja az A
auto vltozit, hacsak B-ben nincs ugyanezen nven is auto
vltoz definilva. Azon tny miatt, hogy az auto vltozk s
a paramterek egy vermen kapnak helyet, a \fBbc\fR kezeli a
rekurzv fggvnyeket is.
.PP
A fggvny trzse \fBbc\fR utastsok listja. Az utastsokat
pontosvesszk, vagy jsorok vlasztjk el. A return utasts
hatsra a fggvny vgrehajtsa vget r, s visszatr egy
rtkkel. Az els forma, a "\fBreturn\fR", 0-t ad vissza a hvnak,
mg a msodik, "\fBreturn ( \fIkifejezs \fB)\fR", kirtkeli
a kifejezst, s az eredmnyt adja vissza. A fggvny vgn,
ha mst nem runk ki, mindig van egy "\fBreturn (0)\fR", ez
megkml attl, hogy explicite ki kelljen rni a return
utastst.
.PP
A fggvnyeknl megvltozik az \fBibase\fR vltoz hasznlata is.
A fggvny trzsben szerepl minden konstans, a fggvny hvsakor
hasznlatos \fBibase\fR alapjn konvertldik. Ha az \fBibase\fR-t
megvltoztatjuk egy fggvnyben, annak nem lesz hatsa, kivve a
\fBread\fR standard fggvnyt, amely mindig az \fBibase\fR
aktulis rtkt hasznlja a szmok konvertlshoz.
.SH MATEMATIKAI KNYVTR
Ha a \fBbc\fR-t a \fB-l\fR opcival indtjuk, a matematikai
knyvtr betltdik, s a pontossg 20-as lesz. A matematikai
fggvnyek azzal a pontossggal szmoljk ki az eredmnyt,
amely a meghvsukkor be volt lltva. A matematikai knyvtr
a kvetkez fggvnyeket definilja:
.IP "s (\fIx\fR)"
Az x (radin) sznusza.
.IP "c (\fIx\fR)"
Az x (radin) kosznusza.
.IP "a (\fIx\fR)"
Az x arkusz tangense.
.IP "l (\fIx\fR)"
Az x termszetes logaritmusa.
.IP "e (\fIx\fR)"
Az e x-edik hatvnya.
.IP "j (\fIn,x\fR)"
Az n-ed rend Bessel fuggvenye x-nek.
.SH PLDK
A /bin/sh-ban a kvetkez utasts visszaadja a "pi" rtkt a
\fBpi\fR krnyezeti vltozban.
.RS
\f(CW
pi=$(echo "scale=10; 4*a(1)" | bc -l)
\fR
.RE
.PP
Az itt kvetkez pldban a matematikai knyvtrban tallhat
hatvny fggvny defincijt mutatjuk be. A fggvny POSIX
\fBbc\fR nyelven rdott.
.nf
.RS
\f(CW
scale = 20
/* Kihasznlja a kvetkez tnyt: e^x = (e^(x/2))^2.
Mikor az x elg kicsi, a kvetkez sort hasznljuk:
e^x = 1 + x + x^2/2! + x^3/3! + ...
*/
define e(x) {
auto a, d, e, f, i, m, v, z
/* Ellenrzi az x eljelt. */
if (x<0) {
m = 1
x = -x
}
/* Elfelttel. */
z = scale;
scale = 4 + z + .44*x;
while (x > 1) {
f += 1;
x /= 2;
}
/* Inicializlja a vltozkat. */
v = 1+x
a = x
d = 1
for (i=2; 1; i++) {
e = (a *= x) / (d *= i)
if (e == 0) {
if (f>0) while (f--) v = v*v;
scale = z
if (m) return (1/v);
return (v/1);
}
v += e
}
}
\fR
.RE
.fi
.PP
A kvetkez kd a \fBbc\fR kiterjesztett szolgltatsait hasznlja,
egy egyszer csekkfzet egyenleg kiszmolsra. Legjobb, ha ezt
a programot fjlba lementjk, hogy tbbszr is hasznlhassuk anlkl,
hogy jra be kelljen gpelni.
.nf
.RS
\f(CW
scale=2
print "\enCsekkfzet program!\en"
print " Emlkeztet, a lettek negatv tranzakcik.\en"
print " Kilps 0 sszeg tranzakci bevitelvel.\en\en"
print "Kezdeti egyenleg? "; bal = read()
bal /= 1
print "\en"
while (1) {
"jelenlegi egyenleg = "; bal
"tranzakci? "; trans = read()
if (trans == 0) break;
bal -= trans
bal /= 1
}
quit
\fR
.RE
.fi
.PP
A kvetkez fggvny a faktorilis rekurzv defincija.
.nf
.RS
\f(CW
define f (x) {
if (x <= 1) return (1);
return (f(x-1) * x);
}
\fR
.RE
.fi
.SH ELTRSEK
A
.B bc
ezen verzija a POSIX P1003.2/D11 tervezete alapjn kszlt s
a tervezethez s a tradcionlis implementcihoz kpest sok
bvtst s klnbsget tartalmaz.
Ez nincs implementlva a tradcionlis
.I dc(1)-ben.
Ez a verzi egy egyszer feldolgoz, amely csak tfordtja a programot.
Egy "nem dokumentlt" kapcsol (-c) kirja az tfordtott
programot a szabvnyos kimenetre, s nem futtatja le. Ez fleg
az rtelmez nyomkvetsekor s a matematikai knyvtr
elksztsekor hasznlatos.
.PP
A klnbsgek legfbb forrsai a kiterjesztsek, hol egy szolgltats
lett kiterjesztve, hogy tbb lehetsge legyen, hol pedig j
szolgltats lett ltrehozva. A kvetkez lista megmutatja
a klnbsgeket s a kiterjesztseket.
.IP "LANG krnyezeti vltoz"
Ez a verzi nem kveti a POSIX szabvnyt a LANG krnyezeti vltoz
hasznlatban, s minden krnyezeti vltoz az "LC_" prefixszel
kezddik.
.IP nevek
A tradcionlis s a POSIX
.B bc
-ben a funkcik, vltozk s tmbk nevei csak egy karakter hosszak
lehettek. Itt mr tbb karaktert is hasznlhatunk, de a neveknek
betvel kell kezddni s csak betket szmokat s alhzsjeleket
tartalmazhatnak.
.IP Stringek
A stringek nem tartalmazhatnak NUL (ASCII nulla) karaktert. A POSIX
szerint brmilyen karakter lehet egy stringben.
.IP last
A POSIX \fBbc\fR-ben nincs \fBlast\fR vltoz. Nhny implementci
a pontot (.) hasznlja erre a clra.
.IP sszehasonltsok
A POSIX \fBbc\fR csak az if, vagy a while utastsban enged meg
sszehasonltsokat, vagy a for utasts msodik kifejezsben.
Tovbb, utastsonknt csak egy relcis opertor van megengedve.
.IP "if utasts, else g"
A POSIX \fBbc\fR-ben nincs else g.
.IP "for utasts"
A POSIX \fBbc\fR-ben minden kifejezsnek szerepelnie kell.
.IP "&&, ||, !"
A POSIX \fBbc\fR-ben nincsenek logikai opertorok.
.IP "read fggvny"
A POSIX \fBbc\fR-ben nincs read fggvny.
.IP "print utasts"
A POSIX \fBbc\fR-ben nincs print utasts.
.IP "continue utasts"
A POSIX \fBbc\fR-ben nincs continue utasts.
.IP "tmb paramterek"
A POSIX \fBbc\fR-ben nincsenek tmb paramterek. Ms implementcikban
lehetnek.
.IP "=+, =-, =*, =/, =%, =^"
A POSIX \fBbc\fR-ben nincs szksg ezekre a "rgi stlus" rtkad
opertorokra. Ez a verzi megengedi ezeket. Hasznld a limits utastst,
hogy megtudd, hogy az installlt verzi megengedi-e ezeket.
Ha igen, az "a =- 1" kifejezs cskkenti az \fBa\fR rtkt 1-gyel,
egybknt pedig az \fBa\fR rtkt belltja -1-re.
.IP "szkzk a szmokban"
A \fBbc\fR ms implementcii megengedik szkzk hasznlatt a szmokban.
Pldul, az "x=1 3" kifejezs az x vltozhoz hozzrendeli a 13-at.
Ebben a \fBbc\fR-ben ugyanez az utasts szintaktikai hibt ad.
.IP "hibk s vgrehajts"
Ez az impelmentci klnbzik a tbbitl abban, hogy mely kdokat
hajtja vgre, mikor egy szintaktikai, vagy ms hibba belefut.
Ha egy szintaktikai hibt tall a fggvny defincijban, a
hibakezel megprblja megtallni az utasts elejt, s folytatni
a fggvny feldolgozst. Ha a szintaktikai hiba a fggvny trzsben
kvetkezik be, a fggvny nem lesz definilva, s nem lehet meghvni sem.
Az interaktv vgrehajtsi blokkokban lev szintaktikai hibk
rvnytelentik az egsz blokkot. Egy vgrehajtsi blokknak minsl
az az utastssor, amely a kvetkez soremelsig tart.
Pldul:
.nf
.RS
a = 1
b = 2
.RE
.fi
ez kt vgrehajtsi blokk s
.nf
.RS
{ a = 1
b = 2 }
.RE
.fi
ez egy. A futsi-hibk hatsra a jelenlegi blokk vgrehajtsa
befejezdik. A futsi-figyelmezetets nem lltja meg a blokk
vgrehajtst.
.IP "Megszaktsok"
Egy interaktv vgrehajts sorn, a SIGINT szignl (ltalban a
terminlrl rkez Control-C karakter generlja) hatsra a jelenlegi
blokk vgrehajtsa megszakad. Kijelzsre kerl egy "futsi" hiba,
hogy melyik fggvny lett megszaktva. Miutn minden futsi
struktra kirl, egy zenet kerl kirsra a felhasznl fel, hogy
a \fBbc\fR ksz tovbbi adatok fogadsra. Minden korbban definilt
fggvny tovbbra is definilva marad, s minden nem-auto vltozban
a megszaktskori rtk lesz. Minden auto vltoz (a fggvnyek
paramterei is) trlsre kerl a kirtsi eljrs sorn. Nem-interaktv
vgrehajtskor a SIGINT szignl az egsz \fBbc\fR futst megszaktja.
.SH HATROK
A kvetkez hatrok vannak beptve ebbe a
.B bc
-be. Nhnyuk egy installlssal megvltoztathat. Az aktulis
rtkeik megszerzshez hasznld a limits utastst.
.IP BC_BASE_MAX
A legnagyobb kimeneti szmrendszer, jelenleg 999. A maximum bemeneti
szmrendszer 16.
.IP BC_DIM_MAX
Ez a jelenlegi pontossgi hatr, 655535. Az n installcijban
ms lehet.
.IP BC_SCALE_MAX
A tizedes pont eltti s utni szmjegyek szmt az INT_MAX hatrozza meg.
.IP BC_STRING_MAX
A karakterek maximlis szma egy stringben INT_MAX.
.IP exponens
A hatvnyozs opertor (^) kitevjnek maximum rtkt a LONG_MAX
hatrozza meg.
.IP szorzs
A szorz rutin inkorrekt eredmnyt adhat, ha a szmnak (LONG_MAX / 90)-nl
tbb szmjegye van. 32-bites long-nl ez 23,860,929 szmjegy.
.IP "kd mret"
Minden fggvnynek s a "f" programnak is limitlva van a mrete 16384
byte lefordtott kdban. Ez a hatr (BC_MAX_SEGS) knnyen tllphet,
ha tbb, mint 16 1024 byte-os szegmensnk van.
.IP "vltoz nevek"
A jelenlegi limit az egyedi nevekre 32767 mind az egyszer vltozkra,
mind a tmbkre s a fggvnyekre.
.SH FJLOK
A legtbb installciban a \fBbc\fR-nek nincs szksge egyb fjlokra.
Mg a vgrehajthat program hossza fontos, illetve a C fordt
nem tudja kezelni a nagyon hossz stringeket, a \fBbc\fR a
standard matematikai knyvtrat a /usr/local/lib/libmath.b fjlbl
olvassa be. (A fjl helye rendszerenknt vltozhat, lehet /lib/libmath.b
is.)
.SH DIAGNOSZTIKA
Ha egy a parancssorban szerepl fjl nem nyithat meg, a \fBbc\fR
zen, hogy a fjl nem elrhet, s kilp. Ugyangy, a fordtsi s
a futsi idej diagnosztika is nmagyarz.
.SH HIBK
A hibakezels mg nem tl j.
.SH SZERZ
.nf
Philip A. Nelson
phil@cs.wwu.edu
.fi
.SH KSZNETNYILVNTSOK
A szerz szeretn megksznni Setve Sommars-nak (Steve.Sommars@att.com),
hogy oly nagy mrtkben segtett az implementci tesztelsben.
Sok nagyon j tancsot adott. Segtsgvel egy sokkal jobb termket
sikerlt ltrehozni.
.SH MAGYAR FORDTS
Csehi Andrs <acsehi@flexum.hu>
|