Provided by: manpages-tr_1.0.5.1-2_all bug

ISIM

       bc - Keyfi duyarlilikta hesaplama dili

KULLANIM

       bc [ -hlwsqv ] [ uzun-se,cenekler ] [ dosya ... ]

S"UR"UM

       Bu kullanim kilavuzu, GNU bc surum 1.06'ya gore hazirlanmistir.

A,CIKLAMA

       bc,  girilen  deyimleri  isleterek  keyfi  uzunlukta  ve duyarliliktaki
       sayilar  uzerinde  matematiksel   islemler   yapmaya   imkan   saglayan
       etkilesimli  bir  ortam  ve  bir  yazilim gelistirme dilidir. Sozdizimi
       acisindan   C   yazilim   gelistirme   dilini   andiran    benzerlikler
       sozkonusudur.  Komut  satirindan belirtmek suretiyle kullanabilecegimiz
       standart bir math  kutuphanesine de sahiptir. Eger  gerekli  ise;  math
       kutuphanesi,  belirtilen  dosyalardan  daha  once ele alinir. bc isleme
       tabi tutarken dosyalari komut  satirinda  belirtilen  siraya  gore  ele
       alir. Belirtilen dosyalarin tumu ele alinip islendikten sonra, standart
       girdiden  girisler  okunmaya  baslar.  Kodlar  nasil  okunuyorlarsa  bu
       halleriyle  isletilirler. (Eger belirtilen dosyalardan herhangi birinde
       bc'yi sonlandiracak  bir  komut  yer  alirsa,  bc  sonlanir,  bir  daha
       standart girdiden okuyamaz.)

       bc'nin   bu  surumu,  geleneksel  bc  uygulamalarina  ve  POSIX  taslak
       standardina  gore  ilave  olusumlar  icermektedir.   Komut   satirindan
       belirtilecek  bir secenekle bu genisletmeler kullanima dahil edilebilir
       veya edilmeyebilir. Bu kilavuzda GNU bc  anlatilacak  ve  ek  olusumlar
       yeri gelince belirtilecektir.

   SE,CENEKLER
       -h, --help
              Bir kullanim iletisi basar ve cikar.

       -i, --interactive
              Etkilesimli kipe gecilir.

       -l, --mathlib
              Standart math kutuphanesini kullanima sokar.

       -w, --warn
              POSIX bc'ye ek olusumlar icin uyarilar verir.

       -s, --standard
              Standart POSIX bc diline uygun olarak islem yapar.

       -q, --quiet
              Normalde gelen, GNU bc hosgeldiniz iletisini goruntulemez.

       -v, --version
              Surum ve telif hakki bilgilerini gosterir ve cikar.

   SAYILAR
       bc'deki  en  temel  eleman sayilardir. Sayilar keyfi duyarlilikta ifade
       edilirler. Yani bc'de bir sayi, tamsayi kisim ve ondalik  kisim  olarak
       ifade  edilir. Tum sayilar normalde ic hesaplamalarda onluk tabanda ele
       alinirlar ve tum islemler onluk  taban  uzerinden  gerceklestirilirler.
       (Bu  surum,  bolme ve carpma islemlerinde sayilarin ondalik kisimlarini
       belli uzunluktan  sonra  kesmektedir.)  bc'de  sayilarin  iki  ozelligi
       vardir:  uzunluk  ve boluntu. Uzunluk, sayidaki tum anlamli rakamlarin,
       boluntu ise ondalik noktadan sonraki rakamlarin adedidir.

       Ornegin:

       0.0000010 sayisinin uzunlugu 7 ve boluntusu 6'dir.
       01935.000 sayisinin uzunlugu 7 ve boluntusu 3'tur.

       Uzunluk  acisindan;  en  sagdaki  sifir  anlamli,  en   soldaki   sifir
       anlamsizdir.

   DEGI,SKENLER
       Sayilar   iki  farkli  turde  degisken  olarak  saklanabilirler:  basit
       degiskenler ve diziler. Her iki  degisken  turu  icin  de  degiskenlere
       birer  ad  verilir.  Degiskenler  bir  harfle  baslarlar  ve sonrasinda
       harfler, rakamlar ve  altcizgi  karakteri  icerebilirler.  Tum  harfler
       kucuk  harf  olmak  zorundadir.  (Degiskenlere  uzun isim verebilme bir
       genisletmedir. Cunku, POSIX  bc'de  degisken  isimleri  tek  bir  kucuk
       harftir.)  Dizi  degiskenleri ise isimden sonra [] (koseli parantezler)
       alirlar.

       bc'de dort tane ozel degisken vardir. Bunlar; scale,  ibase,  obase  ve
       last'dir.  scale,  islemlerde sayilarda ondalik noktadan sonra kac tane
       rakamin kullanilacagini belirtir. Ontanimli scale degeri  0'dir.  ibase
       (input  base)  ve  obase (output base) degiskenleri, sayilarda girdi ve
       cikti icin tabanlari belirtir.  Ornegin,  ibase=10  ve  obase=2  olursa
       sayilar  onluk  tabanda  girilir  ve  sonuclar  ekrana  ikilik  tabanda
       yazdirilirlar.  Ontanimli  ibase  ve  obase  degerleri   10'dur.   last
       degiskeni  (bu  bir genisletmedir) ise, en son ekrana yazdirilan sayiyi
       iceren bir  degiskendir.  Bu  degiskenlere  yeni  degerler  atanabilir.
       Bunlar ileride daha ayrintili olarak ele alinacaktir.

   A,CIKLAMALAR
       bc'de  aciklama satirlari /* karakterleri ile baslar ve */ karakterleri
       ile biter. Aciklamalar herhangi bir yerde baslayabilir ve  girdide  tek
       bir bosluk gibi ele alinir. (Yani, bu da aciklamalarin girdi elemanlari
       arasinda bir ayrac olarak  yorumlandigini  gosterir.  Dolayisiyla,  bir
       degisken ismi icerisinde aciklama yer alamaz anlamindadir.) Aciklamalar
       satirsonu karakteri icerebilirler.

       Ayrica bc'de  betiklerin  kullanilmasini  saglamak  icin  tek  satirlik
       aciklamalar  desteklenmektedir  ve  bu  bir genisletmedir. Tek satirlik
       aciklama # karakterinden sonra baslar ve satir sonuna kadar devam eder.
       Satirsonu karakteri aciklamaya dahil degildir ve normal karakter olarak
       ele alinir.

   IFADELER
       Sayilar, ifadelerle  ve  deyimlerle  birlikte  kullanilirlar.  Bu  dil,
       etkilesimli  bir  calisma  ortami  olarak tasarlandigi icin deyimler ve
       ifadeler de  etkilesimli  olarak  isletilebilirler.  bc'de  bir  'main'
       islevi   kavrami   yoktur.  Bunun  yerine  kod,  oldugu  haliyle  hemen
       yorumlanarak  isletilir.  (Islevler,  once  tanimlanirlar  ve  sonradan
       kullanilabilirler -ileride ele alinacaklar-).

       En basit ifade bir 'sabit'tir. bc, ibase degiskeniyle belirtilen o anki
       girdi tabanini kullanarak sayiyi dahili onluk tabana  cevirir.  (Ancak,
       islevler icin bir istisna vardir.) ibase degiskeninin gecerli degerleri
       2'den  16'ya  kadardir.   Bu   araligin   disinda   degerler   atanirsa
       kendiliginden  2  veya 16 olarak yeniden ayarlanir. Sayilar girilirken,
       0-9 arasi rakamlar ve A-F arasi harfler ile kullanilabilir.  (Not:  A-F
       buyuk   harf   olmalidir.   Cunku,   kucuk   harfler  degiskenler  icin
       kullaniliyorlar.) Tek rakamli sayilar, ibase ne olursa olsun, her zaman
       rakamin  ifade ettigi degere sahip olurlar (orn, A=10)). bc cok rakamli
       sayilarda, ibase degerine esit veya daha buyuk rakamlari derhal ibase-1
       tabaninda  ele alarak sayinin degerini hesaplar. Bu FFF sayisini daima,
       girdi tabanindaki en buyuk 3 haneli sayi yapar.

       Ifadeler, diger yuksek-duzeyli dillerdekilere oldukca benzerler.  bc'de
       sayilar  icin  farkli turler olmadigi icin karisik turler icin kurallar
       yoktur. Bunun yerine, sadece ifadelerin  boluntuleri  uzerine  kurallar
       vardir.  Her  ifadenin  bir  boluntusu  vardir.  Bu, orijinal sayilarin
       boluntulerinden, gerceklestirilen islemden ve  cogu  durumda  da  scale
       degiskeninin  degerinden  elde  edilir.  scale degiskeninin alabilecegi
       degerler, 0 (sifir)  ile  C'deki  tamsayi  turu  ile  ifade  edilebilen
       tamsayi araligindadir.

       Asagidaki gecerli ifadelerin aciklamalarinda "ifade" komple bir ifadeyi
       ve "degisken" ise siradan  bir  degiskeni  veya  bir  dizi  degiskenini
       gostermektedir. Bir basit degisken

       isim

       seklinde ve bir dizi degiskeni ise asagidaki gibi belirtilir:

       isim[ifade]

       Ozel  olarak soz edilmediyse sonucun boluntusu, ilgili ifadelerin azami
       boluntusu olur.

       -ifade Sonuc, ifade'nin negatifi olur.

       ++degi,sken
              degi,sken'in degerine once 'bir' eklenir ve yeni  deger  ifadenin
              sonucu olur.

       --degi,sken
              degi,sken'in  degeri once 'bir' eksiltilir ve yeni deger ifadenin
              sonucu olur.

       degi,sken++
              Ifadenin  sonucu  degiskenin  degerine  gore  hesaplanir,  sonra
              degi,sken'in degeri 'bir' artirilir.

       degi,sken--
              Ifadenin  sonucu  degiskenin  degerine  gore  hesaplanir,  sonra
              degi,sken'in degeri 'bir' eksiltilir.

       ifade + ifade
              Sonuc, iki ifade'nin toplamidir.

       ifade - ifade
              Sonuc, iki ifade'nin farkidir.

       ifade * ifade
              Sonuc, iki ifade'nin carpimidir.

       ifade / ifade
              Sonuc,  iki  ifade'nin  bolumudur.   Sonucun   boluntusu   scale
              degiskeninin degeridir.

       ifade % ifade
              Sonuc,   "kalan"i   verir   ve  su  sekilde  hesaplanir.  a%b'yi
              hesaplarken,  ilk  once  a/b  scale  haneli  olarak  hesaplanir.
              scale+scale(b) ve scale(a)'dan hangisi daha buyukse bu boluntuye
              gore a-(a/b)*b ifadesi  sonucu hesaplamak icin kullanilir.  Eger
              scale  0'a esitlenirse ve her iki ifade de tamsayi ise, bu ifade
              tamsayi kalan islevidir.

       ifade ^ ifade
              Ifadenin sonucu, birincinin ikinciye gore ussudur. Ikinci  ifade
              bir  tamsayi olmalidir. (Eger ikinci ifade tamsayi degilse, once
              ekrana bir uyari gelir ve ifade tamsayi olacak sekilde  kesilir,
              yani  ikinci  ifadenin tam kismi alinir). Sonucun boluntusu ise,
              eger us negatif ise  scale'dir.  Us  pozitif  ise  scale(a^b)  =
              min(scale(a)*b,  max(scale,  scale(a)))'dir.  Unutulmamalidir ki
              ifade^0 ifadesinin sonucu her zaman "1" olur.

       ( ifade )
              Parantezler,  ifadenin  degeri  bulunurken   standart   onceligi
              degistirir ve parantez icine alinan ifade daha once hesaplanir.

       degi,sken = ifade
              Ifadenin sonucu degiskene atanir.

       degi,sken <i,sle,c>= ifade
              Bu, "degi,sken = degi,sken <i,sle,c> ifade" ile esdegerdir ancak bir
              farkla; degi,sken'in degeri sadece bir  kere  elde  edilir.  Eger
              degi,sken  bir  dizi ise, islemin bir kere yapilacagi gozden uzak
              tutulmamalidir.

       Iliskisel ifadeler (karsilastirma ifadeleri),  sonuclari  her  zaman  0
       veya  1  olan  ozel  ifadelerdir.  0, yanlis (false) ve 1, dogru (true)
       olarak  yorumlanir.  Bunlar   herhangi   bir   ifade   icerisinde   yer
       alabilirler.  (POSIX  bc'de  ise iliskisel ifadeler sadece if, while ve
       for deyimlerinde kullanilabilir ve sadece  bir  tane  iliskisel  sinama
       olabilir.) Iliskisel islecler sunlardir:

       ifade1 < ifade2
              Sonuc,  eger  ifade1,  ifade2'den  kucukse  1 olur. Aksi halde 0
              olur.

       ifade1 <= ifade2
              Sonuc, eger ifade1, ifade2'den kucuk ya da esitse 1  olur.  Aksi
              halde 0 olur.

       ifade1 > ifade2
              Sonuc,  eger  ifade1,  ifade2'den  buyukse  1 olur. Aksi halde 0
              olur.

       ifade1 >= ifade2
              Sonuc, eger ifade1, ifade2'den buyuk ya da esitse 1  olur.  Aksi
              halde 0 olur.

       ifade1 == ifade2
              Sonuc, eger ifade1, ifade2'ye esitse 1 olur. Aksi halde 0 olur.

       ifade1 == ifade2
              Sonuc,  eger  ifade1,  ifade2'den farkliysa 1 olur. Aksi halde 0
              olur.

       bc'de   mantiksal  (boolean)  islemler  de  gecerlidir.  (POSIX   bc'de
       mantiksal  islemler  yoktur.)  Mantiksal  islemlerin  sonucu, iliskisel
       islemlerde oldugu gibi, 0 (false) yada 1 (true)  olmaktadir.  Mantiksal
       islecler sunlardir:

       !ifade ifade 0 ise sonuc 1'dir. Aksi halde 0 olur.

       ifade && ifade
              ifade'lerin ikiside sifirdan farkliysa sonuc 1'dir. Aksi halde 0
              olur.

       ifade || ifade
              ifade'lerden biri sifirdan farkliysa sonuc 1'dir. Aksi  halde  0
              olur.

       Isleclerin islem oncelik sirasi soyledir (kucukten buyuge):

       || isleci, once sol taraf
       && isleci, once sol taraf
       ! isleci, tarafsiz
       Iliskisel islecler, once sol taraf
       Atama isleci, once sag taraf
       + and - isleci, once sol taraf
       *, / ve % isleci, once sol taraf
       ^ isleci, once sag taraf
       tek terimli - isleci
       ++ ve -- isleci

       Bu  onceligin secilmesinin nedeni, POSIX uyumlu bc yazilimlarinin dogru
       calismasi  icindir.  Ancak,  iliskisel  ve  mantiksal  islecler,  atama
       ifadelerinde  kullanildiginda elverissiz ve cok farkli bir durum ortaya
       cikmaktadir. Asagidaki ifadeyi ele alalim:

       a = 3 < 5

       C programcilari  bu  ifadeyi  ele  alirken,  once  3<5   (sonuc  1'dir)
       ifadesini  gerceklestirir,  ardindan  sonucu  "a"  degiskenine atarlar.
       bc'de ise once "a"ya 3 atanir ve ardindan 5 ile karsilastirma  yapilir.
       Buna  dikkat  etmek  gerekir. En iyisi, iliskisel ve mantiksal islecler
       ile atama isleci ayni ifadede kullanildiginda  karmasayi  onlemek  icin
       parantezleri kullanmaktir.

       bc'de  desteklenen  biraz  daha  ozel ifadeler vardir. Bunlar, standart
       islevler ve kullanici tanimli islevlerde, "isim(parametreler)" seklinde
       gorulmektedirler.  Ayrintili  bilgi icin I,SLEVLER bolumundeki kullanici
       tanimli islevlere bakiniz. Yerlesik islevler sunlardir:

       length ( ifade )
              length islevinin degeri, ifade'deki anlamli rakamlarin adedidir.

       read ( )
              read  islevi  (bu  bir  genisletmedir),  nerede   kullanildigina
              bakilmaksizin,   standart   girdiden   bir   sayi   okumak  icin
              kullanilir. Ancak, standart girdiden veri  ve  yazilim  birlikte
              okunurken   problemlere  neden  olabileceginden  dikkatli  olmak
              gerekir. Bu islevin en iyi kullanim sekli, asla kullanicidan kod
              girmeyi  gerektiren  yerlerde  degil,  evvelce  gelistirilen bir
              yazilim  icin   kullanicidan   bir   girdi   bekleyen   yerlerde
              kullanmaktir.  read  islevinin  degeri, standart girdiden okunan
              sayinin ibase tabanindaki degeridir.

       scale ( ifade )
              scale islevinin degeri, ifade'denin sonucu olan sayidaki ondalik
              hanelerin sayisidir.

       sqrt ( ifade )
              sqrt  islevinin  degeri, ifade'nin karekokudur. ifade'nin sonucu
              negatif bir sayi ise bir calisma ani hatasi uretilir.

   DEYIMLER
       Deyimler,  bircok  cebirsel  dilde  oldugu  gibi,  ifadelerin   sirayla
       degerlendirilmelerini  saglarlar.  bc'de  deyimler  "mumkun  oldugunca"
       isletilirler. Isletim, bir ya da daha  fazla  tam  deyimden  sonra  bir
       satirsonu   karakteri   girildiginde  gerceklesir.  Bu  bakimdan  bc'de
       satirsonu karakterleri cok onemlidir. Aslinda, deyimleri  ayirmak  icin
       bir  satirsonu  karakteri  ve  bir noktali virgul gerekir. Yanlis yerde
       kullanilmis bir satirsonu karakteri bir sozdizimi hatasina sebep  olur.
       Satir sonu karakteri deyimler icin bir ayrac oldugundan, bir satir sonu
       karakterini gizlemek icin ters bolu karakteri kullanilabilir.  Tersbolu
       karakterinden  sonra  gelen bir satirsonu karakterinden olusan karakter
       ciftini bc bosluk karakteri olarak degerlendirir.  Bir  deyim  listesi,
       noktali  virgul  ve  satirsonu  karakteri ile sonlandirimis deyimlerden
       olusur. Asagidaki listede bc'deki deyimler ve  bunlarin  ne  yaptiklari
       anlatilmaktadir  (Koseli  parantezler  ([ ]) arasina alinanlar, deyimin
       istege bagli kisimlaridir.):

       ifade  Bu deyim iki seyden birini yapar. Eger ifade "<degisken> <atama>
              ..."  seklinde basliyorsa, bunun bir atama deyimi oldugunu kabul
              eder. Eger ifade bir atama deyimi degil  ise,  ifade'nin  degeri
              bulunur   ve  ciktiya  yazdirilir.  Sayinin  ardindan  satirsonu
              karakteri yazdirilir.  Ornegin,  a=1  ifadesi  bariz  bir  atama
              deyimidir;  ve  (a=1) icinde bir atama deyimi olan bir ifadedir.
              Ciktilanan tum sayilar obase degiskeni  ile  belirtilen  tabanda
              yazdirilirlar.  obase  degiskeninin  alabilecegi  degerler 2 ile
              BC_BASE_MAX arasindadir. (Ayrintili bilgi icin SINIRLAR bolumune
              bakiniz.)

              2  ile  16  arasindaki  tabanlar  icin cikti bildigimiz yontemle
              yazdirilir. 16'dan daha buyuk tabanlar  icin  ise,  bc  her  bir
              haneyi   yazdirmak  icin  10'luk  tabanda  birden  cok  karakter
              kullanir ve haneler arasinda bosluk birakir. Her  hane,  obase-1
              degerini  10'luk duzende yazmak icin gereken sayi kadar rakamdan
              olusur. Ornegin, obase=20 icin 65 sayisi ekrana "03 05" seklinde
              yazdirilir.  Eger  obase=101  olsaydi,  25  sayisi  ekrana "025"
              seklinde  yazdirilacakti.   Sayilar   keyfi   duyarlilikta   ele
              alindiklari  icin,  bazi  sayilar  ekrana  yazdirilirken tek bir
              satira sigmayabilirler. Bu  uzun  sayilar  yazdirilirken  ekrana
              satirlarin  sonuna  "\"  (tersbolu)  karakteri  gelir.  Her  bir
              satirda en fazla 70 karakter yazdirilabilir. bc'nin  etkilesimli
              dogasindan  dolayi  yazilan en son deger, ozel last degiskeninde
              saklanir ki ayni sayiyi bir daha  elde  etmek  icin  bir  onceki
              ifade'yi  tekrar  yazmaya  gerek  kalmaz. last degiskenine atama
              yapilmasi da gecerlidir ve  atanan  deger  son  yazilan  degerin
              uzerine  yazilir.  Yeni  atanan  deger,  yeni bir deger yazilana
              kadar ya da last  degiskenine  yeni  bir  atama  yapilana  kadar
              gecerli  kalir.  (Bazi  kurulumlar last icin bir kisaltma olarak
              bir sayinin parcasi olmayan tek bir nokta (.) kullanimini mumkun
              kilabilir.)

       dizge  dizge  ciktiya  yazdirilir. Cift tirnak "..." arasina alinan her
              sey (satirsonu karakteri de dahil) dizge olarak kabul edilir  ve
              ekrana aynen yazdirilirlar. dizge yazdirildiktan sonra satirsonu
              karakteri yazdirilmaz (yani asagi satira  gecilmez,  bu  nedenle
              satirsonu karakteri dizge'nin icine yerlestirilmelidir).

       print liste
              print  deyimi (bu bir genisletmedir) ciktiya birseyler yazdirmak
              icin  kullanilan  diger   bir   yontemdir.   liste   parametresi
              zorunludur,   aralarina  virgul  (,)  konularak  dizgelerden  ve
              ifadelerden  olusur.  liste'deki  her  bir  dizge  veya   ifade,
              yazildiklari siraya gore ekrana yazdirilir. Eger belirtilmediyse
              satir  sonunda  satirsonu  karakteri   yazdirilmaz.   Ifadelerin
              degerleri  bulunduktan  sonra  sonuclari  ekrana  yazdirilir. Bu
              esnada ekrana en son yazdirilan sayinin degeri last  degiskenine
              atanir.  print  deyimi  icindeki  dizgeler ciktiya yazdirilir ve
              ozel anlami olan karakterleri de icerebilirler. Ozel karakterler
              tersbolu  karakteri  ile  baslar.  bc  tarafindan  taninan  ozel
              karakterler; "a" (uyari; bip sesi), "b" (gerisilme),  "f" (sayfa
              ileri),  "n"  (satirsonu), "q" (cift tirnak), "t" (sekme) ve "\"
              (tersbolu)  karakterleridir.  Bunlarin   disindaki   karakterler
              gozardi edilir.

       { deyim_listesi }
              Bu,   bir   birlesik   deyimdir.  Bu  yapi,  birden  cok  deyimi
              gruplandirarak birlikte calistirmak  icin  kullanilir.  Deyimler
              arasinda yukarida anlatilan ayraclar yer alirlar.

       if ( ifade ) deyim1 [ else deyim2 ]
              if  deyimi  ifade'nin degerini bulur ve iifade'nin sonucuna gore
              deyim1'i veya deyim2'yi calistirir.  ifade'nin  sonucu  sifirdan
              farkli  ise  deyim1  isletilir.  Eger  deyim2  belirtilmisse  ve
              ifade'nin sonucu da sifir ise, deyim2  isletilir  (else  sozcugu
              bir genisletmedir).

       while ( ifade ) deyim
              while  deyimi,  ifade'nin degeri sifirdan farkli oldugu muddetce
              deyim'i tekrar  tekrar  isletir.  Dongude  her  yinelemede  once
              ifade'nin  degeri  bulunur,  sonuc  sifirdan  farkli  ise  deyim
              isletilir. ifade'nin sifir olmasi  durumunda  veya  cikmak  icin
              break deyimi kullanildiginda dongu sonlanir.

       for ( [ifade1] ; [ifade2] ; [ifade3] ) deyim
              for  deyimi, deyim'in tekrar tekrar calistirilmasini saglar. Ilk
              basta (yani dongu baslamadan once) ifade1 isletilir. Dongude her
              yinelemede  deyim  isletilmeden  once ifade2'nin degeri bulunur.
              Eger sonuc sifirdan farkli  ise  deyim  yerine  getirilir,  eger
              sonuc  sifir  ise  dongu  sonlandirilir.  Dongude  deyim  yerine
              getirildikten sonra  ifade3  isletilir  ve  ardindan  ifade2'nin
              degeri  tekrar  bulunur.  Ta ki ifade2'nin degeri sifir oluncaya
              kadar... Donguyu  daha  erken  sonlandirmak  icin  break  deyimi
              kullanilabilir.  Eger  ifade1  veya  ifade3  kullanilmamissa, bu
              noktada  degerlendirilecek  hicbir  sey  olmadigindan  bir   sey
              yapilmaz.  Eger  ifade2  kullanilmamissa,  ifade2'nin  degeri  1
              olarak kabul edilir. (POSIX bc'de her uc  ifadeyi  de  belirtmek
              mecburidir.  Bunlarin secimlik kullanilmasi, bir genisletmedir.)
              for deyimine karsilik gelen deyimler sunlardir:

              ifade1;
              while (ifade2) {
                deyim;
                ifade3;
              }
       break  Icinde yer aldigi son while veya for dongusunu sonlandirir.

       continue
              continue deyimi, (bir genisletmedir) icinde yer aldigi  son  for
              dongusunu  kendinden  sonra  gelen deyimler isletilmeden sonraki
              yinelemeden baslatir.

       halt   halt deyimi,  (bir  genisletmedir)  bc'yi  sonladirir.  quit'ten
              farki,  halt  deyimi kesinkes degil, sart saglandiginda calisir.
              Ornegin, "if (0==1) halt" deyimi bc'yi sonladirmaz;  cunku  sart
              saglanmadigi icin halt deyimi isletilmez.

       return Bir  islevden  0 (sifir) dondurerek cikar. (Ayrintili bilgi icin
              I,SLEVLER bolumune bakiniz.)

       return ( ifade )
              Bir islevden ifade'nin  degerini  dondurerek  cikar.  (Ayrintili
              bilgi  icin  I,SLEVLER  bolumune  bakiniz.) Bir genisletme olarak
              parantezler gerekli degildir.

   YARDIMCI DEYIMLER
       Yardimci deyimler, bildigimiz  klasik  anlamda  isletilebilir  deyimler
       degildirler. Bunlar "derleme" zamaninda ele alinirlar.

       limits bc'nin  yerel  surumu tarafindan zorlanan yerel sinirlari basar.
              Bu bir genisletmedir.

       quit   Her nerede ve her ne  sekilde  kullanilirsa  kullanilsin,  bc'yi
              kesinkes  sonlandirir.  Ornegin,  "if  (0==1) quit" deyimi, sart
              saglanmasa da bc'yi sonlandiracaktir.

       warranty
              Uzun bir garanti iletisi basar. Bu bir genisletmedir.

   I,SLEVLER
       Islevler, daha sonra calistirilmak  uzere  hesaplamalarin  tanimlandigi
       bir  yontem  sunar.  bc'deki  islevler  daima bir deger hesaplayip bunu
       cagriciya dondururler. Islev tanimlari  "ozdevimli"dir;  yani,  girdide
       saptanana  kadar  bir islev tanimsizdir. Bu tanimlama, ayni isimde yeni
       bir islev tanimlanincaya kadar gecerlidir. Yeni islev tanimi  eskisinin
       yerine gecer. Bir islev asagidaki gibi tanimlanir.

       define isim ( parametreler ) { satirsonu
             auto_listesi   deyim_listesi }

       Bir islev cagrisi ise "isim(parametreler)" biciminde bir ifadedir.

       Parametreler   sayilar   ya   da   dizilerdir  (dizi  parametreler  bir
       genisletmedir). Islev taniminda sifir ya da daha fazla sayida parametre
       verilebilir  ve  bunlar  aralarina virgul konularak ayrilmis isimlerden
       olusan  bir  liste  olarak  tanimlanir.  Sayilar  sadece   degerleriyle
       cagrilan    parametrelerdir.   Diziler   ise   sadece   degiskenleriyle
       cagrilirlar. Diziler, parametre taniminda "isim[]" seklinde belirtilir.
       Islev  cagrisinda  asil  parametreler,  sayi  turunde ifadelerdir. Ayni
       yazim sekli, dizi parametrelerin tanimi olarak dizilerin aktarilmasinda
       da  kullanilir.  Bir  isimli  dizi  bir isleve degiskeni ile aktarilir.
       Islev tanimlari ozdevimli olduklarindan, parametre  sayisi  ve  turleri
       islev   cagrildiginda   kontrol   edilir.   Parametrelerin   sayisi  ve
       turlerindeki herhangi bir uyumsuzluk bir  calisma  ani  hatasina  sebep
       olur.  Ayrica,  tanimsiz  bir  islevin  cagrilmasi  da  bir calisma ani
       hatasina sebep olacaktir.

       auto_listesi,  "yerel"  kullanim  icin  istege   bagli   bir   degisken
       listesidir.  auto_listesi'nin  (eger  varsa) sozdizimi "auto isim,  ...
       ;" seklindedir (Sondaki noktali virgul istege baglidir). Her  isim  bir
       auto  degiskenin  ismidir. Diziler, parametrelerde kullanilan sozdizimi
       ile  belirtilebilir.  Bu  degiskenlerin  sifir   ile   ilklendirilerek,
       degerleri,  islevin  baslangicinda  yigita  basilir  ve  islevin icrasi
       boyunca kullanilir. Islevden  cikista  bu  degerler  yigittan  cekilir,
       boylece  degiskenler  islevin  baslangicindaki  ilk  degerlerine donmus
       olur. Parametreler gercekte, islev cagrisi sirasinda ilklendirilen auto
       degiskenlerdir.   auto  degiskenler,  geleneksel  yerel  degiskenlerden
       farklidir.  A  islevi,  B  islevini  cagirdiginda,  A  islevinin   auto
       degiskenlerine,    B    islevinde   onlar   auto   degiskenler   olarak
       cagrilmadikca, B islevi ayni isimlerle erisebilir. auto degiskenler  ve
       parametreler   yigita   basildiklarindan  dolayi  bc  kendini  cagrilan
       islevleri destekler.

       Islevin govdesi bir  bc  deyimleri  listesidir.  Tekrar  belitelim  ki,
       deyimler  noktali  virgul  ve satirsonu karakterleri ile birbirlerinden
       ayrilir. return deyimi islevin  sonlandirilmasina  sebep  olur  ve  bir
       deger  dondurur.  return  deyiminin  iki  surumu  vardir.  ilk seklinde
       "return" ifadesi islevi cagiran ifadeye sifir degerini dondurur. Ikinci
       seklinde,  "return  (  ifade  )",  ifade'nin  degeri hesaplanip cagiran
       ifadeye  sonucu  dondurulur.  Her  islevin  sonunda  kendiliginden  bir
       return(0)  vardir. Boylece bir islevin sonunda acikca bir return deyimi
       kullanmaya gerek kalmaksizin islev sifir degeri dondurerek sonlanir.

       Islevler ayrica, ibase degiskeninin kullanimini  da  degistirir.  Islev
       govdesindeki  tum  sabitler, islev cagrisi sirasinda ibase degiskeninin
       degeri  kullanilarak  donusturulur.  Sayilarin  donusumu   icin   daima
       ibase'in  o  anki degerini kullanan yerlesik read islevi disinda, islev
       icrasi sirasinda ibase degisiklikleri gozardi edilecektir.

       Bir gelistirme olarak, tanim bicimi pek az  esnektir.  Standart,  islev
       govdesini  olusturan  ilk  kuyruklu  ayracin  define  ile  ayni satirda
       olmasini ve kalan her seyin alt satirlarda olmasini gerektirir.  bc'nin
       bu  surumunde  ilk  kasli  ayracin oncesinde ya da sonrasinda satirsonu
       karakteri  kullanabilmeyi  mumkun  kilar.  Ornegin  asagidaki  tanimlar
       gecerli tanimlardir:

       define d (n) { return (2*n); }
       define d (n)
         { return (2*n); }

   MATH K"UT"UPHANESI
       bc,  -l  secenegi  ile  calistirildiginda  math kutuphanesini yukler ve
       ontanimli boluntu  20  yapilir.  math  islvleri,  cagrildiklari  sirada
       gecerli   olan  boluntuye  gore  sonuc  dondururler.  math  kutuphanesi
       asagidaki islevleri tanimlar:

       s (x)  Radyan cinsinden verilen x'in sinusu.

       c (x)  Radyan cinsinden verilen x'in kosinusu.

       a (x)  x'in arktanjanti; radyan cinsinden doner.

       l (x)  x'in tabii logaritmasi.

       e (x)  e ussu x.

       j (n,x)
              x tamsayisina gore n. dereceden Bessel islevi.

   "ORNEKLER
       /bin/sh'da asagidaki atama, kabul degiskeni pi'ye pi degerini atar.

       pi=$(echo "scale=10; 4*a(1)" | bc -l)

       Asagidaki ornekte, math kutuphanesinde kullanilan ustel islevin  tanimi
       vardir. Bu islev POSIX bc'de yazilmistir.

       scale = 20

       /* e^x = (e^(x/2))^2 formulu kullaniliyor
         x yeterinde kucukse, bu seriyi kullanabiliriz:
           e^x = 1 + x + x^2/2! + x^3/3! + ...
       */

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

         /* x'in isaretine bakalim. */
         if (x<0) {
           m = 1
           x = -x
         }

         /* x icin onkosul. */
         z = scale;
         scale = 4 + z + .44*x;
         while (x > 1) {
           f += 1;
           x /= 2;
         }

         /* Degiskenleri ilklendirelim. */
         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
         }
       }

       Asagidaki  ornekte,  cek  defteri  (checkbook)  bakiyelerini hesaplayan
       basit bir yazilim verilmektedir. Yazilimi bir kez yazarak  bir  dosyaya
       kaydedebilirsiniz   ve  sonralari  her  seferinde  yeniden  yazmaksizin
       istediginiz zaman kullanabilirsiniz.

       scale=2
       print "\nCek defteri yazilimi!\n"
       print "  Hatirlatma: Depozitolar negatif miktarlardir.\n"
       print "  Cikis icin 0 yazin.\n\n"

       print "Baslangictaki bakiye? "; bal = read()
       bal /= 1
       print "\n"
       while (1) {
         "su anki bakiye = "; bal
         "cekilecek miktar? "; trans = read()
         if (trans == 0) break;
         bal -= trans
         bal /= 1
       }
       quit

       Asagidaki ornekte ise, kendi kendini cagiran bir  faktoriyel  hesaplama
       islevi tanimlanmaktadir.

       define f (x) {
         if (x <= 1) return (1);
         return (f(x-1) * x);
       }

   READLINE ve LIBEDIT SE,CENEKLERI
       GNU  bc  (bir yapilandirma secenegi ile), GNU readline kutuphanesini ya
       da BSD libedit kutuphanesini kullanacak sekilde  derlenebilir.  Bu  ise
       kullaniciya, bc'ye gondermeden once birden cok satir uzerinde duzenleme
       yapma imkani sunar. Ayrica, daha  onceden  girilen  satirlar  icin  bir
       gecmis de tutar. Bu secenek secilirse, bc bir ozel degiskene daha sahip
       olur. Bu ozel history  degiskeni,  bellekte  tutulacak  satir  sayisini
       tutar.  -1  degeri sinirsiz (bellek yettigi muddetce) sayida eski komut
       tutulacagini belirtir ve varsayilan degeri 100'dur.  Eger  pozitif  bir
       tamsayi  belirtilirse,  liste  bu  belirtilen sayi ile sinirlandirilmis
       olur. 0 degeri ise liste tutulmayacagini belirtir.

       Daha ayrintili bilgi icin, GNU readline, history  kutuphanesi  ile  BSD
       libedit  kutuphanesi  hakkindaki  belgeleri  okuyunuz. bc,  readline ve
       libedit kutuphaneleri ayni anda etkin olacak sekilde derlenemez.

   FARKLILIKLAR
       bc'nin  bu  surumu,  POSIX  P1003.2/D11  taslagindan  uyarlanmistir  ve
       taslaga   gore   ve   geleneksel   bc  uygulamalarina  gore  bir  takim
       farkliliklar    sozkonusudur.    dc(1)kullanilan    geleneksel    yolla
       gerceklestirilmemistir. Bu surum, yazilimin kodlarini ayristirarak bayt
       koda  cevirdikten  sonra  tek  bir  surec   olarak  calistirir.   Komut
       satirindan  verilen  ve  belgelendirilmemis  -c  secenegi  ile, yazilim
       calistirilmaz, onun yerinee bayt kodlari ekrana listelenir. Bu, aslinda
       etkilesimli  olarak  ayristiricinin  hatalarini gormek/gidermek ve math
       kutuphanesini hazirlamak icin kullanilir.

       POSIX  bc'deki  farkliliklarin   yaninda   bir   de   yeni   ozellikler
       eklenmistir,  bunlara  da genisletmeler demekteyiz. Asagida, bahsedilen
       farkliliklarin ve genisletmelerin bir listesi yer almaktadir:

       LANG   Bu  surum  LANG  ve  LC_  ile   baslayan  ortam  degiskenlerinin
              islenmesinde POSIX standardina uyumlu degildir.

       isimler
              Geleneksel  ve  POSIX  bc  degiskenler, diziler ve islevler icin
              sadece tek harften olusan isimleri mumkun kilar.  GNU  bc'de  bu
              isimler icin cok karakterli isimler kullanilabilir. Bir isim bir
              harf ile baslar ve harfler, rakamlar  ile  altcizgi  karakterini
              icerebilir.

       dizgeler
              Dizgelerde  bos  karakter  kullanilmasina izin verilmez, POSIX'e
              gore dizgelerde tum karakterler kullanilabilmelidir.

       last   POSIX   bc'de   bir   last   degiskeni   yoktur.   bc'nin   bazi
              gerceklemelerinde bunun yerine nokta (.) kullanilir.

       karsilastirmalar
              POSIX  bc'de  karsilastirmalar  sadece if, while deyimlerinde ve
              for  deyiminin  ikinci  ifadesinde  kullanilabilir.  Ayrica   bu
              deyimlerde sadece bir iliskisel isleme izin verilir.

       if deyimi ve else sozcugu
              POSIX bc'de else sozcugu yoktur.

       for deyimi
              POSIX bc'de tum ifadelerin deyim icinde kullanilmasi gereklidir.

       &&, ||, !
              POSIX bc'de mantiksal islecler yoktur.

       read islevi
              POSIX bc'de read islevi yoktur.

       print deyimi
              POSIX bc'de print deyimi yoktur.

       continue deyimi
              POSIX bc'de continue deyimi yoktur.

       return deyimi
              POSIX   bc,   return   ifadesinin   parantez   icine  alinmasini
              gerektirir.

       dizi parametreler
              POSIX    bc'de    (simdilik)    dizi    parametreler     tamamen
              desteklenmemektedir.   POSIX  sozdiziminde,  islev  tanimlarinda
              dizilere izin veriliyor, ancak bir dizinin bir isleve  parametre
              olarak aktarilmasi desteklenmiyor. (Bu, aslinda gozden kacan bir
              dikkatsizligin   sonucudur.)   Geleneksel   bc   gerceklemeleri,
              dizileri       sadece      elemanlarinin      degerleri      ile
              cagirabilmektedirler.

       islev bicimi
              POSIX bc ilk kasli ayracin define anahtar  sozcugunun  bulundugu
              satirda,  auto  anahtar  sozcugunun  de  alt  satirinda olmasini
              gerektirir.

       =+, =-, =*, =/, =%, =^
              POSIX  bc  bu  "eski  tarz"  atama  isleclerinin  tanimlanmasini
              gerektirmez.  Bu  surum bu "eski tarz" atamalara izin verebilir.
              limits  deyimini  kullanarak   kurulu   surumun   bu   atamalari
              desekleyip      desteklemedigini      ogrenebilirsiniz.     Eger
              destekliyorsa, "a =- 1" atamasinda a degiskenine -1 atanmayacak,
              a degiskeninin degeri bir eksiltilecektir.

       sayilardaki bosluklar
              bc'nin  diger  gerceklemeleri  sayilarin  icinde bosluklara izin
              verir. "x=1  3"  atamasi,  "x=13"  olarak  degerlendirilecektir.
              Ayni ifade bu surumde bir sozdizimi hatasina sebep olacaktir.

       calistirma ve hatalar
              Bu  bc,  yazilim icerinde sozdizimi ve diger hatalarin bulunmasi
              durumunda kodun isletilmesi konusunda diger gerceklemelere  gore
              oldukca  farkliliklar  icermektedir.  Eger bir islev tanimlarken
              bir  sozdizimi  hatasi  yapilmissa,  hata  duzeltme  mekanizmasi
              deyimin baslangicini bulmaya calisir, ilk hatali satiri bulur ve
              satir numarasini ekrana yazar; sonra yine de islevin geri  kalan
              kisimlarini  ayristirmaya  devam  eder. Islev icinde birkez bile
              hata yapilmissa, o  islev  'cagrilamaz'  addedilir  ve  tanimsiz
              olur.

              Etkilesimli  ortamda  calisirken bir sozdizimi hatasi yapilirsa,
              bir uyari gelir ve calistirilacak  olan  o  anki  blok  gecersiz
              sayilir. Isletim blogu, yazilisi tamamlanmis basit veya birlesik
              bir deyimden sonra satirsonu karakteri bulunan yapidir. Ornegin,

              a = 1
              b = 2
              iki ayri isletim blogudur. Ancak,

              { a = 1
                b = 2 }
              tek isletim blogudur. Olusan herhangi  bir  calisma  ani  hatasi
              (error),  o  anki  isletim  blogunu  sonlandirir.  Ancak, olusan
              herhangi bir  calisma  ani  uyarisi  (warning)  isletim  blogunu
              sonlandirmaz.

       kesmeler
              Bir  etkilesimli  oturumda,  SIGINT  sinyali  (genelde klavyeden
              Ctrl-C'ye  basildiginda  uretilir)   o  anda  isletilmekte  olan
              blogun  yarida  kesilmesine  neden  olur.  Hangi  islevin yarida
              kesildigini belirten bir calisma ani hatasi  ekrana  yazdirilir.
              Ardindan,   tum   calisma   ani   yapilarinin  "temizlenme"sinin
              ardindan, bc'nin yeni girdiler almak icin hazir  oldugunu  yazan
              bir  mesaj  belirir.  Onceden  tanimlanmis  olan tum islevler ve
              auto-olmayan degiskenler bu noktadan onceki  degerleriyle  aynen
              kalirlar.   Tum  auto  degiskenler  ve  islev  parametreleri  bu
              "temizleme" islemi esnasinda silinirler. Etkilesimli olmayan bir
              oturumda  ise  SIGINT  sinyali,bc'nin  calismasini sonlandirarak
              kontrolu sisteme devredecektir.

   SINIRLAR
       Asagida  bc'nin  islem  yapabilecegi  sinirlar  verilmistir.  Bunlardan
       bazilari  aslinda her bir kurulum icin farkli farkli olabilir. Bunlarin
       gecerli degerlerini ogrenmek icin limits deyimini kullanin.

       BC_BASE_MAX
              Azami cikti tabani, 999 dur. Azami girdi tabani ise 16 dir.

       BC_DIM_MAX
              Dizilerde  indisleme   siniri,   keyfi   olarak   65535   olarak
              belirlenmistir. Kurulumunuzda farkli olabilir.

       BC_SCALE_MAX
              Sayilarda  ondalik  noktadan  sonraki  hane  sayisi  INT_MAX ile
              sinirlanmistir. Ayrica ondalik noktadan onceki  hane  sayisi  da
              INT_MAX ile sinirlanmistir.

       BC_STRING_MAX
              Dizgelerin    icerebilecegi    karakter   sayisi   INT_MAX   ile
              sinirlanmistir.

       us     Ustel degerlerde ussun siniri LONG_MAX'tir.

       degisken isimleri
              Basit degisken, dizi ve islev isimlerinin her  biri  icin  essiz
              isim sayisi 32767 ile sinirlanmistir.

ORTAM DEGI,SKENLERI

       bc tarafindan taninan ortam degiskenleri sunlardir:

       POSIXLY_CORRECT
              -s secenegi ile aynidir.

       BC_ENV_ARGS
              Bu,   bc'nin   argumanlari   almak  icin  kullandigi  diger  bir
              mekanizmadir. Bicimi komut satiri argumanlarinda oldugu gibidir.
              Bu  argumanlar,  belirtilen dosyalardan once islem gorurler. Bu,
              kullaniciya  "standart"  secenekleri  ayarlama  imkanini  sunar.
              Ortam degiskenlerinde belirtilen dosyalar tipik olarak iclerinde
              kullanicinin tanimladigi islevler olan dosyalardir. Bu  ayarlama
              ile  artik,  bc her calistirildiginda belirtilen dosyalar isleme
              sokulurlar.

       BC_LINE_LENGTH
              Bu,  sayilar  ekrana  yazdirilirken  bir  satirda  kac  karakter
              olacagini  belirten  bir  tamsayidir.  Uzun  (yani,  tek  satira
              sigmayan) sayilar icin \ (tersbolu) ve satirsonu karakterleri bu
              miktara dahildir.

HATA AYIKLAMA

       Eger  komut  satirinda  belirtilen  dosyalardan biri acilamazsa bc bunu
       raporlar ve hemen sonlanir. Ayrica, derleme ve calisma-ani  hatalarinda
       bunlar  ekrana  hata numaralari ile birlikte yazdirilirlar ve bu esnada
       aciklayici bilgiler verilir.

YAZILIM HATALARI

       Hata bulma/duzeltme henuz cok iyi degil.

       Hatalari rapor etmek  icin  konu  alanina  "bc"  yazarak  <bug-bc  (at)
       gnu.org> adresine e-posta atiniz.

YAZAN

       Philip A. Nelson <philnelson (at) acm.org>

TE,SEKK"URLER

       Yazar kodun sinanmasindaki genis yardimlarindan dolayi Steve  Sommars'a
       <Steve.Sommars (at) att.com> tesekkurlerinin kabulunu rica ediyor.  Bir
       cok oneride bulundu ve onun katilimiyla bu cok daha iyi bir urun oldu.

,CEVIRENLER

       Adem Gunes  <adem (at) alaeddin.cc.selcuk.edu.tr>, Eylul 1999, v1.04
       Nilgun Belma Buguner  <nilgun (at) belgeler.gen.tr>, Ocak 2004, v1.06

bc v1.06                         12 Eylul 2000                           bc(1)