Man page - bc(1)
Packages contains this manual
Available languages:
en fr es pl tr hu ja fi roManual
bc
NOMSYNTAXE
DESCRIPTION
OPTIONS
NOMBRES
VARIABLES
COMMENTAIRES
EXPRESSIONS
INSTRUCTIONS
PSEUDO-INSTRUCTIONS
FONCTIONS
BIBLIOTHĂQUE MATHĂMATIQUE
EXEMPLES
OPTIONS READLINE ET LIBEDIT
DIFFĂRENCES
LIMITES
VARIABLES DâENVIRONNEMENT
DIAGNOSTICS
BOGUES
AUTEUR
REMERCIEMENTS
TRADUCTION
NOM
bc â Un langage de calculatrice Ă prĂ©cision arbitraire
SYNTAXE
bc [ -hlwsqv ] [options_longues] [ fichier ... ]
DESCRIPTION
bc est un langage qui prend en charge les nombres en prĂ©cision arbitraire ainsi quâune exĂ©cution interactive des instructions. Il y a quelques similitudes au niveau de la syntaxe avec le langage de programmation C. Une bibliothĂšque mathĂ©matique standard est disponible Ă lâaide dâoptions de ligne de commande. Si nĂ©cessaire, la bibliothĂšque mathĂ©matique peut ĂȘtre dĂ©finie avant de prendre en compte le moindre fichier. bc dĂ©marre en traitant le code de tous les fichiers listĂ©s sur la ligne de commande dans leur ordre dâapparition. AprĂšs que tous les fichiers ont Ă©tĂ© traitĂ©s, bc lit Ă partir de lâentrĂ©e standard. Tout le code est exĂ©cutĂ© dĂšs quâil est lu (si un fichier contient une commande indiquant dâarrĂȘter le processeur, bc ne lira jamais Ă partir de lâentrĂ©e standard).
Cette version de bc contient plusieurs extensions en sus des implémentations traditionnelles de bc et du document de travail de la norme POSIX. Les options de ligne de commande peuvent faire afficher un avertissement par ces extensions ou les rejeter. Ce document décrit le langage accepté par ce processeur. Les extensions seront considérées selon cela.
OPTIONS
-h, --help
Afficher ce message et quitter.
-i , --interactive
Forcer le mode interactif.
-l , --mathlib
Définir la bibliothÚque mathématique standard.
-w , --warn
Ămettre des avertissements pour les extensions du bc POSIX.
-s , --standard
Utiliser exactement le langage bc POSIX.
-q, --quiet
Ne pas afficher le message normal de bienvenue de GNU bc .
-V , --version
Afficher le numéro de version et le copyright et quitter.
NOMBRES
LâĂ©lĂ©ment le plus basique dans bc est le nombre. Les nombres sont des nombres en prĂ©cision arbitraire. Cette prĂ©cision vaut Ă la fois pour la partie entiĂšre et pour la partie fractionnaire. Tous les nombres sont reprĂ©sentĂ©s de façon interne en dĂ©cimal et tous les calculs sont effectuĂ©s en dĂ©cimal (cette version tronque les rĂ©sultats des opĂ©rations de division et de multiplication). Les nombres ont deux attributs : la longueur et lâĂ©chelle. La longueur est le nombre total de chiffres dĂ©cimaux utilisĂ©s par bc pour reprĂ©senter un nombre et lâĂ©chelle est le nombre total de chiffres dĂ©cimaux aprĂšs le point dĂ©cimal. Par exemple :
.000001 a une longueur de 6 et
une échelle de 6.
1935.000 a une longueur de 7 et une échelle de 3.
VARIABLES
Les nombres sont stockĂ©s dans deux types de variables : les variables simples et les variables de tableau. Toutes deux sont nommĂ©es. Les noms commencent par une lettre suivie dâun nombre quelconque de lettres, de chiffres ou de caractĂšres de soulignement (« _ »). Toutes les lettres doivent ĂȘtre en minuscule. Les noms entiĂšrement alphanumĂ©riques sont une extension. Dans le bc POSIX, tous les noms sont constituĂ©s dâune seule lettre minuscule. Le type de variable est rendu Ă©vident grĂące au contexte, car tous les noms de variables de tableau sont suivis de crochets ([]).
Il y a quatre variables spĂ©ciales : scale , ibase , obase et last . scale dĂ©finit la façon dont certaines opĂ©rations utilisent les chiffres aprĂšs le point dĂ©cimal. La valeur par dĂ©faut pour scale est 0. ibase et obase dĂ©finissent la base de conversion pour les nombres en entrĂ©e et en sortie. La base par dĂ©faut est 10, que ce soit pour lâentrĂ©e ou pour la sortie. last (une extension) est une variable ayant pour valeur le dernier nombre affichĂ©. Ces variables seront commentĂ©es plus en dĂ©tail quand cela sera appropriĂ©. Toutes ces variables peuvent se voir affecter des valeurs et ĂȘtre utilisĂ©es dans des expressions.
COMMENTAIRES
Les commentaires dans bc dĂ©butent par les caractĂšres /* et se terminent par les caractĂšres */ . Les commentaires peuvent dĂ©marrer nâimporte oĂč et apparaĂźtre comme une simple espace en entrĂ©e. Cela conduit les commentaires Ă dĂ©limiter les autres Ă©lĂ©ments de lâentrĂ©e. Par exemple, un commentaire ne peut ĂȘtre trouvĂ© au milieu dâun nom de variable. Les commentaires incluent tous les sauts de ligne (fin de ligne) situĂ©s entre le dĂ©but et la fin du commentaire.
Pour que bc prenne en charge lâutilisation de scripts, un commentaire dâune seule ligne a Ă©tĂ© ajoutĂ© comme extension. Un commentaire dâune seule ligne dĂ©bute par un caractĂšre # et continue jusquâĂ la fin de la ligne. Le caractĂšre de fin de ligne ne fait pas partie du commentaire et est traitĂ© normalement.
EXPRESSIONS
Les nombres sont manipulĂ©s par des expressions et des instructions. Puisque le langage a Ă©tĂ© conçu pour ĂȘtre interactif, les instructions et les expressions sont exĂ©cutĂ©es le plus tĂŽt possible. Il nây a pas de programme « main ». Au lieu de cela, le code est exĂ©cutĂ© dĂšs quâil est rencontrĂ©. Les fonctions, expliquĂ©es en dĂ©tail ci-aprĂšs, sont dĂ©finies quand elles sont rencontrĂ©es.
Une expression simple est simplement une constante. bc convertit les constantes en nombres dĂ©cimaux internes en utilisant la base courante de lâentrĂ©e courante, spĂ©cifiĂ©e par la variable ibase . Une exception existe pour les fonctions. Les valeurs valables pour ibase vont de 2 Ă Â 36, celles supĂ©rieures Ă Â 16 sont une extension. Affecter une valeur en dehors de cet intervalle Ă ibase rĂ©sultera en une valeur de 2 ou 36. Les nombres dâentrĂ©e peuvent contenir les caractĂšres 0-9 et A-F (remarque : ils doivent ĂȘtre en capitales, les lettres minuscules Ă©tant des noms de variables). Les nombres dâun seul chiffre ont toujours la valeur de ce chiffre quelle que soit la valeur de ibase (câest-Ă -dire A = 10). Pour les nombres composĂ©s de plusieurs chiffres, bc remplace tous les chiffres dâentrĂ©e supĂ©rieurs ou Ă©gaux Ă ibase par la valeur de ibase - 1. Cela fait en sorte que le nombre ZZZ est toujours le plus grand nombre de 3 chiffres dans la base dâentrĂ©e.
Les expressions complĂštes sont similaires Ă celles de nombreux autres langages de haut niveau. Puisquâil nây a quâun seul type de nombre, il nây a pas de rĂšgle pour mĂ©langer des types. Au lieu de cela, il existe des rĂšgles portant sur lâĂ©chelle des expressions. Chaque expression possĂšde une Ă©chelle. Elle est dĂ©rivĂ©e de lâĂ©chelle des nombres originaux, de lâopĂ©ration effectuĂ©e et, dans de nombreux cas, de la valeur de la variable scale . Les valeurs valables pour la variable scale vont de 0 au plus grand nombre reprĂ©sentable par un entier C.
Dans les descriptions suivantes des expressions valables, « expr » fait référence à une expression complÚte, et « var » à une variable simple ou de tableau. Une variable simple est juste un
nom
et une variable de tableau est indiquée par
nom [ expr ]
Ă moins quâelle ne soit mentionnĂ©e spĂ©cifiquement, lâĂ©chelle du rĂ©sultat est la plus grande de celles des expressions impliquĂ©es.
|
- expr |
Le rĂ©sultat de la nĂ©gation de lâexpression. |
||
|
++ var |
La variable est incrĂ©mentĂ©e de un et la nouvelle valeur est le rĂ©sultat de lâexpression. |
||
|
-- var |
La variable est dĂ©crĂ©mentĂ©e de un et la nouvelle valeur est le rĂ©sultat de lâexpression. |
||
|
var ++ |
Le rĂ©sultat de lâexpression est la valeur de la variable et ensuite la variable est incrĂ©mentĂ©e de un.
|
var -- |
Le rĂ©sultat de lâexpression est la valeur de la variable et ensuite la variable est dĂ©crĂ©mentĂ©e de un. |
expr + expr
Le rĂ©sultat de lâexpression est la somme des deux expressions.
expr - expr
Le rĂ©sultat de lâexpression est la diffĂ©rence des deux expressions.
expr * expr
Le rĂ©sultat de lâexpression est le produit des deux expressions.
expr / expr
Le rĂ©sultat de lâexpression est le quotient des deux expressions. LâĂ©chelle du rĂ©sultat est la valeur de la variable scale .
expr % expr
Le rĂ©sultat de lâexpression est le « reste » et il est calculĂ© de la maniĂšre suivante : pour calculer a%b, a/b est dâabord calculĂ© avec une Ă©chelle de scale chiffres. Ce rĂ©sultat est utilisĂ© pour calculer a-(a/b)*b avec comme Ă©chelle le maximum de scale + échelle(b) et Ă©chelle(a). Si scale vaut zĂ©ro et que les deux expressions sont des entiers, cette expression est la fonction modulo dâentiers.
expr Ë expr
Le rĂ©sultat de lâexpression est la valeur de lâĂ©lĂ©vation de la premiĂšre expression Ă une puissance Ă©gale Ă la valeur de la seconde expression. La seconde expression doit ĂȘtre un entier. Si la seconde expression nâest pas un entier, un avertissement est gĂ©nĂ©rĂ© et lâexpression est tronquĂ©e pour obtenir une valeur entiĂšre. LâĂ©chelle du rĂ©sultat est scale si lâexposant est nĂ©gatif. Si lâexposant est positif, lâĂ©chelle du rĂ©sultat est le minimum entre lâĂ©chelle de la premiĂšre expression multipliĂ©e par la valeur de lâexposant et celle maximale entre scale et lâĂ©chelle de la premiĂšre expression (par exemple, scale(aËb) = min(scale(a)*b, max( scale , scale(a)))). Il faut noter que exprË0 renverra toujours la valeur 1.
( expr )
Cela altĂšre la prioritĂ© standard pour forcer lâĂ©valuation de lâexpression.
var = expr
La valeur de lâexpression est affectĂ©e Ă la variable.
var <op>= expr
Câest Ă©quivalent à « var = var <op> expr » exceptĂ© que la partie « var » nâest Ă©valuĂ©e quâune seule fois. Cela peut faire une diffĂ©rence si « var » est un tableau.
Les expressions
relationnelles sont un cas particulier des expressions qui
sont toujours évaluées à 0
ou 1 : 0 si la relation est fausse et 1 si la
relation est vraie. Elles peuvent apparaĂźtre dans
nâimporte quelle expression valable. Le
bc
POSIX requiert que les expressions relationnelles ne soient
utilisées que dans les instructions if, for et while,
et quâun seul test relationnel y soit effectuĂ©.
Les opérateurs relationnels sont
expr1 < expr2
Le résultat est 1 si expr1 est strictement inférieure à expr2.
expr1 <= expr2
Le résultat est 1 si expr1 est inférieure ou égale à expr2.
expr1 > expr2
Le résultat est 1 si expr1 est strictement supérieure à expr2.
expr1 >= expr2
Le résultat est 1 si expr1 est supérieure ou égale à expr2.
expr1 == expr2
Le résultat est 1 si expr1 est égale à expr2.
expr1 != expr2
Le rĂ©sultat est 1 si expr1 nâest pas Ă©gale Ă expr2.
Les opĂ©rations boolĂ©ennes sont Ă©galement valables. Le bc POSIX NE possĂšde PAS dâopĂ©rations boolĂ©ennes. Le rĂ©sultat de toutes les opĂ©rations boolĂ©ennes est 0 ou 1 (pour faux ou vrai) comme dans les expressions relationnelles. Les opĂ©rateurs boolĂ©ens sont :
|
!expr |
Le résultat est 1 si expr vaut 0. |
expr && expr
Le résultat est 1 si les deux expressions sont différentes de zéro.
expr || expr
Le rĂ©sultat est 1 si au moins lâune des deux expressions est diffĂ©rente de zĂ©ro.
La priorité dans les expressions est la suivante (de la plus basse à la plus haute) :
opérateur ||, associatif
Ă gauche
opérateur &&, associatif à gauche
opérateur !, non associatif
opérateurs relationnels, associatifs à gauche
opĂ©rateur dâaffectation, associatif Ă
droite
opérateurs + et - , associatifs à gauche
opérateurs *, / et %, associatifs à gauche
opĂ©rateur Ë, associatif Ă droite
opérateur - unaire, non associatif
opérateurs ++ et --, non associatifs
Cette prioritĂ© a Ă©tĂ© choisie de telle sorte que les programmes bc conformes Ă POSIX sâexĂ©cutent correctement. Cela conduira Ă ce que lâutilisation des opĂ©rateurs relationnels et logiques mĂšne Ă un comportement inhabituel lors de leur utilisation dans des expressions dâaffectation. ConsidĂ©rez lâexpression :
a = 3 < 5
La plupart des programmeurs C supposeraient que cela affecte le rĂ©sultat de « 3 < 5 » (la valeur 1) Ă la variable « a ». Dans bc , cela affecte la valeur 3 Ă la variable « a » et compare ensuite 3 Ă Â 5. Il vaut mieux utiliser des parenthĂšses lors de lâutilisation dâopĂ©rateurs relationnels ou logiques en prĂ©sence dâopĂ©rateurs dâaffectation.
Il y a quelques
expressions spéciales supplémentaires qui sont
fournies dans
bc
. Elles se rapportent Ă des
fonctions dĂ©finies par lâutilisateur et
Ă des fonctions standard. Elles apparaissent toutes
sous la forme
«
nom
(
paramĂštres
)
».
Consulter la section sur les fonctions pour les fonctions
dĂ©finies par lâutilisateur. Les fonctions
standard sont :
length ( expression )
La valeur de la fonction length est le nombre de chiffres significatifs dans lâexpression.
read ( )
La fonction read (une extension) lit un nombre Ă partir de lâentrĂ©e standard indĂ©pendamment de lâendroit oĂč elle est appelĂ©e. Attention : cela peut causer des problĂšmes lors du mĂ©lange de donnĂ©es et dâun programme sur lâentrĂ©e standard. Le meilleur usage de cette fonction se situe dans un programme prĂ©cĂ©demment Ă©crit qui a besoin dâune saisie de lâutilisateur, mais qui ne permet jamais que lâutilisateur saisisse du code de programme. La valeur de la fonction read est le nombre lu Ă partir de lâentrĂ©e standard en utilisant la valeur actuelle de la variable ibase comme base de conversion.
scale ( expression )
La valeur de la fonction scale est le nombre de chiffres aprĂšs le point dĂ©cimal dans lâexpression.
sqrt ( expression )
La valeur de la fonction sqrt est la racine carrĂ©e de lâexpression. Si lâexpression est nĂ©gative, une erreur dâexĂ©cution est gĂ©nĂ©rĂ©e.
INSTRUCTIONS
Les instructions
(comme dans la plupart des langages algébriques)
fournissent lâordre dâĂ©valuation
dâune expression. Dans
bc
, les instructions
sont exécutées « le plus tÎt
possible ». LâexĂ©cution se produit
quand un saut de ligne est rencontrĂ© et quâil y
a une ou plusieurs instructions complĂštes. Ă
cause de cette exécution immédiate, les sauts
de ligne sont trĂšs importants dans
bc
. En
fait, le point-virgule et le saut de ligne sont
utilisés comme séparateurs
dâinstructions. Un saut de ligne mal placĂ©
provoquera une erreur de syntaxe. Puisque les sauts de ligne
sont des sĂ©parateurs dâinstructions, il est
possible de cacher un saut de ligne en utilisant une barre
oblique inverse. La séquence
« \<nl> », oĂč <nl>
est le saut de ligne, apparaĂźt Ă
bc
comme un espace blanc au lieu dâun saut de ligne. Une
liste dâinstructions est une sĂ©rie
dâinstructions sĂ©parĂ©es par des
points-virgules et des sauts de ligne. Voici une liste des
instructions de
bc
et ce quâelles font (les
éléments entre crochets ([]) sont des parties
facultatives de lâinstruction)Â :
expression
Cette instruction accomplit une des deux actions. Si lâexpression dĂ©bute par « <variable> <affectation> ... », elle est considĂ©rĂ©e comme une instruction dâaffectation. Si lâexpression nâest pas une instruction dâaffectation, lâexpression est Ă©valuĂ©e et affichĂ©e sur la sortie. AprĂšs lâaffichage du nombre, un saut de ligne est Ă©galement affichĂ©. Par exemple, « a=1 » est une instruction dâaffectation et « (a=1) » est une expression qui possĂšde une affectation imbriquĂ©e. Tous les nombres qui sont affichĂ©s le sont dans la base spĂ©cifiĂ©e par la variable obase . Les valeurs valables pour obase vont de 2 Ă BC_BASE_MAX (consulter la section LIMITES). Pour les bases 2 Ă Â 16, la mĂ©thode habituelle dâĂ©criture des nombres est utilisĂ©e. Pour les bases supĂ©rieures Ă 16, bc utilise une mĂ©thode utilisant des chiffres multicaractĂšres pour afficher les nombres oĂč chaque chiffre dâune base supĂ©rieure est affichĂ© comme un nombre en base 10. Les chiffres multicaractĂšres sont sĂ©parĂ©s par des espaces. Chaque chiffre contient le nombre de caractĂšres requis pour reprĂ©senter la valeur en base dix de « obase - 1 ». Puisque les nombres sont en prĂ©cision arbitraire, certains nombres ne peuvent ĂȘtre affichĂ©s sur une seule ligne de sortie. Ces nombres longs seront Ă©clatĂ©s sur plusieurs lignes en utilisant « \ » comme dernier caractĂšre de la ligne. Le nombre maximal de caractĂšres affichĂ©s par ligne est 70. Ă cause de la nature interactive de bc , lâaffichage dâun nombre prĂ©sente comme effet de bord lâaffectation de la valeur affichĂ©e Ă la variable spĂ©ciale last . Cela permet Ă lâutilisateur de rĂ©cupĂ©rer la derniĂšre valeur affichĂ©e sans avoir Ă retaper lâexpression qui a affichĂ© le nombre. Affecter une valeur Ă last est lĂ©gal et remplacera la derniĂšre valeur affichĂ©e par la valeur affectĂ©e. La valeur nouvellement affectĂ©e restera jusquâĂ ce que le nombre suivant soit affichĂ© ou quâune autre valeur soit affectĂ©e Ă last . Certaines installations peuvent permettre lâutilisation dâun simple point (.) qui ne fait pas partie dâun nombre comme un raccourci pour last .
|
string |
La chaĂźne de caractĂšres est affichĂ©e sur la sortie. Les chaĂźnes dĂ©butent par un guillemet double droit et contiennent tous les caractĂšres prĂ©sents jusquâau guillemet suivant. Tous les caractĂšres sont utilisĂ©s littĂ©ralement, y compris les sauts de ligne. Aucun caractĂšre de saut de ligne nâest imprimĂ© aprĂšs la chaĂźne. |
print liste
Lâinstruction print (une extension) fournit une autre mĂ©thode de sortie. La « liste » est une liste de chaĂźnes et dâexpressions sĂ©parĂ©es par des virgules. Les chaĂźnes ou expressions sont affichĂ©es dans leur ordre dâapparition dans cette liste. Aucun saut de ligne terminal nâest affichĂ©. Les expressions sont Ă©valuĂ©es et leur valeur est affichĂ©e et affectĂ©e Ă la variable last . Les chaĂźnes de lâinstruction print sont affichĂ©es sur la sortie et peuvent contenir des caractĂšres spĂ©ciaux. Les caractĂšres spĂ©ciaux dĂ©butent par une barre oblique inverse (\). Les caractĂšres spĂ©ciaux reconnus par bc sont « a » (alerte ou sonnerie), « b » (effacement arriĂšre), « f » (saut de page), « n » (saut de ligne), « r » (retour chariot), « q » (guillemet double droit), « t » (tabulation) et « \ » (barre oblique inverse). Tout autre caractĂšre suivant la barre oblique inverse sera ignorĂ©.
{ liste_instructions }
Câest lâinstruction composĂ©e. Elle permet Ă plusieurs instructions dâĂȘtre regroupĂ©es pour exĂ©cution.
if ( expression ) instruction1 [ else instruction2]
Lâinstruction if Ă©value lâexpression et exĂ©cute instruction1 ou instruction2 en fonction de la valeur de lâexpression. Si lâexpression est diffĂ©rente de zĂ©ro, instruction1 est exĂ©cutĂ©e. Si instruction2 est prĂ©sente et que la valeur de lâexpression est 0, alors instruction2 est exĂ©cutĂ©e (la clause else est une extension).
while ( expression ) instruction
Lâinstruction while exĂ©cutera lâinstruction tant que lâexpression est diffĂ©rente de zĂ©ro. Elle Ă©value lâexpression avant chaque exĂ©cution de lâinstruction. La fin de la boucle est causĂ©e par une valeur dâexpression de 0 ou par lâexĂ©cution dâune instruction break.
for ( [expression1] ; [expression2] ; [expression3] ) instruction
Lâinstruction for
contrĂŽle lâexĂ©cution
rĂ©pĂ©tĂ©e de lâinstruction.
Expression1 est évaluée avant la boucle.
Expression2 est évaluée avant chaque
exĂ©cution de lâinstruction. Si elle est
diffĂ©rente de zĂ©ro, lâinstruction est
Ă©valuĂ©e. Si câest zĂ©ro, la boucle
est terminée. AprÚs chaque exécution de
lâinstruction, expression3 est Ă©valuĂ©e
avant la réévaluation de expression2. Si
expression1 ou expression3 sont absentes, rien nâest
Ă©valuĂ© au moment oĂč elles devraient
lâĂȘtre. Si expression2 manque, cela revient
à substituer la valeur 1 à expression2.
Les expressions facultatives sont une extension. Le
bc
POSIX requiert les trois expressions. Le code
suivant est Ă©quivalent Ă lâinstruction
for :
expression1;
while (expression2) {
instruction;
expression3;
}
|
break |
Cette instruction provoque un arrĂȘt forcĂ© de lâinstruction while ou for englobante la plus proche. |
continue
Lâinstruction continue (une extension) force lâinstruction for englobante la plus proche Ă commencer lâitĂ©ration suivante.
|
halt |
Lâinstruction halt (une extension) est une instruction exĂ©cutĂ©e qui indique au processeur bc de ne sâarrĂȘter que lorsquâelle est exĂ©cutĂ©e. Par exemple, « if (0 == 1) halt » nâobligera pas bc Ă se terminer, car le halt nâest pas exĂ©cutĂ©. |
||
|
return |
Renvoyer la valeur 0 Ă partir dâune fonction (consulter la section sur les fonctions). |
return ( expression )
Renvoyer la valeur de lâexpression Ă partir dâune fonction (consulter la section sur les fonctions). Comme extension, les parenthĂšses ne sont pas requises.
PSEUDO-INSTRUCTIONS
Ces instructions ne sont pas des instructions au sens traditionnel du terme. Elles ne sont pas des instructions exécutées. Leur fonction est effectuée au moment de la compilation.
|
limits |
Afficher les limites locales imposĂ©es par la version locale de bc . Câest une extension. |
||
|
quit |
Quand lâinstruction quit est lue, le processeur bc est arrĂȘtĂ©, quel que soit lâemplacement de lâinstruction quit. Par exemple, « if (0 == 1) quit » provoquera lâarrĂȘt de bc. |
warranty
Afficher une notice de garantie plus longue. Câest une extension.
FONCTIONS
Les fonctions fournissent une mĂ©thode pour dĂ©finir un calcul pouvant ĂȘtre exĂ©cutĂ© ultĂ©rieurement. Les fonctions de bc calculent toujours une valeur et la renvoient Ă lâappelant. Les dĂ©finitions de fonction sont « dynamiques » dans le sens oĂč une fonction nâest pas dĂ©finie avant que sa dĂ©finition ait Ă©tĂ© rencontrĂ©e en entrĂ©e. Cette dĂ©finition est ensuite utilisĂ©e jusquâĂ ce quâune dĂ©finition de fonction de mĂȘme nom soit rencontrĂ©e. La nouvelle dĂ©finition remplace ensuite lâancienne. Une fonction est dĂ©finie comme suit :
define nom ( paramĂštres ) { saut_de_ligne liste_auto liste_instructions }
Un appel de fonction est simplement une expression de la forme « nom ( paramÚtres ) ».
Les paramĂštres sont des nombres ou des tableaux (une extension). Dans la dĂ©finition de fonction, zĂ©ro paramĂštres ou plus sont dĂ©finis en fournissant leurs noms sĂ©parĂ©s par des virgules. Tous les paramĂštres sont passĂ©s par valeur. Les tableaux sont spĂ©cifiĂ©s dans la dĂ©finition des paramĂštres par la notation « nom [] ». Dans lâappel de fonction, les paramĂštres rĂ©els sont des expressions complĂštes pour les paramĂštres nombres. La mĂȘme notation est utilisĂ©e pour passer des tableaux et pour dĂ©finir des paramĂštres de tableau. Le tableau nommĂ© est passĂ© par valeur Ă la fonction. Puisque les dĂ©finitions de fonctions sont dynamiques, le nombre de paramĂštres et leur type sont vĂ©rifiĂ©s quand une fonction est appelĂ©e. Toute erreur dans le nombre ou le type des paramĂštres provoquera une erreur Ă lâexĂ©cution. Une erreur Ă lâexĂ©cution se produit Ă©galement lors de lâappel dâune fonction non dĂ©finie.
La liste_auto est une liste facultative de variables destinĂ©es Ă une utilisation « locale ». La syntaxe de la liste_auto (si elle est prĂ©sente) est « auto nom , ... ; », le point-virgule Ă©tant facultatif. Chaque nom est le nom dâune variable automatique. Les tableaux peuvent ĂȘtre spĂ©cifiĂ©s en utilisant la mĂȘme notation que celle utilisĂ©e pour les paramĂštres. Ces variables voient leur valeur empilĂ©e au dĂ©but de la fonction. Les variables sont ensuite initialisĂ©es Ă zĂ©ro et utilisĂ©es tout au long de lâexĂ©cution de la fonction. Ă la sortie de la fonction, ces valeurs sont dĂ©pilĂ©es afin que leur valeur originale (au moment de lâappel de la fonction) soit restaurĂ©e. Les paramĂštres sont rĂ©ellement des variables automatiques qui sont initialisĂ©es Ă une valeur fournie dans lâappel de fonction. Les variables automatiques sont diffĂ©rentes des variables locales traditionnelles car, si une fonction A appelle une fonction B, B peut accĂ©der aux variables automatiques de A en utilisant simplement le mĂȘme nom, Ă moins que la fonction B en ait fait des variables automatiques. Ătant donnĂ© que les variables automatiques et les paramĂštres sont placĂ©s sur une pile, bc prend en charge les fonctions rĂ©cursives.
Le corps de la fonction est une liste dâinstructions de bc . Ă nouveau, les instructions sont sĂ©parĂ©es par des points-virgules ou des sauts de ligne. Les instructions return provoquent lâarrĂȘt dâune fonction et le renvoi dâune valeur. Il y a deux versions de lâinstruction return. La premiĂšre forme, « return », renvoie la valeur 0 Ă lâexpression appelante. La seconde forme, « return ( expression ) », calcule la valeur de lâexpression et la renvoie Ă lâexpression appelante. Il y a un « return (0) » implicite Ă la fin de chaque fonction. Cela permet Ă une fonction de se terminer et de renvoyer 0 sans avoir besoin dâune instruction return explicite.
Les fonctions modifient Ă©galement lâutilisation de la variable ibase . Toutes les constantes dans le corps de la fonction seront converties en utilisant la valeur de ibase au moment de lâappel de fonction. Les changements dâ ibase seront ignorĂ©s durant lâexĂ©cution de la fonction sauf pour la fonction standard read , qui utilise toujours la valeur actuelle de ibase pour les conversions de nombres.
Plusieurs extensions ont Ă©tĂ© ajoutĂ©es aux fonctions. Dâabord, le format de la dĂ©finition a Ă©tĂ© rendu lĂ©gĂšrement moins astreignant. La norme requiert que lâaccolade dâouverture soit placĂ©e sur la mĂȘme ligne que le mot-clĂ© define et que toutes les autres parties se situent sur les lignes suivantes. Cette version de bc permet un nombre quelconque de sauts de ligne avant et aprĂšs lâaccolade dâouverture de la fonction. Par exemple, les dĂ©finitions suivantes sont valables :
define d (n) { return (2*n); } define d (n) { return (2*n); }
Les fonctions peuvent ĂȘtre dĂ©finies comme void . Une fonction void ne renvoie aucune valeur et par consĂ©quent ne peut ĂȘtre utilisĂ©e dans toute place nĂ©cessitant une valeur. Une fonction void ne produit aucune sortie lorsquâappelĂ©e par elle-mĂȘme sur une ligne dâentrĂ©e. Le mot-clĂ© void est placĂ© entre le mot-clĂ© define et le nom de fonction. Par exemple, en considĂ©rant la session suivante  :
define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<---
Puisque py nâest pas une fonction void, lâappel de py(1) affiche la sortie dĂ©sirĂ©e et une seconde ligne qui est la valeur de la fonction. Puisque la valeur dâune fonction qui nâa pas reçu dâinstruction return explicite est zĂ©ro, celui-ci est affichĂ©. Pour px(1) , aucun zĂ©ro nâest affichĂ© parce que la fonction est une fonction void.
Lâappel par variable a Ă©tĂ© aussi ajoutĂ© pour les tableaux. Pour dĂ©clarer un appel par variable, la dĂ©claration du paramĂštre de tableau dans la dĂ©finition de fonction ressemble à « *nom [] ». Lâappel de la fonction reste le mĂȘme que lâappel par tableaux de valeurs.
BIBLIOTHĂQUE MATHĂMATIQUE
Si bc est invoquĂ© avec lâoption -l , une bibliothĂšque mathĂ©matique est prĂ©chargĂ©e et lâĂ©chelle par dĂ©faut est fixĂ©e Ă Â 20. Les fonctions mathĂ©matiques calculeront leur rĂ©sultat Ă lâĂ©chelle Ă©tablie au moment de leur appel. La bibliothĂšque mathĂ©matique dĂ©finit les fonctions suivantes :
|
s ( x ) |
Le sinus de x ; x est exprimé en radians. |
|||
|
c ( x ) |
Le cosinus de x ; x est exprimé en radians. |
|||
|
a ( x ) |
Lâarc tangente de x ; arctan renvoie des radians. |
|||
|
l ( x ) |
Le logarithme naturel (népérien) de x. |
|||
|
e ( x ) |
La fonction exponentielle de e Ă la puissance x. |
j ( n,x )
La fonction de Bessel dâordre entier n de x.
EXEMPLES
Dans /bin/sh, le code suivant affectera la valeur de « pi » Ă la variable dâinterprĂ©teur pi.
pi=$(echo "scale=10; 4*a(1)" | bc -l)
Le code suivant est la définition de la fonction exponentielle utilisée dans la bibliothÚque mathématique. Cette fonction est écrite en bc POSIX.
scale = 20
/* Utilisation du fait que eËx = (eË(x/2))Ë2 Quand x est suffisamment petit, la sĂ©rie suivante est utilisĂ©e : eËx = 1 + x + xË2/2! + xË3/3! + ... */
define e(x) { auto a, d, e, f, i, m, v, z
/* Vérification du signe de x. */ if (x<0) { m = 1 x = -x }
/* Précondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; }
/* Initialisation des variables. */ 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 } }
Le code suivant utilise les fonctionnalitĂ©s avancĂ©es de bc pour implĂ©menter un programme simple de calcul des soldes de chĂ©quier. Ce programme est conservĂ© de prĂ©fĂ©rence dans un fichier pour quâil puisse ĂȘtre rĂ©utilisĂ© Ă maintes reprises sans avoir Ă le retaper Ă chaque fois.
scale=2 print "\nProgramme de chéquier !\n" print " Rappelez-vous, les dépÎts sont des transactions négatives.\n" print " Quittez par une transaction 0.\n\n"
print "Solde initial ? "; bal = read() bal /= 1 print "\n" while (1) { "solde actuel = "; bal "transaction ? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit
Le code suivant est la définition de la fonction factorielle récursive :
define f (x) { if (x <= 1) return (1); return (f(x-1) * x); }
OPTIONS READLINE ET LIBEDIT
GNU bc peut ĂȘtre compilĂ© (Ă lâaide dâune option de configuration) pour utiliser soit la bibliothĂšque dâĂ©diteur dâentrĂ©e GNU readline , soit la bibliothĂšque BSD libedit . Cela permet Ă lâutilisateur dâĂ©diter des lignes avant de les envoyer Ă bc . Cela permet Ă©galement un historique des lignes prĂ©cĂ©demment tapĂ©es. Quand cette option est sĂ©lectionnĂ©e, bc possĂšde une variable spĂ©ciale supplĂ©mentaire. Cette variable spĂ©ciale, history , est le nombre de lignes dâhistorique mĂ©morisĂ©es. Pour readline , une valeur de -1 signifie quâun nombre illimitĂ© de lignes dâhistorique sont mĂ©morisĂ©es. Fixer la valeur de history Ă un nombre positif restreint le nombre de lignes dâhistorique au nombre fourni. La valeur 0 dĂ©sactive cette fonctionnalitĂ© dâhistorique. La valeur par dĂ©faut est 100. Pour plus dâinformations, lisez les manuels dâutilisateur des bibliothĂšques GNU readline et history , et BSD libedit . Il nâest pas possible dâactiver Ă la fois readline et libedit .
DIFFĂRENCES
Cette version de bc a Ă©tĂ© implĂ©mentĂ©e sur la base du document de travail POSIX P1003.2/D11 et contient plusieurs diffĂ©rences et extensions par rapport au document de travail et aux implĂ©mentations traditionnelles. Elle nâa pas Ă©tĂ© implĂ©mentĂ©e de la façon traditionnelle en utilisant dc (1). Cette version est un unique processus qui analyse et exĂ©cute une traduction en code intermĂ©diaire (byte code) du programme. Il y a une option « non documentĂ©e » (-c) qui fait Ă©mettre par le programme le code intermĂ©diaire sur la sortie standard au lieu de lâexĂ©cuter. Elle a Ă©tĂ© principalement utilisĂ©e pour dĂ©boguer lâanalyseur syntaxique et pour prĂ©parer la bibliothĂšque mathĂ©matique.
Une source
majeure de différences est constituée par les
extensions, oĂč une fonctionnalitĂ© est
étendue pour offrir plus de fonctionnalités et
des ajouts pour de nouvelles fonctionnalités. Voici
la liste des différences et des extensions :
environnement LANG
Cette version ne se conforme pas Ă la norme POSIX en ce qui concerne le traitement de la variable dâenvironnement LANG et de toutes les variables dâenvironnement dont le nom dĂ©bute par LC_.
|
noms |
Les bc traditionnel et POSIX ont des noms composĂ©s dâune seule lettre pour les fonctions, les variables et les tableaux. Ils ont Ă©tĂ© Ă©tendus pour gĂ©rer les noms multicaractĂšres dĂ©butant par une lettre et pouvant contenir des lettres, des nombres et le caractĂšre de soulignement (_). |
chaines
Les chaĂźnes de caractĂšres ne peuvent pas contenir dâoctet NULL. POSIX dit que tous les caractĂšres doivent ĂȘtre inclus dans des chaĂźnes.
|
last |
Le bc POSIX ne possĂšde pas de variable last . Certaines implĂ©mentations de bc utilisent le point (.) dâune maniĂšre similaire. |
comparaisons
Le bc POSIX ne permet les comparaisons que dans lâinstruction if, lâinstruction while et la seconde expression de lâinstruction for. De plus, une seule opĂ©ration relationnelle est permise dans chacune de ces instructions.
if instruction, else clause
Le bc POSIX ne possĂšde pas de clause else.
instruction for
Le bc POSIX requiert que toutes les expressions soient prĂ©sentes dans lâinstruction for.
&&, ||, !
Le bc POSIX ne dispose pas des opérateurs logiques.
fonction read
Le bc POSIX ne possĂšde pas de fonction read.
instruction print
Le bc POSIX ne possĂšde pas dâinstruction print.
instruction continue
Le bc POSIX ne possĂšde pas dâinstruction continue.
instruction return
Le bc POSIX requiert des parenthĂšses autour de lâexpression return.
paramĂštres de tableau
Le bc POSIX ne gĂšre (actuellement) pas totalement les paramĂštres tableau. La grammaire POSIX autorise les tableaux dans les dĂ©finitions de fonction, mais ne fournit pas de mĂ©thode pour spĂ©cifier un tableau comme paramĂštre rĂ©el. Câest plus que probablement un oubli dans la grammaire. Les implĂ©mentations traditionnelles de bc ne gĂšrent que les paramĂštres tableau par valeur.
format de fonction
Le bc POSIX requiert que lâaccolade ouvrante soit sur la mĂȘme ligne que le mot-clĂ© define et que lâinstruction auto soit sur la ligne suivante.
=+, =-, =*, =/, =%, =Ë
Le bc POSIX ne requiert pas la dĂ©finition de ces opĂ©rateurs dâaffectation dans « lâancien style ». Cette version peut permettre ces affectations dans « lâancien style ». Utilisez lâinstruction limits pour voir si la version installĂ©e les prend en charge. Si elle gĂšre les opĂ©rateurs dâaffectation dans « lâancien style », lâinstruction « a = -1 » dĂ©crĂ©mentera a de 1 au lieu de fixer a Ă la valeur -1.
espaces dans les nombres
Dâautres implĂ©mentations de bc permettent les espaces dans les nombres. Par exemple, « x=1 3 » affecterait la valeur 13 Ă la variable x. La mĂȘme instruction causerait une erreur de syntaxe dans cette version de bc .
erreurs et exécution
Cette implémentation se
différencie des autres implémentations par le
code qui est exécuté quand des erreurs de
syntaxe ou dâautres erreurs sont
détectées dans le programme. Si une erreur de
syntaxe est trouvée dans une définition de
fonction, la récupération des erreurs essaie
de trouver le dĂ©but dâune instruction et
continue Ă analyser la fonction. Une fois
quâune erreur de syntaxe est trouvĂ©e dans la
fonction, la fonction ne sera pas appelable et devient non
définie. Les erreurs de syntaxe dans le code
dâexĂ©cution interactive invalideront le bloc
dâexĂ©cution courant. Le bloc
dâexĂ©cution est terminĂ© par une fin de
ligne qui apparaßt aprÚs une séquence
complĂšte dâinstructions. Par exemple,
a = 1
b = 2
possĂšde deux blocs dâexĂ©cution et
{ a = 1
b = 2 }
en possĂšde un. Toute
erreur Ă lâexĂ©cution terminera
lâexĂ©cution du bloc dâexĂ©cution
courant. Un avertissement Ă lâexĂ©cution
ne terminera pas lâexĂ©cution du bloc
dâexĂ©cution courant.
Interruptions
Durant une session interactive, le signal SIGINT (habituellement gĂ©nĂ©rĂ© par la sĂ©quence control-C sur le terminal) interrompra lâexĂ©cution du bloc dâexĂ©cution courant. Il provoquera lâaffichage dâune erreur Ă lâexĂ©cution indiquant quelle fonction a Ă©tĂ© interrompue. AprĂšs que toutes les structures Ă lâexĂ©cution ont Ă©tĂ© « nettoyĂ©es », un message est affichĂ© pour notifier lâutilisateur que bc est prĂȘt Ă recevoir des entrĂ©es supplĂ©mentaires. Toutes les fonctions prĂ©cĂ©demment dĂ©finies le restent, et la valeur de toutes les variables non automatiques est celle ayant cours au moment de lâinterruption. Toutes les variables automatiques et paramĂštres de fonction sont supprimĂ©s durant le processus de nettoyage. Durant une session non interactive, le signal SIGINT terminera lâexĂ©cution entiĂšre de bc .
LIMITES
Voici les
limites actuellement en vigueur pour ce processeur
bc
. Certaines dâentre elles peuvent avoir
été modifiées par une installation.
Utilisez lâinstruction limits pour voir les valeurs
réelles.
BC_BASE_MAX
La base de sortie maximale est actuellement fixĂ©e Ă 999. La base dâentrĂ©e maximale est 16.
BC_DIM_MAX
Câest actuellement une limite arbitraire de 65535 dans la distribution. Votre installation peut ĂȘtre diffĂ©rente.
BC_SCALE_MAX
Le nombre de chiffres aprÚs le point décimal est limité à INT_MAX chiffres. Le nombre de chiffres avant le point décimal est également limité à INT_MAX chiffres.
BC_STRING_MAX
La limite sur le nombre de caractĂšres dans une chaĂźne est de INT_MAX caractĂšres.
exposant
La valeur de lâexposant dans lâopĂ©ration dâexponentielle (Ë) est limitĂ©e Ă LONG_MAX.
noms de variable
Le nombre maximal de noms uniques est fixé à 32767 pour toutes les variables simples, les tableaux et les fonctions.
VARIABLES DâENVIRONNEMENT
Les variables
dâenvironnement suivantes sont prises en compte par
bc
:
POSIXLY_CORRECT
Câest la mĂȘme chose que lâoption -s .
BC_ENV_ARGS
Câest un autre mĂ©canisme pour obtenir des arguments pour bc . Le format est le mĂȘme que celui des arguments en ligne de commande. Ces arguments sont traitĂ©s en premier lieu, de sorte que les fichiers listĂ©s dans les arguments dâenvironnement sont traitĂ©s avant nâimporte quel fichier apparaissant comme argument sur la ligne de commande. Cela permet Ă lâutilisateur de dĂ©finir des options et des fichiers « standard » Ă traiter lors de chaque invocation de bc . Les fichiers prĂ©sents dans les variables dâenvironnement contiennent typiquement des dĂ©finitions de fonction pour les fonctions que lâutilisateur veut voir dĂ©finies Ă chaque fois que bc est exĂ©cutĂ©.
BC_LINE_LENGTH
Cela doit ĂȘtre un entier spĂ©cifiant le nombre de caractĂšres dans une ligne de sortie pour les nombres. Cela inclut les caractĂšres de barre oblique inversĂ©e et de saut de ligne pour les nombres longs. Comme extension, la valeur zĂ©ro dĂ©sactive la fonctionnalitĂ© multiligne. Toute autre valeur de cette variable infĂ©rieure Ă trois dĂ©finit la longueur de ligne Ă Â 70.
DIAGNOSTICS
Si lâun des fichiers de la ligne de commandes ne peut ĂȘtre ouvert, bc indiquera que le fichier nâest pas disponible et se terminera. Il y a Ă©galement des diagnostics lors de la compilation et de lâexĂ©cution qui devraient ĂȘtre suffisamment auto-explicites.
BOGUES
La rĂ©cupĂ©ration aprĂšs erreur nâest pas encore trĂšs bonne.
Envoyez vos rapports de bogues par courriel Ă bug-bc@gnu.org . Assurez-vous dâinclure le mot « bc » quelque part dans le champ « Sujet : ».
AUTEUR
Philip A. Nelson
philnelson@acm.org
REMERCIEMENTS
Lâauteur veut remercier Steve Sommars (Steve.Sommars@att.com) pour son aide intensive lors des tests de lâimplĂ©mentation. Il a fourni beaucoup de suggestions gĂ©niales. Câest un produit bien meilleur grĂące Ă son implication.
TRADUCTION
La traduction française de cette page de manuel a été créée par Frédéric Delanoy <delanoy_f@yahoo.com> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter Ă la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il nây a aucune RESPONSABILITĂ LĂGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .