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

İSİM

       bc - Keyfî duyarlılıkta hesaplama dili

KULLANIM

       bc [ -hlwsqv ] [ uzun-seçenekler ] [ dosya ... ]

SÜRÜM

       Bu kullanım kılavuzu, GNU bc sürüm 1.06'ya göre hazırlanmıştır.

AÇIKLAMA

       bc,  girilen  deyimleri  işleterek  keyfi  uzunlukta  ve  duyarlılıktaki  sayılar üzerinde
       matematiksel işlemler  yapmaya  imkan  sağlayan  etkileşimli  bir  ortam  ve  bir  yazılım
       geliştirme  dilidir.  Sözdizimi açısından C yazılım geliştirme dilini andıran benzerlikler
       sözkonusudur. Komut satırından belirtmek suretiyle kullanabileceğimiz  standart  bir  math
       kütüphanesine de sahiptir. Eğer gerekli ise; math kütüphanesi, belirtilen dosyalardan daha
       önce ele alınır. bc işleme tabi tutarken dosyaları komut satırında belirtilen sıraya  göre
       ele  alır.  Belirtilen  dosyaların  tümü  ele  alınıp işlendikten sonra, standart girdiden
       girişler okunmaya başlar. Kodlar nasıl okunuyorlarsa  bu  halleriyle  işletilirler.  (Eğer
       belirtilen  dosyalardan  herhangi  birinde  bc'yi  sonlandıracak  bir komut yer alırsa, bc
       sonlanır, bir daha standart girdiden okuyamaz.)

       bc'nin bu sürümü, geleneksel bc uygulamalarına ve  POSIX  taslak  standardına  göre  ilave
       oluşumlar  içermektedir.  Komut  satırından  belirtilecek  bir  seçenekle bu genişletmeler
       kullanıma dahil edilebilir veya edilmeyebilir. Bu  kılavuzda  GNU  bc  anlatılacak  ve  ek
       oluşumlar yeri gelince belirtilecektir.

   SEÇENEKLER
       -h, --help
              Bir kullanım iletisi basar ve çıkar.

       -i, --interactive
              Etkileşimli kipe geçilir.

       -l, --mathlib
              Standart math kütüphanesini kullanıma sokar.

       -w, --warn
              POSIX bc'ye ek oluşumlar için uyarılar verir.

       -s, --standard
              Standart POSIX bc diline uygun olarak işlem yapar.

       -q, --quiet
              Normalde gelen, GNU bc hoşgeldiniz iletisini görüntülemez.

       -v, --version
              Sürüm ve telif hakkı bilgilerini gösterir ve çıkar.

   SAYILAR
       bc'deki en temel eleman sayılardır. Sayılar keyfi duyarlılıkta ifade edilirler. Yani bc'de
       bir sayı, tamsayı kısım ve ondalık kısım olarak ifade  edilir.  Tüm  sayılar  normalde  iç
       hesaplamalarda  onluk  tabanda  ele  alınırlar  ve  tüm  işlemler  onluk  taban  üzerinden
       gerçekleştirilirler. (Bu sürüm, bölme ve çarpma işlemlerinde sayıların ondalık kısımlarını
       belli  uzunluktan  sonra  kesmektedir.)  bc'de  sayıların  iki özelliği vardır: uzunluk ve
       bölüntü. Uzunluk, sayıdaki tüm anlamlı rakamların, bölüntü ise  ondalık  noktadan  sonraki
       rakamların adedidir.

       Örneğin:

       0.0000010 sayısının uzunluğu 7 ve bölüntüsü 6'dır.
       01935.000 sayısının uzunluğu 7 ve bölüntüsü 3'tür.

       Uzunluk açısından; en sağdaki sıfır anlamlı, en soldaki sıfır anlamsızdır.

   DEĞİŞKENLER
       Sayılar  iki  farklı  türde değişken olarak saklanabilirler: basit değişkenler ve diziler.
       Her iki değişken türü için de  değişkenlere  birer  ad  verilir.  Değişkenler  bir  harfle
       başlarlar ve sonrasında harfler, rakamlar ve altçizgi karakteri içerebilirler. Tüm harfler
       küçük harf olmak zorundadır. (Değişkenlere uzun isim verebilme bir  genişletmedir.  Çünkü,
       POSIX  bc'de değişken isimleri tek bir küçük harftir.) Dizi değişkenleri ise isimden sonra
       [] (köşeli parantezler) alırlar.

       bc'de dört tane özel değişken vardır. Bunlar; scale,  ibase,  obase  ve  last'dır.  scale,
       işlemlerde  sayılarda  ondalık  noktadan  sonra kaç tane rakamın kullanılacağını belirtir.
       Öntanımlı scale değeri 0'dır. ibase (input base)  ve  obase  (output  base)  değişkenleri,
       sayılarda  girdi  ve  çıktı  için  tabanları belirtir. Örneğin, ibase=10 ve obase=2 olursa
       sayılar onluk tabanda girilir ve sonuçlar ekrana ikilik tabanda  yazdırılırlar.  Öntanımlı
       ibase  ve obase değerleri 10'dur. last değişkeni (bu bir genişletmedir) ise, en son ekrana
       yazdırılan sayıyı içeren bir değişkendir. Bu değişkenlere yeni değerler atanabilir. Bunlar
       ileride daha ayrıntılı olarak ele alınacaktır.

   AÇIKLAMALAR
       bc'de  açıklama  satırları  /*  karakterleri  ile  başlar  ve  */  karakterleri ile biter.
       Açıklamalar herhangi bir yerde başlayabilir ve girdide tek bir  boşluk  gibi  ele  alınır.
       (Yani,  bu  da  açıklamaların  girdi  elemanları  arasında bir ayraç olarak yorumlandığını
       gösterir. Dolayısıyla, bir değişken ismi içerisinde  açıklama  yer  alamaz  anlamındadır.)
       Açıklamalar satırsonu karakteri içerebilirler.

       Ayrıca   bc'de   betiklerin   kullanılmasını   sağlamak   için  tek  satırlık  açıklamalar
       desteklenmektedir ve bu bir genişletmedir. Tek satırlık  açıklama  #  karakterinden  sonra
       başlar  ve satır sonuna kadar devam eder. Satırsonu karakteri açıklamaya dahil değildir ve
       normal karakter olarak ele alınır.

   İFADELER
       Sayılar, ifadelerle ve deyimlerle birlikte kullanılırlar. Bu dil, etkileşimli bir  çalışma
       ortamı   olarak   tasarlandığı   için   deyimler   ve   ifadeler   de  etkileşimli  olarak
       işletilebilirler. bc'de bir 'main' işlevi kavramı yoktur. Bunun yerine kod, olduğu haliyle
       hemen  yorumlanarak işletilir. (İşlevler, önce tanımlanırlar ve sonradan kullanılabilirler
       -ileride ele alınacaklar-).

       En basit ifade bir 'sabit'tir. bc, ibase değişkeniyle belirtilen  o  anki  girdi  tabanını
       kullanarak  sayıyı dahili onluk tabana çevirir. (Ancak, işlevler için bir istisna vardır.)
       ibase değişkeninin geçerli değerleri 2'den 16'ya kadardır. Bu  aralığın  dışında  değerler
       atanırsa  kendiliğinden  2 veya 16 olarak yeniden ayarlanır. Sayılar girilirken, 0-9 arası
       rakamlar ve A-F arası harfler ile kullanılabilir. (Not: A-F büyük harf  olmalıdır.  Çünkü,
       küçük  harfler  değişkenler  için  kullanılıyorlar.)  Tek rakamlı sayılar, ibase ne olursa
       olsun, her zaman rakamın ifade ettiği değere sahip olurlar (örn, A=10)).  bc  çok  rakamlı
       sayılarda,  ibase  değerine  eşit  veya  daha büyük rakamları derhal ibase-1 tabanında ele
       alarak sayının değerini hesaplar. Bu FFF sayısını daima,  girdi  tabanındaki  en  büyük  3
       haneli sayı yapar.

       İfadeler, diğer yüksek-düzeyli dillerdekilere oldukça benzerler. bc'de sayılar için farklı
       türler olmadığı için karışık türler için kurallar yoktur. Bunun yerine, sadece  ifadelerin
       bölüntüleri  üzerine  kurallar  vardır.  Her  ifadenin  bir bölüntüsü vardır. Bu, orijinal
       sayıların bölüntülerinden, gerçekleştirilen işlemden ve çoğu durumda da scale değişkeninin
       değerinden  elde  edilir.  scale  değişkeninin  alabileceği değerler, 0 (sıfır) ile C'deki
       tamsayı türü ile ifade edilebilen tamsayı aralığındadır.

       Aşağıdaki geçerli ifadelerin açıklamalarında "ifade" komple bir ifadeyi ve "değişken"  ise
       sıradan bir değişkeni veya bir dizi değişkenini göstermektedir. Bir basit değişken

       isim

       şeklinde ve bir dizi değişkeni ise aşağıdaki gibi belirtilir:

       isim[ifade]

       Özel olarak söz edilmediyse sonucun bölüntüsü, ilgili ifadelerin azami bölüntüsü olur.

       -ifade Sonuç, ifade'nin negatifi olur.

       ++değişken
              değişken'in değerine önce 'bir' eklenir ve yeni değer ifadenin sonucu olur.

       --değişken
              değişken'in değeri önce 'bir' eksiltilir ve yeni değer ifadenin sonucu olur.

       değişken++
              İfadenin sonucu değişkenin değerine göre hesaplanır, sonra değişken'in değeri 'bir'
              artırılır.

       değişken--
              İfadenin sonucu değişkenin değerine göre hesaplanır, sonra değişken'in değeri 'bir'
              eksiltilir.

       ifade + ifade
              Sonuç, iki ifade'nin toplamıdır.

       ifade - ifade
              Sonuç, iki ifade'nin farkıdır.

       ifade * ifade
              Sonuç, iki ifade'nin çarpımıdır.

       ifade / ifade
              Sonuç, iki ifade'nin bölümüdür. Sonucun bölüntüsü scale değişkeninin değeridir.

       ifade % ifade
              Sonuç,  "kalan"ı  verir  ve şu şekilde hesaplanır. a%b'yi hesaplarken, ilk önce a/b
              scale haneli olarak hesaplanır. scale+scale(b) ve scale(a)'dan hangisi daha büyükse
              bu  bölüntüye göre a-(a/b)*b ifadesi  sonucu hesaplamak için kullanılır. Eğer scale
              0'a eşitlenirse ve her iki ifade de tamsayı ise, bu ifade tamsayı kalan işlevidir.

       ifade ^ ifade
              İfadenin sonucu,  birincinin  ikinciye  göre  üssüdür.  İkinci  ifade  bir  tamsayı
              olmalıdır. (Eğer ikinci ifade tamsayı değilse, önce ekrana bir uyarı gelir ve ifade
              tamsayı olacak şekilde kesilir, yani ikinci ifadenin  tam  kısmı  alınır).  Sonucun
              bölüntüsü  ise,  eğer  üs  negatif  ise  scale'dir.  Üs  pozitif  ise  scale(a^b) =
              min(scale(a)*b, max(scale, scale(a)))'dır. Unutulmamalıdır  ki  ifade^0  ifadesinin
              sonucu her zaman "1" olur.

       ( ifade )
              Parantezler,  ifadenin  değeri  bulunurken standart önceliği değiştirir ve parantez
              içine alınan ifade daha önce hesaplanır.

       değişken = ifade
              İfadenin sonucu değişkene atanır.

       değişken <işleç>= ifade
              Bu,  "değişken  =  değişken  <işleç>  ifade"  ile  eşdeğerdir  ancak  bir   farkla;
              değişken'in değeri sadece bir kere elde edilir. Eğer değişken bir dizi ise, işlemin
              bir kere yapılacağı gözden uzak tutulmamalıdır.

       İlişkisel ifadeler (karşılaştırma ifadeleri), sonuçları her  zaman  0  veya  1  olan  özel
       ifadelerdir.  0,  yanlış (false) ve 1, doğru (true) olarak yorumlanır. Bunlar herhangi bir
       ifade içerisinde yer alabilirler. (POSIX bc'de ise ilişkisel ifadeler sadece if, while  ve
       for  deyimlerinde  kullanılabilir ve sadece bir tane ilişkisel sınama olabilir.) İlişkisel
       işleçler şunlardır:

       ifade1 < ifade2
              Sonuç, eğer ifade1, ifade2'den küçükse 1 olur. Aksi halde 0 olur.

       ifade1 <= ifade2
              Sonuç, eğer ifade1, ifade2'den küçük ya da eşitse 1 olur. Aksi halde 0 olur.

       ifade1 > ifade2
              Sonuç, eğer ifade1, ifade2'den büyükse 1 olur. Aksi halde 0 olur.

       ifade1 >= ifade2
              Sonuç, eğer ifade1, ifade2'den büyük ya da eşitse 1 olur. Aksi halde 0 olur.

       ifade1 == ifade2
              Sonuç, eğer ifade1, ifade2'ye eşitse 1 olur. Aksi halde 0 olur.

       ifade1 == ifade2
              Sonuç, eğer ifade1, ifade2'den farklıysa 1 olur. Aksi halde 0 olur.

       bc'de  mantıksal  (boolean)  işlemler  de  geçerlidir.  (POSIX  bc'de  mantıksal  işlemler
       yoktur.)  Mantıksal  işlemlerin sonucu, ilişkisel işlemlerde olduğu gibi, 0 (false) yada 1
       (true) olmaktadır. Mantıksal işleçler şunlardır:

       !ifade ifade 0 ise sonuç 1'dir. Aksi halde 0 olur.

       ifade && ifade
              ifade'lerin ikiside sıfırdan farklıysa sonuç 1'dir. Aksi halde 0 olur.

       ifade || ifade
              ifade'lerden biri sıfırdan farklıysa sonuç 1'dir. Aksi halde 0 olur.

       İşleçlerin işlem öncelik sırası şöyledir (küçükten büyüğe):

       || işleci, önce sol taraf
       && işleci, önce sol taraf
       ! işleci, tarafsız
       İlişkisel işleçler, önce sol taraf
       Atama işleci, önce sağ taraf
       + and - işleci, önce sol taraf
       *, / ve % işleci, önce sol taraf
       ^ işleci, önce sağ taraf
       tek terimli - işleci
       ++ ve -- işleci

       Bu önceliğin seçilmesinin nedeni, POSIX uyumlu bc yazılımlarının doğru çalışması  içindir.
       Ancak,  ilişkisel  ve mantıksal işleçler, atama ifadelerinde kullanıldığında elverişsiz ve
       çok farklı bir durum ortaya çıkmaktadır. Aşağıdaki ifadeyi ele alalım:

       a = 3 < 5

       C programcıları bu ifadeyi ele alırken, önce 3<5  (sonuç 1'dir) ifadesini  gerçekleştirir,
       ardından  sonucu  "a" değişkenine atarlar. bc'de ise önce "a"ya 3 atanır ve ardından 5 ile
       karşılaştırma yapılır. Buna  dikkat  etmek  gerekir.  En  iyisi,  ilişkisel  ve  mantıksal
       işleçler ile atama işleci aynı ifadede kullanıldığında karmaşayı önlemek için parantezleri
       kullanmaktır.

       bc'de desteklenen biraz daha özel ifadeler vardır. Bunlar, standart işlevler ve  kullanıcı
       tanımlı  işlevlerde,  "isim(parametreler)" şeklinde görülmektedirler. Ayrıntılı bilgi için
       İŞLEVLER bölümündeki kullanıcı tanımlı işlevlere bakınız. Yerleşik işlevler şunlardır:

       length ( ifade )
              length işlevinin değeri, ifade'deki anlamlı rakamların adedidir.

       read ( )
              read işlevi (bu bir genişletmedir), nerede kullanıldığına  bakılmaksızın,  standart
              girdiden  bir sayı okumak için kullanılır. Ancak, standart girdiden veri ve yazılım
              birlikte okunurken problemlere neden olabileceğinden  dikkatli  olmak  gerekir.  Bu
              işlevin  en  iyi  kullanım şekli, asla kullanıcıdan kod girmeyi gerektiren yerlerde
              değil, evvelce geliştirilen  bir  yazılım  için  kullanıcıdan  bir  girdi  bekleyen
              yerlerde  kullanmaktır.  read  işlevinin  değeri,  standart girdiden okunan sayının
              ibase tabanındaki değeridir.

       scale ( ifade )
              scale  işlevinin  değeri,  ifade'denin  sonucu  olan  sayıdaki  ondalık   hanelerin
              sayısıdır.

       sqrt ( ifade )
              sqrt işlevinin değeri, ifade'nin kareköküdür. ifade'nin sonucu negatif bir sayı ise
              bir çalışma anı hatası üretilir.

   DEYİMLER
       Deyimler, birçok cebirsel dilde  olduğu  gibi,  ifadelerin  sırayla  değerlendirilmelerini
       sağlarlar.  bc'de  deyimler "mümkün olduğunca" işletilirler. İşletim, bir ya da daha fazla
       tam deyimden sonra bir satırsonu karakteri girildiğinde  gerçekleşir.  Bu  bakımdan  bc'de
       satırsonu  karakterleri  çok  önemlidir.  Aslında,  deyimleri  ayırmak  için bir satırsonu
       karakteri ve bir noktalı virgül gerekir. Yanlış yerde kullanılmış bir satırsonu  karakteri
       bir  sözdizimi  hatasına  sebep  olur.  Satır  sonu  karakteri  deyimler  için  bir  ayraç
       olduğundan, bir satır sonu karakterini gizlemek için ters bölü  karakteri  kullanılabilir.
       Tersbölü  karakterinden sonra gelen bir satırsonu karakterinden oluşan karakter çiftini bc
       boşluk karakteri olarak değerlendirir. Bir deyim  listesi,  noktalı  virgül  ve  satırsonu
       karakteri  ile  sonlandırımış  deyimlerden  oluşur.  Aşağıdaki listede bc'deki deyimler ve
       bunların ne yaptıkları anlatılmaktadır  (Köşeli  parantezler   ([  ])  arasına  alınanlar,
       deyimin isteğe bağlı kısımlarıdır.):

       ifade  Bu  deyim  iki  şeyden  birini  yapar. Eğer ifade "<değişken> <atama> ..." şeklinde
              başlıyorsa, bunun bir atama deyimi olduğunu kabul eder. Eğer ifade bir atama deyimi
              değil  ise,  ifade'nin  değeri  bulunur  ve  çıktıya  yazdırılır.  Sayının ardından
              satırsonu karakteri yazdırılır. Örneğin, a=1 ifadesi bariz bir atama deyimidir;  ve
              (a=1)  içinde  bir  atama  deyimi  olan  bir ifadedir. Çıktılanan tüm sayılar obase
              değişkeni ile belirtilen  tabanda  yazdırılırlar.  obase  değişkeninin  alabileceği
              değerler  2  ile  BC_BASE_MAX  arasındadır. (Ayrıntılı bilgi için SINIRLAR bölümüne
              bakınız.)

              2 ile 16 arasındaki tabanlar için çıktı bildiğimiz yöntemle yazdırılır. 16'dan daha
              büyük tabanlar için ise, bc her bir haneyi yazdırmak için 10'luk tabanda birden çok
              karakter kullanır ve haneler arasında boşluk bırakır. Her  hane,  obase-1  değerini
              10'luk  düzende  yazmak  için gereken sayı kadar rakamdan oluşur. Örneğin, obase=20
              için 65 sayısı ekrana "03 05"  şeklinde  yazdırılır.  Eğer  obase=101  olsaydı,  25
              sayısı  ekrana  "025"  şeklinde  yazdırılacaktı.  Sayılar  keyfi  duyarlılıkta  ele
              alındıkları için, bazı sayılar ekrana yazdırılırken tek bir satıra sığmayabilirler.
              Bu  uzun  sayılar  yazdırılırken  ekrana satırların sonuna "\" (tersbölü) karakteri
              gelir. Her bir satırda en fazla  70  karakter  yazdırılabilir.  bc'nin  etkileşimli
              doğasından  dolayı  yazılan  en  son değer, özel last değişkeninde saklanır ki aynı
              sayıyı bir daha elde etmek için bir önceki ifade'yi tekrar  yazmaya  gerek  kalmaz.
              last  değişkenine atama yapılması da geçerlidir ve atanan değer son yazılan değerin
              üzerine yazılır. Yeni atanan değer, yeni  bir  değer  yazılana  kadar  ya  da  last
              değişkenine yeni bir atama yapılana kadar geçerli kalır. (Bazı kurulumlar last için
              bir kısaltma olarak bir sayının parçası  olmayan  tek  bir  nokta  (.)  kullanımını
              mümkün kılabilir.)

       dizge  dizge  çıktıya  yazdırılır.  Çift  tırnak  "..."  arasına alınan her şey (satırsonu
              karakteri de dahil) dizge olarak kabul edilir ve ekrana aynen yazdırılırlar.  dizge
              yazdırıldıktan  sonra  satırsonu karakteri yazdırılmaz (yani aşağı satıra geçilmez,
              bu nedenle satırsonu karakteri dizge'nin içine yerleştirilmelidir).

       print liste
              print deyimi (bu bir genişletmedir) çıktıya  birşeyler  yazdırmak  için  kullanılan
              diğer  bir  yöntemdir. liste parametresi zorunludur, aralarına virgül (,) konularak
              dizgelerden  ve  ifadelerden  oluşur.  liste'deki  her  bir   dizge   veya   ifade,
              yazıldıkları  sıraya  göre  ekrana  yazdırılır.  Eğer belirtilmediyse satır sonunda
              satırsonu karakteri yazdırılmaz. İfadelerin değerleri bulunduktan  sonra  sonuçları
              ekrana  yazdırılır.  Bu  esnada  ekrana  en  son  yazdırılan  sayının  değeri  last
              değişkenine atanır. print deyimi  içindeki  dizgeler  çıktıya  yazdırılır  ve  özel
              anlamı  olan karakterleri de içerebilirler. Özel karakterler tersbölü karakteri ile
              başlar. bc  tarafından  tanınan  özel  karakterler;  "a"  (uyarı;  bip  sesi),  "b"
              (gerisilme),  "f" (sayfa ileri), "n" (satırsonu), "q" (çift tırnak), "t" (sekme) ve
              "\" (tersbölü) karakterleridir. Bunların dışındaki karakterler gözardı edilir.

       { deyim_listesi }
              Bu, bir birleşik deyimdir. Bu  yapı,  birden  çok  deyimi  gruplandırarak  birlikte
              çalıştırmak  için  kullanılır.  Deyimler  arasında  yukarıda anlatılan ayraçlar yer
              alırlar.

       if ( ifade ) deyim1 [ else deyim2 ]
              if deyimi ifade'nin değerini  bulur  ve  iifade'nin  sonucuna  göre  deyim1'i  veya
              deyim2'yi  çalıştırır.  ifade'nin sonucu sıfırdan farklı ise deyim1 işletilir. Eğer
              deyim2 belirtilmişse ve ifade'nin sonucu  da  sıfır  ise,  deyim2  işletilir  (else
              sözcüğü bir genişletmedir).

       while ( ifade ) deyim
              while  deyimi,  ifade'nin  değeri  sıfırdan  farklı  olduğu müddetçe deyim'i tekrar
              tekrar işletir.  Döngüde  her  yinelemede  önce  ifade'nin  değeri  bulunur,  sonuç
              sıfırdan  farklı  ise deyim işletilir. ifade'nin sıfır olması durumunda veya çıkmak
              için break deyimi kullanıldığında döngü sonlanır.

       for ( [ifade1] ; [ifade2] ; [ifade3] ) deyim
              for deyimi, deyim'in tekrar tekrar çalıştırılmasını sağlar. İlk başta  (yani  döngü
              başlamadan  önce)  ifade1 işletilir. Döngüde her yinelemede deyim işletilmeden önce
              ifade2'nin değeri bulunur. Eğer sonuç sıfırdan farklı ise deyim  yerine  getirilir,
              eğer  sonuç sıfır ise döngü sonlandırılır. Döngüde deyim yerine getirildikten sonra
              ifade3 işletilir ve ardından ifade2'nin değeri tekrar  bulunur.  Ta  ki  ifade2'nin
              değeri  sıfır  oluncaya  kadar... Döngüyü daha erken sonlandırmak için break deyimi
              kullanılabilir.   Eğer   ifade1   veya   ifade3   kullanılmamışsa,    bu    noktada
              değerlendirilecek   hiçbir   şey   olmadığından   bir  şey  yapılmaz.  Eğer  ifade2
              kullanılmamışsa, ifade2'nin değeri 1 olarak  kabul  edilir.  (POSIX  bc'de  her  üç
              ifadeyi    de   belirtmek   mecburidir.   Bunların   seçimlik   kullanılması,   bir
              genişletmedir.) for deyimine karşılık gelen deyimler şunlardır:

              ifade1;
              while (ifade2) {
                deyim;
                ifade3;
              }
       break  İçinde yer aldığı son while veya for döngüsünü sonlandırır.

       continue
              continue deyimi, (bir genişletmedir) içinde yer aldığı son for döngüsünü  kendinden
              sonra gelen deyimler işletilmeden sonraki yinelemeden başlatır.

       halt   halt  deyimi,  (bir  genişletmedir)  bc'yi  sonladırır. quit'ten farkı, halt deyimi
              kesinkes değil, şart sağlandığında çalışır. Örneğin, "if (0==1) halt" deyimi  bc'yi
              sonladırmaz; çünkü şart sağlanmadığı için halt deyimi işletilmez.

       return Bir  işlevden  0  (sıfır) döndürerek çıkar. (Ayrıntılı bilgi için İŞLEVLER bölümüne
              bakınız.)

       return ( ifade )
              Bir işlevden ifade'nin değerini döndürerek çıkar. (Ayrıntılı  bilgi  için  İŞLEVLER
              bölümüne bakınız.) Bir genişletme olarak parantezler gerekli değildir.

   YARDIMCI DEYİMLER
       Yardımcı  deyimler,  bildiğimiz  klasik anlamda işletilebilir deyimler değildirler. Bunlar
       "derleme" zamanında ele alınırlar.

       limits bc'nin  yerel  sürümü  tarafından  zorlanan   yerel   sınırları   basar.   Bu   bir
              genişletmedir.

       quit   Her  nerede ve her ne şekilde kullanılırsa kullanılsın, bc'yi kesinkes sonlandırır.
              Örneğin, "if (0==1) quit" deyimi, şart sağlanmasa da bc'yi sonlandıracaktır.

       warranty
              Uzun bir garanti iletisi basar. Bu bir genişletmedir.

   İŞLEVLER
       İşlevler, daha sonra çalıştırılmak üzere hesaplamaların  tanımlandığı  bir  yöntem  sunar.
       bc'deki  işlevler  daima  bir değer hesaplayıp bunu çağrıcıya döndürürler. İşlev tanımları
       "özdevimli"dir; yani, girdide saptanana kadar bir işlev tanımsızdır.  Bu  tanımlama,  aynı
       isimde  yeni bir işlev tanımlanıncaya kadar geçerlidir. Yeni işlev tanımı eskisinin yerine
       geçer. Bir işlev aşağıdaki gibi tanımlanır.

       define isim ( parametreler ) { satırsonu
             auto_listesi   deyim_listesi }

       Bir işlev çağrısı ise "isim(parametreler)" biçiminde bir ifadedir.

       Parametreler sayılar  ya  da  dizilerdir  (dizi  parametreler  bir  genişletmedir).  İşlev
       tanımında  sıfır  ya da daha fazla sayıda parametre verilebilir ve bunlar aralarına virgül
       konularak  ayrılmış  isimlerden  oluşan  bir  liste  olarak  tanımlanır.  Sayılar   sadece
       değerleriyle  çağrılan  parametrelerdir.  Diziler  ise sadece değişkenleriyle çağrılırlar.
       Diziler,  parametre  tanımında  "isim[]"  şeklinde  belirtilir.  İşlev   çağrısında   asıl
       parametreler,  sayı  türünde  ifadelerdir.  Aynı  yazım  şekli, dizi parametrelerin tanımı
       olarak dizilerin aktarılmasında da kullanılır. Bir isimli dizi bir  işleve  değişkeni  ile
       aktarılır.  İşlev  tanımları  özdevimli  olduklarından,  parametre sayısı ve türleri işlev
       çağrıldığında  kontrol  edilir.  Parametrelerin  sayısı  ve  türlerindeki   herhangi   bir
       uyumsuzluk bir çalışma anı hatasına sebep olur. Ayrıca, tanımsız bir işlevin çağrılması da
       bir çalışma anı hatasına sebep olacaktır.

       auto_listesi, "yerel" kullanım için isteğe bağlı bir değişken listesidir. auto_listesi'nin
       (eğer  varsa)  sözdizimi  "auto  isim,  ...  ;" şeklindedir (Sondaki noktalı virgül isteğe
       bağlıdır). Her isim  bir  auto  değişkenin  ismidir.  Diziler,  parametrelerde  kullanılan
       sözdizimi  ile  belirtilebilir.  Bu  değişkenlerin  sıfır  ile ilklendirilerek, değerleri,
       işlevin başlangıcında yığıta  basılır  ve  işlevin  icrası  boyunca  kullanılır.  İşlevden
       çıkışta  bu  değerler  yığıttan  çekilir,  böylece değişkenler işlevin başlangıcındaki ilk
       değerlerine dönmüş olur. Parametreler gerçekte, işlev çağrısı sırasında ilklendirilen auto
       değişkenlerdir.  auto  değişkenler, geleneksel yerel değişkenlerden farklıdır. A işlevi, B
       işlevini çağırdığında, A işlevinin auto değişkenlerine, B işlevinde onlar auto değişkenler
       olarak çağrılmadıkça, B işlevi aynı isimlerle erişebilir. auto değişkenler ve parametreler
       yığıta basıldıklarından dolayı bc kendini çağrılan işlevleri destekler.

       İşlevin gövdesi bir bc deyimleri listesidir. Tekrar belitelim ki, deyimler noktalı  virgül
       ve   satırsonu   karakterleri   ile   birbirlerinden   ayrılır.   return   deyimi  işlevin
       sonlandırılmasına sebep olur ve bir değer döndürür. return deyiminin  iki  sürümü  vardır.
       ilk  şeklinde  "return"  ifadesi  işlevi  çağıran  ifadeye sıfır değerini döndürür. İkinci
       şeklinde,  "return  (  ifade  )",  ifade'nin  değeri  hesaplanıp  çağıran  ifadeye  sonucu
       döndürülür.  Her  işlevin  sonunda kendiliğinden bir return(0) vardır. Böylece bir işlevin
       sonunda  açıkça  bir  return  deyimi  kullanmaya  gerek  kalmaksızın  işlev  sıfır  değeri
       döndürerek sonlanır.

       İşlevler  ayrıca,  ibase  değişkeninin  kullanımını  da değiştirir. İşlev gövdesindeki tüm
       sabitler, işlev çağrısı sırasında ibase  değişkeninin  değeri  kullanılarak  dönüştürülür.
       Sayıların  dönüşümü  için  daima   ibase'in  o anki değerini kullanan yerleşik read işlevi
       dışında, işlev icrası sırasında ibase değişiklikleri gözardı edilecektir.

       Bir geliştirme olarak, tanım biçimi pek az esnektir. Standart, işlev  gövdesini  oluşturan
       ilk  kuyruklu  ayracın  define ile aynı satırda olmasını ve kalan her şeyin alt satırlarda
       olmasını gerektirir. bc'nin bu sürümünde ilk kaşlı  ayraçın  öncesinde  ya  da  sonrasında
       satırsonu  karakteri  kullanabilmeyi  mümkün  kılar.  Örneğin  aşağıdaki  tanımlar geçerli
       tanımlardır:

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

   MATH KÜTÜPHANESİ
       bc, -l seçeneği ile çalıştırıldığında  math kütüphanesini yükler ve öntanımlı  bölüntü  20
       yapılır.   math   işlvleri,   çağrıldıkları  sırada  geçerli  olan  bölüntüye  göre  sonuç
       döndürürler. math kütüphanesi aşağıdaki işlevleri tanımlar:

       s (x)  Radyan cinsinden verilen x'in sinüsü.

       c (x)  Radyan cinsinden verilen x'in kosinüsü.

       a (x)  x'in arktanjantı; radyan cinsinden döner.

       l (x)  x'in tabii logaritması.

       e (x)  e üssü x.

       j (n,x)
              x tamsayısına göre n. dereceden Bessel işlevi.

   ÖRNEKLER
       /bin/sh'da aşağıdaki atama, kabul değişkeni pi'ye pi değerini atar.

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

       Aşağıdaki örnekte, math kütüphanesinde kullanılan üstel işlevin tanımı  vardır.  Bu  işlev
       POSIX bc'de yazılmıştır.

       scale = 20

       /* e^x = (e^(x/2))^2 formülü kullanılıyor
         x yeterinde küçükse, 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 işaretine bakalım. */
         if (x<0) {
           m = 1
           x = -x
         }

         /* x için önkoşul. */
         z = scale;
         scale = 4 + z + .44*x;
         while (x > 1) {
           f += 1;
           x /= 2;
         }

         /* Değişkenleri 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
         }
       }

       Aşağıdaki  örnekte,  çek  defteri  (checkbook)  bakiyelerini  hesaplayan basit bir yazılım
       verilmektedir. Yazılımı bir kez yazarak bir dosyaya  kaydedebilirsiniz  ve  sonraları  her
       seferinde yeniden yazmaksızın istediğiniz zaman kullanabilirsiniz.

       scale=2
       print "\nÇek defteri yazılımı!\n"
       print "  Hatırlatma: Depozitolar negatif miktarlardır.\n"
       print "  Çıkış için 0 yazın.\n\n"

       print "Başlangıçtaki bakiye? "; bal = read()
       bal /= 1
       print "\n"
       while (1) {
         "şu anki bakiye = "; bal
         "çekilecek miktar? "; trans = read()
         if (trans == 0) break;
         bal -= trans
         bal /= 1
       }
       quit

       Aşağıdaki   örnekte   ise,   kendi   kendini   çağıran  bir  faktöriyel  hesaplama  işlevi
       tanımlanmaktadır.

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

   READLINE ve LIBEDIT SEÇENEKLERİ
       GNU bc (bir yapılandırma seçeneği ile), GNU  readline  kütüphanesini  ya  da  BSD  libedit
       kütüphanesini  kullanacak şekilde derlenebilir. Bu ise kullanıcıya, bc'ye göndermeden önce
       birden çok satır üzerinde düzenleme yapma  imkanı  sunar.  Ayrıca,  daha  önceden  girilen
       satırlar  için bir geçmiş de tutar. Bu seçenek seçilirse, bc bir özel değişkene daha sahip
       olur. Bu özel history değişkeni, bellekte  tutulacak  satır  sayısını  tutar.  -1   değeri
       sınırsız  (bellek  yettiği müddetçe) sayıda eski komut tutulacağını belirtir ve varsayılan
       değeri 100'dür. Eğer pozitif bir  tamsayı  belirtilirse,  liste  bu  belirtilen  sayı  ile
       sınırlandırılmış olur. 0 değeri ise liste tutulmayacağını belirtir.

       Daha  ayrıntılı  bilgi için, GNU readline, history kütüphanesi ile BSD libedit kütüphanesi
       hakkındaki belgeleri okuyunuz. bc,  readline ve  libedit  kütüphaneleri  aynı  anda  etkin
       olacak şekilde derlenemez.

   FARKLILIKLAR
       bc'nin  bu  sürümü,  POSIX  P1003.2/D11  taslağından  uyarlanmıştır  ve  taslağa  göre  ve
       geleneksel bc uygulamalarına göre bir  takım  farklılıklar  sözkonusudur.  dc(1)kullanılan
       geleneksel  yolla  gerçekleştirilmemiştir. Bu sürüm, yazılımın kodlarını ayrıştırarak bayt
       koda çevirdikten sonra tek bir süreç   olarak  çalıştırır.  Komut  satırından  verilen  ve
       belgelendirilmemiş  -c  seçeneği  ile,  yazılım  çalıştırılmaz,  onun yerinee bayt kodları
       ekrana   listelenir.   Bu,   aslında   etkileşimli   olarak   ayrıştırıcının    hatalarını
       görmek/gidermek ve math kütüphanesini hazırlamak için kullanılır.

       POSIX  bc'deki  farklılıkların  yanında  bir  de  yeni  özellikler eklenmiştir, bunlara da
       genişletmeler  demekteyiz.  Aşağıda,  bahsedilen  farklılıkların  ve  genişletmelerin  bir
       listesi yer almaktadır:

       LANG   Bu  sürüm  LANG  ve  LC_  ile   başlayan  ortam  değişkenlerinin işlenmesinde POSIX
              standardına uyumlu değildir.

       isimler
              Geleneksel ve POSIX bc değişkenler, diziler ve işlevler  için  sadece  tek  harften
              oluşan  isimleri  mümkün  kılar.  GNU  bc'de bu isimler için çok karakterli isimler
              kullanılabilir. Bir isim bir harf ile başlar  ve  harfler,  rakamlar  ile  altçizgi
              karakterini içerebilir.

       dizgeler
              Dizgelerde  boş  karakter kullanılmasına izin verilmez, POSIX'e göre dizgelerde tüm
              karakterler kullanılabilmelidir.

       last   POSIX bc'de bir last değişkeni yoktur. bc'nin bazı gerçeklemelerinde  bunun  yerine
              nokta (.) kullanılır.

       karşılaştırmalar
              POSIX  bc'de karşılaştırmalar sadece if, while deyimlerinde ve for deyiminin ikinci
              ifadesinde kullanılabilir. Ayrıca bu deyimlerde sadece bir  ilişkisel  işleme  izin
              verilir.

       if deyimi ve else sözcüğü
              POSIX bc'de else sözcüğü yoktur.

       for deyimi
              POSIX bc'de tüm ifadelerin deyim içinde kullanılması gereklidir.

       &&, ||, !
              POSIX bc'de mantıksal işleçler yoktur.

       read işlevi
              POSIX bc'de read işlevi yoktur.

       print deyimi
              POSIX bc'de print deyimi yoktur.

       continue deyimi
              POSIX bc'de continue deyimi yoktur.

       return deyimi
              POSIX bc, return ifadesinin parantez içine alınmasını gerektirir.

       dizi parametreler
              POSIX  bc'de  (şimdilik)  dizi  parametreler  tamamen  desteklenmemektedir.   POSIX
              sözdiziminde, işlev tanımlarında dizilere izin veriliyor,  ancak  bir  dizinin  bir
              işleve  parametre  olarak aktarılması desteklenmiyor. (Bu, aslında gözden kaçan bir
              dikkatsizliğin  sonucudur.)   Geleneksel   bc   gerçeklemeleri,   dizileri   sadece
              elemanlarının değerleri ile çağırabilmektedirler.

       işlev biçimi
              POSIX  bc  ilk  kaşlı  ayracın  define  anahtar  sözcüğünün bulunduğu satırda, auto
              anahtar sözcüğünün de alt satırında olmasını gerektirir.

       =+, =-, =*, =/, =%, =^
              POSIX bc bu "eski tarz" atama işleçlerinin tanımlanmasını gerektirmez. Bu sürüm  bu
              "eski  tarz" atamalara izin verebilir. limits deyimini kullanarak kurulu sürümün bu
              atamaları desekleyip desteklemediğini öğrenebilirsiniz. Eğer destekliyorsa,  "a  =-
              1"   atamasında   a   değişkenine   -1   atanmayacak,  a  değişkeninin  değeri  bir
              eksiltilecektir.

       sayılardaki boşluklar
              bc'nin diğer gerçeklemeleri  sayıların  içinde  boşluklara  izin  verir.  "x=1   3"
              ataması,  "x=13"  olarak  değerlendirilecektir. Aynı ifade bu sürümde bir sözdizimi
              hatasına sebep olacaktır.

       çalıştırma ve hatalar
              Bu bc, yazılım içerinde sözdizimi ve  diğer  hataların  bulunması  durumunda  kodun
              işletilmesi  konusunda diğer gerçeklemelere göre oldukça farklılıklar içermektedir.
              Eğer  bir  işlev  tanımlarken  bir  sözdizimi  hatası  yapılmışsa,  hata   düzeltme
              mekanizması  deyimin başlangıcını bulmaya çalışır, ilk hatalı satırı bulur ve satır
              numarasını ekrana yazar; sonra yine de işlevin geri kalan kısımlarını  ayrıştırmaya
              devam  eder.  İşlev  içinde  birkez  bile  hata  yapılmışsa,  o  işlev 'çağrılamaz'
              addedilir ve tanımsız olur.

              Etkileşimli ortamda çalışırken bir sözdizimi hatası yapılırsa, bir uyarı  gelir  ve
              çalıştırılacak   olan  o  anki  blok  geçersiz  sayılır.  İşletim  bloğu,  yazılışı
              tamamlanmış basit veya birleşik bir  deyimden  sonra  satırsonu  karakteri  bulunan
              yapıdır. Örneğin,

              a = 1
              b = 2
              iki ayrı işletim bloğudur. Ancak,

              { a = 1
                b = 2 }
              tek  işletim  bloğudur.  Oluşan  herhangi  bir  çalışma  anı hatası (error), o anki
              işletim bloğunu  sonlandırır.  Ancak,  oluşan  herhangi  bir  çalışma  anı  uyarısı
              (warning) işletim bloğunu sonlandırmaz.

       kesmeler
              Bir  etkileşimli oturumda, SIGINT sinyali (genelde klavyeden Ctrl-C'ye basıldığında
              üretilir)  o anda işletilmekte olan bloğun yarıda  kesilmesine  neden  olur.  Hangi
              işlevin  yarıda  kesildiğini  belirten  bir  çalışma  anı hatası ekrana yazdırılır.
              Ardından, tüm çalışma  anı  yapılarının  "temizlenme"sinin  ardından,  bc'nin  yeni
              girdiler  almak  için  hazır  olduğunu yazan bir mesaj belirir. Önceden tanımlanmış
              olan tüm işlevler ve auto-olmayan değişkenler bu noktadan önceki değerleriyle aynen
              kalırlar.  Tüm  auto  değişkenler  ve  işlev  parametreleri  bu  "temizleme" işlemi
              esnasında silinirler. Etkileşimli olmayan bir oturumda  ise  SIGINT  sinyali,bc'nin
              çalışmasını sonlandırarak kontrolü sisteme devredecektir.

   SINIRLAR
       Aşağıda bc'nin işlem yapabileceği sınırlar verilmiştir. Bunlardan bazıları aslında her bir
       kurulum için farklı farklı olabilir. Bunların geçerli  değerlerini  öğrenmek  için  limits
       deyimini kullanın.

       BC_BASE_MAX
              Azami çıktı tabanı, 999 dur. Azami girdi tabanı ise 16 dır.

       BC_DIM_MAX
              Dizilerde indisleme sınırı, keyfi olarak 65535 olarak belirlenmiştir. Kurulumunuzda
              farklı olabilir.

       BC_SCALE_MAX
              Sayılarda ondalık noktadan sonraki hane sayısı INT_MAX ile  sınırlanmıştır.  Ayrıca
              ondalık noktadan önceki hane sayısı da INT_MAX ile sınırlanmıştır.

       BC_STRING_MAX
              Dizgelerin içerebileceği karakter sayısı INT_MAX ile sınırlanmıştır.

       üs     Üstel değerlerde üssün sınırı LONG_MAX'tır.

       değişken isimleri
              Basit değişken, dizi ve işlev isimlerinin her biri için eşsiz isim sayısı 32767 ile
              sınırlanmıştır.

ORTAM DEĞİŞKENLERİ

       bc tarafından tanınan ortam değişkenleri şunlardır:

       POSIXLY_CORRECT
              -s seçeneği ile aynıdır.

       BC_ENV_ARGS
              Bu, bc'nin argümanları almak için kullandığı diğer bir mekanizmadır.  Biçimi  komut
              satırı  argümanlarında  olduğu  gibidir. Bu argümanlar, belirtilen dosyalardan önce
              işlem görürler. Bu, kullanıcıya "standart"  seçenekleri  ayarlama  imkanını  sunar.
              Ortam  değişkenlerinde  belirtilen  dosyalar  tipik  olarak  içlerinde kullanıcının
              tanımladığı  işlevler  olan  dosyalardır.   Bu   ayarlama   ile   artık,   bc   her
              çalıştırıldığında belirtilen dosyalar işleme sokulurlar.

       BC_LINE_LENGTH
              Bu,  sayılar  ekrana  yazdırılırken bir satırda kaç karakter olacağını belirten bir
              tamsayıdır. Uzun (yani, tek satıra sığmayan) sayılar için \ (tersbölü) ve satırsonu
              karakterleri bu miktara dahildir.

HATA AYIKLAMA

       Eğer  komut  satırında  belirtilen  dosyalardan  biri açılamazsa bc bunu raporlar ve hemen
       sonlanır. Ayrıca, derleme ve çalışma-anı hatalarında bunlar  ekrana  hata  numaraları  ile
       birlikte yazdırılırlar ve bu esnada açıklayıcı bilgiler verilir.

YAZILIM HATALARI

       Hata bulma/düzeltme henüz çok iyi değil.

       Hataları rapor etmek için konu alanına "bc" yazarak <bug-bc (at) gnu.org> adresine e-posta
       atınız.

YAZAN

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

TEŞEKKÜRLER

       Yazar kodun sınanmasındaki geniş yardımlarından  dolayı  Steve   Sommars'a  <Steve.Sommars
       (at)  att.com>  teşekkürlerinin  kabulünü  rica  ediyor.  Bir  çok öneride bulundu ve onun
       katılımıyla bu çok daha iyi bir ürün oldu.

ÇEVİRENLER

       Adem Güneş  <adem (at) alaeddin.cc.selcuk.edu.tr>, Eylül 1999, v1.04
       Nilgün Belma Bugüner  <nilgun (at) belgeler·gen·tr>, Ocak 2004, v1.06