bc(1) General Commands Manual bc(1) NAZWA bc - jezyk kalkulatora dowolnej precyzji SKLADNIA bc [ -hlwsqv ] [dlugie-opcje] [ plik ... ] OPIS bc jest jezykiem obslugujacym obliczenia na liczbach dowolnej dokladnosci z interaktywnym wykonywaniem instrukcji. Istnieja pewne podobienstwa skladni do jezyka programowania C. Przy pomocy opcji wiersza polecen dostepna jest standardowa biblioteka matematyczna. Na zadanie, biblioteka matematyczna jest definiowana przed rozpoczeciem przetwarzania plikow. bc rozpoczyna prace przetwarzajac kod z wszystkich plikow wymienionych w wierszu polecen, zachowujac ich kolejnosc. Po przetworzeniu wszystkich plikow, bc czyta ze standardowego wejscia. Calosc kodu wykonywana jest w miare czytania. (Jesli plik zawiera polecenie zatrzymania procesora, to bc nie bedzie prowadzil odczytu ze standardowego wejscia). Omawiana wersja bc zawiera kilka rozszerzen w stosunku do tradycyjnych realizacji bc i standardu POSIX. Opcje wiersza polecen moga powodowac, ze rozszerzenia te beda wyswietlac ostrzezenia lub beda odrzucane. Niniejszy dokument opisuje jezyk akceptowany przez ten procesor bc. Rozszerzenia sa w nim wyraznie wyroznione. OPCJE -h, --help Wypisuje informacje o sposobie wywolania i konczy dzialanie. -i, --interactive Wymusza tryb interaktywny. -l, --mathlib Definiuje standardowa biblioteke matematyczna. -w, --warn Ostrzega o rozszerzeniach w stosunku do POSIX bc. -s, --standard Przetwarza wylacznie standardowy, POSIX-owy jezyk bc. -q, --quiet Nie wyswietla zwyklego przywitania GNU bc. -v, --version Wypisuje numer wersji, informacje o prawach autorskich i konczy dzialanie. LICZBY The most basic element in bc is the number. Numbers are arbitrary precision numbers. This precision is both in the integer part and the fractional part. All numbers are represented internally in decimal and all computation is done in decimal. (This version truncates results from divide and multiply operations.) There are two attributes of numbers, the length and the scale. The length is the total number of decimal digits used by bc to represent a number and the scale is the total number of decimal digits after the decimal point. For example: .000001 ma dlugosc 6 i dokladnosc 6. 1935.000 ma dlugosc 7 i dokladnosc 3. ZMIENNE Numbers are stored in two types of variables, simple variables and arrays. Both simple variables and array variables are named. Names begin with a letter followed by any number of letters, digits and underscores. All letters must be lower case. (Full alpha-numeric names are an extension. In POSIX bc all names are a single lower case letter.) The type of variable is clear by the context because all array variable names will be followed by brackets ([]). There are four special variables, scale, ibase, obase, and last. scale defines how some operations use digits after the decimal point. The default value of scale is 0. ibase and obase define the conversion base for input and output numbers. The default for both input and output is base 10. last (an extension) is a variable that has the value of the last printed number. These will be discussed in further detail where appropriate. All of these variables may have values assigned to them as well as used in expressions. KOMENTARZE Komentarze w bc rozpoczynaja sie od znakow /*, a koncza znakami */. Komentarze moga zaczynac sie w dowolnym miejscu i na wejsciu pojawiaja sie jako pojedyncze spacje. (Powoduje to, ze komentarze sa ogranicznikami innych elementow wejscia. Na przyklad, komentarz nie moze znajdowac sie w srodku nazwy zmiennej). Komentarze obejmuja znaki nowej linii (konca linii) pomiedzy poczatkiem a koncem komentarza. Do zapewnienia obslugi skryptow dla bc, jako rozszerzenie dodano komentarz w pojedynczym wierszu. Komentarz jednowierszowy rozpoczyna sie znakiem # i rozciaga sie do konca wiersza. Znak konca linii nie jest tu czescia komentarza i jest przetwarzany jak zwykle. WYRAZENIA Liczbami posluguja sie wyrazenia i instrukcje. Poniewaz jezyk zostal zaprojektowany jako interaktywny, instrukcje i wyrazenia wykonywane sa niezwlocznie. Nie ma zadnego programu "glownego" ("main"). Zamiast tego, kod jest wykonywany zaraz po jego napotkaniu. (Funkcje, omowione szczegolowo dalej, sa zdefiniowane po ich napotkaniu). A simple expression is just a constant. bc converts constants into internal decimal numbers using the current input base, specified by the variable ibase. (There is an exception in functions.) The legal values of ibase are 2 through 36. (Bases greater than 16 are an extension.) Assigning a value outside this range to ibase will result in a value of 2 or 36. Input numbers may contain the characters 0-9 and A-Z. (Note: They must be capitals. Lower case letters are variable names.) Single digit numbers always have the value of the digit regardless of the value of ibase. (i.e. A = 10.) For multi-digit numbers, bc changes all input digits greater or equal to ibase to the value of ibase-1. This makes the number ZZZ always be the largest 3 digit number of the input base. Pelne wyrazenia sa podobne do wystepujacych w wielu jezykach wysokiego poziomu. Poniewaz wystepuje tylko jeden rodzaj liczb, nie ma regul okreslajacych uzycie roznych typow. Zamiast tego istnieja reguly dotyczace dokladnosci wyrazen. Kazde wyrazenie ma okreslona dokladnosc. Zalezy ona od dokladnosci pierwotnych liczb, wykonywanego dzialania i, w wielu przypadkach, wartosci zmiennej scale. Dopuszczalnymi wartosciami zmiennej scale sa liczby od 0 az do maksymalnej liczby, jaka moze byc reprezentowana jako calkowita (integer) w jezyku C. W podanych ponizej opisach dopuszczalnych wyrazen, "wyrazenie" okresla pelne wyrazenie a "zmienna" okresla zmienna prosta lub tablicowa. Zmienna prosta jest po prostu nazwa a zmienna tablicowa jest okreslona jako nazwa[wyrazenie] Dokladnosc wyniku jest maksymalna z dokladnosci uzytych w nim wyrazen, chyba ze podano inaczej. - wyrazenie Wynikiem jest wartosc przeciwna do wyrazenia. ++ zmienna Zmienna jest powiekszana o jeden a wynikiem wyrazenia jest ta nowa wartosc. -- zmienna Zmienna jest pomniejszana o jeden a wynikiem wyrazenia jest ta nowa wartosc. zmienna ++ Wynikiem wyrazenia jest wartosc zmiennej, a nastepnie zmienna jest powiekszana o jeden. zmienna -- Wynikiem wyrazenia jest wartosc zmiennej, a nastepnie zmienna jest pomniejszana o jeden. wyrazenie + wyrazenie Wynikiem tego wyrazenia jest suma obu wyrazen. wyrazenie - wyrazenie Wynikiem tego wyrazenia jest roznica obu wyrazen. wyrazenie * wyrazenie Wynikiem tego wyrazenia jest iloczyn obu wyrazen. wyrazenie / wyrazenie Wynikiem tego wyrazenia jest iloraz obu wyrazen. Liczba cyfr po kropce dziesietnej wyniku jest rowna wartosci zmiennej scale. wyrazenie % wyrazenie Wynikiem tego wyrazenia jest "reszta" z dzielenia obliczana w nastepujacy sposob. W celu obliczenia a%b, obliczane jest najpierw a/b z dokladnoscia do scale cyfr dziesietnych. Wynik uzywany jest do obliczenia a-(a/b)*b z dokladnoscia okreslona jako maksymalna z scale+scale(b) oraz scale(a). Jezeli scale ustawiona jest na zero, zas oba wyrazenia sa calkowite to wyrazenie to jest funkcja reszty calkowitej. wyrazenie ^ wyrazenie The result of the expression is the value of the first raised to the second. The second expression must be an integer. (If the second expression is not an integer, a warning is generated and the expression is truncated to get an integer value.) The scale of the result is scale if the exponent is negative. If the exponent is positive the scale of the result is the minimum of the scale of the first expression times the value of the exponent and the maximum of scale and the scale of the first expression. (e.g. scale(a^b) = min(scale(a)*b, max( scale, scale(a))).) It should be noted that expr^0 will always return the value of 1. ( wyrazenie ) Nawiasy wymuszaja zmiane standardowych priorytetow przy obliczaniu wyrazenia. zmienna = wyrazenie Zmiennej przypisywana jest wartosc wyrazenia. zmienna = wyrazenie jest to rownowazne zapisowi "zmienna = zmienna wyrazenie", z wyjatkiem tego, iz czesc "zmienna" jest wyliczana tylko raz. Moze to byc istotne, jesli "zmienna" jest tablica. Wyrazenia relacyjne sa specjalnym rodzajem wyrazen, zwracajacym zawsze wartosc 0 lub 1: zero jesli relacja jest falszywa, zas 1 jezeli jest prawdziwa. Moga one wystepowac w dowolnych dozwolonych wyrazeniach. (POSIX bc wymaga, by wyrazenia relacyjne byly uzywane wylacznie w instrukcjach if, while i for oraz aby bylo w nich uzyte tylko jedno sprawdzenie relacji). Operatorami relacji sa: wyrazenie1 < wyrazenie2 Wynikiem jest 1, jesli wyrazenie1 jest mniejsze niz wyrazenie2. wyrazenie1 <= wyrazenie2 Wynikiem jest 1, gdy wyrazenie jest mniejsze badz rowne wyrazenie2. wyrazenie1 > wyrazenie2 Wynikiem jest 1, jesli wyrazenie1 jest wieksze niz wyrazenie2. wyrazenie1 >= wyrazenie2 Wynikiem jest 1, gdy wyrazenie1 jest wieksze badz rowne wyrazenie2. wyrazenie1 == wyrazenie2 Wynikiem jest 1, gdy wyrazenie1 jest rowne wyrazenie2. wyrazenie != wyrazenie2 Wynikiem jest 1, gdy wyrazenie1 nie jest rowne wyrazenie2. Boolean operations are also legal. (POSIX bc does NOT have boolean operations). The result of all boolean operations are 0 and 1 (for false and true) as in relational expressions. The boolean operators are: !wyrazenie Zaprzeczenie. Wynikiem jest 1, jesli wyrazenie ma wartosc 0. wyrazenie && wyrazenie Koniunkcja. Wynikiem jest 1, jezeli oba wyrazenia sa niezerowe. wyrazenie || wyrazenie Alternatywa. Wynikiem jest 1, jesli dowolne z wyrazen jest niezerowe. Wyrazenia maja nastepujacy priorytet (od najnizszego do najwyzszego): operator ||, wiazanie lewe operator &&, wiazanie lewe operator !, niezwiazany operatory relacji, wiazanie lewe operator przypisania, wiazanie prawe operatory + i -, wiazanie lewe operatory *, / i %, wiazanie lewe operator ^, wiazanie prawe jednoargumentowy operator -, niezwiazany operatory ++ i --, niezwiazane This precedence was chosen so that POSIX compliant bc programs will run correctly. This will cause the use of the relational and logical operators to have some unusual behavior when used with assignment expressions. Consider the expression: a = 3 < 5 Wiekszosc programistow C uwazalaby, ze przypisze ono wynik operacji "3 < 5" (wartosc 1) zmiennej "a". Tymczasem w bc nadaje ono wartosc 3 zmiennej "a", a nastepnie porownuje 3 z 5. Uzywajac operatorow relacji i operatorow logicznych z operatorami przypisania najlepiej jest posluzyc sie nawiasami. There are a few more special expressions that are provided in bc. These have to do with user defined functions and standard functions. They all appear as "name(parameters)". See the section on functions for user defined functions. The standard functions are: length ( wyrazenie ) Wynikiem funkcji length jest liczba cyfr znaczacych w wyrazeniu. read ( ) Funkcja ta, bedaca rozszerzeniem, odczytuje liczbe ze standardowego wejscia, niezaleznie od miejsca uzycia funkcji. Strzez sie -- moze to spowodowac klopoty przy przeplataniu sie danych i programu ze standardowego wejscia. Najlepszym zastosowaniem tej funkcji jest uzycie jej w uprzednio napisanym programie, ktory wymaga wprowadzania danych przez uzytkownika, ale nigdy nie pozwala na wprowadzanie kodu programu. Wynikiem dzialania funkcji read jest liczba odczytana ze standardowego wejscia z konwersja ukladu liczbowego wedlug aktualnej wartosci zmiennej ibase. scale ( wyrazenie ) Wynikiem funkcji scale jest liczba cyfr po kropce dziesietnej w wyrazeniu bedacym jej parametrem. sqrt ( wyrazenie ) Wynikiem funkcji sqrt jest pierwiastek kwadratowy z wyrazenia. Jezeli wyrazenie ma wartosc ujemna, to generowany jest blad wykonania. INSTRUKCJE Statements (as in most algebraic languages) provide the sequencing of expression evaluation. In bc statements are executed "as soon as possible." Execution happens when a newline in encountered and there is one or more complete statements. Due to this immediate execution, newlines are very important in bc. In fact, both a semicolon and a newline are used as statement separators. An improperly placed newline will cause a syntax error. Because newlines are statement separators, it is possible to hide a newline by using the backslash character. The sequence "\", where is the newline appears to bc as whitespace instead of a newline. A statement list is a series of statements separated by semicolons and newlines. The following is a list of bc statements and what they do: (Things enclosed in brackets ([]) are optional parts of the statement.) wyrazenie This statement does one of two things. If the expression starts with " ...", it is considered to be an assignment statement. If the expression is not an assignment statement, the expression is evaluated and printed to the output. After the number is printed, a newline is printed. For example, "a=1" is an assignment statement and "(a=1)" is an expression that has an embedded assignment. All numbers that are printed are printed in the base specified by the variable obase. The legal values for obase are 2 through BC_BASE_MAX. (See the section LIMITS.) For bases 2 through 16, the usual method of writing numbers is used. For bases greater than 16, bc uses a multi-character digit method of printing the numbers where each higher base digit is printed as a base 10 number. The multi-character digits are separated by spaces. Each digit contains the number of characters required to represent the base ten value of "obase-1". Since numbers are of arbitrary precision, some numbers may not be printable on a single output line. These long numbers will be split across lines using the "\" as the last character on a line. The maximum number of characters printed per line is 70. Due to the interactive nature of bc, printing a number causes the side effect of assigning the printed value to the special variable last. This allows the user to recover the last value printed without having to retype the expression that printed the number. Assigning to last is legal and will overwrite the last printed value with the assigned value. The newly assigned value will remain until the next number is printed or another value is assigned to last. (Some installations may allow the use of a single period (.) which is not part of a number as a short hand notation for for last.) lancuch Na wyjsciu drukowany jest lancuch znakowy. Lancuchy rozpoczynaja sie znakiem cudzyslowu i zawieraja wszystkie znaki do nastepnego znaku cudzyslowu. Wszystkie znaki, wlacznie ze znakami nowej linii, traktowane sa doslownie. Po wydrukowaniu lancucha nie jest drukowany znak nowej linii. print lista The print statement (an extension) provides another method of output. The "list" is a list of strings and expressions separated by commas. Each string or expression is printed in the order of the list. No terminating newline is printed. Expressions are evaluated and their value is printed and assigned to the variable last. Strings in the print statement are printed to the output and may contain special characters. Special characters start with the backslash character (\). The special characters recognized by bc are "a" (alert or bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage return), "q" (double quote), "t" (tab), and "\" (backslash). Any other character following the backslash will be ignored. { lista_instrukcji } Jest to instrukcja grupowania. Pozwala na grupowanie wielu instrukcji do wykonania. if ( wyrazenie ) instrukcja1 [else instrukcja2] Instrukcja if oblicza wyrazenie i wykonuje instrukcje1 badz instrukcje2 w zaleznosci od wartosci wyrazenia. Jezeli wyrazenie jest niezerowe, wykonywana jest instrukcja1. Jesli wystepuje instrukcja2 a wartoscia wyrazenia jest 0, to wykonywana jest instrukcja2. (Klauzula else instrukcji if jest rozszerzeniem). while ( wyrazenie ) instrukcja Instrukcja while powtarza wykonywanie danej instrukcji poki wyrazenie jest niezerowe. Oblicza ona wartosc wyrazenia przed kazdym wykonaniem instrukcji. Przerwanie petli powodowane jest zerowa wartoscia wyrazenia lub wykonaniem instrukcji break (przerwania). for ( [wyr1] ; [wyr2] ; [wyr3] ) instrukcja The for statement controls repeated execution of the statement. Expression1 is evaluated before the loop. Expression2 is evaluated before each execution of the statement. If it is non-zero, the statement is evaluated. If it is zero, the loop is terminated. After each execution of the statement, expression3 is evaluated before the reevaluation of expression2. If expression1 or expression3 are missing, nothing is evaluated at the point they would be evaluated. If expression2 is missing, it is the same as substituting the value 1 for expression2. (The optional expressions are an extension. POSIX bc requires all three expressions.) The following is equivalent code for the for statement: wyrazenie1; while (wyrazenie2) { instrukcja; wyrazenie3; } break Instrukcja ta powoduje wymuszone zakonczenie ostatniej obejmujacej ja instrukcji while lub for. continue The continue statement (an extension) causes the most recent enclosing for statement to start the next iteration. halt Instrukcja halt (rozszerzenie) jest instrukcja nakazujaca preprocesorowi bc zakonczenie pracy (ale tylko wtedy gdy instrukcja ta jest wykonywana). Na przyklad, "if (0 == 1) halt" nie spowoduje przerwania pracy bc, gdyz instrukcja halt nie bedzie wykonana. return Zwraca wartosc zero jako wynik funkcji. (Patrz sekcja dotyczaca funkcji). return ( wyrazenie ) Zwraca wartosc wyrazenia jako wynik funkcji. (Patrz sekcja dotyczaca funkcji). Nawiasy nie sa wymagane, co jest rozszerzeniem GNU bc. PSEUDOINSTRUKCJE Te instrukcje nie sa instrukcjami w tradycyjnym sensie tego terminu. Nie sa one instrukcjami wykonywanymi. Ich funkcja jest wykonywana podczas "kompilacji". limits Wypisuje lokalne ograniczenia narzucone przez lokalna wersje bc. Jest to rozszerzenie. quit Po odczycie instrukcji quit procesor bc konczy prace, niezaleznie od tego, gdzie wystapila ta instrukcja. Na przyklad, "if (0 == 1) quit" spowoduje zakonczenie pracy bc. warranty Wypisuje dluzsza notke na temat gwarancji. Jest to rozszerzenie. FUNKCJE Funkcje dostarczaja sposobu definiowania obliczen, ktore moga byc wykonane pozniej. Funkcje w bc zawsze obliczaja wartosc i zwracaja ja do miejsca wywolania. Definicje funkcji sa "dynamiczne" w tym sensie, ze funkcja pozostaje niezdefiniowana dopoki na wejsciu nie zostanie odczytana jej definicja. Definicja ta jest nastepnie uzywana dopoki nie zostanie napotkana inna definicja funkcji o tej samej nazwie. Wowczas nowa definicja zastepuje starsza. Funkcja definiowana jest nastepujaco: define nazwa ( parametry ) { nowa_linia lista_auto lista_instrukcji } A function call is just an expression of the form "name(parameters)". Parameters are numbers or arrays (an extension). In the function definition, zero or more parameters are defined by listing their names separated by commas. All parameters are call by value parameters. Arrays are specified in the parameter definition by the notation "name[]". In the function call, actual parameters are full expressions for number parameters. The same notation is used for passing arrays as for defining array parameters. The named array is passed by value to the function. Since function definitions are dynamic, parameter numbers and types are checked when a function is called. Any mismatch in number or types of parameters will cause a runtime error. A runtime error will also occur for the call to an undefined function. lista_auto jest opcjonalna lista zmiennych, do uzytku "lokalnego". A oto skladnia tej listy (jesli wystepuje): "auto nazwa, ... ;". Srednik jest opcjonalny. Kazda z nazw jest nazwa auto-zmiennej. Tablice moga byc podane przy uzyciu takiej samej skladni jak w parametrach. Na poczatku funkcji wartosci tych zmiennych odkladane sa na stosie. Nastepnie zmienne sa inicjowane zerami i uzywane w czasie wykonywania funkcji. Przy zakonczeniu funkcji zmienne sa zdejmowane ze stosu, tak ze przywracana jest ich pierwotna wartosc (z momentu wywolania funkcji). Parametry te sa faktycznie zmiennymi auto inicjowanymi wartosciami dostarczonymi w wywolaniu funkcji. Zmienne typu auto roznia sie od tradycyjnych zmiennych lokalnych, gdyz jesli funkcja A wola funkcje B, to B moze poslugiwac sie zmiennymi auto funkcji A po prostu uzywajac tych samych nazw, chyba ze funkcja B traktuje je jako zmienne auto. Poniewaz zmienne auto i parametry skladowane sa na stosie, to bc obsluguje funkcje rekurencyjne. Cialo funkcji jest lista instrukcji bc. I znow, jak w czesci zasadniczej, instrukcje oddzielane sa srednikami lub znakami nowej linii. Instrukcje return (powrot) powoduja zakonczenie funkcji i zwrocenie wartosci. Istnieja dwa warianty instrukcji return. Pierwsza postac, "return", zwraca wartosc 0 do wywolujacego wyrazenia. Druga postac, "return ( wyrazenie )", oblicza wartosc wyrazenia i zwraca ja do wyrazenia wolajacego. Kazda funkcja domyslnie konczy sie niejawna instrukcja "return (0)". Pozwala to na funkcji na zakonczenie dzialania i zwrocenie zera bez jawnej instrukcji powrotu. Funkcje inaczej korzystaja ze zmiennej ibase. Wszystkie stale w obrebie ciala funkcji beda konwertowane przy zastosowaniu wartosci ibase w momencie wywolania funkcji. Zmiany ibase w czasie wykonywania funkcji sa ignorowane, z wyjatkiem funkcji standardowej read, ktora zawsze do konwersji liczb wykorzystuje biezaca wartosc ibase. GNU bc zawiera kilka rozszerzen zwiazanych z funkcjami. Pierwszym jest nieco luzniejszy format definicji funkcji. Standard wymaga, by nawias otwierajacy znajdowal sie w tym samym wierszu, co slowo kluczowe define, a wszystkie pozostale czesci w kolejnych wierszach. Opisywana tu wersja bc zezwala na dowolna liczbe znakow nowej linii przed i po nawiasie otwierajacym funkcji. Na przyklad, dozwolone sa ponizsze definicje. define d (n) { return (2*n); } define d (n) { return (2*n); } Functions may be defined as void. A void funtion returns no value and thus may not be used in any place that needs a value. A void function does not produce any output when called by itself on an input line. The key word void is placed between the key word define and the function name. For example, consider the following session. define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<--- Poniewaz py nie jest funkcja void, to wywolanie py(1) wyswietla pozadane wyjscie, a nastepnie wypisuje w drugiej linii wartosc tej funkcji. Poniewaz wartoscia funkcji, ktora nie zawiera instrukcji return, jest zero, to wlasnie zero zostanie wypisane. W przypadku funkcji px(1) zero nie jest wypisywane, poniewaz ta funkcja jest funkcja void. Also, call by variable for arrays was added. To declare a call by variable array, the declaration of the array parameter in the function definition looks like "*name[]". The call to the function remains the same as call by value arrays. BIBLIOTEKA MATEMATYCZNA Jezeli bc wywolywane jest z opcja -l, to wstepnie wczytywana jest biblioteka matematyczna (math library), a domyslna liczba cyfr dziesietnych (scale) ustawiana jest na 20. Funkcje matematyczne obliczaja swe wyniki z dokladnoscia okreslona w momencie ich wywolania. Bibilioteka matematyczna definiuje nastepujace funkcje: s (x) Sinus x, x podawany jest w radianach. c (x) Cosinus x, x w radianach. a (x) Arcus tangens x; arcus tangens zwraca radiany. l (x) Logarytm naturalny z x. e (x) Funkcja wykladnicza - e do potegi x. j (n,x) Funkcja Bessela rzedu n (calkowitego) z argumentem x. PRZYKLADY W powloce /bin/sh, ponizsze polecenie przypisuje wartosc liczby "Pi" zmiennej srodowiska pi. pi=$(echo "scale=10; 4*a(1)" | bc -l) Ponizej podano definicje funkcji wykladniczej uzywanej w bibliotece matematycznej. Funkcja ta napisana jest w bc standardu POSIX. scale = 20 /* wykorzystuje fakt, ze e^x = (e^(x/2))^2 Gdy x jest dostatecznie male, uzywamy szeregu: e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Check the sign of x. */ if (x<0) { m = 1 x = -x } /* przewidywane x */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* inicjowanie zmiennych */ 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 } } Ponizszy kod posluguje sie rozszerzonymi cechami bc do uzyskania prostego programu liczacego salda ksiazeczki czekowej. Najlepiej byloby zachowac go w pliku, tak by mogl byc wykorzystany wielokrotnie bez potrzeby kazdorazowego przepisywania. scale=2 print "\nProgram ksiazeczki czekowej!\n" print " Pamietaj, wplaty sa transakcjami ujemnymi.\n" print " Koniec - transakcja zerowa.\n\n" print "Saldo poczatkowe? "; bal = read() bal /= 1 print "\n" while (1) { "biezace saldo = "; bal "transakcja? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit Ponizej zamieszczono definicje rekurencyjnej funkcji silni. define f (x) { if (x <= 1) return (1); return (f(x-1) * x); } OPCJE READLINE I LIBEDIT GNU bc can be compiled (via a configure option) to use the GNU readline input editor library or the BSD libedit library. This allows the user to do editing of lines before sending them to bc. It also allows for a history of previous lines typed. When this option is selected, bc has one more special variable. This special variable, history is the number of lines of history retained. For readline, a value of -1 means that an unlimited number of history lines are retained. Setting the value of history to a positive number restricts the number of history lines to the number given. The value of 0 disables the history feature. The default value is 100. For more information, read the user manuals for the GNU readline, history and BSD libedit libraries. One can not enable both readline and libedit at the same time. ROZNICE Niniejsza wersja bc zostala zbudowana, bazujac na projekcie POSIX P1003.2/D11 i zawiera kilka roznic i rozszerzen w stosunku do tego dokumentu i tradycyjnych realizacji. Nie jest wykonana w tradycyjny sposob, wykorzystujacy polecenie dc(1). Wersja ta jest pojedynczym procesem, analizujacym i uruchamiajacym kod binarny bedacy tlumaczeniem programu. Istnieje "nieudokumentowana" opcja (-c) powodujaca, ze program wyswietla kod binarny na standardowym wyjsciu zamiast wykonywania go. Uzywana byla ona glownie do debuggowania analizatora skladni i przy przygotowaniu biblioteki matematycznej. Glownym zrodlem roznic sa rozszerzenia, w ktorych jakas cecha, mozliwosc programu jest rozbudowana w celu dodania funkcjonalnosci, oraz dodatki, gdzie dodano nowe mozliwosci. Ponizej podano liste roznic i rozszerzen. Zmienna srodowiska LANG Niniejsza wersja nie spelnia standardu POSIX przetwarzania zmiennej srodowiska LANG i wszystkich zmiennych srodowiska rozpoczynajacych sie na LC_. nazwy Tradycyjny i POSIXowy bc zawieraja jednoliterowe nazwy funkcji, zmiennych i tablic. Zostaly one rozszerzone do nazw wieloznakowych, rozpoczynajacych sie litera i mogacych zawierac litery, cyfry i znaki podkreslenia. Lancuchy znakowe Lancuchy nie moga zawierac znakow NUL. POSIX stwierdza, ze wszystkie znaki musza byc zawarte w lancuchach. last POSIX bc does not have a last variable. Some implementations of bc use the period (.) in a similar way. porownania POSIX bc dopuszcza porownania wylacznie w instrukcjach if, while oraz w drugim wyrazeniu instrukcji for. Dodatkowo, w kazdej z tych instrukcji dopuszczalna jest tylko jedna operacja porownania (relacji). instrukcja if, klauzula else POSIX bc nie zawiera klauzuli else. instrukcja for POSIX bc wymaga, by w instrukcji for wystepowaly wszystkie wyrazenia. &&, ||, ! POSIX bc nie zawiera operatorow logicznych. funkcja read POSIX bc nie zawiera funkcji read. instrukcja print POSIX bc does not have a print statement . instrukcja continue POSIX bc nie zawiera instrukcji continue. instrukcja return POSIX bc wymaga nawiasow wokol zwracanego wyrazenia. parametry tablicowe POSIX bc nie obsluguje (obecnie) w pelni parametrow tablicowych. Gramatyka POSIX zezwala na uzycie tablic w definicjach funkcji, ale nie zapewnia metody przekazania tablicy jako biezacego parametru. (Jest to najprawdopodobniej przeoczenie w zdefiniowanej gramatyce.) Tradycyjne implementacje bc maja jedynie wywolanie parametrow tablicowych przez wartosc. format funkcji POSIX bc wymaga, by nawias otwierajacy byl w tym samym wierszu, co slowo kluczowe define, instrukcja auto natomiast w nastepnym wierszu. =+, =-, =*, =/, =%, =^ POSIX bc nie wymaga, by byly zdefiniowane powyzsze operatory przypisania "starego typu". Niniejsza wersja zezwala na takie przypisania w "starym stylu". Nalezy skorzystac z instrukcji limits, by stwierdzic, czy zainstalowana wersja je rozpoznaje. Jezeli obsluguje ona przypisania w "starym stylu", to instrukcja "a =- 1" pomniejszy a o jeden zamiast przypisac a wartosc -1. spacje w liczbach Inne implementacje bc dopuszczaja wystepowanie spacji w liczbach. Na przyklad, "x=1 3" przypisze wartosc 13 zmiennej x. Ta sama instrukcja spowoduje blad skladni w opisywanej tu wersji bc. bledy i wykonanie Opisywana implementacja rozni sie od innych sposobem, w jaki wykonywany jest kod w przypadku znalezienia w programie bledow skladniowych i innych. W przypadku napotkania bledu w definicji funkcji, obsluga bledow probuje odnalezc poczatek instrukcji i kontynuowac analize skladniowa funkcji. Po znalezieniu bledu w funkcji, nie jest ona mozliwa do wywolania i staje sie niezdefiniowana. Bledy skladniowe w interaktywnym wykonywaniu kodu uniewazniaja biezacy blok wykonania. Blok wykonania jest zakonczony koncem linii pojawiajacym sie po pelnej sekwencji instrukcji. Na przyklad, a = 1 b = 2 ma dwa bloki wykonania a { a = 1 b = 2 } ma jeden blok wykonania. Kazdy z bledow wykonania przerywa wykonywanie biezacego bloku wykonania. Ostrzezenie w trakcie wykonywania nie przerywa biezacego bloku. Przerwania Podczas sesji interaktywnej sygnal SIGINT (zwykle generowany przez znak control-C z terminala) spowoduje przerwanie biezacego bloku wykonywania. Wyswietli on blad wykonania ("runtime"), wskazujacy ktora funkcja zostala przerwana. Po wyczyszczeniu wszystkich struktur (runtime structures) wykonania, zostanie wyswietlony komunikat informujacy uzytkownika, ze bc jest gotow do przyjmowania kolejnych danych. Wszystkie uprzednio zdefiniowane funkcje pozostaja zdefiniowane, zas wartosci wszystkich zmiennych innych niz zmienne typu auto sa wartosciami sprzed przerwania. Podczas procesu oczyszczania struktur danych usuwane sa wszystkie zmienne typu auto oraz parametry funkcji. W czasie sesji nieinteraktywnej sygnal SIGINT przerywa wykonanie calego bc. OGRANICZENIA Ponizej podano obecne ograniczenia opisywanego procesora bc. Niektore z nich moga byc zmienione podczas instalacji. Faktyczne ograniczenia mozna sprawdzic za pomoca instrukcji limits (ograniczenia). BC_BASE_MAX Maksymalna podstawa pozycyjnego ukladu, w ktorym wyprowadzane sa wyniki obecnie ustawiona jest na 999. Maksymalna podstawa ukladu wejsciowego jest 16. BC_DIM_MAX Obecnie ustawione jest arbitralne ograniczenie do 65535 (w wersji rozpowszechnianej). Twoja instalacja moze byc inna. BC_SCALE_MAX Liczba cyfr po kropce dziesietnej ograniczona jest do INT_MAX cyfr. Takze liczba cyfr przed kropka dziesietna ograniczona jest do INT_MAX cyfr. BC_STRING_MAX Maksymalnie w lancuchu moze wystapic INT_MAX znakow. wykladnik Wartosc wykladnika w operacji potegowania (^) ograniczona jest do LONG_MAX. nazwy zmiennych Obecnie nie moze byc wiecej niz 32767 unikatowych nazw w kazdym z rodzajow: zmiennych prostych, tablic i funkcji. ZMIENNE SRODOWISKOWE bc przetwarza nastepujace zmienne srodowiska: POSIXLY_CORRECT To samo, co opcja -s. Tryb zgodnosci z POSIX. BC_ENV_ARGS Inny sposob przekazywania argumentow do bc. Format jest taki sam, jak argumentow wiersza polecen. Argumenty te przetwarzane sa na poczatku, wiec pliki podane w argumentach srodowiska przetwarzane sa przed plikami podanymi jako argumenty wiersza polecen. Umozliwia to uzytkownikowi ustawienie "standardowych" opcji i plikow, jakie beda przetwarzane przy kazdym wywolaniu bc. Pliki podane w zmiennych srodowiska zawieraja zwykle definicje funkcji, ktore uzytkownik chce miec zdefiniowane przy kazdym uruchomieniu bc. BC_LINE_LENGTH This should be an integer specifying the number of characters in an output line for numbers. This includes the backslash and newline characters for long numbers. As an extension, the value of zero disables the multi-line feature. Any other value of this variable that is less than 3 sets the line length to 70. DIAGNOSTYKA Jezeli ktorys z plikow podanych w wierszu polecen nie moze zostac otwarty bc zglosi, ze plik ten jest niedostepny i przerwie prace. Istnieja tez komunikaty diagnostyczne kompilacji i wykonania, ktore powinny byc zrozumiale. USTERKI Obsluga bledow (error recovery) nie jest jeszcze bardzo dobra. Bledy prosze zglaszac (w jez.angielskim) na adres bug-bc@gnu.org. Prosze sie upewnic, ze pole tematu wiadomosci zawiera gdzies slowo "bc". AUTOR Philip A. Nelson philnelson@acm.org PODZIEKOWANIA Autor chcialby podziekowac Steve'owi Sommars (Steve.Sommars@att.com) za jego szeroka pomoc w testowaniu tej implementacji. Podsunal on wiele cennych sugestii. Dzieki jego zaangazowaniu jest to o wiele lepszy produkt. TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Wojtek Kotwica i Robert Luberda Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Projekt GNU 11 czerwca 2006 r. bc(1)