bc - manual referensi, opsi, contoh perintah


NAMA

bc - Bahasa kalkulator presisi sewenang-wenang

SINTAKSIS

bc [ -hlwsqv ] [long-options] [ file ... ]

KETERANGAN

bc adalah bahasa yang mendukung angka presisi arbitrer dengan eksekusi pernyataan interaktif. Ada beberapa kesamaan sintaks dengan bahasa pemrograman C. Pustaka matematika standar tersedia dengan opsi baris perintah. Jika diminta, pustaka matematika ditentukan sebelum memproses file apa pun. bc dimulai dengan memproses kode dari semua file yang tercantum pada baris perintah dalam urutan yang tercantum. Setelah semua file diproses, bc membaca dari input standar. Semua kode dieksekusi saat dibaca. (Jika file berisi perintah untuk menghentikan prosesor, bc tidak akan pernah membaca dari input standar.)

Versi bc ini berisi beberapa ekstensi di luar penerapan tradisional bc dan standar draf POSIX. Opsi baris perintah dapat menyebabkan ekstensi ini mencetak peringatan atau ditolak. Dokumen ini menjelaskan bahasa yang diterima oleh prosesor ini. Ekstensi akan diidentifikasi seperti itu.

PILIHAN

-h, --help

Cetak penggunaan dan keluar.

-i, --interactive

Paksa mode interaktif.

-l, --mathlib

Tentukan pustaka matematika standar.

-w, --warn

Berikan peringatan untuk ekstensi ke POSIX bc.

-s, --standard

Memproses persis bahasa bc POSIX.

-q, --quiet

Jangan cetak sambutan GNU bc normal.

-v, --version

Cetak nomor versi dan hak cipta dan keluar.

ANGKA

Elemen paling dasar dalam bc adalah angka. Angka adalah angka presisi arbitrer. Ketepatan ini ada di bagian bilangan bulat dan bagian pecahan. Semua angka direpresentasikan secara internal dalam desimal dan semua perhitungan dilakukan dalam desimal. (Versi ini memotong hasil dari operasi pembagian dan perkalian.) Ada dua atribut angka, panjang dan skala. Panjangnya adalah jumlah digit desimal yang digunakan oleh bc untuk mewakili angka dan skala adalah jumlah digit desimal setelah titik desimal. Misalnya:

 .000001 has a length of 6 and scale of 6.
 1935.000 has a length of 7 and a scale of 3.

VARIABEL

Angka disimpan dalam dua jenis variabel, variabel sederhana dan array. Variabel sederhana dan variabel array diberi nama. Nama dimulai dengan huruf diikuti dengan sejumlah huruf, angka, dan garis bawah. Semua huruf harus huruf kecil. (Nama lengkap alfanumerik adalah ekstensi. Dalam POSIX bc semua nama adalah satu huruf kecil.) Tipe variabel jelas dengan konteksnya karena semua nama variabel array akan diikuti dengan tanda kurung ([]).

Ada empat variabel khusus, skala, ibase, obase, dan terakhir. skala menentukan bagaimana beberapa operasi menggunakan angka setelah titik desimal. Nilai default scale adalah 0. ibase dan obase menentukan basis konversi untuk angka input dan output. Default untuk masukan dan keluaran adalah basis 10. terakhir (ekstensi) adalah variabel yang memiliki nilai angka terakhir yang dicetak. Ini akan dibahas secara lebih rinci jika sesuai. Semua variabel ini mungkin memiliki nilai yang diberikan padanya serta digunakan dalam ekspresi.

KOMENTAR

Komentar di bc dimulai dengan karakter /* dan diakhiri dengan karakter */. Komentar dapat dimulai di mana saja dan muncul sebagai satu spasi di input. (Hal ini menyebabkan komentar membatasi item input lainnya. Misalnya, komentar tidak dapat ditemukan di tengah nama variabel.) Komentar menyertakan baris baru (akhir baris) antara awal dan akhir komentar.

Untuk mendukung penggunaan skrip untuk bc, satu baris komentar telah ditambahkan sebagai ekstensi. Komentar satu baris dimulai dengan karakter # dan berlanjut ke akhir baris berikutnya. Karakter baris akhir bukan bagian dari komentar dan diproses secara normal.

EKSPRESI

Angka-angka dimanipulasi oleh ekspresi dan pernyataan. Karena bahasa dirancang untuk interaktif, pernyataan dan ekspresi dieksekusi sesegera mungkin. Tidak ada program "utama". Alih-alih, kode dieksekusi saat ditemui. (Fungsi, dibahas secara rinci nanti, didefinisikan saat ditemui.)

Ekspresi sederhana hanyalah sebuah konstanta. bc mengonversi konstanta menjadi angka desimal internal menggunakan basis input saat ini, yang ditentukan oleh variabel ibase. (Ada pengecualian dalam fungsi.) Nilai legal ibase adalah 2 hingga 36. (Basis yang lebih besar dari 16 adalah ekstensi.) Menetapkan nilai di luar rentang ini ke ibase akan menghasilkan nilai 2 atau 36. Angka input dapat berisi karakter 0-9 dan A-Z. (Catatan: Mereka harus kapital. Huruf kecil adalah nama variabel.) Angka satu digit selalu memiliki nilai digit terlepas dari nilai ibase. (mis. A=10.) Untuk angka multi-digit, bc ubah semua digit masukan lebih besar atau sama dengan ibase menjadi nilai ibase-1. Ini membuat angka ZZZ selalu menjadi angka 3 digit terbesar dari basis input.

Ekspresi penuh mirip dengan banyak bahasa tingkat tinggi lainnya. Karena hanya ada satu jenis angka, tidak ada aturan untuk mencampur jenis. Sebaliknya, ada aturan tentang skala ekspresi. Setiap ekspresi memiliki skala. Ini berasal dari skala angka asli, operasi yang dilakukan dan dalam banyak kasus, nilai variabel skala. Nilai legal variabel skala adalah 0 hingga angka maksimum yang dapat diwakili oleh bilangan bulat C.

Dalam deskripsi ekspresi legal berikut, "expr" mengacu pada ekspresi lengkap dan "var" merujuk pada variabel sederhana atau array. Variabel sederhana hanyalah a

name

dan variabel array ditentukan sebagai

name[expr]

Kecuali secara khusus disebutkan skala hasilnya adalah skala maksimum dari ekspresi yang terlibat.

- expr

Hasilnya adalah negasi dari ekspresi.

++ var

Variabel bertambah satu dan nilai baru adalah hasil dari ekspresi.

-- var

Variabel dikurangi satu dan nilai baru adalah hasil dari ekspresi.

var ++

Hasil ekspresi adalah nilai variabel dan kemudian variabel bertambah satu.

var --

Hasil ekspresi adalah nilai dari variabel dan kemudian variabel tersebut dikurangi satu.

expr + expr

Hasil ekspresi adalah jumlah dari dua ekspresi.

expr - expr

Hasil ekspresi adalah perbedaan dari dua ekspresi.

expr * expr

Hasil ekspresi adalah produk dari dua ekspresi.

expr / expr

Hasil dari ekspresi adalah hasil bagi dari dua ekspresi. Skala hasil adalah nilai dari variabel skala.

expr % expr

Hasil ekspresi adalah "sisa" dan dihitung dengan cara berikut. Untuk menghitung a%b, a/b pertama dihitung ke digit skala. Hasil tersebut digunakan untuk menghitung a-(a/b)*b hingga skala maksimum skala+skala(b) dan skala(a). Jika skala disetel ke nol dan kedua ekspresi adalah bilangan bulat, ekspresi ini adalah fungsi sisa bilangan bulat.

expr ^ expr

Hasil ekspresi adalah nilai yang pertama dinaikkan ke yang kedua. Ekspresi kedua harus berupa bilangan bulat. (Jika ekspresi kedua bukan bilangan bulat, peringatan dihasilkan dan ekspresi dipotong untuk mendapatkan nilai bilangan bulat.) Skala hasilnya adalah skala jika pangkatnya negatif. Jika eksponennya positif, skala hasilnya adalah skala minimum dari ekspresi pertama dikalikan nilai eksponen dan maksimum skala dan skala ekspresi pertama. (misalnya scale(a^b)=min(scale(a)*b, max( scale, scale(a))).) Perlu dicatat bahwa expr^0 akan selalu mengembalikan nilai dari 1.

( expr )

Ini mengubah prioritas standar untuk memaksa evaluasi ekspresi.

var = expr

Variabel diberi nilai ekspresi.

var <op>= expr

Ini setara dengan "var=var expr" dengan pengecualian bahwa bagian "var" hanya dievaluasi sekali. Ini bisa membuat perbedaan jika "var" adalah sebuah array.

Ekspresi relasional adalah jenis ekspresi khusus yang selalu bernilai 0 atau 1, 0 jika relasinya salah dan 1 jika relasinya benar. Ini mungkin muncul dalam ekspresi hukum apa pun. (POSIX bc mensyaratkan bahwa ekspresi relasional hanya digunakan dalam pernyataan if, while, dan for dan hanya satu uji relasional yang dapat dilakukan di dalamnya.) Operator relasional adalah

expr1 < expr2

Hasilnya adalah 1 jika expr1 benar-benar kurang dari expr2.

expr1 <= expr2

Hasilnya adalah 1 jika expr1 kurang dari atau sama dengan expr2.

expr1 > expr2

Hasilnya adalah 1 jika expr1 lebih besar dari expr2.

expr1 >= expr2

Hasilnya adalah 1 jika expr1 lebih besar dari atau sama dengan expr2.

expr1 == expr2

Hasilnya adalah 1 jika expr1 sama dengan expr2.

expr1 != expr2

Hasilnya adalah 1 jika expr1 tidak sama dengan expr2.

Operasi Boolean juga legal. (POSIX bc TIDAK memiliki operasi boolean). Hasil dari semua operasi boolean adalah 0 dan 1 (untuk false dan true) seperti pada ekspresi relasional. Operator boolean adalah:

!expr

Hasilnya adalah 1 jika expr adalah 0.

expr && expr

Hasilnya adalah 1 jika kedua ekspresi bukan nol.

expr || expr

Hasilnya adalah 1 jika salah satu ekspresi bukan nol.

Prioritas ekspresi adalah sebagai berikut: (terendah ke tertinggi)

|| operator, left associative
&& operator, left associative
! operator, nonassociative
Relational operators, left associative
Assignment operator, right associative
+ and - operators, left associative
*, / and % operators, left associative
^ operator, right associative
unary - operator, nonassociative
++ and -- operators, nonassociative

Prioritas ini dipilih agar program bc yang sesuai dengan POSIX akan berjalan dengan benar. Ini akan menyebabkan penggunaan operator relasional dan logis memiliki beberapa perilaku yang tidak biasa saat digunakan dengan ekspresi penugasan. Pertimbangkan ungkapan:

a = 3 < 5

Sebagian besar pemrogram C menganggap ini akan memberikan hasil "3 < 5" (nilai 1) ke variabel "a". Apa yang dilakukan di bc adalah menetapkan nilai 3 ke variabel "a" dan kemudian membandingkan 3 dengan 5. Yang terbaik adalah menggunakan tanda kurung saat menggunakan operator relasional dan logika dengan operator penugasan.

Ada beberapa ekspresi khusus lainnya yang disediakan di bc. Ini ada hubungannya dengan fungsi yang ditentukan pengguna dan fungsi standar. Semuanya muncul sebagai "nama(parameter)". Lihat bagian tentang fungsi untuk fungsi yang ditentukan pengguna. Fungsi standarnya adalah:

length ( expression )

Nilai fungsi panjang adalah jumlah digit signifikan dalam ekspresi.

read ( )

Fungsi baca (ekstensi) akan membaca angka dari input standar, di mana pun fungsi tersebut terjadi. Hati-hati, hal ini dapat menyebabkan masalah pencampuran data dan program dalam input standar. Penggunaan terbaik untuk fungsi ini adalah dalam program yang ditulis sebelumnya yang memerlukan masukan dari pengguna, tetapi tidak pernah mengizinkan kode program untuk dimasukkan dari pengguna. Nilai fungsi baca adalah angka yang dibaca dari input standar menggunakan nilai saat ini dari variabel ibase untuk basis konversi.

scale ( expression )

Nilai fungsi skala adalah jumlah digit setelah titik desimal dalam ekspresi.

sqrt ( expression )

Nilai fungsi sqrt adalah akar kuadrat dari ekspresi. Jika ekspresinya negatif, kesalahan run time dihasilkan.

PERNYATAAN

Pernyataan (seperti dalam kebanyakan bahasa aljabar) memberikan urutan evaluasi ekspresi. Dalam bc pernyataan dieksekusi "sesegera mungkin." Eksekusi terjadi ketika baris baru ditemui dan ada satu atau lebih pernyataan lengkap. Karena eksekusi langsung ini, baris baru sangat penting dalam bc. Faktanya, titik koma dan baris baru digunakan sebagai pemisah pernyataan. Baris baru yang ditempatkan secara tidak benar akan menyebabkan kesalahan sintaksis. Karena baris baru adalah pemisah pernyataan, baris baru dapat disembunyikan dengan menggunakan karakter garis miring terbalik. Urutan "\", di mana adalah baris baru muncul ke bc sebagai spasi putih, bukan baris baru. Daftar pernyataan adalah serangkaian pernyataan yang dipisahkan oleh titik koma dan baris baru. Berikut ini adalah daftar pernyataan bc dan fungsinya: (Hal-hal yang diapit tanda kurung ([]) adalah bagian opsional dari pernyataan tersebut.)

expression

Pernyataan ini melakukan salah satu dari dua hal. Jika ekspresi dimulai dengan " ...", ini dianggap sebagai pernyataan penugasan. Jika ekspresi bukan pernyataan penugasan, ekspresi dievaluasi dan dicetak ke output. Setelah nomor dicetak, baris baru dicetak. Misalnya, "a=1" adalah pernyataan penugasan dan "(a=1)" adalah ekspresi yang memiliki penugasan tersemat. Semua angka yang dicetak dicetak di basis yang ditentukan oleh variabel obase. Nilai legal untuk obase adalah 2 hingga BC_BASE_MAX. (Lihat bagian BATAS.) Untuk basis 2 sampai 16, metode penulisan angka yang biasa digunakan. Untuk basis yang lebih besar dari 16, bc menggunakan metode digit multi-karakter untuk mencetak angka di mana setiap digit basis yang lebih tinggi dicetak sebagai bilangan berbasis 10. Digit multi-karakter dipisahkan oleh spasi. Setiap digit berisi jumlah karakter yang diperlukan untuk mewakili nilai basis sepuluh dari "obase-1". Karena angka memiliki presisi acak, beberapa angka mungkin tidak dapat dicetak pada satu baris keluaran. Angka-angka panjang ini akan dibagi menjadi beberapa baris menggunakan "\" sebagai karakter terakhir pada baris. Jumlah maksimum karakter yang dicetak per baris adalah 70. Karena sifat interaktif bc, mencetak angka menyebabkan efek samping dari penetapan nilai yang dicetak ke variabel khusus terakhir . Ini memungkinkan pengguna untuk memulihkan nilai terakhir yang dicetak tanpa harus mengetik ulang ekspresi yang mencetak nomor tersebut. Penetapan ke terakhir adalah sah dan akan menimpa nilai cetak terakhir dengan nilai yang ditetapkan. Nilai yang baru ditetapkan akan tetap ada hingga nomor berikutnya dicetak atau nilai lain ditetapkan ke terakhir. (Beberapa pemasangan mungkin mengizinkan penggunaan titik tunggal (.) yang bukan merupakan bagian dari angka sebagai notasi singkat untuk terakhir.)

string

String dicetak ke output. String dimulai dengan karakter petik ganda dan berisi semua karakter hingga karakter petik ganda berikutnya. Semua karakter diambil secara harfiah, termasuk baris baru apa pun. Tidak ada karakter baris baru yang dicetak setelah string.

print list

Pernyataan cetak (ekstensi) menyediakan metode output lain. "Daftar" adalah daftar string dan ekspresi yang dipisahkan dengan koma. Setiap string atau ekspresi dicetak dalam urutan daftar. Tidak ada baris baru terminasi yang dicetak. Ekspresi dievaluasi dan nilainya dicetak dan ditetapkan ke variabel terakhir. String dalam pernyataan cetak dicetak ke output dan mungkin berisi karakter khusus. Karakter khusus dimulai dengan karakter garis miring terbalik (\). Karakter khusus yang dikenali oleh bc adalah "a" (alert atau bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage kembali), "q" (kutip ganda), "t" (tab), dan "\" (garis miring terbalik). Karakter lain yang mengikuti garis miring terbalik akan diabaikan.

{ statement_list }

Ini adalah pernyataan majemuk. Ini memungkinkan beberapa pernyataan dikelompokkan bersama untuk dieksekusi.

if ( expression ) statement1 [else statement2]

Pernyataan if mengevaluasi ekspresi dan mengeksekusi pernyataan1 atau pernyataan2 tergantung pada nilai ekspresi. Jika ekspresi bukan nol, pernyataan1 dieksekusi. Jika pernyataan2 ada dan nilai ekspresi adalah 0, maka pernyataan2 dijalankan. (Klausa lain adalah ekstensi.)

while ( expression ) statement

Pernyataan while akan mengeksekusi pernyataan saat ekspresi bukan nol. Itu mengevaluasi ekspresi sebelum setiap eksekusi pernyataan. Pemutusan loop disebabkan oleh nilai ekspresi nol atau eksekusi pernyataan break.

for ( [expression1] ; [expression2] ; [expression3] ) statement

Pernyataan for mengontrol eksekusi berulang dari pernyataan tersebut. Expression1 dievaluasi sebelum loop. Ekspresi2 dievaluasi sebelum setiap eksekusi pernyataan. Jika bukan nol, pernyataan dievaluasi. Jika nol, loop dihentikan. Setelah setiap eksekusi pernyataan, ekspresi3 dievaluasi sebelum evaluasi ulang ekspresi2. Jika ekspresi1 atau ekspresi3 hilang, tidak ada yang dievaluasi pada saat mereka akan dievaluasi. Jika ekspresi2 hilang, itu sama dengan mengganti ekspresi2 dengan nilai 1. (Ekspresi opsional adalah ekstensi. POSIX bc memerlukan ketiga ekspresi.) Berikut ini adalah kode yang setara untuk pernyataan for:

expression1;
while (expression2) {
   statement;
   expression3;
}
break

Pernyataan ini menyebabkan keluarnya secara paksa pernyataan penutup while terbaru atau pernyataan for.

continue

Pernyataan continue (ekstensi) menyebabkan pernyataan terlampir terbaru untuk memulai iterasi berikutnya.

halt

Pernyataan halt (ekstensi) adalah pernyataan yang dieksekusi yang menyebabkan prosesor bc berhenti hanya ketika dieksekusi. Misalnya, "if (0 == 1) halt" tidak akan menyebabkan bc berhenti karena penghentian tidak dijalankan.

return

Mengembalikan nilai 0 dari suatu fungsi. (Lihat bagian tentang fungsi.)

return ( expression )

Mengembalikan nilai ekspresi dari suatu fungsi. (Lihat bagian tentang fungsi.) Sebagai ekstensi, tanda kurung tidak diperlukan.

PERNYATAAN PSEUDO

Pernyataan-pernyataan ini bukanlah pernyataan dalam pengertian tradisional. Mereka bukan pernyataan yang dieksekusi. Fungsi mereka dilakukan pada waktu "kompilasi".

limits

Cetak batas lokal yang diberlakukan oleh versi lokal bc. Ini adalah perpanjangan.

quit

Saat pernyataan keluar dibaca, prosesor bc dihentikan, di mana pun pernyataan keluar ditemukan. Misalnya, "if (0 == 1) quit" akan menyebabkan bc berhenti.

warranty

Cetak pemberitahuan garansi yang lebih lama. Ini adalah perpanjangan.

FUNGSI

Fungsi menyediakan metode untuk menentukan komputasi yang dapat dijalankan nanti. Fungsi di bc selalu menghitung nilai dan mengembalikannya ke pemanggil. Definisi fungsi adalah "dinamis" dalam arti bahwa suatu fungsi tidak terdefinisi sampai definisi ditemukan di input. Definisi itu kemudian digunakan sampai fungsi definisi lain untuk nama yang sama ditemukan. Definisi baru kemudian menggantikan definisi lama. Suatu fungsi didefinisikan sebagai berikut:

define name ( parameters ) { newline
    auto_list   statement_list }

Panggilan fungsi hanyalah ekspresi dari bentuk "nama(parameter)".

Parameter adalah angka atau larik (ekstensi). Dalam definisi fungsi, nol atau lebih parameter ditentukan dengan mencantumkan namanya yang dipisahkan dengan koma. Semua parameter dipanggil oleh parameter nilai. Array ditentukan dalam definisi parameter dengan notasi "nama[]". Dalam pemanggilan fungsi, parameter aktual adalah ekspresi penuh untuk parameter angka. Notasi yang sama digunakan untuk melewatkan array seperti untuk mendefinisikan parameter array. Array bernama diteruskan oleh nilai ke fungsi. Karena definisi fungsi bersifat dinamis, nomor dan tipe parameter diperiksa saat fungsi dipanggil. Setiap ketidakcocokan dalam jumlah atau jenis parameter akan menyebabkan kesalahan runtime. Kesalahan runtime juga akan terjadi untuk panggilan ke fungsi yang tidak ditentukan.

daftar_otomatis adalah daftar variabel opsional untuk penggunaan "lokal". Sintaks daftar otomatis (jika ada) adalah "otomatis nama, ... ;". (Titik koma bersifat opsional.) Setiap nama adalah nama variabel otomatis. Array dapat ditentukan dengan menggunakan notasi yang sama seperti yang digunakan dalam parameter. Variabel-variabel ini nilainya didorong ke tumpukan pada awal fungsi. Variabel kemudian diinisialisasi ke nol dan digunakan selama pelaksanaan fungsi. Saat keluar dari fungsi, variabel-variabel ini dimunculkan sehingga nilai asli (pada saat pemanggilan fungsi) dari variabel-variabel ini dipulihkan. Parameternya benar-benar variabel otomatis yang diinisialisasi ke nilai yang diberikan dalam pemanggilan fungsi. Variabel otomatis berbeda dari variabel lokal tradisional karena jika fungsi A memanggil fungsi B, B dapat mengakses variabel otomatis fungsi A hanya dengan menggunakan nama yang sama, kecuali jika fungsi B memanggilnya variabel otomatis. Karena variabel dan parameter otomatis didorong ke tumpukan, bc mendukung fungsi rekursif.

Badan fungsi adalah daftar pernyataan bc. Sekali lagi, pernyataan dipisahkan oleh titik koma atau baris baru. Pernyataan pengembalian menyebabkan penghentian fungsi dan pengembalian nilai. Ada dua versi pernyataan pengembalian. Bentuk pertama, "return", mengembalikan nilai 0 ke ekspresi panggilan. Bentuk kedua, "kembalikan ( ekspresi )", menghitung nilai ekspresi dan mengembalikan nilai tersebut ke ekspresi pemanggilan. Ada "return (0)" tersirat di akhir setiap fungsi. Ini memungkinkan fungsi untuk mengakhiri dan mengembalikan 0 tanpa pernyataan pengembalian yang eksplisit.

Fungsi juga mengubah penggunaan variabel ibase. Semua konstanta dalam badan fungsi akan dikonversi menggunakan nilai ibase pada saat pemanggilan fungsi. Perubahan ibase akan diabaikan selama eksekusi fungsi kecuali untuk fungsi standar baca, yang akan selalu menggunakan nilai ibase saat ini untuk konversi angka.

Beberapa ekstensi telah ditambahkan ke fungsi. Pertama, format definisinya sedikit santai. Standar mengharuskan kurung kurawal berada di baris yang sama dengan kata kunci define dan semua bagian lainnya harus berada di baris berikutnya. Versi bc ini akan mengizinkan sejumlah baris baru sebelum dan sesudah kurung buka fungsi. Misalnya, definisi berikut adalah legal.

define d (n) { return (2*n); }
define d (n)
  { return (2*n); }

Fungsi dapat didefinisikan sebagai batal. Fungsi void tidak mengembalikan nilai dan karenanya tidak dapat digunakan di tempat mana pun yang membutuhkan nilai. Fungsi batal tidak menghasilkan output apa pun saat dipanggil dengan sendirinya pada jalur input. Kata kunci void ditempatkan di antara kata kunci define dan nama fungsi. Sebagai contoh, pertimbangkan sesi berikut.

define py (y) { print "--->", y, "<---", "\n"; }
define void px (x) { print "--->", x, "<---", "\n"; }
py(1)
--->1<---
0
px(1)
--->1<---

Karena py bukan fungsi batal, pemanggilan py(1) mencetak hasil yang diinginkan dan kemudian mencetak baris kedua yang merupakan nilai fungsi. Karena nilai fungsi yang tidak diberi pernyataan pengembalian eksplisit adalah nol, angka nol akan dicetak. Untuk px(1), tidak ada nol yang dicetak karena fungsinya adalah fungsi batal.

Juga, panggilan dengan variabel untuk array telah ditambahkan. Untuk mendeklarasikan panggilan dengan array variabel, deklarasi parameter array dalam definisi fungsi terlihat seperti "*nama[]". Panggilan ke fungsi tetap sama dengan panggilan dengan array nilai.

PERPUSTAKAAN MATEMATIKA

Jika bc dipanggil dengan opsi -l, pustaka matematika akan dimuat sebelumnya dan skala default disetel ke 20. Fungsi matematika akan menghitung hasilnya ke skala yang disetel pada saat panggilannya. Perpustakaan matematika mendefinisikan fungsi-fungsi berikut:

s (x)

Sinus dari x, x dalam radian.

c (x)

Kosinus x, x dalam radian.

a (x)

Arctangent dari x, arctangent mengembalikan radian.

l (x)

Logaritma natural dari x.

e (x)

Fungsi eksponensial menaikkan e ke nilai x.

j (n,x)

Fungsi Bessel bilangan bulat orde n dari x.

CONTOH

Di /bin/sh, berikut ini akan menetapkan nilai "pi" ke variabel shell pi.

pi=$(echo "scale=10; 4*a(1)" | bc -l)

Berikut ini adalah definisi fungsi eksponensial yang digunakan di library matematika. Fungsi ini ditulis dalam POSIX bc.

scale = 20

/* Uses the fact that e^x = (e^(x/2))^2
   When x is small enough, we use the series:
     e^x = 1 + x + x^2/2! + x^3/3! + ...
*/

define e(x) {
  auto  a, d, e, f, i, m, v, z

  /* Check the sign of x. */
  if (x<0) {
    m = 1
    x = -x
  } 

  /* Precondition x. */
  z = scale;
  scale = 4 + z + .44*x;
  while (x > 1) {
    f += 1;
    x /= 2;
  }

  /* Initialize the variables. */
  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
  }
}

Berikut adalah kode yang menggunakan fitur tambahan bc untuk mengimplementasikan program sederhana untuk menghitung saldo buku cek. Program ini sebaiknya disimpan dalam file sehingga dapat digunakan berkali-kali tanpa harus mengetik ulang setiap kali digunakan.

scale=2
print "\nCheck book program!\n"
print "  Remember, deposits are negative transactions.\n"
print "  Exit by a 0 transaction.\n\n"

print "Initial balance? "; bal = read()
bal /= 1
print "\n"
while (1) {
  "current balance = "; bal
  "transaction? "; trans = read()
  if (trans == 0) break;
  bal -= trans
  bal /= 1
}
quit

Berikut ini adalah definisi dari fungsi faktorial rekursif.

define f (x) {
  if (x <= 1) return (1);
  return (f(x-1) * x);
}

OPSI READLINE DAN LIBEDIT

GNU bc dapat dikompilasi (melalui opsi konfigurasi) untuk menggunakan pustaka editor input readline GNU atau pustaka libedit BSD. Hal ini memungkinkan pengguna untuk mengedit baris sebelum mengirimkannya ke bc. Ini juga memungkinkan riwayat baris sebelumnya diketik. Saat opsi ini dipilih, bc memiliki satu variabel khusus lagi. Variabel khusus ini, riwayat adalah jumlah baris riwayat yang dipertahankan. Untuk readline, nilai -1 berarti jumlah baris riwayat yang dipertahankan tidak terbatas. Menyetel nilai riwayat ke angka positif akan membatasi jumlah baris riwayat ke angka yang diberikan. Nilai 0 menonaktifkan fitur riwayat. Nilai defaultnya adalah 100. Untuk informasi selengkapnya, baca panduan pengguna untuk pustaka GNU readline, history dan BSD libedit. Seseorang tidak dapat mengaktifkan readline dan libedit secara bersamaan.

PERBEDAAN

Versi bc ini diimplementasikan dari draf POSIX P1003.2/D11 dan berisi beberapa perbedaan dan ekstensi relatif terhadap draf dan implementasi tradisional. Itu tidak diimplementasikan dengan cara tradisional menggunakan dc(1). Versi ini adalah proses tunggal yang mem-parsing dan menjalankan terjemahan kode byte dari program. Ada opsi "tidak berdokumen" (-c) yang menyebabkan program mengeluarkan kode byte ke keluaran standar alih-alih menjalankannya. Itu terutama digunakan untuk men-debug parser dan menyiapkan perpustakaan matematika.

Sumber utama perbedaan adalah ekstensi, di mana fitur diperluas untuk menambahkan lebih banyak fungsi dan penambahan, di mana fitur baru ditambahkan. Berikut ini adalah daftar perbedaan dan ekstensi.

LANG environment

Versi ini tidak sesuai dengan standar POSIX dalam pemrosesan variabel lingkungan LANG dan semua variabel lingkungan yang dimulai dengan LC_.

names

Tradisional dan POSIX bc memiliki nama huruf tunggal untuk fungsi, variabel, dan larik. Mereka telah diperluas menjadi nama multi-karakter yang dimulai dengan huruf dan dapat berisi huruf, angka, dan karakter garis bawah.

Strings

String tidak boleh berisi karakter NUL. POSIX mengatakan semua karakter harus dimasukkan dalam string.

last

POSIX bc tidak memiliki variabel last. Beberapa penerapan bc menggunakan tanda titik (.) dengan cara yang sama.

comparisons

POSIX bc memungkinkan perbandingan hanya dalam pernyataan if, pernyataan while, dan ekspresi kedua dari pernyataan for. Juga, hanya satu operasi relasional yang diizinkan di setiap pernyataan tersebut.

if statement, else clause

POSIX bc tidak memiliki klausa lain.

for statement

POSIX bc mengharuskan semua ekspresi ada dalam pernyataan for.

&&, ||, !

POSIX bc tidak memiliki operator logika.

read function

POSIX bc tidak memiliki fungsi baca.

print statement

POSIX bc tidak memiliki pernyataan cetak.

continue statement

POSIX bc tidak memiliki pernyataan lanjutan.

return statement

POSIX bc memerlukan tanda kurung di sekitar ekspresi pengembalian.

array parameters

POSIX bc tidak (saat ini) mendukung parameter larik secara penuh. Tata bahasa POSIX memungkinkan array dalam definisi fungsi, tetapi tidak menyediakan metode untuk menentukan array sebagai parameter aktual. (Ini kemungkinan besar kesalahan dalam tata bahasa.) Implementasi tradisional bc hanya memanggil dengan parameter larik nilai.

function format

POSIX bc memerlukan kurung kurawal pembuka pada baris yang sama dengan kata kunci define dan pernyataan otomatis pada baris berikutnya.

=+, =-, =*, =/, =%, =^

POSIX bc tidak memerlukan operator penugasan "gaya lama" ini untuk didefinisikan. Versi ini memungkinkan penetapan "gaya lama" ini. Gunakan pernyataan limit untuk melihat apakah versi terinstal mendukungnya. Jika mendukung operator penugasan "gaya lama", pernyataan "a =- 1" akan mengurangi a sebesar 1 alih-alih menyetel a ke nilai -1.

spaces in numbers

Implementasi lain dari bc memungkinkan spasi dalam angka. Misalnya, "x=1 3" akan menetapkan nilai 13 ke variabel x. Pernyataan yang sama akan menyebabkan kesalahan sintaks dalam versi bc ini.

errors and execution

Implementasi ini berbeda dari implementasi lain dalam hal kode apa yang akan dieksekusi ketika sintaks dan kesalahan lain ditemukan dalam program. Jika kesalahan sintaks ditemukan dalam definisi fungsi, pemulihan kesalahan mencoba menemukan awal pernyataan dan melanjutkan penguraian fungsi. Setelah kesalahan sintaks ditemukan dalam fungsi, fungsi tersebut tidak dapat dipanggil dan menjadi tidak terdefinisi. Kesalahan sintaks dalam kode eksekusi interaktif akan membatalkan blok eksekusi saat ini. Blok eksekusi diakhiri dengan akhir baris yang muncul setelah urutan pernyataan lengkap. Misalnya,

a = 1
b = 2

memiliki dua blok eksekusi dan

{ a = 1
  b = 2 }

memiliki satu blok eksekusi. Setiap kesalahan runtime akan menghentikan eksekusi blok eksekusi saat ini. Peringatan runtime tidak akan menghentikan blok eksekusi saat ini.

Interrupts

Selama sesi interaktif, sinyal SIGINT (biasanya dihasilkan oleh karakter kontrol-C dari terminal) akan menyebabkan eksekusi blok eksekusi saat ini terganggu. Ini akan menampilkan kesalahan "runtime" yang menunjukkan fungsi mana yang terputus. Setelah semua struktur runtime dibersihkan, sebuah pesan akan dicetak untuk memberi tahu pengguna bahwa bc siap untuk masukan lainnya. Semua fungsi yang ditentukan sebelumnya tetap ditentukan dan nilai semua variabel non-otomatis adalah nilai pada titik interupsi. Semua variabel otomatis dan parameter fungsi dihapus selama proses pembersihan. Selama sesi non-interaktif, sinyal SIGINT akan menghentikan seluruh proses bc.

BATAS

Berikut adalah batasan yang saat ini berlaku untuk prosesor bc ini. Beberapa dari mereka mungkin telah diubah oleh instalasi. Gunakan pernyataan limit untuk melihat nilai sebenarnya.

BC_BASE_MAX

Basis keluaran maksimum saat ini ditetapkan pada 999. Basis masukan maksimum adalah 16.

BC_DIM_MAX

Ini saat ini merupakan batas sewenang-wenang 65535 sebagaimana didistribusikan. Instalasi Anda mungkin berbeda.

BC_SCALE_MAX

Jumlah digit setelah titik desimal dibatasi hingga INT_MAX digit. Selain itu, jumlah digit sebelum titik desimal dibatasi hingga INT_MAX digit.

BC_STRING_MAX

Batas jumlah karakter dalam sebuah string adalah INT_MAX karakter.

exponent

Nilai eksponen dalam operasi kenaikan (^) terbatas pada LONG_MAX.

variable names

Batasan jumlah nama unik saat ini adalah 32767 untuk setiap variabel sederhana, larik, dan fungsi.

VARIABEL LINGKUNGAN

Variabel lingkungan berikut diproses oleh bc:

POSIXLY_CORRECT

Ini sama dengan opsi -s.

BC_ENV_ARGS

Ini adalah mekanisme lain untuk mendapatkan argumen ke bc. Formatnya sama dengan argumen baris perintah. Argumen ini diproses terlebih dahulu, jadi file apa pun yang tercantum dalam argumen lingkungan diproses sebelum file argumen baris perintah apa pun. Hal ini memungkinkan pengguna untuk menyiapkan opsi dan file "standar" untuk diproses pada setiap pemanggilan bc. File dalam variabel lingkungan biasanya berisi definisi fungsi untuk fungsi yang ingin ditentukan pengguna setiap kali bc dijalankan.

BC_LINE_LENGTH

Ini harus berupa bilangan bulat yang menentukan jumlah karakter dalam baris keluaran untuk angka. Ini termasuk garis miring terbalik dan karakter baris baru untuk angka yang panjang. Sebagai perpanjangan, nilai nol menonaktifkan fitur multi-baris. Nilai lain dari variabel ini yang kurang dari 3 menetapkan panjang garis menjadi 70.

DIAGNOSTIK

Jika ada file pada baris perintah yang tidak dapat dibuka, bc akan melaporkan bahwa file tersebut tidak tersedia dan dihentikan. Juga, ada diagnostik kompilasi dan waktu berjalan yang harus cukup jelas.

BUG

Pemulihan kesalahan belum terlalu baik.

Email laporan bug ke bug-bc@gnu.org. Pastikan untuk menyertakan kata ``bc'' di suatu tempat di bidang ``Subject:''.

PENGARANG

Philip A. Nelson
philnelson@acm.org

UCAPAN TERIMA KASIH

Penulis mengucapkan terima kasih kepada Steve Sommars (Steve.Sommars@att.com) atas bantuannya yang ekstensif dalam menguji implementasi. Banyak saran bagus diberikan. Ini adalah produk yang jauh lebih baik karena keterlibatannya.