Provided by: manpages-tr_2.0.6-2_all 

İ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.
GNU bc 1.07.1 11 Haziran 2006 BC(1)