Man page - bc(1)

Packages contains this manual

    Package:  bc
    apt-get install bc
    Manuals in package:
    Documentations in package:

Available languages:

en fr es pl tr hu ja fi ro

Manual

bc

NOM
SYNTAXE
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 .