.\" -*- coding: UTF-8 -*-
.\"
.\" bc.1 - the *roff document processor source for the bc manual
.\"
.\" This file is part of GNU bc.
.\" Copyright (C) 1991-1994, 1997, 2000, 2003, 2006, 2017, 2024, 2025
.\" 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, see
.\" .
.\"
.\" You may contact the author by:
.\" e-mail: philnelson@acm.org
.\" us-mail: Philip A. Nelson
.\" Computer Science Department, 9062
.\" Western Washington University
.\" Bellingham, WA 98226-9062
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH bc 1 "5 ianuarie 2025" "Proiectul GNU"
.SH NUME
bc \- un limbaj de calcul cu precizie arbitrară
.SH SINTAXĂ
\fBbc\fP [ \fB\-hlwsqv\fP ] [opțiuni\-lungi] [ \fI fișier ...\fP ]
.SH DESCRIERE
\fBbc\fP este un limbaj care acceptă numere cu precizie arbitrară cu execuție
interactivă a instrucțiunilor. Există unele asemănări în sintaxă cu limbajul
de programare C. O bibliotecă de matematică standard este disponibilă prin
opțiune de linie de comandă. Dacă se solicită, biblioteca de matematică este
definită înainte de procesarea oricăror fișiere. \fBbc\fP începe prin
procesarea codului din toate fișierele enumerate în linia de comandă, în
ordinea enumerată. După ce toate fișierele au fost procesate, \fBbc\fP citește
de la intrarea standard. Tot codul este executat pe măsură ce este citit;
(dacă un fișier conține o comandă de oprire a procesorului, \fBbc\fP nu va citi
niciodată de la intrarea standard).
.PP
Această versiune a \fBbc\fP conține mai multe extensii care depășesc
implementările \fBbc\fP tradiționale și proiectul de standard POSIX. Opțiunile
din linia de comandă pot face ca aceste extensii să afișeze un avertisment
sau să fie respinse. Acest document descrie limbajul acceptat de acest
procesor. Extensiile vor fi identificate ca atare.
.SS OPȚIUNI
.IP "\-h, \-\-help"
Afișează modul de utilizare și iese.
.IP "\-i, \-\-interactive"
Forțează modul interactiv.
.IP "\-l, \-\-mathlib"
Definește biblioteca matematică standard.
.IP "\-w, \-\-warn"
Furnizează avertismente pentru extensiile la POSIX \fBbc\fP.
.IP "\-s, \-\-standard"
Procesează exact în limbajul POSIX \fBbc\fP.
.IP "\-q, \-\-quiet"
Nu afișează mesajul normal de bun venit în GNU bc.
.IP "\-v, \-\-version"
Afișează numărul versiunii și drepturile de autor și iese.
.SS NUMERE
Cel mai de bază element în \fBbc\fP este numărul. Numerele sunt numere cu
precizie arbitrară. Această precizie este atât în partea întreagă, cât și în
partea fracționară. Toate numerele sunt reprezentate intern în zecimal și
toate calculele sunt efectuate în zecimal; (această versiune trunchiază
rezultatele operațiilor de împărțire și multiplicare). Există două atribute
ale numerelor, lungimea și scala. Lungimea este numărul total de cifre
zecimale utilizate de \fBbc\fP pentru a reprezenta un număr, iar scala este
numărul total de cifre zecimale după punctul zecimal. De exemplu:
.nf
.RS
.000001 are o lungime de 6 și o scală de 6.
1935.000 are o lungime de 7 și o scală de 3.
.RE
.fi
.SS VARIABILE
Numerele sunt stocate în două tipuri de variabile, variabile simple și
matrice. Atât variabilele simple, cât și variabilele matrice sunt
denumite. Numele încep cu o literă urmată de orice număr de litere, cifre și
liniuțe de subliniere. Toate literele trebuie să fie în minuscule. Numele
alfanumerice complete sunt o extensie; în \fBbc\fP POSIX toate numele sunt
formate dintr\-o singură literă minusculă). Tipul de variabilă este clar în
funcție de context, deoarece toate numele variabilelor de tip matrice vor fi
urmate de paranteze drepte ([]).
.PP
Există patru variabile speciale, \fBscale, ibase, obase,\fP și
\fBlast\fP. \fBscale\fP definește modul în care unele operații utilizează cifrele
după punctul zecimal. Valoarea implicită a lui \fBscale\fP este 0. \fBibase\fP și
\fBobase\fP definesc baza de conversie pentru numerele de intrare și
ieșire. Valoarea implicită atât pentru intrare, cât și pentru ieșire este
baza 10. \fBlast\fP (o extensie) este o variabilă care are valoarea ultimului
număr afișat. Acestea vor fi discutate mai detaliat acolo unde este
cazul. Toate aceste variabile pot avea valori atribuite, precum și utilizate
în expresii.
.SS COMENTARII
Comentariile din \fBbc\fP încep cu caracterele \fB/*\fP și se termină cu
caracterele \fB*/\fP. Comentariile pot începe oriunde și apar ca un singur
spațiu în textul de intrare; (acest lucru face ca comentariile să delimiteze
alte elemente de intrare \- de exemplu, un comentariu nu poate fi găsit în
mijlocul unui nume de variabilă). Comentariile includ orice linii noi
(sfârșit de linie) între începutul și sfârșitul comentariului.
.PP
Pentru a oferi suport pentru utilizarea scripturilor pentru \fBbc\fP, a fost
adăugat un comentariu pe o singură linie ca extensie. Un comentariu pe o
singură linie începe la un caracter \fB#\fP și continuă până la următorul capăt
de linie. Caracterul de sfârșit de linie nu face parte din comentariu și
este procesat în mod normal.
.SS EXPRESII
Numerele sunt manipulate prin expresii și instrucțiuni. Deoarece limbajul a
fost conceput pentru a fi interactiv, instrucțiunile și expresiile sunt
executate cât mai curând posibil. Nu există un program „principal”. În
schimb, codul este executat pe măsură ce este întâlnit; (funcțiile,
discutate în detaliu mai târziu, sunt definite atunci când sunt întâlnite).
.PP
O expresie simplă este doar o constantă. \fBbc\fP convertește constantele în
numere zecimale interne folosind baza de intrare curentă, specificată de
variabila \fBibase\fP.; (există o excepție în funcții). Valorile valide pentru
\fBibase\fP sunt de la 2 la 36; (bazele mai mari de 16 sunt o
extensie). Atribuirea unei valori în afara acestui interval pentru \fBibase\fP
va avea ca rezultat o valoare de 2 sau 36. Numerele de intrare pot conține
caracterele 0\-9 și A\-Z. \- Notă: Acestea trebuie să fie în
majuscule. Literele minuscule sunt nume de variabile. \- Numerele cu o
singură cifră au întotdeauna valoarea cifrei indiferent de valoarea lui
\fBibase\fP, (de exemplu, \& A = 10.) Pentru numerele cu mai multe cifre, \fBbc\fP
schimbă toate cifrele de intrare mai mari sau egale cu ibase la valoarea
\fBibase\fP\-1. Acest lucru face ca numărul \fBZZZ\fP să fie întotdeauna cel mai
mare număr de 3 cifre din baza de intrare.
.PP
Expresiile complete sunt similare cu multe alte limbaje de nivel înalt.
Deoarece există un singur tip de număr, nu există reguli pentru amestecarea
tipurilor. În schimb, există reguli privind scala expresiilor. Fiecare
expresie are o scală. Aceasta este derivată din scala numerelor originale,
operația efectuată și, în multe cazuri, valoarea variabilei
\fBscale\fP. Valorile legale ale variabilei \fBscale\fP sunt de la 0 la numărul
maxim reprezentabil de un număr întreg C.
.PP
În următoarele descrieri ale expresiilor valide, „expr” se referă la o
expresie completă, iar „var” se referă la o variabilă simplă sau la o
matrice. O variabilă simplă este doar o
.RS
\fInume\fP
.RE
iar o variabilă matrice este specificată ca
.RS
\fInume\fP[\fIexpr\fP]
.RE
Cu excepția cazului în care se menționează în mod specific, scala
rezultatului este scara maximă a expresiilor implicate.
.IP "\- expr"
Rezultatul este negația expresiei.
.IP "++ var"
Variabila este incrementată cu unu, iar noua valoare este rezultatul
expresiei.
.IP "\-\- var"
Variabila este decrementată cu unu, iar noua valoare este rezultatul
expresiei.
.IP "var ++"
Rezultatul expresiei este valoarea variabilei și apoi variabila este
incrementată cu unu.
.IP "var \-\-"
Rezultatul expresiei este valoarea variabilei și apoi variabila este
decrementată cu unu.
.IP "expr + expr"
Rezultatul expresiei este suma celor două expresii.
.IP "expr \- expr"
Rezultatul expresiei este diferența dintre cele două expresii.
.IP "expr * expr"
Rezultatul expresiei este produsul celor două expresii.
.IP "expr / expr"
Rezultatul expresiei este coeficientul celor două expresii. Scala
rezultatului este valoarea variabilei \fBscale\fP.
.IP "expr % expr"
Rezultatul expresiei este „restul” și este calculat în felul următor. Pentru
a calcula a%b, mai întâi a/b este calculat la cifrele \fBscale\fP. Acest
rezultat este utilizat pentru a calcula a\-(a/b)*b la scala maximului dintre
\fBscale\fP+scale(b) și scale(a). Dacă \fBscale\fP este definită la zero și ambele
expresii sunt numere întregi, această expresie este funcția de rest întreg.
.IP "expr ^ expr"
Rezultatul expresiei este valoarea primei expresii ridicată la a doua. A
doua expresie trebuie să fie un număr întreg; (dacă a doua expresie nu este
un număr întreg, este generat un avertisment și expresia este trunchiată
pentru a obține o valoare întreagă). Scala rezultatului este \fBscale\fP dacă
exponentul este negativ. Dacă exponentul este pozitiv, scala rezultatului
este minimul dintre scala primei expresii înmulțit cu valoarea exponentului
și maximul dintre \fBscale\fP și scala primei expresii; (dde exemplu: \&
scale(a^b) = min(scale(a)*b, max( \fBscale,\fP scale(a)))). Trebuie remarcat
faptul că expr^0 va returna întotdeauna valoarea 1.
.IP "( expr )"
Aceasta modifică precedența standard pentru a forța evaluarea expresiei.
.IP "var = expr"
Variabilei i se atribuie valoarea expresiei.
.IP "var = expr"
Aceasta este echivalentă cu „var = var expr”, cu excepția
faptului că partea „var” este evaluată o singură dată. Acest lucru poate
face o diferență dacă „var” este o matrice.
.PP
Expresiile relaționale sunt un tip special de expresie care evaluează
întotdeauna la 0 sau 1, 0 dacă relația este falsă și 1 dacă relația este
adevărată. Acestea pot apărea în orice expresie validă; (bc POSIX impune ca
expresiile relaționale să fie utilizate numai în declarațiile if, while și
for și ca numai un test relațional să poată fi efectuat în
acestea). Operatorii relaționali sunt
.IP "expr1 < expr2"
Rezultatul este 1 dacă expr1 este strict mai mică decât expr2.
.IP "expr1 <= expr2"
Rezultatul este 1 dacă expr1 este mai mică sau egală cu expr2.
.IP "expr1 > expr2"
Rezultatul este 1 dacă expr1 este strict mai mare decât expr2.
.IP "expr1 >= expr2"
Rezultatul este 1 dacă expr1 este mai mare sau egală cu expr2.
.IP "expr1 == expr2"
Rezultatul este 1 dacă expr1 este egală cu expr2.
.IP "expr1 != expr2"
Rezultatul este 1 dacă expr1 nu este egală cu expr2.
.PP
Operațiile booleene sunt, de asemenea, valabile. (POSIX \fBbc\fP NU are
operații booleene). Rezultatul tuturor operațiilor booleene sunt 0 și 1
(pentru fals și adevărat) ca în expresiile relaționale. Operatorii booleeni
sunt:
.IP !expr
Rezultatul este 1 dacă expr este 0.
.IP "expr && expr"
Rezultatul este 1 dacă ambele expresii sunt diferite de zero.
.IP "expr || expr"
Rezultatul este 1 dacă oricare dintre expresii este diferită de zero.
.PP
Precedența expresiilor este după cum urmează: (de la cea mai mică la cea mai
mare)
.nf
.RS
operator ||, asociativ la stânga
operator &&, asociativ la stânga
operator !, neasociativ
operatori relaționali, asociativi la stânga
operator de atribuire, asociativ la dreapta
operatori + și \-, asociativ la stânga
operatori *, / și %, asociativ la stânga
operator ^, asociativ la dreapta
operator unar \-, neasociativ
operatori ++ și \-\-, neasociativi
.RE
.fi
.PP
Această precedență a fost aleasă astfel încât programele \fBbc\fP conforme cu
POSIX să ruleze corect. Acest lucru va face ca utilizarea operatorilor
logici și relaționali să aibă un comportament neobișnuit atunci când sunt
utilizați cu expresii de atribuire. Luați în considerare expresia:
.RS
a = 3 < 5
.RE
.PP
Majoritatea programatorilor C ar presupune că acest lucru ar atribui
rezultatul „3 < 5” (valoarea 1) variabilei „a”. Ceea ce face acest lucru
în \fBbc\fP este să atribuie valoarea 3 variabilei „a” și apoi să compare 3 cu
5. Cel mai bine este să folosiți paranteze atunci când utilizați operatorii
relaționali și logici cu operatorii de atribuire.
.PP
Mai există câteva expresii speciale care sunt furnizate în \fBbc\fP. Acestea au
de\-a face cu funcții definite de utilizator și funcții standard. Toate apar
ca „\fInume\fP\fB(\fP\fIparametri\fP\fB)\fP”. Consultați secțiunea privind funcțiile,
pentru funcțiile definite de utilizator. Funcțiile standard sunt:
.IP "length ( expresie )"
Valoarea funcției length este numărul de cifre semnificative din expresie.
.IP "read ( )"
Funcția read (o extensie) va citi un număr de la intrarea standard,
indiferent de locul în care apare funcția. Atenție, acest lucru poate cauza
probleme cu amestecul de date și program la intrarea standard. Cea mai bună
utilizare a acestei funcții este într\-un program scris anterior care are
nevoie de intrare de la utilizator, dar nu permite niciodată introducerea
codului de program de la utilizator. Valoarea funcției read este numărul
citit de la intrarea standard folosind valoarea curentă a variabilei
\fBibase\fP pentru baza de conversie.
.IP "scale ( expresie )"
Valoarea funcției scale este numărul de cifre după punctul zecimal din
expresie.
.IP "sqrt ( expresie )"
Valoarea funcției sqrt este rădăcina pătrată a expresiei. Dacă expresia este
negativă, este generată o eroare în timpul execuției.
.SS INSTRUCȚIUNI
Instrucțiunile (ca în majoritatea limbajelor algebrice) asigură secvența de
evaluare a expresiilor. În \fBbc\fP instrucțiunile sunt executate „de îndată ce
este posibil”. Execuția are loc atunci când este întâlnită o linie nouă și
există una sau mai multe instrucțiuni complete. Datorită acestei execuții
imediate, liniile noi sunt foarte importante în \fBbc\fP. De fapt, atât punctul
și virgula, cât și linia nouă sunt utilizate ca separatoare de
instrucțiuni. O linie nouă plasată necorespunzător va cauza o eroare de
sintaxă. Deoarece liniile noi sunt separatoare de instrucțiuni, este posibil
să se ascundă o linie nouă prin utilizarea caracterului de bară oblică
inversă. Secvența „\e”, unde este linia nouă, apare
pentru \fBbc\fP ca spațiu alb în loc de o linie nouă. O listă de instrucțiuni
este o serie de instrucțiuni separate prin punct și virgulă și linii
noi. Următoarea este o listă de instrucțiuni \fBbc\fP și ce fac acestea:
(Lucrurile incluse în paranteze ([]) sunt părți opționale ale
instrucțiunii).
.IP expresie
Această instrucțiune face unul din două lucruri. Dacă expresia începe cu
„ ...”, aceasta este considerată a fi
o instrucțiune de atribuire. Dacă expresia nu este o instrucțiune de
atribuire, expresia este evaluată și imprimată la ieșire. După imprimarea
numărului, este imprimată o linie nouă. De exemplu, „a=1” este o
instrucțiune de atribuire, iar „(a=1)” este o expresie care are o atribuire
încorporată. Toate numerele care sunt imprimate sunt imprimate în baza
specificată de variabila \fBobase\fP. Valorile valide pentru \fBobase\fP sunt de
la 2 până la BC_BASE_MAX; (ase vedea secțiunea LIMITE.) Pentru bazele de la
2 la 16, se utilizează metoda obișnuită de scriere a numerelor. Pentru baze
mai mari de 16, \fBbc\fP utilizează o metodă de imprimare a cifrelor cu mai
multe caractere, în care fiecare cifră de bază superioară este imprimată ca
un număr de bază 10. Cifrele cu mai multe caractere sunt separate prin
spații. Fiecare cifră conține numărul de caractere necesare pentru a
reprezenta valoarea în bază zece a „obase\-1”. Deoarece numerele sunt de o
precizie arbitrară, este posibil ca unele numere să nu poată fi imprimate pe
o singură linie de ieșire. Aceste numere lungi vor fi împărțite pe linii
folosind „\e” ca ultim caracter pe o linie. Numărul maxim de caractere
imprimate pe linie este de 70. Datorită naturii interactive a \fBbc\fP,
imprimarea unui număr are ca efect secundar atribuirea valorii imprimate
variabilei speciale \fBlast\fP. Acest lucru permite utilizatorului să
recupereze ultima valoare imprimată fără a fi nevoit să rescrie expresia
care a imprimat numărul. Atribuirea la \fBlast\fP este valabilă și va
suprascrie ultima valoare imprimată cu valoarea atribuită. Valoarea nou
atribuită va rămâne până la imprimarea următorului număr sau până la
atribuirea unei alte valori la \fBlast\fP; (unele instalații pot permite
utilizarea unui singur punct (.) care nu face parte dintr\-un număr ca
notație scurtă pentru \fBlast\fP).
.IP șir
Șirul este imprimat la ieșire. Șirurile încep cu un caracter de ghilimele
duble și conțin toate caracterele până la următorul caracter de ghilimele
duble. Toate caracterele sunt luate literal, inclusiv orice linie nouă. După
șir nu se imprimă niciun caracter de linie nouă.
.IP "\fBprint\fP listă"
Instrucțiunea print (o extensie) oferă o altă metodă de ieșire. „Lista” este
o listă de șiruri de caractere și expresii separate prin virgule. Fiecare
șir sau expresie este imprimată în ordinea din listă. Nu se imprimă nicio
linie nouă de încheiere. Expresiile sunt evaluate, iar valoarea lor este
imprimată și atribuită variabilei \fBlast\fP. Șirurile de caractere din
instrucțiunea print sunt imprimate la ieșire și pot conține caractere
speciale. Caracterele speciale încep cu caracterul de bară oblică inversă
(\e). Caracterele speciale recunoscute de \fBbc\fP sunt „a” (alertă sau
clopoțel), „b” (backspace), „f” (salt de pagină), „n” (linie nouă), „r”
(retur de cărucior), „q” (ghilimele duble), „t” (tabulator) și „\e” (bară
oblică inversă). Orice alt caracter care urmează barei inverse va fi
ignorat.
.IP "{ listă_instrucțiuni }"
Aceasta este instrucțiunea compusă. Aceasta permite gruparea mai multor
instrucțiuni pentru execuție.
.IP "\fBif\fP ( expresie ) instrucțiune1 [\fBelse\fP instrucțiune2]"
Instrucțiunea if evaluează expresia și execută instrucțiunea1 sau
instrucțiunea2 în funcție de valoarea expresiei. Dacă expresia este diferită
de zero, se execută instrucțiunea1. Dacă instrucțiunea2 este prezentă și
valoarea expresiei este 0, atunci instrucțiunea2 este executată; (clauza
else este o extensie).
.IP "\fBwhile\fP ( expresie ) instrucțiune"
Instrucțiunea while va executa instrucțiunea în timp ce expresia este
diferită de zero. Aceasta evaluează expresia înainte de fiecare execuție a
instrucțiunii. Încheierea buclei este cauzată de o valoare zero a expresiei
sau de executarea unei instrucțiuni break.
.IP "\fBfor\fP ( expresie1] ; [expresie2] ; [expresie3] ) instrucțiune"
Instrucțiunea for controlează executarea repetată a instrucțiunii. Expresia1
este evaluată înainte de buclă. Expresia2 este evaluată înainte de fiecare
execuție a instrucțiunii. Dacă este diferită de zero, instrucțiunea este
evaluată. Dacă este zero, bucla este terminată. După fiecare execuție a
instrucțiunii, expresia3 este evaluată înainte de reevaluarea
expresiei2. Dacă expresia1 sau expresia3 lipsesc, nu se evaluează nimic în
momentul în care acestea ar fi evaluate. Dacă expresia2 lipsește, este la
fel ca și înlocuirea expresiei2 cu valoarea 1; (expresiile opționale sunt o
extensie, POSIX \fBbc\fP necesită toate cele trei expresii). Următorul este
codul echivalent pentru instrucțiunea for:
.nf
.RS
expresie1;
while (expresie2) {
declarație
expresie3;
}
.RE
.fi
.IP \fBbreak\fP
Această instrucțiune determină o ieșire forțată din cea mai recentă
instrucțiune while sau for care o include.
.IP \fBcontinue\fP
Instrucțiunea continue (o extensie) face ca cea mai recentă instrucțiune for
să înceapă următoarea iterație.
.IP \fBhalt\fP
Instrucțiunea halt (o extensie) este o instrucțiune executată care determină
procesorul \fBbc\fP să se oprească numai atunci când este executată. De
exemplu, „if (0 == 1) halt” nu va determina terminarea \fBbc\fP deoarece
instrucțiunea halt nu este executată.
.IP \fBreturn\fP
Returnează valoarea 0 de la o funcție; (consultați secțiunea privind
funcțiile).
.IP "\fBreturn\fP ( expresie )"
Returnează valoarea expresiei dintr\-o funcție; (consultați secțiunea privind
funcțiile). Ca extensie, parantezele nu sunt necesare.
.SS "PSEUDO INSTRUCȚIUNI"
Aceste instrucțiuni nu sunt instrucțiuni în sensul tradițional. Ele nu sunt
instrucțiuni executate. Funcția lor este îndeplinită la momentul
„compilării”.
.IP \fBlimits\fP
Afișează limitele locale impuse de versiunea locală a \fBbc\fP. Aceasta este o
extensie.
.IP \fBquit\fP
Atunci când instrucțiunea quit este citită, procesorul \fBbc\fP se termină,
indiferent unde se găsește instrucțiunea quit. De exemplu, „if (0 == 1)
quit” va determina terminarea procesorului \fBbc\fP.
.IP \fBwarranty\fP
Afișează o notificare de garanție mai lungă. Aceasta este o extensie.
.SS FUNCȚII
Funcțiile oferă o metodă de definire a unui calcul care poate fi executat
ulterior. Funcțiile din \fBbc\fP calculează întotdeauna o valoare și o
returnează apelantului. Definițiile funcțiilor sunt „dinamice” în sensul că
o funcție este nedefinită până când o definiție este întâlnită în
intrare. Acea definiție este apoi utilizată până când este întâlnită o altă
funcție de definiție pentru același nume. Noua definiție înlocuiește atunci
vechea definiție. O funcție este definită după cum urmează:
.nf
.RS
\fBdefine \fP\fInume\fP\fB( \fP\fIparametri \fP\fB) { \fP\fIlinie nouă listă_auto listă_de_instrucțiuni \fP\fB}\fP
.RE
.fi
Un apel de funcție este doar o expresie de forma
„\fInume\fP\fB(\fP\fIparametri\fP\fB)\fP”.
.PP
Parametrii sunt numere sau matrici (o extensie). În definiția funcției, zero
sau mai mulți parametri sunt definiți prin enumerarea numelor lor separate
prin virgulă. Toți parametrii sunt parametrii de apel prin
valoare. Matricele sunt specificate în definiția parametrilor prin notația
„\fInume\fP\fB[]\fP”. În apelul funcției, parametrii efectivi sunt expresii
complete pentru parametrii numerici. Pentru pasarea matricelor se utilizează
aceeași notație ca și pentru definirea parametrilor matricelor. Matricea
numită este pasată prin valoare către funcție. Deoarece definițiile
funcțiilor sunt dinamice, numărul și tipul parametrilor sunt verificate
atunci când se apelează o funcție. Orice neconcordanță în ceea ce privește
numărul sau tipurile de parametri va provoca o eroare în timpul execuției. O
eroare de execuție va apărea și în cazul apelării unei funcții nedefinite.
.PP
\fIauto_list\fP este o listă opțională de variabile care sunt pentru utilizare
„locală”. Sintaxa listei auto (dacă este prezentă) este „\fBauto \fP\fInume\fP,
\&... ;”. (Punctul și virgula este opțional.) Fiecare \fInume\fP este numele unei
variabile auto. Matricele pot fi specificate prin utilizarea aceleiași
notații ca în cazul parametrilor. Aceste variabile au valorile lor plasate
pe o stivă la începutul funcției. Variabilele sunt apoi inițializate la zero
și utilizate pe parcursul execuției funcției. La ieșirea din funcție, aceste
variabile sunt scoase, astfel încât valoarea inițială (la momentul apelului
funcției) a acestor variabile să fie restaurată. Parametrii sunt de fapt
variabile automate care sunt inițializate la o valoare furnizată în apelul
funcției. Variabilele automate sunt diferite de variabilele locale
tradiționale deoarece, dacă funcția A apelează funcția B, B poate accesa
variabilele automate ale funcției A folosind doar același nume, cu excepția
cazului în care funcția B le\-a numit variabile automate. Datorită faptului
că variabilele automate și parametrii sunt plasați pe o stivă, \fBbc\fP acceptă
funcții recursive.
.PP
Corpul funcției este o listă de instrucțiuni \fBbc\fP. Din nou, instrucțiunile
sunt separate prin punct și virgulă sau linii noi. Instrucțiunile return
determină terminarea unei funcții și returnarea unei valori. Există două
versiuni ale instrucțiunii return. Prima formă, „\fBreturn\fP”, returnează
valoarea 0 la expresia apelantă. A doua formă, „\fBreturn ( \fP\fIexpresie \fP\fB)\fP”, calculează valoarea expresiei și returnează această valoare
expresiei apelante. Există un „\fBreturn (0)\fP” implicit la sfârșitul fiecărei
funcții. Acest lucru permite unei funcții să se încheie și să returneze 0
fără o instrucțiune de returnare explicită.
.PP
Funcțiile modifică, de asemenea, utilizarea variabilei \fBibase\fP. Toate
constantele din corpul funcției vor fi convertite folosind valoarea lui
\fBibase\fP la momentul apelului funcției. Modificările lui \fBibase\fP vor fi
ignorate în timpul executării funcției, cu excepția funcției standard
\fBread\fP, care va utiliza întotdeauna valoarea curentă a lui \fBibase\fP pentru
conversia numerelor.
.PP
Funcțiilor le\-au fost adăugate mai multe extensii. În primul rând, formatul
definiției a fost ușor relaxat. Standardul cere ca acolada de deschidere să
fie pe aceeași linie cu cuvântul\-cheie \fBdefine\fP și toate celelalte părți
trebuie să fie pe liniile următoare. Această versiune a \fBbc\fP va permite
orice număr de linii noi înainte și după acolada de deschidere a
funcției. De exemplu, următoarele definiții sunt valabile.
.nf
.RS
\f(CR
define d (n) { return (2*n); }
define d (n)
{ return (2*n); }\fR
.\fR
.RE
.fi
.PP
Funcțiile pot fi definite ca \fBvoid\fP. O funcție vidă nu returnează nicio
valoare și, prin urmare, nu poate fi utilizată în niciun loc care necesită o
valoare. O funcție vidă nu produce niciun rezultat atunci când este apelată
singură pe o linie de intrare. Cuvântul cheie \fBvoid\fP este plasat între
cuvântul cheie \fBdefine\fP și numele funcției. De exemplu, luați în
considerare următoarea sesiune.
.nf
.RS
\f(CR
define py (y) { print "\-\-\->", y, "<\-\-\-", "\en"; }
define void px (x) { print "\-\-\->", x, "<\-\-\-", "\en"; }
py(1)
\-\-\->1<\-\-\-
0
px(1)
\-\-\->1<\-\-\-\fR
.\fR
.RE
.fi
\f(CRDin moment ce \fBpy\fP nu este o funcție nulă (void), apelul la \fBpy(1)\fP
imprimă rezultatul dorit și apoi imprimă o a doua linie care este valoarea
funcției. Deoarece valoarea unei funcții care nu primește o instrucțiune de
revenire explicită este zero, se imprimă zero. Pentru \fBpx(1)\fP, nu se
imprimă niciun zero deoarece funcția este o funcție nulă.
.PP
De asemenea, a fost adăugat apelul prin variabilă pentru matrice. Pentru a
declara o matrice cu apel prin variabilă, declarația parametrului matricei
în definiția funcției arată ca „\fI*nume\fP\fB[]\fP”. Apelul la funcție rămâne
același ca în cazul apelului prin valoare a matricelor.
.SS "BIBLIOTECA DE MATEMATICĂ"
Dacă \fBbc\fP este invocat cu opțiunea \fB\-l\fP, o bibliotecă de matematică este
preîncărcată, iar scala implicită este fixată la 20. Funcțiile matematice
își vor calcula rezultatele la scala stabilită în momentul apelării lor.
Biblioteca de matematică definește următoarele funcții:
.IP "s (\fIx\fP)"
Sinusul lui x, x este exprimat în radiani.
.IP "c (\fIx\fP)"
Cosinusul lui x, x este exprimat în radiani.
.IP "a (\fIx\fP)"
Arctangenta lui x, arctangenta returnează radiani.
.IP "l (\fIx\fP)"
Logaritmul natural al lui x.
.IP "e (\fIx\fP)"
The exponential function of raising e to the value x.
.IP "j (\fIn,x\fP)"
Funcția Bessel de ordin întreg n a lui x.
.SS EXEMPLE
În /bin/sh, următorul text va atribui valoarea „pi” variabilei shell \fBpi\fP.
.RS
\f(CR pi=$(echo "scale=10; 4*a(1)" | bc \-l)\fR
.\fR
.RE
.PP
The following is the definition of the exponential function used in the math
library. This function is written in POSIX \fBbc\fP.
.nf
.RS
\f(CR
scale = 20\fR
\f(CR/* Folosește faptul că e^x = (e^(x/2))^2
Când x este suficient de mic, se folosește seria:
e^x = 1 + x + x^2/2! + x^3/3! + ...
*/\fR
\f(CRdefine e(x) {
auto a, d, e, f, i, m, v, z\fR
\f(CR /* Verifică semnul lui x. */
if (x<0) {
m = 1
x = \-x
}\fR
\f(CR /* Precondiție x. */
z = scale;
scale = 4 + z + .44*x;
while (x > 1) {
f += 1;
x /= 2;
}\fR
\f(CR /* Inițializează variabilele. */
v = 1+x
a = x
d = 1\fR
\f(CR 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
.\fR
.RE
.fi
.PP
În continuare este prezentat codul care utilizează caracteristicile extinse
ale \fBbc\fP pentru a implementa un program simplu de calculare a soldurilor
carnetului de cecuri. Acest program este cel mai bine să fie păstrat într\-un
fișier pentru a putea fi utilizat de mai multe ori fără a fi nevoie să îl
rescrieți la fiecare utilizare.
.nf
.RS
\f(CR
scale=2
print „\enProgramul registrului de balanțe!\en”
print „ Țineți minte, depozitele sunt tranzacții negative.\en”
print „ Ieșire printr\-o tranzacție 0.\en\en”\fR
\f(CRprint "Soldul inițial? "; bal = read()
bal /= 1
print "\en"
while (1) {
"current balance = "; bal
"transaction? "; trans = read()
if (trans == 0) break;
bal \-= trans
bal /= 1
}
quit\fR
.\fR
.RE
.fi
.PP
Următoarea este definiția funcției factoriale recursive.
.nf
.RS
\f(CR
define f (x) {
if (x <= 1) return (1);
return (f(x\-1) * x);
}\fR
.\fR
.RE
.fi
.SS "OPȚIUNI PENTRU READLINE ȘI LIBEDIT"
\fBbc\fP GNU poate fi compilat (prin intermediul unei opțiuni configure) pentru
a utiliza biblioteca editorului de intrare GNU \fBreadline\fP sau biblioteca
BSD \fBlibedit\fP. Acest lucru permite utilizatorului să editeze liniile
înainte de a le trimite la \fBbc\fP. De asemenea, permite un istoric al
liniilor tastate anterior. Când această opțiune este selectată, \fBbc\fP mai
are o variabilă specială. Această variabilă specială, \fBhistory\fP este
numărul de linii de istoric reținute. Pentru \fBreadline\fP, o valoare de \-1
înseamnă că se păstrează un număr nelimitat de linii de istoric. Stabilirea
valorii \fBhistory\fP la un număr pozitiv limitează numărul de linii de istoric
la numărul dat. Valoarea 0 dezactivează funcția de istoric. Valoarea
implicită este 100. Pentru mai multe informații, citiți manualele de
utilizare pentru bibliotecile GNU \fBreadline\fP, \fBhistory\fP și BSD
\fBlibedit\fP. Nu se pot activa în același timp \fBreadline\fP și \fBlibedit\fP.
.SS DIFERENȚE
Această versiune a \fBbc\fP a fost implementată pornind de la proiectul POSIX
P1003.2/D11 și conține mai multe diferențe și extensii în raport cu
proiectul și implementările tradiționale. Aceasta nu este implementată în
mod tradițional folosind \fBdc\fP(1). Această versiune este un proces unic care
analizează și execută o traducere a codului de octeți al programului. Există
o opțiune „nedocumentată” (\-c) care face ca programul să trimită codul de
octeți la ieșirea standard în loc să îl execute. Aceasta a fost utilizată în
principal pentru depanarea analizorului și pregătirea bibliotecii de
matematică.
.PP
O sursă majoră de diferențe este reprezentată de extensii, atunci când o
caracteristică este extinsă pentru a adăuga mai multe funcționalități și de
adăugiri, atunci când sunt adăugate noi caracteristici. Următoarea este
lista de diferențe și extensii.
.IP "variabila de mediu LANG"
Această versiune nu este conformă cu standardul POSIX în ceea ce privește
prelucrarea variabilei de mediu LANG și a tuturor variabilelor de mediu care
încep cu LC_.
.IP nume
\fBbc\fP tradițional și POSIX au nume cu o singură literă pentru funcții,
variabile și matrici. Acestea au fost extinse pentru a fi nume cu mai multe
caractere care încep cu o literă și pot conține litere, numere și caracterul
de subliniere.
.IP Șiruri
Șirurile nu au voie să conțină caractere NUL. POSIX spune că toate
caracterele trebuie să fie incluse în șiruri.
.IP last
\fBbc\fP POSIX nu are o variabilă \fBlast\fP. Unele implementări ale \fBbc\fP
utilizează punctul (.) într\-un mod similar.
.IP comparații
\fBbc\fP POSIX permite comparațiile numai în instrucțiunea if, instrucțiunea
while și a doua expresie a instrucțiunii for. De asemenea, numai o operație
relațională este permisă în fiecare dintre aceste instrucțiuni.
.IP "instrucțiunea if, clauza else"
\fBbc\fP POSIX nu are o clauză else.
.IP "instrucțiunea for"
\fBbc\fP POSIX impune ca toate expresiile să fie prezente în instrucțiunea for.
.IP "&&, ||, !"
\fBbc\fP POSIX nu are operatori logici.
.IP "funcția read"
\fBbc\fP POSIX nu are o funcție de citire.
.IP "instrucțiunea print"
\fBbc\fP POSIX nu are o instrucțiune print .
.IP "instrucțiunea continue"
\fBbc\fP POSIX nu are o instrucțiune continue.
.IP "instrucțiunea return"
\fBbc\fP POSIX necesită paranteze în jurul expresiei return.
.IP "parametri de matrice"
\fBbc\fP POSIX nu acceptă (în prezent) parametrii matricei în
întregime. Gramatica POSIX permite utilizarea matricelor în definițiile
funcțiilor, dar nu oferă o metodă de a specifica o matrice ca parametru
real; (aceasta este, cel mai probabil, o omisiune a
gramaticii). Implementările tradiționale ale \fBbc\fP au doar parametrii de tip
matrice cu apel prin valoare.
.IP "formatul funcției"
\fBbc\fP POSIX impune ca paranteza de deschidere să se afle pe aceeași linie cu
cuvântul\-cheie \fBdefine\fP, iar declarația \fBauto\fP pe linia următoare.
.IP "=+, =\-, =*, =/, =%, =^"
POSIX \fBbc\fP nu necesită definirea acestor operatori de atribuire „în stil
vechi”. Această versiune poate permite aceste atribuiri „în stil
vechi”. Utilizați declarația limits pentru a vedea dacă versiunea instalată
le acceptă. Dacă acceptă operatorii de atribuire „în stil vechi”,
instrucțiunea „a =\- 1” va decrementa \fBa\fP cu 1 în loc să stabilească \fBa\fP la
valoarea \-1.
.IP "spații în numere"
Alte implementări ale \fBbc\fP permit spații în numere. De exemplu, „x=1 3” ar
atribui valoarea 13 variabilei x. Aceeași afirmație ar cauza o eroare de
sintaxă în această versiune a \fBbc\fP.
.IP "erori și execuție"
Această implementare diferă de alte implementări în ceea ce privește codul
care va fi executat atunci când se găsesc erori de sintaxă și alte erori în
program. Dacă se găsește o eroare de sintaxă în definiția unei funcții,
recuperarea erorilor încearcă să găsească începutul unei instrucțiuni și să
continue analizarea funcției. Odată ce este găsită o eroare de sintaxă în
funcție, funcția nu va mai putea fi apelată și devine nedefinită. Erorile de
sintaxă din codul de execuție interactiv vor invalida blocul de execuție
curent. Blocul de execuție este încheiat de un sfârșit de linie care apare
după o secvență completă de instrucțiuni. De exemplu,
.nf
.RS
a = 1
b = 2
.RE
.fi
are două blocuri de execuție și
.nf
.RS
{ a = 1
b = 2 }
.RE
.fi
are un singur bloc de execuție. Orice eroare în timp de execuție va încheia
execuția blocului de execuție curent. Un avertisment de timp de execuție nu
va încheia blocul de execuție curent.
.IP întreruperi
În timpul unei sesiuni interactive, semnalul SIGINT (generat de obicei de
caracterul control\-C din terminal) va determina întreruperea execuției
blocului de execuție curent. Se va afișa o eroare „runtime” indicând funcția
care a fost întreruptă. După ce toate structurile de timp de execuție au
fost curățate, va fi afișat un mesaj pentru a notifica utilizatorul că \fBbc\fP
este gata pentru mai multe intrări. Toate funcțiile definite anterior rămân
definite, iar valoarea tuturor variabilelor non\-auto este valoarea din
punctul de întrerupere. Toate variabilele automate și parametrii funcțiilor
sunt eliminați în timpul procesului de curățare. În timpul unei sesiuni
non\-interactive, semnalul SIGINT va pune capăt întregii execuții a \fBbc\fP.
.SS LIMITE
Următoarele sunt limitele existente în prezent pentru acest procesor
\fBbc\fP. Este posibil ca unele dintre ele să fi fost modificate de o
instalare. Utilizați declarația limits pentru a vedea valorile actuale.
.IP BC_BASE_MAX
Baza maximă de ieșire este de cel puțin 10^9. Baza maximă de intrare este
16.
.IP BC_DIM_MAX
În prezent, aceasta este o limită arbitrară de 65535, așa cum este
distribuită. Instalarea dvs. poate fi diferită.
.IP BC_SCALE_MAX
Numărul de cifre după punctul zecimal este limitat la INT_MAX cifre. De
asemenea, numărul de cifre înainte de punctul zecimal este limitat la
INT_MAX cifre.
.IP BC_STRING_MAX
Limita numărului de caractere dintr\-un șir este INT_MAX caractere.
.IP exponent
Valoarea exponentului în operația de ridicare la putere (^) este limitată la
LONG_MAX.
.IP "nume de variabile"
Limita actuală a numărului de nume unice este de 32767 pentru fiecare dintre
variabilele simple, matrici și funcții.
.SH "VARIABILE DE MEDIU"
Următoarele variabile de mediu sunt prelucrate de \fBbc\fP:
.IP POSIXLY_CORRECT
Aceasta este aceeași ca și opțiunea \fB\-s\fP.
.IP BC_ENV_ARGS
Acesta este un alt mecanism pentru a obține argumente pentru \fBbc\fP. Formatul
este același ca al argumentelor din linia de comandă. Aceste argumente sunt
procesate primele, astfel încât orice fișiere listate în argumentele de
mediu sunt procesate înaintea oricăror fișiere de argumente din linia de
comandă. Acest lucru permite utilizatorului să configureze opțiuni și
fișiere „standard” care să fie procesate la fiecare invocare a
\fBbc\fP. Fișierele din variabilele de mediu ar conține, de obicei, definiții
de funcții pentru funcțiile pe care utilizatorul dorește să le definească de
fiecare dată când \fBbc\fP este rulat.
.IP BC_LINE_LENGTH
Acesta trebuie să fie un număr întreg care să specifice numărul de caractere
dintr\-o linie de ieșire pentru numere. Acesta include caracterele de bară
oblică inversă și de linie nouă pentru numerele lungi. Ca extensie, valoarea
zero dezactivează funcția de linii multiple. Orice altă valoare a acestei
variabile care este mai mică de 3 stabilește lungimea liniei la 70.
.SH DIAGNOSTICARE
Dacă un fișier din linia de comandă nu poate fi deschis, \fBbc\fP va raporta că
fișierul nu este disponibil și se va încheia. De asemenea, există
diagnostice de compilare și de execuție care ar trebui să se explice de la
sine.
.SH ERORI
Recuperarea erorilor nu este încă foarte bună.
.PP
Trimiteți rapoartele de erori prin poștă electronică la adresa
\fBbug\-bc@gnu.org\fP. Asigurați\-vă că includeți cuvântul „bc” undeva în câmpul
„Subiect:”.
.SH AUTOR
.nf
Philip A. Nelson
philnelson@acm.org
.fi
.SH MULȚUMIRI
Autorul dorește să îi mulțumească lui Steve Sommars (Steve.Sommars@att.com)
pentru ajutorul său extins în testarea implementării. Au fost oferite multe
sugestii excelente. Acesta este un produs mult mai bun datorită implicării
sale.
.PP
.SH TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de
Remus-Gabriel Chelu
.
.PP
Această traducere este documentație gratuită; citiți
.UR https://www.gnu.org/licenses/gpl-3.0.html
Licența publică generală GNU Versiunea 3
.UE
sau o versiune ulterioară cu privire la condiții privind drepturile de autor.
NU se asumă NICIO RESPONSABILITATE.
.PP
Dacă găsiți erori în traducerea acestui manual,
vă rugăm să trimiteți un e-mail la
.MT translation-team-ro@lists.sourceforge.net
.ME .