İ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,
-
iki ayrı işletim bloğudur. Ancak,
-
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