Provided by: manpages-pl_0.6-2_all bug

NAZWA

       bc - język kalkulatora dowolnej precyzji

SKŁADNIA

       bc [-hlwsqv] [długie_opcje] [plik...]

WERSJA

       Niniejszy podręcznik opisuje GNU bc w wersji 1.06.

OPIS

        Uwaga! To tłumaczenie może być nieaktualne!

       bc  jest  językiem  obsługującym obliczenia na liczbach dowolnej dokładności z interaktywnym wykonywaniem
       instrukcji. Istnieją pewne podobieństwa składni do języka programowania  C.  Przy  pomocy  opcji  wiersza
       poleceń  dostępna  jest  standardowa  biblioteka  matematyczna.  Na żądanie, biblioteka matematyczna jest
       definiowana przed rozpoczęciem przetwarzania plików. bc rozpoczyna pracę przetwarzając kod  z  wszystkich
       plików  wymienionych  w wierszu poleceń, zachowując ich kolejność. Po przetworzeniu wszystkich plików, bc
       czyta ze standardowego wejścia. Całość kodu  wykonywana  jest  w  miarę  czytania.  (Jeśli  plik  zawiera
       polecenie zatrzymania procesora, to bc nie będzie prowadził odczytu ze standardowego wejścia.)

       Omawiana  wersja  bc zawiera kilka rozszerzeń w stosunku do tradycyjnych realizacji bc i standardu POSIX.
       Opcje wiersza poleceń mogą powodować, że rozszerzenia te będą wyświetlać ostrzeżenia lub będą  odrzucane.
       Niniejszy  dokument  opisuje  język  akceptowany  przez  ten  procesor bc. Rozszerzenia są w nim wyraźnie
       wyróżnione.

   OPCJE
       -h, --help
              Wypisuje informację o sposobie wywołania i kończy działanie.

       -i, --interactive
              Wymusza tryb interaktywny.

       -l, --mathlib
              Definiuje standardową bibliotekę matematyczną.

       -w ,  --warn
              Ostrzega o rozszerzeniach w stosunku do POSIX bc.

       -s ,  --standard
              Przetwarza wyłącznie standardowy, POSIX-owy język bc.

       -q ,  --quiet
              Nie wyświetla zwykłego przywitania GNU bc.

       -v ,  --version
              Wypisuje numer wersji, informację o prawach autorskich i kończy działanie.

   LICZBY
       Najbardziej podstawowym elementem w bc jest liczba. Liczby są liczbami dowolnej  dokładności.  Dokładność
       ta  odnosi  się  zarówno  do  części  całkowitej  jak  i do ułamkowej. Wszystkie liczby są reprezentowane
       wewnętrznie  w  postaci  dziesiętnej  i  wszystkie  obliczenia  prowadzone  są  w  układzie  dziesiętnym.
       (Opisywana wersja obcina wyniki operacji dzielenia i mnożenia.)  Liczby posiadają dwa atrybuty: długość i
       dokładność.  [od tłum.: (org.scale) -  w  tłumaczeniu  używane  będzie  słowo  `dokładność'  w  znaczeniu
       zbliżonym  do  znanego  np. z obsługi kalkulatorów] Długość jest całkowitą liczbą cyfr znaczących liczby,
       zaś dokładność jest całkowitą liczbą cyfr dziesiętnych po kropce dziesiętnej.  Na przykład:
               .000001 ma długość 6 i dokładność 6.
               1935.000 ma długość 7 i dokładność 3.

   ZMIENNE
       Liczby przechowywane są w dwu rodzajach zmiennych, zmiennych prostych i tablicach. Zarówno zmienne proste
       jak  i  tablice posiadają nazwy. Nazwy zaczynają się od litery, po której następuje dowolna liczba liter,
       cyfr i  znaków  podkreślenia.  Wszystkie  litery  muszą  być  małe.  (Nazwy  w  pełni  alfanumeryczne  są
       rozszerzeniem.  W POSIXowym bc wszystkie nazwy są pojedynczymi małymi literami.) Rodzaj zmiennej wynika z
       kontekstu, gdyż po nazwie każdej zmiennej tablicowej wystąpią nawiasy ([]).

       Istnieją cztery zmienne specjalne: scale, ibase, obase oraz last. scale określa,  jak  niektóre  operacje
       używają  cyfr po kropce dziesiętnej. Domyślną wartością scale jest 0. ibase oraz obase określają podstawę
       pozycyjnego systemu liczbowego przy konwersji wejścia i wyjścia. Domyślną podstawą  zarówno  dla  wejścia
       jak i dla wyjścia jest 10. last (rozszerzenie standardu) jest zmienną, która przechowuje wartość ostatnio
       wydrukowanej liczby. Zmienne te będą omówione szczegółowo później, w  odpowiedniej  części.  Wszystkie  z
       nich mogą mieć przypisywane wartości, jak również mogą być używane w wyrażeniach.

   KOMENTARZE
       Komentarze  w  bc  rozpoczynają  się  od  znaków /* zaś kończą znakami */. Komentarze mogą zaczynać się w
       dowolnym miejscu i na wejściu pojawiają się jako  pojedyncze  spacje.  (Powoduje  to,  że  komentarze  są
       ogranicznikami  innych  elementów  wejścia.  Na przykład, komentarz nie może znajdować się w środku nazwy
       zmiennej.) Komentarze obejmują znaki nowej linii (końca linii) pomiędzy początkiem a końcem komentarza.

       Do zapewnienia obsługi skryptów dla  bc,  jako  rozszerzenie  dodano  komentarz  w  pojedynczym  wierszu.
       Komentarz  jednowierszowy  rozpoczyna się znakiem # i rozciąga się do końca wiersza. Znak końca linii nie
       jest tu częścią komentarza i jest przetwarzany jak zwykle.

   WYRAŻENIA
       Liczbami posługują się wyrażenia i instrukcje. Ponieważ język został  zaprojektowany  jako  interaktywny,
       instrukcje  i  wyrażenia wykonywane są niezwłocznie. Nie ma żadnego programu "głównego" ("main"). Zamiast
       tego, kod jest wykonywany zaraz po jego napotkaniu. (Funkcje, omówione szczegółowo dalej, są zdefiniowane
       po ich napotkaniu.)

       Proste  wyrażenie  jest  po  prostu  stałą. bc zamienia stałe na wewnętrzne liczby dziesiętne przy użyciu
       bieżącej podstawy systemu dla wprowadzania, podanej w zmiennej ibase.  (Istnieje  wyjątek  dla  funkcji.)
       Dopuszczalnymi  wartościami  ibase  są  2  do  16. Przypisanie ibase wartości spoza tego zakresu nada jej
       wartość 2 lub 16. Liczby wejściowe mogą zawierać znaki 0-9 oraz A-F. (Uwaga: muszą to być wielkie litery.
       Małe  litery są nazwami zmiennych.) Liczby jednocyfrowe mają zawsze wartość cyfry, bez względu na wartość
       ibase. (tj. A = 10.) Dla liczb wielocyfrowych bc zamienia wszystkie cyfry wejściowe  większe  bądź  równe
       ibase  na  wartość  ibase-1.  Powoduje to, że liczba FFF będzie zawsze największą trzycyfrową liczbą przy
       danej podstawie systemu dla wejścia.

       Pełne wyrażenia są podobne do występujących w wielu językach wysokiego poziomu. Ponieważ występuje  tylko
       jeden  rodzaj  liczb,  nie  ma  reguł  określających  użycie  różnych typów. Zamiast tego istnieją reguły
       dotyczące dokładności wyrażeń. Każde wyrażenie posiada określoną dokładność. Zależy  ona  od  dokładności
       pierwotnych liczb, wykonywanego działania i, w wielu przypadkach, wartości zmiennej scale. Dopuszczalnymi
       wartościami zmiennej scale są liczby od 0 aż do maksymalnej liczby, jaka  może  być  reprezentowana  jako
       całkowita (integer) w języku C.

       W  podanych  poniżej  opisach  dopuszczalnych  wyrażeń,  "wyrażenie"  określa pełne wyrażenie a "zmienna"
       określa zmienną prostą lub tablicową.  Zmienną prostą jest po prostu
              nazwa
       a zmienna tablicowa jest określona jako
              nazwa[wyrażenie]
       Dokładność wyniku jest maksymalną z dokładności użytych w nim wyrażeń, chyba że podano inaczej.

       - wyrażenie
              Wynikiem jest wartość przeciwna do wyrażenia.

       ++ zmienna
              Zmienna jest powiększana o jeden a wynikiem wyrażenia jest ta nowa wartość.

       -- zmienna
              Zmienna jest pomniejszana o jeden a wynikiem wyrażenia jest ta nowa wartość.

       zmienna ++
              Wynikiem wyrażenia jest wartość zmiennej, a następnie zmienna jest powiększana o jeden.

       zmienna --
              Wynikiem wyrażenia jest wartość zmiennej, a następnie zmienna jest pomniejszana o jeden.

       wyrażenie + wyrażenie
              Wynikiem tego wyrażenia jest suma obu wyrażeń.

       wyrażenie - wyrażenie
              Wynikiem tego wyrażenia jest różnica obu wyrażeń.

       wyrażenie * wyrażenie
              Wynikiem tego wyrażenia jest iloczyn obu wyrażeń.

       wyrażenie / wyrażenie
              Wynikiem tego wyrażenia jest iloraz obu wyrażeń. Liczba cyfr po  kropce  dziesiętnej  wyniku  jest
              równa wartości zmiennej scale.

       wyrażenie % wyrażenie
              Wynikiem  tego  wyrażenia  jest  "reszta"  z  dzielenia  obliczana  w  następujący  sposób. W celu
              obliczenia a%b, obliczane jest najpierw a/b z  dokładnością  do  scale  cyfr  dziesiętnych.  Wynik
              używany  jest  do  obliczenia  a-(a/b)*b z dokładnością określoną jako maksymalna z scale+scale(b)
              oraz scale(a).  Jeżeli scale ustawiona jest na zero, zaś oba wyrażenia są całkowite  to  wyrażenie
              to jest funkcją reszty całkowitej.

       wyrażenie ^ wyrażenie
              Wynikiem  tego  wyrażenia jest wartość pierwszego z wyrażeń podniesiona do potęgi określonej przez
              drugie. Drugie wyrażenie musi być liczbą całkowitą.  (Jeśli drugie wyrażenie nie  jest  całkowite,
              to  emitowane  jest  ostrzeżenie  a  wyrażenie  jest obcinane tak, by otrzymać wartość całkowitą).
              Liczba cyfr ułamkowych wyniku wynosi scale, jeśli wykładnik jest ujemny. Jeżeli jest  on  dodatni,
              to  dokładność (liczba cyfr po kropce dziesiętnej) wyniku stanowi minimum z dokładności pierwszego
              wyrażenia przemnożonej przez wartość wykładnika  i  maksimum  z  scale  i  dokładności  pierwszego
              wyrażenia. To znaczy:
              scale(a^b) = min(scale(a)*b, max( scale, scale(a)))
              Należy pamiętać, że wyrażenie^0 zawsze zwraca wartość 1.

       ( wyrażenie )
              Nawiasy wymuszają zmianę standardowych priorytetów przy obliczaniu wyrażenia.

       zmienna = wyrażenie
              Zmiennej przypisywana jest wartość wyrażenia.

       zmienna <op>= wyrażenie
              jest  to  równoważne  zapisowi  "zmienna  =  zmienna  <op>  wyrażenie", z wyjątkiem tego, iż część
              "zmienna" jest wyliczana tylko raz. Może to być istotne, jeśli "zmienna" jest tablicą.

       Wyrażenia relacyjne są specjalnym rodzajem wyrażeń, zwracającym  zawsze  wartość  0  lub  1:  zero  jeśli
       relacja  jest  fałszywa,  zaś  1  jeżeli  jest  prawdziwa.   Mogą  one występować w dowolnych dozwolonych
       wyrażeniach. (POSIX bc wymaga, by  wyrażenia relacyjne były używane wyłącznie w instrukcjach if, while  i
       for oraz aby było w nich użyte tylko jedno sprawdzenie relacji.) Operatorami relacji są:

       wyrażenie1 < wyrażenie2
              Wynikiem jest jeden jeśli wyrażenie1 jest mniejsze niż wyrażenie2.

       wyrażenie1 <= wyrażenie2
              Wynikiem jest 1 gdy wyrażenie jest mniejsze bądź równe wyrażenie2.

       wyrażenie1 > wyrażenie2
              Wynikiem jest 1 jeśli wyrażenie1 jest większe niż wyrażenie2.

       wyrażenie1 >= wyrażenie2
              Wynikiem jest 1 gdy wyrażenie1 jest większe bądź równe wyrażenie2.

       wyrażenie1 == wyrażenie2
              Wynikiem jest 1 gdy wyrażenie1 jest równe wyrażenie2.

       wyrażenie != wyrażenie2
              Wynikiem jest 1 gdy wyrażenie1 nie jest równe wyrażenie2.

       Dozwolone  są  także  operacje  logiczne. (POSIX bc NIE posiada operacji logicznych). Wynikami wszystkich
       operacji logicznych są 0 lub 1 (dla fałszu i  prawdy),  tak  jak  dla  wyrażeń  relacyjnych.  Operatorami
       logicznymi są:

       !wyrażenie
              Zaprzeczenie. Wynikiem jest 1 jeśli wyrażenie ma wartość 0.

       wyrażenie && wyrażenie
              Koniunkcja. Wynikiem jest 1 jeżeli oba wyrażenia są niezerowe.

       wyrażenie || wyrażenie
              Alternatywa. Wynikiem jest 1 jeśli dowolne z wyrażeń jest niezerowe.

       Wyrażenia posiadają następujący priorytet: (od najniższego do najwyższego)
              operator ||, wiązanie lewe
              operator &&, wiązanie lewe
              operator !, niezwiązany
              operatory relacji, wiązanie lewe
              operator przypisania, wiązanie prawe
              operatory + i -, wiązanie lewe
              operatory *, / i %, wiązanie lewe
              operator ^, wiązanie prawe
              jednoargumentowy operator -, niezwiązany
              operatory ++ i --, niezwiązane

       Kolejność wykonywania została dobrana tak, by programy zgodne z POSIX bc działały poprawnie. Powoduje to,
       że operatory  relacyjne  i  logiczne,  użyte  w  wyrażeniach  przypisania,  będą  wykazywać  niecodzienne
       zachowywanie.  Rozważ wyrażenie:
              a = 3 < 5

       Większość  programistów  C  uważałaby,  że przypisze ono wynik operacji "3 < 5" (wartość 1) zmiennej "a".
       Tymczasem w bc nadaje ono wartość 3 zmiennej "a", a  następnie  porównuje  3  z  5.  Używając  operatorów
       relacji i operatorów logicznych z operatorami przypisania najlepiej jest posłużyć się nawiasami.

       bc  obsługuje  jeszcze  kilka innych wyrażeń specjalnych. Związane są one z funkcjami definiowanymi przez
       użytkownika i funkcjami standardowymi.  Wszystkie one mają postać "nazwa(parametry)". Funkcje definiowane
       przez użytkownika opisano w sekcji Funkcje. Funkcjami standardowymi są:

       length ( wyrażenie )
              Wynikiem funkcji length jest liczba cyfr znaczących w wyrażeniu.

       read ( )
              Funkcja  ta,  będąca  rozszerzeniem,  odczytuje  liczbę  ze  standardowego wejścia, niezależnie od
              miejsca użycia funkcji. Strzeż się -- może to spowodować kłopoty przy przeplataniu  się  danych  i
              programu  ze  standardowego  wejścia.   Najlepszym  zastosowaniem  tej  funkcji  jest użycie jej w
              uprzednio napisanym programie, który wymaga wprowadzania danych przez użytkownika, ale  nigdy  nie
              pozwala  na  wprowadzanie  kodu programu. Wynikiem działania funkcji read jest liczba odczytana ze
              standardowego wejścia z konwersją układu liczbowego według aktualnej wartości zmiennej ibase.

       scale ( wyrażenie )
              Wynikiem funkcji scale jest liczba cyfr po kropce dziesiętnej w wyrażeniu będącym jej parametrem.

       sqrt ( wyrażenie )
              Wynikiem funkcji sqrt jest pierwiastek kwadratowy z wyrażenia. Jeżeli wyrażenie ma wartość ujemną,
              to generowany jest błąd wykonania.

   INSTRUKCJE
       Instrukcje  (jak  w  większości  języków  algorytmicznych) umożliwiają sterowanie kolejnością wykonywania
       wyrażeń. W bc instrukcje wykonywane są bezzwłocznie, "tak szybko jak to jest możliwe".  Wykonanie  odbywa
       się  gdy  napotkano  znak  nowej  linii  i istnieje jedna lub więcej pełna instrukcja.  W związku z takim
       natychmiastowym wykonaniem, znaki nowej linii są bardzo istotne w bc. W rzeczywistości, jako organiczniki
       instrukcji  używane  są  zarówno  znaki  nowej linii jak i średniki. Nieprawidłowo umieszczony znak nowej
       linii spowoduje błąd składni. Ponieważ znaki nowej linii rozdzielają instrukcje, możliwe jest ich ukrycie
       (przed  interpretacją)  przy pomocy znaku odwrotnego ukośnika. Sekwencja "\<nl>", gdzie <nl> jest znakiem
       nowej linii postrzegana jest przez bc jako  znak  zwykłej  spacji  zamiast  znaku  nowej  linii.  Poniżej
       umieszczono  listę  instrukcji bc i ich znaczenia: (elementy umieszczone w nawiasach kwadratowych ([]) są
       opcjonalnymi częściami instrukcji.)

       wyrażenie
              Instrukcja ta wykonuje dwie rzeczy. jeżeli wyrażenie rozpoczyna się  od  "<zmienna>  <przypisanie>
              ...",  to  jest  traktowane  jak  instrukcja  przypisania.  Jeśli  wyrażenie  nie  jest instrukcją
              przypisania, to wyrażenie jest wyliczane i drukowane  na  standardowym  wyjściu.  Po  wydrukowaniu
              liczby drukowany jest znak nowej linii. Na przykład, "a=1" jest instrukcją przypisania zaś "(a=1)"
              jest wyrażeniem zawierającym przypisanie.  Wszystkie  liczby  drukowane  są  przy  użyciu  systemu
              pozycyjnego  określonego  zmienną  obase.  Dopuszczalnymi  wartościami  obase są 2 do BC_BASE_MAX.
              (Patrz sekcja OGRANICZENIA.) Dla podstaw systemu od 2 do 16 używana jest zwyczajowa metoda  zapisu
              liczb. Dla podstaw większych od 16 bc posługuje się metodą cyfr wieloznakowych wyświetlania liczb,
              gdzie każda  z  kolejnych  cyfr  wyświetlana  jest  jako  liczba  dziesiętna.  Cyfry  wieloznakowe
              oddzielane  są odstępami. Każda z cyfr zawiera tyle znaków, ile jest niezbędnych do przedstawienia
              dziesiętnie wartości "obase-1". Ponieważ liczby mają dowolną dokładność, niektóre z liczb mogą nie
              dać  wydrukować  się  w pojedynczym wierszu. Takie długie liczby zostaną podzielone między wiersze
              przy zastosowaniu "\" jako ostatniego  znaku  wiersza.  Maksymalną  liczbą  znaków  drukowanych  w
              wierszu  jest  70.  Z  powodu  interaktywneggo  charakteru bc drukowanie liczby ma efekt uboczny w
              postaci przypisania wydrukowanej wartości do specjalnej  zmiennej  o  nazwie  last.  Umożliwia  to
              użytkownikowi  odtworzenie  ostatnio  wydrukowanej  wartości  bez  potrzeby  ponownego  wpisywania
              wyrażenia, które ją wydrukowało. Nadawanie wartości zmiennej last jest  dozwolone;  spowoduje  ono
              zastąpienie   ostatnio   wydrukowanej  wartości  wartością  przypisaną.  Nowo  przypisana  wartość
              pozostanie aż do wydrukowania kolejnej  liczby  lub  nadania  last  innej  wartości.  (Niektóre  z
              implementacji  mogą  dopuszczać  użycie  pojedynczej  kropki (.), nie będącej częścią liczby, jako
              skróconej notacji dla last.)

       łańcuch
              Na wyjściu drukowany  jest  łańcuch  znakowy.  Łańcuchy  rozpoczynają  się  znakiem  cudzysłowu  i
              zawierają  wszystkie  znaki  do następnego znaku cudzysłowu.  Wszystkie znaki, włącznie ze znakami
              nowej linii, traktowane są dosłownie.  Po wydrukowaniu łańcucha  nie  jest  drukowany  znak  nowej
              linii.

       print lista
              Instrukcja  print  (rozszerzenie)  umożliwia  użycie  innego sposobu wydruku wyników. "Lista" jest
              listą łańcuchów i wyrażeń oddzielonych przecinkami.  Każdy łańcuch czy wyrażenie drukowany jest  w
              kolejności  występowania  na  liście.  Nie  jest drukowany kończący znak nowej linii (przejście do
              następnego wiersza). Wyliczana jest wartość wyrażeń; jest ona drukowana  i  przypisywana  zmiennej
              last.  Łańcuchy  użyte w instrukcji print są drukowane na wyjściu i mogą zawierać znaki specjalne.
              Znaki specjalne rozpoczynają się znakiem odwrotnego ukośnika (\). bc rozpoznaje następujące  znaki
              specjalne:  "a"  (dzwonek, bell), "b" (backspace), "f" (wysuw strony, form feed), "n" (nowa linia,
              newline), "r" (powrót karetki, carriage return), "q" (cudzysłów, double  quote),  "t"  (tabulacja,
              tab)  oraz  "\"  (odwrotny ukośnik, backslash).  Inne znaki występujące po odwrotnym ukośniku będą
              ignorowane.

       { lista_instrukcji }
              Jest to instrukcja grupowania. Pozwala na grupowanie wielu instrukcji do wykonania.

       if ( wyrażenie ) instrukcja1 [else instrukcja2]
              Instrukcja if oblicza wyrażenie i wykonuje instrukcję1 bądź instrukcję2 w zależności  od  wartości
              wyrażenia.   Jeżeli  wyrażenie  jest  niezerowe,  wykonywana  jest  instrukcja1.  Jeśli  występuje
              instrukcja2 a  wartością  wyrażenia  jest  0,  to  wykonywana  jest  instrukcja2.  (Klauzula  else
              instrukcji if jest rozszerzeniem).

       while ( wyrażenie ) instrukcja
              Instrukcja  while powtarza wykonywanie danej instrukcji póki wyrażenie jest niezerowe. Oblicza ona
              wartość wyrażenia przed każdym wykonaniem instrukcji.  Przerwanie  pętli  powodowane  jest  zerową
              wartością wyrażenia lub wykonaniem instrukcji break (przerwania).

       for ( [wyr1] ; [wyr2] ; [wyr3] ) instrukcja
              Instrukcja  for  kontroluje  powtarzane  wykonanie  danej  instrukcji.  Przed pętlą obliczane jest
              wyrażenie1. Wyrażenie2 jest obliczane przed każdym wykonaniem instrukcji. Jeśli jest niezerowe, to
              wykonywana  jest  instrukcja.   Jeśli  ma  ono  wartość  zero, to pętla jest przerywana. Po każdym
              wykonaniu  danej  instrukcji  wyliczana  jest  wartość  wyrażenia3  przed   ponownym   wyliczeniem
              wyrażenia2.  Jeżeli  pominięto  wyrażenie1 lub wyrażenie3, to nic nie jest obliczane w chwili, gdy
              powinna być określana ich wartość. Jeżeli pominięto wyrażenie2, to jest ono zastępowane  wartością
              1.  (Wyrażenie  opcjonalne  stanowią rozszerzenie. bc w POSIXie wymaga wszystkich trzech wyrażeń.)
              Poniższy kod jest równoważny instrukcji for:
              wyrażenie1;
              while (wyrażenie2) {
                 instrukcja;
                 wyrażenie3;
              }

       break  Instrukcja ta powoduje wymuszone zakończenie ostatniej obejmującej ją instrukcji while lub for.

       continue
              Instrukcja  continue  (rozszerzenie)  powoduje  rozpoczęcie  kolejnej  iteracji   przez   ostatnią
              obejmującą ją instukcję for.

       halt   Instrukcja halt (rozszerzenie) jest instrukcją nakazującą preprocesorowi bc zakończenie pracy (ale
              tylko wtedy gdy instrukcja ta jest wykonywana).  Na przykład, "if (0 ==  1)  halt"  nie  spowoduje
              przerwania pracy bc, gdyż instrukcja halt nie będzie wykonana.

       return Zwraca wartość zero jako wynik funkcji. (Patrz sekcja dotycząca funkcji).

       return ( wyrażenie )
              Zwraca  wartość  wyrażenia  jako  wynik funkcji. (Patrz sekcja dotycząca funkcji).  Nawiasy nie są
              wymagane, co jest rozszerzeniem GNU bc.

   PSEUDO-INSTRUKCJE
       Te  instrukcje  nie  są  instrukcjami  w  tradycyjnym  sensie  tego  terminu.  Nie  są  one  instrukcjami
       wykonywanymi. Ich funkcja jest wykonywana podczas "kompilacji".

       limits Wypisuje lokalne ograniczenia narzucone przez lokalna wersję bc.  Jest to rozszerzenie.

       quit   Po  odczycie  instrukcji  quit  procesor  bc kończy pracę, niezależnie od tego, gdzie wystąpiła ta
              instrukcja. Na przykład, "if (0 == 1) quit" spowoduje zakończenie pracy bc.

       warranty
              Wypisuje dłuższą notkę na temat gwarancji. Jest to rozszerzenie.

   FUNKCJE
       Funkcje dostarczają sposobu definiowania obliczeń, które mogą być wykonane później. Funkcje w  bc  zawsze
       obliczają  wartość i zwracają ją do miejsca wywołania. Definicje funkcji są "dynamiczne" w tym sensie, że
       funkcja pozostaje niezdefiniowana dopóki na wejściu nie zostanie odczytana jej  definicja.  Definicja  ta
       jest  następnie  używana dopóki nie zostanie napotkana inna definicja funkcji o tej samej nazwie. Wówczas
       nowa definicja zastępuje starszą. Funkcja definiowana jest następująco:
              define nazwa ( parametry ) { nowa_linia
                  lista_auto   lista_instrukcji }
       Wywołanie funkcji jest po prostu wyrażeniem postaci "nazwa(parametry)".

       Parametry są liczbami lub tablicami (rozszerzenie). W definicji funkcji definiuje się  równocześnie  jest
       zero  lub  więcej  jej  parametrów  przez  podanie ich nazw rozdzielonych przecinkami. Liczby są jedynymi
       parametrami wywoływanymi przez wartość. Tylko  tablice  są  wołane  przez  wskazanie  zmiennej.   Tablice
       podawane  są  w  definicji  parametrów  przy  pomocy  notacji  "nazwa[ ]".  W wywołaniu funkcji parametry
       rzeczywiste dla parametrów numerycznych są pełnymi wyrażeniami. Do przekazywania tablic używana  jest  ta
       sama  notacja,  co przy definiowaniu parametrów typu tablicowego. Dana tablica przesyłana jest do funkcji
       przez nazwę (wskazanie).  Ponieważ  definicje  funkcji  są  dynamiczne,  w  trakcie  wywoływania  funkcji
       sprawdzana  jest liczba i typy jej parametrów.  Niezgodnośc liczby parametrów lub ich typów powoduje błąd
       wykonania. Błąd wykonania pojawi się także przy próbie wywołania niezdefiniowanej funkcji.

       lista_auto jest opcjonalną listą zmiennych, do użytku "lokalnego".   A  oto  składnia  tej  listy  (jeśli
       występuje):  "auto  nazwa,  ...  ;".   Średnik  jest  opcjonalny.  Każda z nazw jest nazwą auto-zmiennej.
       Tablice mogą być podane przy użyciu takiej samej składni jak w parametrach.  Na początku funkcji wartości
       tych  zmiennych  odkładane  są  na  stosie.   Następnie  zmienne  są inicjowane zerami i używane w czasie
       wykonywania funkcji. Przy zakończeniu funkcji zmienne są zdejmowane ze stosu, tak że przywracana jest ich
       pierwotna  wartość  (z momentu wywołania funkcji). Parametry te są faktycznie zmiennymi auto inicjowanymi
       wartościami dostarczonymi w wywołaniu funkcji. Zmienne typu auto różnią  się  od  tradycyjnych  zmiennych
       lokalnych,  gdyż  jeśli  funkcja  A  woła funkcję B, to B może posługiwać się zmiennymi auto funkcji A po
       prostu używając tych samych nazw, chyba że funkcja B traktuje je jako zmienne auto. Ponieważ zmienne auto
       i parametry składowane są na stosie, to bc obsługuje funkcje rekurencyjne.

       Ciało  funkcji  jest  listą  instrukcji  bc.  I  znów, jak w części zasadniczej, instrukcje oddzielane są
       średnikami lub znakami nowej linii. Instrukcje return (powrót) powodują zakończenie funkcji  i  zwrócenie
       wartości.  Istnieją  dwa  warianty  instrukcji  return.  Pierwsza  postać,  "return", zwraca wartość 0 do
       wywołującego wyrażenia. Druga postać, "return ( wyrażenie )", oblicza wartość wyrażenia i  zwraca  ją  do
       wyrażenia  wołającego. Każda funkcja domyślnie kończy się niejawną instrukcją "return (0)". Pozwala to na
       funkcji na zakończenie działania i zwrócenie zera bez jawnej instrukcji powrotu.

       Funkcje inaczej korzystają ze zmiennej ibase. Wszystkie stałe w obrębie ciała funkcji  będą  konwertowane
       przy  zastosowaniu wartości ibase w momencie wywołania funkcji. Zmiany ibase w czasie wykonywania funkcji
       są ignorowane, z wyjątkiem funkcji standardowej  read,  która  zawsze  do  konwersji  liczb  wykorzystuje
       bieżącą wartość ibase.

       Rozszerzeniem  GNU bc jest nieco luźniejszy format dla definicji.  Standard wymaga, by nawias otwierający
       znajdował się w tym samym wierszu co słowo kluczowe define, a  wszystkie  pozostałe  części  w  kolejnych
       wierszach.  Opisywana  tu  wersja  bc  zezwala  na  dowolną  ilość znaków nowej linii przed i po nawiasie
       otwierającym funkcji.  Na przykład, dozwolone są poniższe definicje.
              define d (n) { return (2*n); }
              define d (n)
                { return (2*n); }

   BIBLIOTEKA MATEMATYCZNA
       Jeżeli bc wywoływane jest z opcją -l, to wstępnie wczytywana jest biblioteka matematyczna (math library),
       a  domyślna  liczba  cyfr  dziesiętnych  (scale) ustawiana jest na 20. Funkcje matematyczne obliczają swe
       wyniki z dokładnością określoną w momencie ich wywołania.  Bibilioteka matematyczna definiuje następujące
       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 wykładnicza - e do potęgi x.

       j(n,x) Funkcja Bessela rzędu n (całkowitego) z argumentem x.

   PRZYKŁADY
       W powłoce /bin/sh, poniższe polecenie przypisuje wartość liczby "Pi" zmiennej środowiska pi.
               pi=$(echo "scale=10; 4*a(1)" | bc -l)

       Poniżej  podano  definicję  funkcji wykładniczej używanej w bibliotece matematycznej. Funkcja ta napisana
       jest w bc standardu POSIX.
              scale = 20

              /* wykorzystuje fakt, że e^x = (e^(x/2))^2
                 Gdy  x jest dostatecznie małe, używamy szeregu:
                   e^x = 1 + x + x^2/2! + x^3/3! + ...
              */

              define e(x) {
                auto  a, d, e, f, i, m, v, z

                /* sprawdzenie znaku 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
                }
              }

       Poniższy kod posługuje się rozszerzonymi cechami  bc  do  uzyskania  prostego  programu  liczącego  salda
       książeczki  czekowej. Najlepiej byłoby zachować go w pliku, tak by mógł być wykorzystany wielokrotnie bez
       potrzeby każdorazowego przepisywania.
              scale=2
              print "\nProgram książeczki czekowej!\n"
              print "  Pamiętaj, wpłaty są transakcjami ujemnymi.\n"
              print "  Koniec - transakcja zerowa.\n\n"

              print "Saldo początkowe? "; bal = read()
              bal /= 1
              print "\n"
              while (1) {
                "bieżące saldo = "; bal
                "transakcja? "; trans = read()
                if (trans == 0) break;
                bal -= trans
                bal /= 1
              }
              quit

       Poniżej zamieszczono definicję rekurencyjnej funkcji silni.
              define f (x) {
                if (x <= 1) return (1);
                return (f(x-1) * x);
              }

   OPCJE READLINE I LIBEDIT
       GNU bc może zostać skompilowany (poprzez opcję  konfiguracji)  tak,  by  posługiwał  się  biblioteką  GNU
       edytora  wejścia  o  nazwie  readline  lub też biblioteką BSD libedit.  Umożliwia to użytkownikowi edycję
       wierszy przed wysłaniem ich do  bc.  Pozwala  też  na  wykorzystanie  historii  poprzednio  wprowadzonych
       wierszy.  Przy  wybraniu tej opcji bc posiada dodatkową zmienną specjalną. Ta specjalna zmienna, history,
       przechowuje liczbę zachowywanych wierszy historii.  Dla readline, wartość -1  oznacza,  że  przechowywana
       jest  nieograniczona  liczba  wierszy historii.  Ustawienie wartości history na liczbę dodatnią ogranicza
       liczbę przechowywanych wierszy  historii  do  podanej  liczby.  Wartość  zero  wyłącza  funkcję  historii
       wprowadzonych  wierszy.  Wartością  domyślną  jest  100.  Więcej informacji można znaleźć w podręcznikach
       użytkownika dla bibliotek GNU readline i history  oraz  BSD  libedit.   Nie  można  równocześnie  włączyć
       zarówno readline jak i libedit.

   RÓŻNICE
       Niniejsza  wersja  bc  została  zbudowana  w oparciu o projekt POSIX P1003.2/D11 i zawiera kilka różnic i
       rozszerzeń w stosunku do tego dokumentu i  tradycyjnych  realizacji.   Nie  jest  wykonana  w  tradycyjny
       sposób,   wykorzystujący   polecenie   dc(1).   Wersja  ta  jest  pojedynczym  procesem,  analizującym  i
       uruchamiającym kod  binarny  będący  tłumaczeniem  programu.   Istnieje  "nieudokumentowana"  opcja  (-c)
       powodująca, że program wyświetla kod binarny na standardowym wyjściu zamiast wykonywania go. Używana była
       ona głównie do debuggowania analizatora składni i przy przygotowaniu biblioteki matematycznej.

       Głównym źródłem różnic są rozszerzenia, w których jakaś cecha, możliwość programu jest rozbudowana w celu
       dodania  funkcjonalności,  oraz  dodatki,  gdzie  dodano  nowe możliwości.  Poniżej podano listę różnic i
       rozszerzeń.

       Zmienna środowiska LANG
              Niniejsza wersja nie spełnia standardu POSIX przetwarzania zmiennej środowiska LANG  i  wszystkich
              zmiennych środowiska rozpoczynających się na LC_.

       nazwy  Tradycyjny  i  POSIXowy  bc posiadają jednoliterowe nazwy funkcji, zmiennych i tablic. Zostały one
              rozszerzone do nazw wieloznakowych, rozpoczynających się literą i mogących zawierać litery,  cyfry
              i znaki podkreślenia.

       łańcuchy
              Łańcuchy  nie  mogą  zawierać  znaków NUL. POSIX stwierdza, że wszystkie znaki muszą być zawarte w
              łańcuchach.

       last   POSIX bc nie posiada zmiennej last. Niektóre implementacje bc używają kropki (.) w podobny sposób.

       porównania
              POSIX bc dopuszcza  porównania  wyłącznie  w  instrukcjach  if,  while  oraz  w  drugim  wyrażeniu
              instrukcji  for.  Dodatkowo,  w  każdej  z  tych instrukcji dopuszczalna jest tylko jedna operacja
              porównania (relacji).

       instrukcja if, klauzula else
              POSIX bc nie posiada klauzuli else.

       instrukcja for
              POSIX bc wymaga by w instrukcji for występowały wszystkie wyrażenia.

       &&, ||, !
              POSIX bc nie posiada operatorów logicznych.

       funkcja read
              POSIX bc nie posiada funkcji read.

       instrukcja print
              POSIX bc nie posiada instrukcji print.

       instrukcja continue
              POSIX bc nie posiada instrukcji continue.

       instrukcja return
              POSIX bc wymaga nawiasów wokół zwracanego wyrażenia.

       parametry tablicowe
              POSIX bc nie obsługuje (obecnie) w pełni  parametrów  tablicowych.   Gramatyka  POSIX  zezwala  na
              użycie  tablic  w  definicjach funkcji, ale nie zapewnia metody przekazania tablicy jako bieżącego
              parametru.  (Jest  to  najprawdopodobniej  przeoczenie  w  zdefiniowanej  gramatyce.)   Tradycyjne
              implementacje bc posiadają jedynie wywołanie parametrów tablicowych przez wartość.

       format funkcji
              POSIX  bc  wymaga,  by  nawias  otwierający był w tym samym wierszu, co słowo kluczowe define, zaś
              instrukcja auto w następnym wierszu.

       =+, =-, =*, =/, =%, =^
              POSIX bc nie wymaga, by były zdefiniowane powyższe operatory przypisania "starego typu". Niniejsza
              wersja  zezwala  na  takie przypisania w "starym stylu". Należy skorzystać z instrukcji limits, by
              stwierdzić, czy zainstalowana wersja je rozpoznaje. Jeżeli obsługuje  ona  przypisania  w  "starym
              stylu", to instrukcja "a =- 1" pomniejszy a o jeden zamiast przypisać a wartość -1.

       spacje w liczbach
              Inne  implementacje bc dopuszczają występowanie spacji w liczbach.  Na przykład, "x=1 3" przypisze
              wartość 13 zmiennej x. Ta sama instrukcja spowoduje błąd składni w opisywanej tu wersji bc.

       błędy i wykonanie
              Opisywana implementacja różni się od innych sposobem, w  jaki  wykonywany  jest  kod  w  przypadku
              znalezienia  w  programie  błędów składniowych i innych.  W przypadku napotkania błędu w definicji
              funkcji, obsługa błędów próbuje odnależć początek  instrukcji  i  kontynuować  analizę  składniową
              funkcji.   Po  znalezieniu  błędu  w  funkcji,  nie  jest  ona  możliwa  do  wywołania i staje się
              niezdefiniowana. Błędy składniowe w  interaktywnym  wykonywaniu  kodu  unieważniają  bieżący  blok
              wykonania.  Blok  wykonania  jest  zakończony  końcem  linii  pojawiającym się po pełnej sekwencji
              instrukcji.  Na przykład,
                     a = 1
                     b = 2
              posiada dwa bloki wykonania a
                     { a = 1
                       b = 2 }
              ma jeden blok wykonania.  Każdy z błędów wykonania przerywa wykonywanie bieżącego bloku wykonania.
              Ostrzeżenie w trakcie wykonywania nie przerywa bieżącego bloku.

       Przerwania
              Podczas  sesji  interaktywnej  sygnał  SIGINT (zwykle generowany przez znak control-C z terminala)
              spowoduje przerwanie bieżącego  bloku  wykonywania.   Wyświetli  on  błąd  wykonania  ("runtime"),
              wskazujący  która  funkcja  została  przerwana.  Po  wyczyszczeniu  wszystkich  struktur  (runtime
              structures) wykonania, zostanie wyświetlony komunikat informujący użytkownika, że bc jest gotów do
              przyjmowania  kolejnych  danych.  Wszystkie uprzednio zdefiniowane funkcje pozostają zdefiniowane,
              zaś wartości wszystkich zmiennych innych niż zmienne typu auto są wartościami  sprzed  przerwania.
              Podczas procesu oczyszczania struktur danych usuwane są wszystkie zmienne typu auto oraz parametry
              funkcji.  W czasie sesji nieinteraktywnej sygnał SIGINT przerywa wykonanie całego bc.

   OGRANICZENIA
       Poniżej podano obecne ograniczenia opisywanego procesora bc.  Niektóre z nich mogą być zmienione  podczas
       instalacji.  Faktyczne ograniczenia można sprawdzić za pomocą instrukcji limits (ograniczenia).

       BC_BASE_MAX
              Maksymalna  podstawa pozycyjnego układu, w którym wyprowadzane są wyniki obecnie ustawiona jest na
              999. Maksymalną podstawą układu wejściowego jest 16.

       BC_DIM_MAX
              Obecnie ustawione jest arbitralne  ograniczenie  do  65535  (w  wersji  rozpowszechnianej).  Twoja
              instalacja może być inna.

       BC_SCALE_MAX
              Liczba cyfr po kropce dziesiętnej ograniczona jest do INT_MAX cyfr. Także liczba cyfr przed kropką
              dziesiętną ograniczona jest do INT_MAX cyfr.

       BC_STRING_MAX
              Maksymalnie w łańcuchu może wystąpić INT_MAX znaków.

       wykładnik
              Wartość wykładnika w operacji potęgowania (^) ograniczona jest do LONG_MAX.

       nazwy zmiennych
              Obecnie nie może być więcej niż 32767 unikalnych nazw w każdym  z  rodzajów:  zmiennych  prostych,
              tablic i funkcji.

ZMIENNE ŚRODOWISKA

       bc przetwarza następujące zmienne środowiska:

       POSIXLY_CORRECT
              To samo, co opcja -s. Tryb zgodności z POSIX.

       BC_ENV_ARGS
              Inny  sposób przekazywania argumentów do bc. Format jest taki sam, jak argumentów wiersza poleceń.
              Argumenty te przetwarzane są na początku, więc pliki podane w argumentach środowiska  przetwarzane
              są  przed  plikami  podanymi jako argumenty wiersza poleceń. Umożliwia to użytkownikowi ustawienie
              "standardowych" opcji i plików, jakie będą przetwarzane przy każdym wywołaniu bc. Pliki  podane  w
              zmiennych  środowiska  zawierają zwykle definicje funkcji, które użytkownik chce mieć zdefiniowane
              przy każdym uruchomieniu bc.

       BC_LINE_LENGTH
              Powinna to być liczba całkowita (integer) podająca ilość znaków w wierszu wynikowym. Obejmuje  ona
              znaki odwrotnego ukośnika i nowej linii dla długich liczb.

DIAGNOSTYKA

       Jeżeli  któryś  z  plików  podanych w wierszu poleceń nie może zostać otwarty bc zgłosi, że plik ten jest
       niedostępny i przerwie pracę. Istnieją też komunikaty diagnostyczne kompilacji i wykonania, które powinny
       być zrozumiałe.

BŁĘDY

       Obsługa błędów (error recovery) nie jest jeszcze bardzo dobra.

       Błędy proszę zgłaszać (w jęz.angielskim) na adres bug-bc@gnu.org.  Upewnij się, że pole tematu wiadomości
       zawiera gdzieś słowo ``bc''.

AUTOR

       Philip A. Nelson
       phil@cs.wwu.edu

PODZIĘKOWANIA

       Autor chciałby podziękować Steve'owi Sommars (Steve.Sommars@att.com) za jego szeroką pomoc  w  testowaniu
       tej  implementacji.  Podsunął on wiele cennych sugestii. Dzięki jego zaangażowaniu jest to o wiele lepszy
       produkt.

ZOBACZ TAKŻE

       dc(1), expr(1), awk(1)

INFORMACJE O TŁUMACZENIU

       Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne.
       W  razie  zauważenia  różnic  między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub
       funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:

              man --locale=C 1 bc

       Prosimy  o  pomoc  w  aktualizacji  stron  man  -   więcej   informacji   można   znaleźć   pod   adresem
       http://sourceforge.net/projects/manpages-pl/.