İ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