BC(1) | Kullanıcı Komutları | BC(1) |
bc - Keyfî duyarlılıkta hesaplama dili
bc, girilen deyimleri işleterek keyfi uzunlukta ve duyarlılıktaki sayılar üzerinde matematiksel işlemler yapmaya imkan sağlayan etkileşimli bir ortam ve bir yazılım geliştirme dilidir. Sözdizimi açısından C yazılım geliştirme dilini andıran bazı benzerlikler vardır. Komut satırından belirtmek suretiyle kullanabileceğimiz standart bir math kütüphanesine sahiptir. Eğer gerekli ise; math kütüphanesi, belirtilen dosyalardan daha önce ele alınır. bc işleme tabi tutarken dosyaları komut satırında belirtilen sıraya göre ele alır. Belirtilen dosyaların tümü ele alınıp işlendikten sonra, standart girdiden girişler okunmaya başlar. Kodlar nasıl okunuyorlarsa bu halleriyle işletilirler. (Eğer belirtilen dosyalardan herhangi birinde bc’yi sonlandıracak bir komut yer alırsa, bc sonlanır, bir daha standart girdiden okuyamaz.)
bc’nin bu sürümü, geleneksel bc uygulamalarına ve POSIX taslak standardına göre bazı genişletmeler içermektedir. Komut satırı seçenekleri, bu genişletmelerin bir uyarı çıktılamasına veya reddedilmesine neden olabilir. Bu belge, bu işlemci tarafından kabul edilen dili açıklar. Genişletmeler yeri gelince açıklanacaktır.
bc’deki en temel eleman sayılardır. Sayılar keyfi duyarlılıkta ifade edilirler. Yani bc’de bir sayı, tamsayı kısım ve ondalık kısım olarak ifade edilir. Tüm sayılar normalde iç hesaplamalarda onluk tabanda ele alınırlar ve tüm işlemler onluk tabanda gerçekleştirilir. (Bu sürüm, bölme ve çarpma işlemlerinde sayıların ondalık kısımlarını belli uzunluktan sonra kesmektedir.) bc’de sayıların iki özelliği vardır: uzunluk ve bölüntü. Uzunluk, sayıdaki tüm anlamlı rakamların, bölüntü ise ondalık noktadan sonraki rakamların adedidir. Örneğin:
.000001 sayısının uzunluğu 6 ve bölüntüsü 6’dır. 1935.000 sayısının uzunluğu 7 ve bölüntüsü 3’tür.
Sayılar iki farklı türde değişken olarak saklanabilirler: basit değişkenler ve diziler. Her iki değişken türü için de değişkenlere birer ad verilir. Değişken isimleri bir harfle başlarlar ve sonrasında harfler, rakamlar ve altçizgi karakteri içerebilirler. Tüm harfler küçük harf olmak zorundadır. (Abece-sayısal uzun isimler bir genişletmedir. Çünkü, POSIX bc’de değişken isimleri tek bir küçük harften ibaretttir.) Dizi değişkenleri ise isimden sonra [] (köşeli ayraç) alırlar.
bc’de dört tane özel değişken vardır. Bunlar; scale, ibase, obase ve last’dır. scale, işlemlerde ondalık noktadan sonra kaç tane rakamın kullanılacağını belirtir. Öntanımlı scale değeri 0’dır. ibase (input base) ve obase (output base) değişkenleri, girdi ve çıktı için sayı tabanlarını belirtir. Örneğin, ibase=10 ve obase=2 olursa sayılar onluk tabanda girilir ve sonuçlar ekrana ikilik tabanda yazdırılır. ibase ve obase için öntanımlı değer 10’dur. last değişkeni (bu bir genişletmedir) ise, en son ekrana yazdırılan sayıyı içeren bir değişkendir. Bu değişkenlere yeni değerler atanabilir. Bunlar ileride daha ayrıntılı olarak ele alınacaktır.
bc’de açıklama satırları /* karakterleri ile başlar ve */ karakterleri ile biter. Açıklamalar herhangi bir yerde başlayabilir ve girdide tek bir boşluk olarak ele alınır. (Yani, bu da açıklamaların girdi elemanları arasında bir ayraç olarak yorumlandığını gösterir. Dolayısıyla, bir değişken ismi içerisinde açıklama yer alamaz.) Açıklamalar sınırlarını belirleyen karakterler arasında satırsonu karakteri içerebilir.
Ayrıca bc’de betiklerin kullanılmasını sağlamak için tek satırlık açıklamalar desteklenmektedir ve bu bir genişletmedir. Tek satırlık açıklama # karakterinden sonra başlar ve satır sonuna kadar devam eder. Satırsonu karakteri açıklamaya dahil değildir ve normal karakter olarak ele alınır.
Sayılar, ifadelerle ve deyimlerle birlikte kullanılırlar. Bu dil, etkileşimli bir çalışma ortamı olarak tasarlandığı için deyimler ve ifadeler de etkileşimli olarak işletilebilir. bc’de ’main’ yordam kavramı yoktur. Bunun yerine kod, rastlandıkları sırayla hemen yorumlanarak işletilir. (İşlevler, önce tanımlanırlar ve sonradan kullanılabilir - ileride ele alınacaktır).
En basit ifade bir ’sabit’tir. bc, ibase değişkeniyle belirtilen o anki girdi tabanını kullanarak sayıyı dahili onluk tabana çevirir. (Ancak, işlevler için bir istisna vardır.) ibase değişkeninin geçerli değerleri 2’den 36’ya kadardır (16’dan sonrası genişletmedir). Sayılar girilirken, 0-9 arası rakamlar ve (ascii) A-Z arası harfler ile kullanılabilir. (Dikkat: A-Z büyük harf olmalıdır. Çünkü, küçük harfler değişkenler için kullanılıyor.) Tek rakamlı sayılar, ibase ne olursa olsun, her zaman rakamın ifade ettiği değere sahip olurlar (örn, A = 9)). bc çok rakamlı sayılarda, ibase değerine eşit veya daha büyük rakamları ibase-1 değeriyle ele alarak sayının değerini hesaplar. Bu ZZZ sayısını daima, girdi tabanındaki 3 haneli en büyük sayı yapar.
İfadeler, diğer yüksek-düzeyli dillerdekilere oldukça benzer. bc’de sayılar için farklı türler olmadığı için karışık türler için kurallar yoktur. Bunun yerine, sadece ifadelerin bölüntüleri için kurallar vardır. Her ifadenin bir bölüntüsü vardır. Bu, özgün sayıların bölüntülerinden, gerçekleştirilen işlemden ve çoğu durumda da scale değişkeninin değerinden elde edilir. scale değişkeninin alabileceği değerler, 0 ile C’deki tamsayı türü ile ifade edilebilen en büyük tamsayı aralığındadır.
Aşağıdaki geçerli ifadelerin açıklamalarında "ifade" eksiksiz bir ifadeyi ve "değişken" ise sıradan bir değişkeni veya bir dizi değişkenini göstermektedir. Bir basit değişken
isim
isim[ifade]
İlişkisel ifadeler (karşılaştırma ifadeleri), sonuçları her zaman 0 veya 1 olan özel ifadelerdir. 0 yanlış (false) ve 1 doğru (true) olarak yorumlanır. Bunlar herhangi bir ifade içerisinde yer alabilir. (POSIX bc’de ise ilişkisel ifadeler sadece if, while ve for deyimlerinde kullanılabilir ve sadece bir tane ilişkisel sınama olabilir.) İlişkisel işleçler şunlardır:
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:
İşleçlerin işlem öncelik sırası şöyledir (küçükten büyüğe):
|| işleci, soldan ilişkilendirmeli && işleci, soldan ilişkilendirmeli ! işleci, ilişkilendirme yok İlişkisel işleçler, soldan ilişkilendirmeli Atama işleci, sağdan ilişkilendirmeli + ve - işleci, soldan ilişkilendirmeli *, / ve % işleci, soldan ilişkilendirmeli ^ işleci, sağdan ilişkilendirmeli tek terimli - işleci, ilişkilendirme yok ++ ve -- işleci, ilişkilendirme yok
a = 3 < 5
bc’de desteklenen biraz daha özel ifadeler vardır. Bunlar, standart işlevler ve kullanıcı tanımlı işlevlerde, "isim(değişkenler)" şeklinde görülmektedirler. Ayrıntılı bilgi için İŞLEVLER bölümündeki kullanıcı tanımlı işlevlere bakınız. Yerleşik işlevler şunlardır:
Deyimler, çoğu cebirsel dilde olduğu gibi, ifadelerin sırayla değerlendirilmelerini sağlarlar. bc’de deyimler "mümkün olduğunca" yürütülür. Yürütme, bir ya da daha fazla tam deyimden sonra bir satır sonu karakteri girildiğinde gerçekleşir. Yürütmenin anında gerçekleşmesi bakımdan bc’de satır sonu karakterleri çok önemlidir. Aslında, deyimleri ayırmak için bir noktalı virgül ve bir satır sonu karakteri gerekir. Yanlış yerde kullanılmış bir satır sonu karakteri bir sözdizimi hatasına sebep olur. Satır sonu karakteri deyimler için bir ayraç olduğundan, bir satırsonu karakterini gizlemek için ters eğik çizgi kullanılabilir. Ters eğik çizgiden sonra gelen bir satır sonu karakterinden oluşan karakter çiftini bc boşluk karakteri olarak değerlendirir. Bir deyim listesi, noktalı virgül ve satır sonu karakteri ile sonlandırımış deyimlerden oluşur. Aşağıdaki listede bc’deki deyimler ve bunların ne yaptıkları anlatılmaktadır (Köşeli ayraçlar ([ ]) arasına alınanlar, deyimin isteğe bağlı kısımlarıdır.):
2 ile 16 arasındaki tabanlar için çıktı bildiğimiz yöntemle yazdırılır. 16’dan daha büyük tabanlar için ise, bc her bir haneyi yazdırmak için 10’luk tabanda birden çok karakter kullanır ve haneler arasında boşluk bırakır. Her hane, obase-1 değerini 10’luk düzende yazmak için gereken sayıda rakamdan oluşur. Örneğin, obase=20 için 65 sayısı ekrana "03 05" şeklinde yazdırılır.
Sayılar keyfi duyarlılıkta ele alındıkları için, bazı sayılar ekrana yazdırılırken tek bir satıra sığmayabilirler. Bu durumda satırların sonuna "\" (ters eğik çizgi) karakteri gelir. Her satırda en fazla 70 karakter yazdırılabilir.
bc’nin etkileşimli doğasından dolayı yazılan en son değer, özel last değişkeninde saklanır, böylece aynı sayıyı bir daha elde etmek için bir önceki ifade’yi tekrar yazmaya gerek kalmaz. last değişkenine atama yapılabilir ve atanan değer son yazılan değerin üzerine yazılır. Yeni atanan değer, yeni bir değer ekrana yazılana kadar ya da last değişkenine yeni bir atama yapılana kadar geçerli kalır. (Bazı kurulumlar last için bir kısaltma olarak bir sayının parçası olmayan tek bir nokta (.) kullanımını mümkün kılabilir.)
ifade1; while ( ifade2 ) { deyim; ifade3; }
Yardımcı deyimler, bildiğimiz klasik anlamda işletilebilir deyimler değildirler. Bunlar "derleme" sırasında ele alınırlar.
İşlevler, daha sonra çalıştırılmak üzere hesaplamaların tanımlandığı bir yöntem sunar. bc’deki işlevler daima bir değer hesaplayıp bunu çağrıcıya döndürürler. İşlev tanımları girdide saptanana kadar bir işlev tanımsızdır. Bu tanımlama, aynı isimde yeni bir işlev tanımlanıncaya kadar geçerlidir. Yeni işlev tanımı eskisinin yerine geçer. Bir işlev aşağıdaki gibi tanımlanır.
define isim ( değişkenler ) { satırsonu auto_listesi deyim_listesi }
girdiler sayı ya da dizi olabilir (dizi girdiler bir genişletmedir). İşlev tanımında sıfır ya da daha fazla sayıda girdi olabilir ve bunlar aralarına virgül konularak ayrılmış isimlerden oluşan bir liste olarak tanımlanır. Sayılar sadece değerleriyle aktarılan girdilerdir. Diziler ise sadece değişkenleriyle aktarılır. Dizi değişkenleri "isim[]" şeklinde belirtilir. İşlev çağrısında asıl girdiler, sayı türünde ifadelerdir. Aynı yazım şekli, dizi değişkenleri üzerinden dizilerin aktarılmasında da kullanılır. Bir isimli dizi bir işleve değişkeni ile aktarılır. İşlev tanımları dinamik olduklarından, girdi sayısı ve türleri işlev çağrıldığında değerlendirilir. Girdilerin sayısı ve türlerindeki herhangi bir uyumsuzluk bir çalışma anı hatasına sebep olur. Ayrıca, tanımsız bir işlevin çağrılması da bir çalışma anı hatasına sebep olacaktır.
auto_listesi, "yerel" kullanım için isteğe bağlı bir değişken listesidir. auto_listesi’nin (eğer varsa) sözdizimi "auto isim, ... ;" şeklindedir (Sondaki noktalı virgül isteğe bağlıdır). Her isim auto değişkenin ismidir. Diziler, değişkenlerde kullanılan sözdizimi ile belirtilebilir. Bu değişkenler sıfır ile ilklendirilerek, değerleri, işlevin başlangıcında yığıta basılır ve işlevin icrası boyunca kullanılır. İşlevden çıkışta bu değerler yığıttan çekilir, böylece değişkenler işlevin başlangıcındaki ilk değerlerine dönmüş olur. Bunlar gerçekte, işlev çağrısı sırasında ilklendirilen auto değişkenlerdir. auto değişkenler, geleneksel yerel değişkenlerden farklıdır. A işlevi, B işlevini çağırdığında, A işlevinin auto değişkenlerine, B işlevinde auto değişkenler olarak bildirilmedikçe, B işlevi aynı isimlerle erişebilir. auto değişkenler ve işlev değişkenleri yığıta basıldıklarından dolayı bc kendini çağıran işlevleri destekler.
İşlevin gövdesi bir bc deyimleri listesidir. Tekrar belitelim, deyimler noktalı virgül ve satır sonu karakterleri ile birbirlerinden ayrılır. return deyimi işlevin sonlandırılmasına sebep olur ve bir değer döndürür. return deyiminin iki sürümü vardır. ilk şeklinde "return" ifadesi işlevi çağıran ifadeye sıfır değerini döndürür. İkinci şeklinde, "return ( ifade )", ifade’nin değeri hesaplanıp çağıran ifadeye sonucu döndürülür. Her işlevin sonunda kendiliğinden bir return(0) vardır. Böylece bir işlevin sonunda açıkça bir return deyimi kullanmaya gerek kalmaksızın işlev sıfır değeri döndürerek sonlanır.
İşlevler ayrıca, ibase değişkeninin kullanımını da değiştirir. İşlev gövdesindeki tüm sabitler, işlev çağrısı sırasında ibase değişkeninin değeri kullanılarak dönüştürülür. Sayıların dönüşümü için daima ibase’in o anki değerini kullanan yerleşik read işlevi dışında, işlev icrası sırasında ibase değişiklikleri gözardı edilir.
Bir geliştirme olarak, tanım biçimi pek az esnektir. Standart, işlev gövdesini oluşturan ilk kuyruklu ayracın define ile aynı satırda olmasını ve kalan her şeyin alt satırlarda olmasını gerektirir. bc’nin bu sürümü, ilk kaşlı ayraçın öncesinde ya da sonrasında satır sonu karakteri kullanabilmeyi mümkün kılar. Örneğin aşağıdakiler geçerli tanımlardır:
define d (n) { return (2*n); } define d (n) { return (2*n); }
define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<---
Ayrıca, değişken dizisi içeren çağrı da eklendi. Değişken dizisi içeren çağrıyı bildirmek için işlev tanımındaki dizi değişkeni "*isim[]" sözdizimi ile kullanılır. Dizideki değişkenlerin değerleriyle çağrılması nedeniyle işlev çağrısı aynı kalır.
bc, -l seçeneği ile çalıştırıldığında math kütüphanesini yükler ve öntanımlı bölüntü 20 yapılır. math işlevleri, çağrıldıkları sırada geçerli olan bölüntüye göre sonuç döndürürler. Math kütüphanesi aşağıdaki işlevleri tanımlar:
/bin/sh’da aşağıdaki atama, kabuk değişkeni pi’ye pi değerini atar.
pi=$(echo "scale=10; 4*a(1)" | bc -l)
scale = 20 /* e^x = (e^(x/2))^2 formülü kullanılıyor x yeterinde küçükse, bu seriyi kullanabiliriz: e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* x pozitif olmalı. */ if (x<0) { m = 1 x = -x } /* x için önkoşul. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* Değişkenleri ilklendirelim. */ v = 1+x a = x d = 1 for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } }
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
define f (x) { if (x <= 1) return (1); return (f(x-1) * x); }
GNU bc (bir yapılandırma seçeneği ile), GNU readline girdi düzenleme kütüphanesini ya da BSD libedit kütüphanesini kullanacak şekilde derlenebilir. Bu ise kullanıcıya, bc’ye göndermeden önce birden çok satır üzerinde düzenleme yapma imkanı sunar. Ayrıca, daha önceden girilen satırlar için bir geçmiş de tutar. Bu seçenek seçilirse, bc bir özel değişkene daha sahip olur. Bu özel history değişkeni, bellekte tutulacak satır sayısını tutar. -1 değeri sınırsız (bellek yettiği müddetçe) sayıda eski komut tutulacağını belirtir ve öntanımlı değeri 100’dür. Eğer pozitif bir tamsayı belirtilirse, liste bu belirtilen sayı ile sınırlandırılmış olur. 0 değeri ise liste tutulmayacağını belirtir.
Daha ayrıntılı bilgi için, GNU readline, history ve BSD libedit kütüphanesi hakkındaki belgeleri okuyunuz. bc, readline ve libedit kütüphaneleri aynı anda etkin olacak şekilde derlenemez.
bc’nin bu sürümü, POSIX P1003.2/D11 taslağından uyarlanmıştır ve taslağa göre ve geleneksel bc uygulamalarına göre bir takım farklılıklar sözkonusudur. dc(1) kullanılan geleneksel yolla gerçekleştirilmemiştir. Bu sürüm, yazılımın kodlarını ayrıştırarak bayt koda çevirdikten sonra tek bir süreç olarak çalıştırır. Komut satırından verilen ve belgelendirilmemiş -c seçeneği ile yazılım çalıştırılmaz, onun yerine bayt kodları ekrana listelenir. Bu, aslında etkileşimli olarak ayrıştırıcının hatalarını görmek/gidermek ve math kütüphanesini hazırlamak için kullanılır.
POSIX bc’den asıl farklılıklar, bir özelliğin daha fazla işlevsellik eklemek için genişletildiği genişletmeler ve yeni özelliklerin eklendiği eklemelerdir. Aşağıda,eklemelerin ve genişletmelerin bir listesi yer almaktadır:
Etkileşimli ortamda çalışırken bir sözdizimi hatası yapılırsa, bir uyarı gelir ve çalıştırılacak olan o anki küme geçersiz sayılır. İşletim kümesi, yazılışı tamamlanmış basit veya birleşik bir deyimden sonra satırsonu karakteri bulunan yapıdır. Örneğin,
a = 1 b = 2
{ a = 1 b = 2 }
Aşağıda bu bc’nin işlem yapabileceği sınırlar verilmiştir. Bunlardan bazıları aslında her bir kurulum için farklı farklı olabilir. Bunların geçerli değerlerini öğrenmek için limits deyimini kullanın.
bc tarafından tanınan ortam değişkenleri şunlardır:
Eğer komut satırında belirtilen dosyalardan biri açılamazsa bc bunu bildirir ve hemen sonlanır. Ayrıca, derleme ve çalışma-anı hatalarında bunlar ekrana hata numaraları ile birlikte yazdırılır ve bu esnada açıklayıcı bilgiler verilir.
Hata bulma/düzeltme henüz çok iyi değil.
Hataları bildirmek için konu alanına "bc" yazarak <bug-bc (at) gnu.org> adresine e-posta atınız.
Philip A. Nelson tarafından yazılmıştır.
Telif hakkı © 2017 Free Software Foundation, Inc. Lisans GPLv3+: GNU GPL sürüm 3 veya üstü <http://gnu.org/licenses/gpl.html> Bu bir özgür yazılımdır: yazılımı değiştirmek ve dağıtmakta özgürsünüz. Yasaların izin verdiği ölçüde HİÇBİR GARANTİ YOKTUR.
Yazar kodun sınanmasındaki geniş yardımlarından dolayı Steve Sommars’a teşekkürlerinin kabulünü rica ediyor. Bir çok öneride bulundu ve onun katılımıyla bu çok daha iyi bir ürün oldu.
© 1999 Adem Güneş
© 2004, 2022 Nilgün Belma Bugüner
Bu çeviri özgür yazılımdır:
Yasaların izin verdiği ölçüde
HİÇBİR GARANTİ YOKTUR.
Lütfen, çeviri ile ilgili bildirimde bulunmak veya çeviri
yapmak için https://github.com/TLBP/manpages-tr/issues adresinde
"New Issue" düğmesine tıklayıp yeni
bir konu açınız ve isteğinizi belirtiniz.
11 Haziran 2006 | GNU bc 1.07.1 |