Provided by: manpages-tr_2.0.6-2_all bug

İSİM

       bc - Keyfî duyarlılıkta hesaplama dili

KULLANIM

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

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 bazı
       benzerlikler vardır. Komut satırından belirtmek suretiyle kullanabileceğimiz standart bir
       math kütüphanesine 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 bazı
       genişletmeler içermektedir. Komut satırı seçenekleri, bu genişletmelerin bir uyarı
       çıktılamasına veya reddedilmesine neden olabilir. Bu belge, bu işlemci tarafından kabul
       edilen dili açıklar. Genişletmeler yeri gelince açıklanacaktır.

   SEÇENEKLER
       -h, --help
           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 genişletmeler 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 tabanda gerçekleştirilir.
       (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:

           .000001 sayısının uzunluğu 6 ve bölüntüsü 6’dır.
           1935.000 sayısının uzunluğu 7 ve bölüntüsü 3’tü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şken isimleri bir harfle
       başlarlar ve sonrasında harfler, rakamlar ve altçizgi karakteri içerebilirler. Tüm harfler
       küçük harf olmak zorundadır. (Abece-sayısal uzun isimler bir genişletmedir. Çünkü, POSIX
       bc’de değişken isimleri tek bir küçük harften ibaretttir.) Dizi değişkenleri ise isimden
       sonra [] (köşeli ayraç) alırlar.

       bc’de dört tane özel değişken vardır. Bunlar; scale, ibase, obase ve last’dır. scale,
       işlemlerde 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, girdi ve çıktı
       için sayı tabanlarını belirtir. Örneğin, ibase=10 ve obase=2 olursa sayılar onluk tabanda
       girilir ve sonuçlar ekrana ikilik tabanda yazdırılır. ibase ve obase için öntanımlı değer
       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ÇIKLAMA SATIRLARI
       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 olarak 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.) Açıklamalar
       sınırlarını belirleyen karakterler arasında satırsonu karakteri içerebilir.

       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şletilebilir.
       bc’de ’main’ yordam kavramı yoktur. Bunun yerine kod, rastlandıkları sırayla hemen
       yorumlanarak işletilir. (İşlevler, önce tanımlanırlar ve sonradan kullanılabilir - ileride
       ele alınacaktır).

       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 36’ya kadardır (16’dan sonrası genişletmedir).
       Sayılar girilirken, 0-9 arası rakamlar ve (ascii) A-Z arası harfler ile kullanılabilir.
       (Dikkat: A-Z büyük harf olmalıdır. Çünkü, küçük harfler değişkenler için kullanılıyor.)
       Tek rakamlı sayılar, ibase ne olursa olsun, her zaman rakamın ifade ettiği değere sahip
       olurlar (örn, A = 9)). bc çok rakamlı sayılarda, ibase değerine eşit veya daha büyük
       rakamları ibase-1 değeriyle ele alarak sayının değerini hesaplar. Bu ZZZ sayısını daima,
       girdi tabanındaki 3 haneli en büyük sayı yapar.

       İfadeler, diğer yüksek-düzeyli dillerdekilere oldukça benzer. 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 için kurallar vardır. Her ifadenin bir bölüntüsü vardır. Bu, özgün 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 ile C’deki tamsayı türü
       ile ifade edilebilen en büyük tamsayı aralığındadır.

       Aşağıdaki geçerli ifadelerin açıklamalarında "ifade" eksiksiz 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 belirtilmemişse 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 ’bir’ arttırılır ve yeni değer ifadenin sonucu olur.

       -- değişken
           değişken ’bir’ eksiltilir ve yeni değer ifadenin sonucu olur.

       değişken ++
           İfadenin sonucu değişkenin değerine atanır, sonra değişken’in değeri ’bir’ artırılır.

       değişken --
           İfadenin sonucu değişkenin değerine atanı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, birinci üssü ikincidir. İ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 sonuç, scale ile ilk ifadenin bölüntüsünden
           büyük olanı ile ilk ifadenin bölüntüsü çarpı üs değerinden küçük olanıdır, yani
           scale(a^b) = min(max(scale, scale(a)), scale(a)*b)’dir. Unutulmamalıdır ki ifade^0
           ifadesinin sonucu her zaman "1" olur.

       ( ifade )
           Yaylı ayraçlar, ifadenin değeri bulunurken standart önceliği değiştirir; yaylı
           ayraçlar içine alınan ifade daha önce hesaplanır.

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

       değişken <şlç>= ifade
           Bu, "değişken = değişken <işlec> 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 alabilir. (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 değilse 0 olur.

       ifade1 <= ifade2
           Sonuç, eğer ifade1, ifade2’den küçük ya da eşitse 1 değilse 0 olur.

       ifade1 > ifade2
           Sonuç, eğer ifade1, ifade2’den büyükse 1 değilse 0 olur.

       ifade1 >= ifade2
           Sonuç, eğer ifade1, ifade2’den büyük ya da eşitse 1 değilse 0 olur.

       ifade1 == ifade2
           Sonuç, eğer ifade1, ifade2’ye eşitse 1 değilse 0 olur.

       ifade1 != ifade2
           Sonuç, eğer ifade1, ifade2’den farklıysa 1 değilse 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, soldan ilişkilendirmeli
           && işleci, soldan ilişkilendirmeli
           ! işleci, ilişkilendirme yok
           İlişkisel işleçler, soldan ilişkilendirmeli
           Atama işleci, sağdan ilişkilendirmeli
           + ve - işleci, soldan ilişkilendirmeli
           *, / ve % işleci, soldan ilişkilendirmeli
           ^ işleci, sağdan ilişkilendirmeli
           tek terimli - işleci, ilişkilendirme yok
           ++ ve -- işleci, ilişkilendirme yok

       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 yaylı
       ayraçları kullanmaktır.

       bc’de desteklenen biraz daha özel ifadeler vardır. Bunlar, standart işlevler ve kullanıcı
       tanımlı işlevlerde, "isim(değişkenler)" ş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ı hanelerin 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 sorunlara 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, çoğu cebirsel dilde olduğu gibi, ifadelerin sırayla değerlendirilmelerini
       sağlarlar. bc’de deyimler "mümkün olduğunca" yürütülür. Yürütme, bir ya da daha fazla tam
       deyimden sonra bir satır sonu karakteri girildiğinde gerçekleşir. Yürütmenin anında
       gerçekleşmesi bakımdan bc’de satır sonu karakterleri çok önemlidir. Aslında, deyimleri
       ayırmak için bir noktalı virgül ve bir satır sonu karakteri gerekir. Yanlış yerde
       kullanılmış bir satır sonu karakteri bir sözdizimi hatasına sebep olur. Satır sonu
       karakteri deyimler için bir ayraç olduğundan, bir satırsonu karakterini gizlemek için ters
       eğik çizgi kullanılabilir. Ters eğik çizgiden sonra gelen bir satır sonu karakterinden
       oluşan karakter çiftini bc boşluk karakteri olarak değerlendirir. Bir deyim listesi,
       noktalı virgül ve satır sonu 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 ayraçlar ([ ])
       arasına alınanlar, deyimin isteğe bağlı kısımlarıdır.):

       ifade
           Bir ifade iki şeyden birini yapar. Eğer ifade "<değişken> <atama> ..." şeklinde
           başlıyorsa, bir atama deyimi olduğu kabul edilir. 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ır sonu
           karakteri yazdırılır. Örneğin, a=1 ifadesi bariz bir atama deyimidir; ve (a=1) ise
           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ıda rakamdan oluşur. Örneğin, obase=20 için 65
           sayısı ekrana "03 05" şeklinde yazdırılır.

           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 durumda satırların sonuna "\" (ters eğik çizgi)
           karakteri gelir. Her 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, böylece aynı sayıyı bir daha elde etmek için bir önceki ifade’yi tekrar
           yazmaya gerek kalmaz. last değişkenine atama yapılabilir ve atanan değer son yazılan
           değerin üzerine yazılır. Yeni atanan değer, yeni bir değer ekrana 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ır. 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 başka
           bir yöntemdir. liste zorunludur, aralarına virgül (,) konulmuş dizgelerden ve
           ifadelerden oluşur. liste’deki her dizge veya ifade, yazıldıkları sıraya göre ekrana
           yazdırılır. Eğer belirtilmediyse satırın sonunda satır sonu 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çerebilir. Özel
           karakterler ters eğik çizgi karakteri ile başlar. bc tarafından tanınan özel
           karakterler; "a" (uyarı; bip sesi), "b" (geri silme), "f" (sayfa ileri), "n" (satır
           sonu), "q" (çift tırnak), "t" (sekme) ve "\" (ters eğik çizgi) karakterleridir.
           Bunların dışındaki karakterler yok sayılır.

       { 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ır.

       if ( ifade ) deyim1 [ else deyim2 ]
           if deyimi ifade’nin değerini bulur ve ifade’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
           whiledeyimi, 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 deyiminine eşdeğer kod şöyledir:

               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, koşul sağlandığında çalışır. Örneğin, "if (0 == 1) halt" deyimi bc’yi
           hemen sonladırmaz; çünkü koşul sağlanmadığı için halt deyimi işletilmez.

       return
           Bir işlevden 0 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 yaylı ayraçlar gerekli değildir.

   YARDIMCI DEYİMLER
       Yardımcı deyimler, bildiğimiz klasik anlamda işletilebilir deyimler değildirler. Bunlar
       "derleme" sırası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ı
       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 ( değişkenler ) { satırsonu
               auto_listesi   deyim_listesi }

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

       girdiler sayı ya da dizi olabilir (dizi girdiler bir genişletmedir). İşlev tanımında sıfır
       ya da daha fazla sayıda girdi olabilir ve bunlar aralarına virgül konularak ayrılmış
       isimlerden oluşan bir liste olarak tanımlanır. Sayılar sadece değerleriyle aktarılan
       girdilerdir. Diziler ise sadece değişkenleriyle aktarılır. Dizi değişkenleri "isim[]"
       şeklinde belirtilir. İşlev çağrısında asıl girdiler, sayı türünde ifadelerdir. Aynı yazım
       şekli, dizi değişkenleri üzerinden dizilerin aktarılmasında da kullanılır. Bir isimli dizi
       bir işleve değişkeni ile aktarılır. İşlev tanımları dinamik olduklarından, girdi sayısı ve
       türleri işlev çağrıldığında değerlendirilir. Girdilerin 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 auto değişkenin ismidir. Diziler, değişkenlerde kullanılan sözdizimi
       ile belirtilebilir. Bu değişkenler 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. Bunlar 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 auto değişkenler olarak
       bildirilmedikçe, B işlevi aynı isimlerle erişebilir. auto değişkenler ve işlev
       değişkenleri yığıta basıldıklarından dolayı bc kendini çağıran işlevleri destekler.

       İşlevin gövdesi bir bc deyimleri listesidir. Tekrar belitelim, deyimler noktalı virgül ve
       satır sonu 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ı edilir.

       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ü, ilk kaşlı ayraçın öncesinde ya da sonrasında satır
       sonu karakteri kullanabilmeyi mümkün kılar. Örneğin aşağıdakiler geçerli tanımlardır:

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

       İşlevler void olarak tanımlanabilir. Void işlevler değer döndürmediğinden değer gerektiren
       yerlerde kullanılamaz. Void işlevler girdi satırında kendisi tarafından çağrıldığında
       herhangi bir çıktı üretmez. void sözcüğü define sözcüğü ile işlev ismi arasına
       yerleştirilir. Örneğin, aşağıdakileri ele alalım:

           define py (y) { print "--->", y, "<---", "\n"; }
           define void px (x) { print "--->", x, "<---", "\n"; }
           py(1)
           --->1<---
           0
           px(1)
           --->1<---

       py void işlev olmadığından py(1) çağrısı isteneni bastıktan sonra işlevin dönüş değerini
       basar. İşlev bir return deyimi içermediğinden öntanımlı olan return(0)’dan dolayı 0 değeri
       basılır. px(1)) için void işlev olduğundan 0 basılmaz.

       Ayrıca, değişken dizisi içeren çağrı da eklendi. Değişken dizisi içeren çağrıyı bildirmek
       için işlev tanımındaki dizi değişkeni "*isim[]" sözdizimi ile kullanılır. Dizideki
       değişkenlerin değerleriyle çağrılması nedeniyle işlev çağrısı aynı kalır.

   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şlevleri, ç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 x’in sinüsü.

       c (x)
           Radyan cinsinden x’in kosinüsü.

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

       l (x)
           x’in doğal logaritması.

       e (x)
           e üssü x.

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

   ÖRNEKLER
       /bin/sh’da aşağıdaki atama, kabuk 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 pozitif olmalı. */
             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 bakiyelerini hesaplayan basit bir yazılım verilmektedir.
       Yazılım bir kez yazılıp bir dosyaya kaydedebilir ve sonraları her seferinde yeniden
       yazmaksızın gerektiği zaman kullanılabilir.

           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 girdi düzenleme 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 öntanımlı 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 ve 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 yerine 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’den asıl farklılıklar, bir özelliğin daha fazla işlevsellik eklemek için
       genişletildiği genişletmeler ve yeni özelliklerin eklendiği eklemelerdir.
       Aşağıda,eklemelerin 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
           ve her isim bir harf ile başlar, harfler, rakamlar ile altçizgi karakterini
           içerebilir.

       dizgeler
           Dizgelerde NUL 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ı gerekir.

       &&, ||, !
           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 yaylı ayraç içine alınmasını gerektirir.

       diziler
           POSIX bc (şimdilik) dizi değişkenlerini tamamen desteklememektedir. POSIX
           sözdiziminde, işlev tanımlarında dizilere izin veriliyor, ancak bir dizinin bir işleve
           değişken olarak aktarılması desteklenmiyor. (Bu, aslında gözden kaçan bir
           dikkatsizliğin sonucudur.) Geleneksel bc gerçeklemelerinde, diziler sadece değerleri
           ile aktarılabilmektedirler.

       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ı destekleyip 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ımlanırken 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 bir kez 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 küme geçersiz sayılır. İşletim kümesi, 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 kümesidir. Ancak,

               { a = 1
                b = 2 }

           tek işletim kümesidir. Oluşan herhangi bir çalışma anı hatası (error), o anki işletim
           kümesini sonlandırır. Ancak, oluşan herhangi bir çalışma anı uyarısı (warning) işletim
           kümesini sonlandırmaz.

       kesmeler
           Bir etkileşimli oturumda, SIGINT sinyali (genelde klavyeden Ctrl-C’ye basıldığında
           üretilir) o anda işletilmekte olan kümenin 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"sinden sonra, bc’nin yeni girdiler
           almak için hazır olduğunu yazan bir ileti 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 değişkenleri bu "temizleme" işlemi esnasında silinirler.
           Etkileşimli olmayan bir oturumda ise SIGINT sinyali, bc’nin çalışmasını sonlandırır.

   SINIRLAR
       Aşağıda bu 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 girdi almak için kullandığı diğer bir mekanizmadır. Biçimi komut satırı
           girdileri ile aynıdır. Bu ortam değişkenlerinde listelenmiş dosyalar, komut satırında
           belirtilen dosyalardan önce işlem görür. Bu, kullanıcıya "standart" seçenekleri ve
           dosyaları ayarlama imkanını sunar. Ortam değişkenlerinde belirtilen dosyalar
           genellikle içlerinde kullanıcının tanımladığı işlevler olan ve dosyalardır. Bu
           ayarlama ile artık, bc her çalıştırıldığında belirtilen dosyalar işleme sokulur.

       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 \ (ters eğik çizgi) ve
           satırsonu karakterleri bu miktara dahildir. Bu değişkene atanan 3’ten küçük değerler
           için satır uzunluğu 70 yapılır.

HATA AYIKLAMA

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

YAZILIM HATALARI

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

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

YAZAN

       Philip A. Nelson tarafından yazılmıştır.

TELİF HAKKI

       Telif hakkı © 2017 Free Software Foundation, Inc. Lisans GPLv3+: GNU GPL sürüm 3 veya üstü
       <http://gnu.org/licenses/gpl.html> Bu bir özgür yazılımdır: yazılımı değiştirmek ve
       dağıtmakta özgürsünüz. Yasaların izin verdiği ölçüde HİÇBİR GARANTİ YOKTUR.

TEŞEKKÜRLER

       Yazar kodun sınanmasındaki geniş yardımlarından dolayı Steve Sommars’a 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İREN

       © 1999 Adem Güneş
       © 2004, 2022 Nilgün Belma Bugüner
       Bu çeviri özgür yazılımdır: Yasaların izin verdiği ölçüde HİÇBİR GARANTİ YOKTUR.
       Lütfen, çeviri ile ilgili bildirimde bulunmak veya çeviri yapmak için
       https://github.com/TLBP/manpages-tr/issues adresinde "New Issue" düğmesine tıklayıp yeni
       bir konu açınız ve isteğinizi belirtiniz.