Provided by:
manpages-tr_1.0.5.1-2_all 
ISIM
bc - Keyfi duyarlilikta hesaplama dili
KULLANIM
bc [ -hlwsqv ] [ uzun-se,cenekler ] [ dosya ... ]
S"UR"UM
Bu kullanim kilavuzu, GNU bc surum 1.06'ya gore hazirlanmistir.
A,CIKLAMA
bc, girilen deyimleri isleterek keyfi uzunlukta ve duyarliliktaki
sayilar uzerinde matematiksel islemler yapmaya imkan saglayan
etkilesimli bir ortam ve bir yazilim gelistirme dilidir. Sozdizimi
acisindan C yazilim gelistirme dilini andiran benzerlikler
sozkonusudur. Komut satirindan belirtmek suretiyle kullanabilecegimiz
standart bir math kutuphanesine de sahiptir. Eger gerekli ise; math
kutuphanesi, belirtilen dosyalardan daha once ele alinir. bc isleme
tabi tutarken dosyalari komut satirinda belirtilen siraya gore ele
alir. Belirtilen dosyalarin tumu ele alinip islendikten sonra, standart
girdiden girisler okunmaya baslar. Kodlar nasil okunuyorlarsa bu
halleriyle isletilirler. (Eger belirtilen dosyalardan herhangi birinde
bc'yi sonlandiracak bir komut yer alirsa, bc sonlanir, bir daha
standart girdiden okuyamaz.)
bc'nin bu surumu, geleneksel bc uygulamalarina ve POSIX taslak
standardina gore ilave olusumlar icermektedir. Komut satirindan
belirtilecek bir secenekle bu genisletmeler kullanima dahil edilebilir
veya edilmeyebilir. Bu kilavuzda GNU bc anlatilacak ve ek olusumlar
yeri gelince belirtilecektir.
SE,CENEKLER
-h, --help
Bir kullanim iletisi basar ve cikar.
-i, --interactive
Etkilesimli kipe gecilir.
-l, --mathlib
Standart math kutuphanesini kullanima sokar.
-w, --warn
POSIX bc'ye ek olusumlar icin uyarilar verir.
-s, --standard
Standart POSIX bc diline uygun olarak islem yapar.
-q, --quiet
Normalde gelen, GNU bc hosgeldiniz iletisini goruntulemez.
-v, --version
Surum ve telif hakki bilgilerini gosterir ve cikar.
SAYILAR
bc'deki en temel eleman sayilardir. Sayilar keyfi duyarlilikta ifade
edilirler. Yani bc'de bir sayi, tamsayi kisim ve ondalik kisim olarak
ifade edilir. Tum sayilar normalde ic hesaplamalarda onluk tabanda ele
alinirlar ve tum islemler onluk taban uzerinden gerceklestirilirler.
(Bu surum, bolme ve carpma islemlerinde sayilarin ondalik kisimlarini
belli uzunluktan sonra kesmektedir.) bc'de sayilarin iki ozelligi
vardir: uzunluk ve boluntu. Uzunluk, sayidaki tum anlamli rakamlarin,
boluntu ise ondalik noktadan sonraki rakamlarin adedidir.
Ornegin:
0.0000010 sayisinin uzunlugu 7 ve boluntusu 6'dir.
01935.000 sayisinin uzunlugu 7 ve boluntusu 3'tur.
Uzunluk acisindan; en sagdaki sifir anlamli, en soldaki sifir
anlamsizdir.
DEGI,SKENLER
Sayilar iki farkli turde degisken olarak saklanabilirler: basit
degiskenler ve diziler. Her iki degisken turu icin de degiskenlere
birer ad verilir. Degiskenler bir harfle baslarlar ve sonrasinda
harfler, rakamlar ve altcizgi karakteri icerebilirler. Tum harfler
kucuk harf olmak zorundadir. (Degiskenlere uzun isim verebilme bir
genisletmedir. Cunku, POSIX bc'de degisken isimleri tek bir kucuk
harftir.) Dizi degiskenleri ise isimden sonra [] (koseli parantezler)
alirlar.
bc'de dort tane ozel degisken vardir. Bunlar; scale, ibase, obase ve
last'dir. scale, islemlerde sayilarda ondalik noktadan sonra kac tane
rakamin kullanilacagini belirtir. Ontanimli scale degeri 0'dir. ibase
(input base) ve obase (output base) degiskenleri, sayilarda girdi ve
cikti icin tabanlari belirtir. Ornegin, ibase=10 ve obase=2 olursa
sayilar onluk tabanda girilir ve sonuclar ekrana ikilik tabanda
yazdirilirlar. Ontanimli ibase ve obase degerleri 10'dur. last
degiskeni (bu bir genisletmedir) ise, en son ekrana yazdirilan sayiyi
iceren bir degiskendir. Bu degiskenlere yeni degerler atanabilir.
Bunlar ileride daha ayrintili olarak ele alinacaktir.
A,CIKLAMALAR
bc'de aciklama satirlari /* karakterleri ile baslar ve */ karakterleri
ile biter. Aciklamalar herhangi bir yerde baslayabilir ve girdide tek
bir bosluk gibi ele alinir. (Yani, bu da aciklamalarin girdi elemanlari
arasinda bir ayrac olarak yorumlandigini gosterir. Dolayisiyla, bir
degisken ismi icerisinde aciklama yer alamaz anlamindadir.) Aciklamalar
satirsonu karakteri icerebilirler.
Ayrica bc'de betiklerin kullanilmasini saglamak icin tek satirlik
aciklamalar desteklenmektedir ve bu bir genisletmedir. Tek satirlik
aciklama # karakterinden sonra baslar ve satir sonuna kadar devam eder.
Satirsonu karakteri aciklamaya dahil degildir ve normal karakter olarak
ele alinir.
IFADELER
Sayilar, ifadelerle ve deyimlerle birlikte kullanilirlar. Bu dil,
etkilesimli bir calisma ortami olarak tasarlandigi icin deyimler ve
ifadeler de etkilesimli olarak isletilebilirler. bc'de bir 'main'
islevi kavrami yoktur. Bunun yerine kod, oldugu haliyle hemen
yorumlanarak isletilir. (Islevler, once tanimlanirlar ve sonradan
kullanilabilirler -ileride ele alinacaklar-).
En basit ifade bir 'sabit'tir. bc, ibase degiskeniyle belirtilen o anki
girdi tabanini kullanarak sayiyi dahili onluk tabana cevirir. (Ancak,
islevler icin bir istisna vardir.) ibase degiskeninin gecerli degerleri
2'den 16'ya kadardir. Bu araligin disinda degerler atanirsa
kendiliginden 2 veya 16 olarak yeniden ayarlanir. Sayilar girilirken,
0-9 arasi rakamlar ve A-F arasi harfler ile kullanilabilir. (Not: A-F
buyuk harf olmalidir. Cunku, kucuk harfler degiskenler icin
kullaniliyorlar.) Tek rakamli sayilar, ibase ne olursa olsun, her zaman
rakamin ifade ettigi degere sahip olurlar (orn, A=10)). bc cok rakamli
sayilarda, ibase degerine esit veya daha buyuk rakamlari derhal ibase-1
tabaninda ele alarak sayinin degerini hesaplar. Bu FFF sayisini daima,
girdi tabanindaki en buyuk 3 haneli sayi yapar.
Ifadeler, diger yuksek-duzeyli dillerdekilere oldukca benzerler. bc'de
sayilar icin farkli turler olmadigi icin karisik turler icin kurallar
yoktur. Bunun yerine, sadece ifadelerin boluntuleri uzerine kurallar
vardir. Her ifadenin bir boluntusu vardir. Bu, orijinal sayilarin
boluntulerinden, gerceklestirilen islemden ve cogu durumda da scale
degiskeninin degerinden elde edilir. scale degiskeninin alabilecegi
degerler, 0 (sifir) ile C'deki tamsayi turu ile ifade edilebilen
tamsayi araligindadir.
Asagidaki gecerli ifadelerin aciklamalarinda "ifade" komple bir ifadeyi
ve "degisken" ise siradan bir degiskeni veya bir dizi degiskenini
gostermektedir. Bir basit degisken
isim
seklinde ve bir dizi degiskeni ise asagidaki gibi belirtilir:
isim[ifade]
Ozel olarak soz edilmediyse sonucun boluntusu, ilgili ifadelerin azami
boluntusu olur.
-ifade Sonuc, ifade'nin negatifi olur.
++degi,sken
degi,sken'in degerine once 'bir' eklenir ve yeni deger ifadenin
sonucu olur.
--degi,sken
degi,sken'in degeri once 'bir' eksiltilir ve yeni deger ifadenin
sonucu olur.
degi,sken++
Ifadenin sonucu degiskenin degerine gore hesaplanir, sonra
degi,sken'in degeri 'bir' artirilir.
degi,sken--
Ifadenin sonucu degiskenin degerine gore hesaplanir, sonra
degi,sken'in degeri 'bir' eksiltilir.
ifade + ifade
Sonuc, iki ifade'nin toplamidir.
ifade - ifade
Sonuc, iki ifade'nin farkidir.
ifade * ifade
Sonuc, iki ifade'nin carpimidir.
ifade / ifade
Sonuc, iki ifade'nin bolumudur. Sonucun boluntusu scale
degiskeninin degeridir.
ifade % ifade
Sonuc, "kalan"i verir ve su sekilde hesaplanir. a%b'yi
hesaplarken, ilk once a/b scale haneli olarak hesaplanir.
scale+scale(b) ve scale(a)'dan hangisi daha buyukse bu boluntuye
gore a-(a/b)*b ifadesi sonucu hesaplamak icin kullanilir. Eger
scale 0'a esitlenirse ve her iki ifade de tamsayi ise, bu ifade
tamsayi kalan islevidir.
ifade ^ ifade
Ifadenin sonucu, birincinin ikinciye gore ussudur. Ikinci ifade
bir tamsayi olmalidir. (Eger ikinci ifade tamsayi degilse, once
ekrana bir uyari gelir ve ifade tamsayi olacak sekilde kesilir,
yani ikinci ifadenin tam kismi alinir). Sonucun boluntusu ise,
eger us negatif ise scale'dir. Us pozitif ise scale(a^b) =
min(scale(a)*b, max(scale, scale(a)))'dir. Unutulmamalidir ki
ifade^0 ifadesinin sonucu her zaman "1" olur.
( ifade )
Parantezler, ifadenin degeri bulunurken standart onceligi
degistirir ve parantez icine alinan ifade daha once hesaplanir.
degi,sken = ifade
Ifadenin sonucu degiskene atanir.
degi,sken <i,sle,c>= ifade
Bu, "degi,sken = degi,sken <i,sle,c> ifade" ile esdegerdir ancak bir
farkla; degi,sken'in degeri sadece bir kere elde edilir. Eger
degi,sken bir dizi ise, islemin bir kere yapilacagi gozden uzak
tutulmamalidir.
Iliskisel ifadeler (karsilastirma ifadeleri), sonuclari her zaman 0
veya 1 olan ozel ifadelerdir. 0, yanlis (false) ve 1, dogru (true)
olarak yorumlanir. Bunlar herhangi bir ifade icerisinde yer
alabilirler. (POSIX bc'de ise iliskisel ifadeler sadece if, while ve
for deyimlerinde kullanilabilir ve sadece bir tane iliskisel sinama
olabilir.) Iliskisel islecler sunlardir:
ifade1 < ifade2
Sonuc, eger ifade1, ifade2'den kucukse 1 olur. Aksi halde 0
olur.
ifade1 <= ifade2
Sonuc, eger ifade1, ifade2'den kucuk ya da esitse 1 olur. Aksi
halde 0 olur.
ifade1 > ifade2
Sonuc, eger ifade1, ifade2'den buyukse 1 olur. Aksi halde 0
olur.
ifade1 >= ifade2
Sonuc, eger ifade1, ifade2'den buyuk ya da esitse 1 olur. Aksi
halde 0 olur.
ifade1 == ifade2
Sonuc, eger ifade1, ifade2'ye esitse 1 olur. Aksi halde 0 olur.
ifade1 == ifade2
Sonuc, eger ifade1, ifade2'den farkliysa 1 olur. Aksi halde 0
olur.
bc'de mantiksal (boolean) islemler de gecerlidir. (POSIX bc'de
mantiksal islemler yoktur.) Mantiksal islemlerin sonucu, iliskisel
islemlerde oldugu gibi, 0 (false) yada 1 (true) olmaktadir. Mantiksal
islecler sunlardir:
!ifade ifade 0 ise sonuc 1'dir. Aksi halde 0 olur.
ifade && ifade
ifade'lerin ikiside sifirdan farkliysa sonuc 1'dir. Aksi halde 0
olur.
ifade || ifade
ifade'lerden biri sifirdan farkliysa sonuc 1'dir. Aksi halde 0
olur.
Isleclerin islem oncelik sirasi soyledir (kucukten buyuge):
|| isleci, once sol taraf
&& isleci, once sol taraf
! isleci, tarafsiz
Iliskisel islecler, once sol taraf
Atama isleci, once sag taraf
+ and - isleci, once sol taraf
*, / ve % isleci, once sol taraf
^ isleci, once sag taraf
tek terimli - isleci
++ ve -- isleci
Bu onceligin secilmesinin nedeni, POSIX uyumlu bc yazilimlarinin dogru
calismasi icindir. Ancak, iliskisel ve mantiksal islecler, atama
ifadelerinde kullanildiginda elverissiz ve cok farkli bir durum ortaya
cikmaktadir. Asagidaki ifadeyi ele alalim:
a = 3 < 5
C programcilari bu ifadeyi ele alirken, once 3<5 (sonuc 1'dir)
ifadesini gerceklestirir, ardindan sonucu "a" degiskenine atarlar.
bc'de ise once "a"ya 3 atanir ve ardindan 5 ile karsilastirma yapilir.
Buna dikkat etmek gerekir. En iyisi, iliskisel ve mantiksal islecler
ile atama isleci ayni ifadede kullanildiginda karmasayi onlemek icin
parantezleri kullanmaktir.
bc'de desteklenen biraz daha ozel ifadeler vardir. Bunlar, standart
islevler ve kullanici tanimli islevlerde, "isim(parametreler)" seklinde
gorulmektedirler. Ayrintili bilgi icin I,SLEVLER bolumundeki kullanici
tanimli islevlere bakiniz. Yerlesik islevler sunlardir:
length ( ifade )
length islevinin degeri, ifade'deki anlamli rakamlarin adedidir.
read ( )
read islevi (bu bir genisletmedir), nerede kullanildigina
bakilmaksizin, standart girdiden bir sayi okumak icin
kullanilir. Ancak, standart girdiden veri ve yazilim birlikte
okunurken problemlere neden olabileceginden dikkatli olmak
gerekir. Bu islevin en iyi kullanim sekli, asla kullanicidan kod
girmeyi gerektiren yerlerde degil, evvelce gelistirilen bir
yazilim icin kullanicidan bir girdi bekleyen yerlerde
kullanmaktir. read islevinin degeri, standart girdiden okunan
sayinin ibase tabanindaki degeridir.
scale ( ifade )
scale islevinin degeri, ifade'denin sonucu olan sayidaki ondalik
hanelerin sayisidir.
sqrt ( ifade )
sqrt islevinin degeri, ifade'nin karekokudur. ifade'nin sonucu
negatif bir sayi ise bir calisma ani hatasi uretilir.
DEYIMLER
Deyimler, bircok cebirsel dilde oldugu gibi, ifadelerin sirayla
degerlendirilmelerini saglarlar. bc'de deyimler "mumkun oldugunca"
isletilirler. Isletim, bir ya da daha fazla tam deyimden sonra bir
satirsonu karakteri girildiginde gerceklesir. Bu bakimdan bc'de
satirsonu karakterleri cok onemlidir. Aslinda, deyimleri ayirmak icin
bir satirsonu karakteri ve bir noktali virgul gerekir. Yanlis yerde
kullanilmis bir satirsonu karakteri bir sozdizimi hatasina sebep olur.
Satir sonu karakteri deyimler icin bir ayrac oldugundan, bir satir sonu
karakterini gizlemek icin ters bolu karakteri kullanilabilir. Tersbolu
karakterinden sonra gelen bir satirsonu karakterinden olusan karakter
ciftini bc bosluk karakteri olarak degerlendirir. Bir deyim listesi,
noktali virgul ve satirsonu karakteri ile sonlandirimis deyimlerden
olusur. Asagidaki listede bc'deki deyimler ve bunlarin ne yaptiklari
anlatilmaktadir (Koseli parantezler ([ ]) arasina alinanlar, deyimin
istege bagli kisimlaridir.):
ifade Bu deyim iki seyden birini yapar. Eger ifade "<degisken> <atama>
..." seklinde basliyorsa, bunun bir atama deyimi oldugunu kabul
eder. Eger ifade bir atama deyimi degil ise, ifade'nin degeri
bulunur ve ciktiya yazdirilir. Sayinin ardindan satirsonu
karakteri yazdirilir. Ornegin, a=1 ifadesi bariz bir atama
deyimidir; ve (a=1) icinde bir atama deyimi olan bir ifadedir.
Ciktilanan tum sayilar obase degiskeni ile belirtilen tabanda
yazdirilirlar. obase degiskeninin alabilecegi degerler 2 ile
BC_BASE_MAX arasindadir. (Ayrintili bilgi icin SINIRLAR bolumune
bakiniz.)
2 ile 16 arasindaki tabanlar icin cikti bildigimiz yontemle
yazdirilir. 16'dan daha buyuk tabanlar icin ise, bc her bir
haneyi yazdirmak icin 10'luk tabanda birden cok karakter
kullanir ve haneler arasinda bosluk birakir. Her hane, obase-1
degerini 10'luk duzende yazmak icin gereken sayi kadar rakamdan
olusur. Ornegin, obase=20 icin 65 sayisi ekrana "03 05" seklinde
yazdirilir. Eger obase=101 olsaydi, 25 sayisi ekrana "025"
seklinde yazdirilacakti. Sayilar keyfi duyarlilikta ele
alindiklari icin, bazi sayilar ekrana yazdirilirken tek bir
satira sigmayabilirler. Bu uzun sayilar yazdirilirken ekrana
satirlarin sonuna "\" (tersbolu) karakteri gelir. Her bir
satirda en fazla 70 karakter yazdirilabilir. bc'nin etkilesimli
dogasindan dolayi yazilan en son deger, ozel last degiskeninde
saklanir ki ayni sayiyi bir daha elde etmek icin bir onceki
ifade'yi tekrar yazmaya gerek kalmaz. last degiskenine atama
yapilmasi da gecerlidir ve atanan deger son yazilan degerin
uzerine yazilir. Yeni atanan deger, yeni bir deger yazilana
kadar ya da last degiskenine yeni bir atama yapilana kadar
gecerli kalir. (Bazi kurulumlar last icin bir kisaltma olarak
bir sayinin parcasi olmayan tek bir nokta (.) kullanimini mumkun
kilabilir.)
dizge dizge ciktiya yazdirilir. Cift tirnak "..." arasina alinan her
sey (satirsonu karakteri de dahil) dizge olarak kabul edilir ve
ekrana aynen yazdirilirlar. dizge yazdirildiktan sonra satirsonu
karakteri yazdirilmaz (yani asagi satira gecilmez, bu nedenle
satirsonu karakteri dizge'nin icine yerlestirilmelidir).
print liste
print deyimi (bu bir genisletmedir) ciktiya birseyler yazdirmak
icin kullanilan diger bir yontemdir. liste parametresi
zorunludur, aralarina virgul (,) konularak dizgelerden ve
ifadelerden olusur. liste'deki her bir dizge veya ifade,
yazildiklari siraya gore ekrana yazdirilir. Eger belirtilmediyse
satir sonunda satirsonu karakteri yazdirilmaz. Ifadelerin
degerleri bulunduktan sonra sonuclari ekrana yazdirilir. Bu
esnada ekrana en son yazdirilan sayinin degeri last degiskenine
atanir. print deyimi icindeki dizgeler ciktiya yazdirilir ve
ozel anlami olan karakterleri de icerebilirler. Ozel karakterler
tersbolu karakteri ile baslar. bc tarafindan taninan ozel
karakterler; "a" (uyari; bip sesi), "b" (gerisilme), "f" (sayfa
ileri), "n" (satirsonu), "q" (cift tirnak), "t" (sekme) ve "\"
(tersbolu) karakterleridir. Bunlarin disindaki karakterler
gozardi edilir.
{ deyim_listesi }
Bu, bir birlesik deyimdir. Bu yapi, birden cok deyimi
gruplandirarak birlikte calistirmak icin kullanilir. Deyimler
arasinda yukarida anlatilan ayraclar yer alirlar.
if ( ifade ) deyim1 [ else deyim2 ]
if deyimi ifade'nin degerini bulur ve iifade'nin sonucuna gore
deyim1'i veya deyim2'yi calistirir. ifade'nin sonucu sifirdan
farkli ise deyim1 isletilir. Eger deyim2 belirtilmisse ve
ifade'nin sonucu da sifir ise, deyim2 isletilir (else sozcugu
bir genisletmedir).
while ( ifade ) deyim
while deyimi, ifade'nin degeri sifirdan farkli oldugu muddetce
deyim'i tekrar tekrar isletir. Dongude her yinelemede once
ifade'nin degeri bulunur, sonuc sifirdan farkli ise deyim
isletilir. ifade'nin sifir olmasi durumunda veya cikmak icin
break deyimi kullanildiginda dongu sonlanir.
for ( [ifade1] ; [ifade2] ; [ifade3] ) deyim
for deyimi, deyim'in tekrar tekrar calistirilmasini saglar. Ilk
basta (yani dongu baslamadan once) ifade1 isletilir. Dongude her
yinelemede deyim isletilmeden once ifade2'nin degeri bulunur.
Eger sonuc sifirdan farkli ise deyim yerine getirilir, eger
sonuc sifir ise dongu sonlandirilir. Dongude deyim yerine
getirildikten sonra ifade3 isletilir ve ardindan ifade2'nin
degeri tekrar bulunur. Ta ki ifade2'nin degeri sifir oluncaya
kadar... Donguyu daha erken sonlandirmak icin break deyimi
kullanilabilir. Eger ifade1 veya ifade3 kullanilmamissa, bu
noktada degerlendirilecek hicbir sey olmadigindan bir sey
yapilmaz. Eger ifade2 kullanilmamissa, ifade2'nin degeri 1
olarak kabul edilir. (POSIX bc'de her uc ifadeyi de belirtmek
mecburidir. Bunlarin secimlik kullanilmasi, bir genisletmedir.)
for deyimine karsilik gelen deyimler sunlardir:
ifade1;
while (ifade2) {
deyim;
ifade3;
}
break Icinde yer aldigi son while veya for dongusunu sonlandirir.
continue
continue deyimi, (bir genisletmedir) icinde yer aldigi son for
dongusunu kendinden sonra gelen deyimler isletilmeden sonraki
yinelemeden baslatir.
halt halt deyimi, (bir genisletmedir) bc'yi sonladirir. quit'ten
farki, halt deyimi kesinkes degil, sart saglandiginda calisir.
Ornegin, "if (0==1) halt" deyimi bc'yi sonladirmaz; cunku sart
saglanmadigi icin halt deyimi isletilmez.
return Bir islevden 0 (sifir) dondurerek cikar. (Ayrintili bilgi icin
I,SLEVLER bolumune bakiniz.)
return ( ifade )
Bir islevden ifade'nin degerini dondurerek cikar. (Ayrintili
bilgi icin I,SLEVLER bolumune bakiniz.) Bir genisletme olarak
parantezler gerekli degildir.
YARDIMCI DEYIMLER
Yardimci deyimler, bildigimiz klasik anlamda isletilebilir deyimler
degildirler. Bunlar "derleme" zamaninda ele alinirlar.
limits bc'nin yerel surumu tarafindan zorlanan yerel sinirlari basar.
Bu bir genisletmedir.
quit Her nerede ve her ne sekilde kullanilirsa kullanilsin, bc'yi
kesinkes sonlandirir. Ornegin, "if (0==1) quit" deyimi, sart
saglanmasa da bc'yi sonlandiracaktir.
warranty
Uzun bir garanti iletisi basar. Bu bir genisletmedir.
I,SLEVLER
Islevler, daha sonra calistirilmak uzere hesaplamalarin tanimlandigi
bir yontem sunar. bc'deki islevler daima bir deger hesaplayip bunu
cagriciya dondururler. Islev tanimlari "ozdevimli"dir; yani, girdide
saptanana kadar bir islev tanimsizdir. Bu tanimlama, ayni isimde yeni
bir islev tanimlanincaya kadar gecerlidir. Yeni islev tanimi eskisinin
yerine gecer. Bir islev asagidaki gibi tanimlanir.
define isim ( parametreler ) { satirsonu
auto_listesi deyim_listesi }
Bir islev cagrisi ise "isim(parametreler)" biciminde bir ifadedir.
Parametreler sayilar ya da dizilerdir (dizi parametreler bir
genisletmedir). Islev taniminda sifir ya da daha fazla sayida parametre
verilebilir ve bunlar aralarina virgul konularak ayrilmis isimlerden
olusan bir liste olarak tanimlanir. Sayilar sadece degerleriyle
cagrilan parametrelerdir. Diziler ise sadece degiskenleriyle
cagrilirlar. Diziler, parametre taniminda "isim[]" seklinde belirtilir.
Islev cagrisinda asil parametreler, sayi turunde ifadelerdir. Ayni
yazim sekli, dizi parametrelerin tanimi olarak dizilerin aktarilmasinda
da kullanilir. Bir isimli dizi bir isleve degiskeni ile aktarilir.
Islev tanimlari ozdevimli olduklarindan, parametre sayisi ve turleri
islev cagrildiginda kontrol edilir. Parametrelerin sayisi ve
turlerindeki herhangi bir uyumsuzluk bir calisma ani hatasina sebep
olur. Ayrica, tanimsiz bir islevin cagrilmasi da bir calisma ani
hatasina sebep olacaktir.
auto_listesi, "yerel" kullanim icin istege bagli bir degisken
listesidir. auto_listesi'nin (eger varsa) sozdizimi "auto isim, ...
;" seklindedir (Sondaki noktali virgul istege baglidir). Her isim bir
auto degiskenin ismidir. Diziler, parametrelerde kullanilan sozdizimi
ile belirtilebilir. Bu degiskenlerin sifir ile ilklendirilerek,
degerleri, islevin baslangicinda yigita basilir ve islevin icrasi
boyunca kullanilir. Islevden cikista bu degerler yigittan cekilir,
boylece degiskenler islevin baslangicindaki ilk degerlerine donmus
olur. Parametreler gercekte, islev cagrisi sirasinda ilklendirilen auto
degiskenlerdir. auto degiskenler, geleneksel yerel degiskenlerden
farklidir. A islevi, B islevini cagirdiginda, A islevinin auto
degiskenlerine, B islevinde onlar auto degiskenler olarak
cagrilmadikca, B islevi ayni isimlerle erisebilir. auto degiskenler ve
parametreler yigita basildiklarindan dolayi bc kendini cagrilan
islevleri destekler.
Islevin govdesi bir bc deyimleri listesidir. Tekrar belitelim ki,
deyimler noktali virgul ve satirsonu karakterleri ile birbirlerinden
ayrilir. return deyimi islevin sonlandirilmasina sebep olur ve bir
deger dondurur. return deyiminin iki surumu vardir. ilk seklinde
"return" ifadesi islevi cagiran ifadeye sifir degerini dondurur. Ikinci
seklinde, "return ( ifade )", ifade'nin degeri hesaplanip cagiran
ifadeye sonucu dondurulur. Her islevin sonunda kendiliginden bir
return(0) vardir. Boylece bir islevin sonunda acikca bir return deyimi
kullanmaya gerek kalmaksizin islev sifir degeri dondurerek sonlanir.
Islevler ayrica, ibase degiskeninin kullanimini da degistirir. Islev
govdesindeki tum sabitler, islev cagrisi sirasinda ibase degiskeninin
degeri kullanilarak donusturulur. Sayilarin donusumu icin daima
ibase'in o anki degerini kullanan yerlesik read islevi disinda, islev
icrasi sirasinda ibase degisiklikleri gozardi edilecektir.
Bir gelistirme olarak, tanim bicimi pek az esnektir. Standart, islev
govdesini olusturan ilk kuyruklu ayracin define ile ayni satirda
olmasini ve kalan her seyin alt satirlarda olmasini gerektirir. bc'nin
bu surumunde ilk kasli ayracin oncesinde ya da sonrasinda satirsonu
karakteri kullanabilmeyi mumkun kilar. Ornegin asagidaki tanimlar
gecerli tanimlardir:
define d (n) { return (2*n); }
define d (n)
{ return (2*n); }
MATH K"UT"UPHANESI
bc, -l secenegi ile calistirildiginda math kutuphanesini yukler ve
ontanimli boluntu 20 yapilir. math islvleri, cagrildiklari sirada
gecerli olan boluntuye gore sonuc dondururler. math kutuphanesi
asagidaki islevleri tanimlar:
s (x) Radyan cinsinden verilen x'in sinusu.
c (x) Radyan cinsinden verilen x'in kosinusu.
a (x) x'in arktanjanti; radyan cinsinden doner.
l (x) x'in tabii logaritmasi.
e (x) e ussu x.
j (n,x)
x tamsayisina gore n. dereceden Bessel islevi.
"ORNEKLER
/bin/sh'da asagidaki atama, kabul degiskeni pi'ye pi degerini atar.
pi=$(echo "scale=10; 4*a(1)" | bc -l)
Asagidaki ornekte, math kutuphanesinde kullanilan ustel islevin tanimi
vardir. Bu islev POSIX bc'de yazilmistir.
scale = 20
/* e^x = (e^(x/2))^2 formulu kullaniliyor
x yeterinde kucukse, 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 isaretine bakalim. */
if (x<0) {
m = 1
x = -x
}
/* x icin onkosul. */
z = scale;
scale = 4 + z + .44*x;
while (x > 1) {
f += 1;
x /= 2;
}
/* Degiskenleri 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
}
}
Asagidaki ornekte, cek defteri (checkbook) bakiyelerini hesaplayan
basit bir yazilim verilmektedir. Yazilimi bir kez yazarak bir dosyaya
kaydedebilirsiniz ve sonralari her seferinde yeniden yazmaksizin
istediginiz zaman kullanabilirsiniz.
scale=2
print "\nCek defteri yazilimi!\n"
print " Hatirlatma: Depozitolar negatif miktarlardir.\n"
print " Cikis icin 0 yazin.\n\n"
print "Baslangictaki bakiye? "; bal = read()
bal /= 1
print "\n"
while (1) {
"su anki bakiye = "; bal
"cekilecek miktar? "; trans = read()
if (trans == 0) break;
bal -= trans
bal /= 1
}
quit
Asagidaki ornekte ise, kendi kendini cagiran bir faktoriyel hesaplama
islevi tanimlanmaktadir.
define f (x) {
if (x <= 1) return (1);
return (f(x-1) * x);
}
READLINE ve LIBEDIT SE,CENEKLERI
GNU bc (bir yapilandirma secenegi ile), GNU readline kutuphanesini ya
da BSD libedit kutuphanesini kullanacak sekilde derlenebilir. Bu ise
kullaniciya, bc'ye gondermeden once birden cok satir uzerinde duzenleme
yapma imkani sunar. Ayrica, daha onceden girilen satirlar icin bir
gecmis de tutar. Bu secenek secilirse, bc bir ozel degiskene daha sahip
olur. Bu ozel history degiskeni, bellekte tutulacak satir sayisini
tutar. -1 degeri sinirsiz (bellek yettigi muddetce) sayida eski komut
tutulacagini belirtir ve varsayilan degeri 100'dur. Eger pozitif bir
tamsayi belirtilirse, liste bu belirtilen sayi ile sinirlandirilmis
olur. 0 degeri ise liste tutulmayacagini belirtir.
Daha ayrintili bilgi icin, GNU readline, history kutuphanesi ile BSD
libedit kutuphanesi hakkindaki belgeleri okuyunuz. bc, readline ve
libedit kutuphaneleri ayni anda etkin olacak sekilde derlenemez.
FARKLILIKLAR
bc'nin bu surumu, POSIX P1003.2/D11 taslagindan uyarlanmistir ve
taslaga gore ve geleneksel bc uygulamalarina gore bir takim
farkliliklar sozkonusudur. dc(1)kullanilan geleneksel yolla
gerceklestirilmemistir. Bu surum, yazilimin kodlarini ayristirarak bayt
koda cevirdikten sonra tek bir surec olarak calistirir. Komut
satirindan verilen ve belgelendirilmemis -c secenegi ile, yazilim
calistirilmaz, onun yerinee bayt kodlari ekrana listelenir. Bu, aslinda
etkilesimli olarak ayristiricinin hatalarini gormek/gidermek ve math
kutuphanesini hazirlamak icin kullanilir.
POSIX bc'deki farkliliklarin yaninda bir de yeni ozellikler
eklenmistir, bunlara da genisletmeler demekteyiz. Asagida, bahsedilen
farkliliklarin ve genisletmelerin bir listesi yer almaktadir:
LANG Bu surum LANG ve LC_ ile baslayan ortam degiskenlerinin
islenmesinde POSIX standardina uyumlu degildir.
isimler
Geleneksel ve POSIX bc degiskenler, diziler ve islevler icin
sadece tek harften olusan isimleri mumkun kilar. GNU bc'de bu
isimler icin cok karakterli isimler kullanilabilir. Bir isim bir
harf ile baslar ve harfler, rakamlar ile altcizgi karakterini
icerebilir.
dizgeler
Dizgelerde bos karakter kullanilmasina izin verilmez, POSIX'e
gore dizgelerde tum karakterler kullanilabilmelidir.
last POSIX bc'de bir last degiskeni yoktur. bc'nin bazi
gerceklemelerinde bunun yerine nokta (.) kullanilir.
karsilastirmalar
POSIX bc'de karsilastirmalar sadece if, while deyimlerinde ve
for deyiminin ikinci ifadesinde kullanilabilir. Ayrica bu
deyimlerde sadece bir iliskisel isleme izin verilir.
if deyimi ve else sozcugu
POSIX bc'de else sozcugu yoktur.
for deyimi
POSIX bc'de tum ifadelerin deyim icinde kullanilmasi gereklidir.
&&, ||, !
POSIX bc'de mantiksal islecler yoktur.
read islevi
POSIX bc'de read islevi yoktur.
print deyimi
POSIX bc'de print deyimi yoktur.
continue deyimi
POSIX bc'de continue deyimi yoktur.
return deyimi
POSIX bc, return ifadesinin parantez icine alinmasini
gerektirir.
dizi parametreler
POSIX bc'de (simdilik) dizi parametreler tamamen
desteklenmemektedir. POSIX sozdiziminde, islev tanimlarinda
dizilere izin veriliyor, ancak bir dizinin bir isleve parametre
olarak aktarilmasi desteklenmiyor. (Bu, aslinda gozden kacan bir
dikkatsizligin sonucudur.) Geleneksel bc gerceklemeleri,
dizileri sadece elemanlarinin degerleri ile
cagirabilmektedirler.
islev bicimi
POSIX bc ilk kasli ayracin define anahtar sozcugunun bulundugu
satirda, auto anahtar sozcugunun de alt satirinda olmasini
gerektirir.
=+, =-, =*, =/, =%, =^
POSIX bc bu "eski tarz" atama isleclerinin tanimlanmasini
gerektirmez. Bu surum bu "eski tarz" atamalara izin verebilir.
limits deyimini kullanarak kurulu surumun bu atamalari
desekleyip desteklemedigini ogrenebilirsiniz. Eger
destekliyorsa, "a =- 1" atamasinda a degiskenine -1 atanmayacak,
a degiskeninin degeri bir eksiltilecektir.
sayilardaki bosluklar
bc'nin diger gerceklemeleri sayilarin icinde bosluklara izin
verir. "x=1 3" atamasi, "x=13" olarak degerlendirilecektir.
Ayni ifade bu surumde bir sozdizimi hatasina sebep olacaktir.
calistirma ve hatalar
Bu bc, yazilim icerinde sozdizimi ve diger hatalarin bulunmasi
durumunda kodun isletilmesi konusunda diger gerceklemelere gore
oldukca farkliliklar icermektedir. Eger bir islev tanimlarken
bir sozdizimi hatasi yapilmissa, hata duzeltme mekanizmasi
deyimin baslangicini bulmaya calisir, ilk hatali satiri bulur ve
satir numarasini ekrana yazar; sonra yine de islevin geri kalan
kisimlarini ayristirmaya devam eder. Islev icinde birkez bile
hata yapilmissa, o islev 'cagrilamaz' addedilir ve tanimsiz
olur.
Etkilesimli ortamda calisirken bir sozdizimi hatasi yapilirsa,
bir uyari gelir ve calistirilacak olan o anki blok gecersiz
sayilir. Isletim blogu, yazilisi tamamlanmis basit veya birlesik
bir deyimden sonra satirsonu karakteri bulunan yapidir. Ornegin,
a = 1
b = 2
iki ayri isletim blogudur. Ancak,
{ a = 1
b = 2 }
tek isletim blogudur. Olusan herhangi bir calisma ani hatasi
(error), o anki isletim blogunu sonlandirir. Ancak, olusan
herhangi bir calisma ani uyarisi (warning) isletim blogunu
sonlandirmaz.
kesmeler
Bir etkilesimli oturumda, SIGINT sinyali (genelde klavyeden
Ctrl-C'ye basildiginda uretilir) o anda isletilmekte olan
blogun yarida kesilmesine neden olur. Hangi islevin yarida
kesildigini belirten bir calisma ani hatasi ekrana yazdirilir.
Ardindan, tum calisma ani yapilarinin "temizlenme"sinin
ardindan, bc'nin yeni girdiler almak icin hazir oldugunu yazan
bir mesaj belirir. Onceden tanimlanmis olan tum islevler ve
auto-olmayan degiskenler bu noktadan onceki degerleriyle aynen
kalirlar. Tum auto degiskenler ve islev parametreleri bu
"temizleme" islemi esnasinda silinirler. Etkilesimli olmayan bir
oturumda ise SIGINT sinyali,bc'nin calismasini sonlandirarak
kontrolu sisteme devredecektir.
SINIRLAR
Asagida bc'nin islem yapabilecegi sinirlar verilmistir. Bunlardan
bazilari aslinda her bir kurulum icin farkli farkli olabilir. Bunlarin
gecerli degerlerini ogrenmek icin limits deyimini kullanin.
BC_BASE_MAX
Azami cikti tabani, 999 dur. Azami girdi tabani ise 16 dir.
BC_DIM_MAX
Dizilerde indisleme siniri, keyfi olarak 65535 olarak
belirlenmistir. Kurulumunuzda farkli olabilir.
BC_SCALE_MAX
Sayilarda ondalik noktadan sonraki hane sayisi INT_MAX ile
sinirlanmistir. Ayrica ondalik noktadan onceki hane sayisi da
INT_MAX ile sinirlanmistir.
BC_STRING_MAX
Dizgelerin icerebilecegi karakter sayisi INT_MAX ile
sinirlanmistir.
us Ustel degerlerde ussun siniri LONG_MAX'tir.
degisken isimleri
Basit degisken, dizi ve islev isimlerinin her biri icin essiz
isim sayisi 32767 ile sinirlanmistir.
ORTAM DEGI,SKENLERI
bc tarafindan taninan ortam degiskenleri sunlardir:
POSIXLY_CORRECT
-s secenegi ile aynidir.
BC_ENV_ARGS
Bu, bc'nin argumanlari almak icin kullandigi diger bir
mekanizmadir. Bicimi komut satiri argumanlarinda oldugu gibidir.
Bu argumanlar, belirtilen dosyalardan once islem gorurler. Bu,
kullaniciya "standart" secenekleri ayarlama imkanini sunar.
Ortam degiskenlerinde belirtilen dosyalar tipik olarak iclerinde
kullanicinin tanimladigi islevler olan dosyalardir. Bu ayarlama
ile artik, bc her calistirildiginda belirtilen dosyalar isleme
sokulurlar.
BC_LINE_LENGTH
Bu, sayilar ekrana yazdirilirken bir satirda kac karakter
olacagini belirten bir tamsayidir. Uzun (yani, tek satira
sigmayan) sayilar icin \ (tersbolu) ve satirsonu karakterleri bu
miktara dahildir.
HATA AYIKLAMA
Eger komut satirinda belirtilen dosyalardan biri acilamazsa bc bunu
raporlar ve hemen sonlanir. Ayrica, derleme ve calisma-ani hatalarinda
bunlar ekrana hata numaralari ile birlikte yazdirilirlar ve bu esnada
aciklayici bilgiler verilir.
YAZILIM HATALARI
Hata bulma/duzeltme henuz cok iyi degil.
Hatalari rapor etmek icin konu alanina "bc" yazarak <bug-bc (at)
gnu.org> adresine e-posta atiniz.
YAZAN
Philip A. Nelson <philnelson (at) acm.org>
TE,SEKK"URLER
Yazar kodun sinanmasindaki genis yardimlarindan dolayi Steve Sommars'a
<Steve.Sommars (at) att.com> tesekkurlerinin kabulunu rica ediyor. Bir
cok oneride bulundu ve onun katilimiyla bu cok daha iyi bir urun oldu.
,CEVIRENLER
Adem Gunes <adem (at) alaeddin.cc.selcuk.edu.tr>, Eylul 1999, v1.04
Nilgun Belma Buguner <nilgun (at) belgeler.gen.tr>, Ocak 2004, v1.06
bc v1.06 12 Eylul 2000 bc(1)