Fungsi buatan sendiri
Ketika Anda mengetik rumus yang sama berulang kali dengan angka yang berbeda, ubah menjadi sebuah fungsi. Anda menyebutkan rumus dan masukannya sekali, lalu memanggilnya di mana pun Anda membutuhkan jawaban: kalkulator tip, cek BMI, proyeksi tabungan, atau faktur.
Halaman ini mencakup mendefinisikan dan memanggil fungsi, bagaimana mereka menggunakan nama lain dalam catatan Anda, kondisi dan rekursi, dan batasan yang berlaku. Untuk fungsi yang datang dengan Varlig, seperti sqrt dan round, lihat referensi fungsi bawaan.
Mendefinisikan dan memanggil sebuah fungsi
Tulis nama fungsi, parameternya dalam tanda kurung, tanda sama dengan dan rumus. Kemudian memanggilnya dengan nilai-nilai dalam urutan yang sama:
tip(bill, pct) = bill * pcttip($48, 15%) menghasilkan $7.20tip($120, 12.5%) menghasilkan $15.00tip($36 + $12, 15%) menghasilkan $7.20Garis definisi tidak menunjukkan jawaban. Setiap panggilan menempatkan nilai Anda di tempat bill dan pct dan mengerjakan rumusnya. Argumen dapat berupa perhitungan keseluruhan, seperti $36 + $12 di atas.
Argumen adalah nilai penuh, bukan hanya angka, jadi satuan dan mata uang membawa melalui rumus:
bmi(weight, height) = weight / height^2bmi(81 kg, 1.8 m) menghasilkan 25 kg/m²Satuan dipertahankan sesuai masukan, sehingga bmi(81 kg, 180 cm) menghasilkan kg/cm². Agar satuan hasil selalu sama untuk masukan apa pun, lakukan konversi di dalam fungsi:
bmi(weight, height) = (weight / height^2) in kg/m^2bmi(81 kg, 180 cm) menghasilkan 25 kg/m²bmi(80 kg, 5.9 ft) menghasilkan 24.7375131668 kg/m²Fungsi juga boleh tidak memiliki parameter. Gunakan tanda kurung kosong saat mendefinisikan maupun memanggilnya:
standard_vat() = 20%£120 * standard_vat() menghasilkan £24.00Variabel biasa, seperti standard_vat = 20%, biasanya melakukan pekerjaan yang sama dengan mengetik lebih sedikit.
Nama dan parameter
- Nama fungsi dan parameter adalah kata-kata tunggal. Gunakan huruf, angka, dan garis bawah, seperti
net_payataubmi2, tanpa spasi. Jika Anda menulisarea of circle(r) = pi * r^2, baris tersebut menyarankan nama untuk digunakan sebagai gantinya:area_of_circle. - Nama fungsi tidak membedakan huruf besar dan kecil: setelah mendefinisikan
Tip(bill, pct), Anda dapat memanggiltip($48, 15%). - Setiap parameter membutuhkan namanya sendiri.
f(a, a) = aadalah sebuah kesalahan. - Sebuah fungsi dapat memiliki hingga 32 parameter.
- Nama fungsi bawaan tidak boleh digunakan kembali untuk fungsi buatan sendiri.
round(x) = …atausqrt(x) = …menghasilkan kesalahan, bukan menggantikan fungsi bawaan. Variabel biasa tetap boleh memakai nama tersebut, misalnyafloor = 12 m²; lihat Nama. - Nama yang lazim di aplikasi lembar kerja, yaitu
avg,total, danstdev, boleh digunakan untuk fungsi buatan Anda. Jika Anda mendefinisikantotal(order), versi Andalah yang dijalankan. - Sebuah fungsi dan variabel dapat berbagi nama.
ratemembaca variabel danrate(5)memanggil fungsi. - Selalu panggil fungsi dengan tanda kurung. Nama fungsi sendiri, tanpa variabel dengan nama yang sama, tidak menunjukkan apa-apa. Pengecualiannya adalah
sum,total,subtotal,grand total,average,maxdanmin, yang menghasilkan angka itu untuk baris di atasnya; lihat Menjumlahkan baris di atas.
Koma dalam argumen
Koma diikuti dengan spasi memisahkan argumen, dan koma diikuti oleh tepat tiga digit kelompok ribuan, sehingga Anda dapat menulis jumlah seperti biasanya:
tip(bill, pct) = bill * pcttip($1,200, 15%) menghasilkan $180.00tip($1200,15%) menghasilkan $180.00Jika pemisah berupa koma dan spasi belum menghasilkan cukup argumen untuk fungsi tersebut, setiap koma dianggap pemisah, seperti pada pemanggilan kedua. Gunakan titik desimal untuk nilai pecahan, misalnya tip($48, 12.5%).
Menggunakan nama lain dalam catatan Anda
Sebuah fungsi dapat menggunakan variabel dari catatan Anda. Ini membaca nilai mereka saat ini setiap kali Anda memanggilnya:
vat = 20%with_vat(price) = price * (1 + vat)with_vat(£50) menghasilkan £60.00vat = 5%with_vat(£50) menghasilkan £52.50Variabel harus sudah ada ketika Anda mendefinisikan fungsi, jadi letakkan vat = 20% di atas with_vat. Jika belum ada, garis definisi menunjukkan kesalahan.
Parameter bersifat lokal untuk fungsi. Parameter yang disebut price tidak membaca atau mengubah variabel yang disebut price di tempat lain dalam catatan:
price = £10double(price) = price * 2double(£3) menghasilkan £6.00price menghasilkan £10.00Seperti variabel, fungsi yang didefinisikan dalam satu blok perhitungan dapat digunakan dalam blok berikutnya pada catatan yang sama. Varlig memproses catatan dari atas ke bawah, jadi letakkan definisi fungsi sebelum baris pertama yang memanggilnya. Pemanggilan sebelum definisi tidak menampilkan hasil.
Fungsi yang memanggil fungsi lain
Fungsi-fungsi kecil dapat dibangun satu sama lain:
day_rate = £400fee(days) = days * day_rateinvoice(days) = fee(days) * 1.2invoice(5) menghasilkan £2,400.00Fungsi mengingat versi fungsi bantu yang ada saat definisinya dibuat. Jika Anda mendefinisikan ulang fungsi bantu yang sama di baris berikutnya, fungsi yang didefinisikan sebelumnya tetap menggunakan versi lama:
shipping(order) = £4.95total(order) = order + shipping(order)shipping(order) = £2.95total(£30) menghasilkan £34.95shipping(£30) menghasilkan £2.95Untuk mengambil shipping baru, tentukan total lagi di bawahnya. Mengedit definisi di tempat tidak menyebabkan ini. Varlig menghitung ulang catatan dari atas, jadi semua yang ada di bawah ini menggunakan versi Anda yang telah diedit.
Fungsi juga dapat memanggil fungsi bantu yang baru didefinisikan di bagian berikutnya. Dalam kasus ini, versi fungsi bantu yang tersedia saat pemanggilan akan digunakan. Jadi, fungsi bantu harus sudah ada ketika fungsi luar dipanggil:
checkout(order) = order + delivery(order)delivery(order) = if order >= £40 then £0 else £3.50checkout(£25) menghasilkan £28.50checkout(£60) menghasilkan £60.00Kondisi
Gunakan if … then … else … untuk memilih di antara hasil. Rantai lain if setelah else untuk lebih dari dua kasus:
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20postage(90 g) menghasilkan £0.85postage(500 g) menghasilkan £1.55postage(1.2 kg) menghasilkan £3.20Hanya cabang yang berlaku yang dikerjakan. Itu memungkinkan Anda untuk menjaga terhadap perhitungan yang jika tidak akan gagal, seperti membagi dengan nol:
per_person(total, people) = if people > 0 then total / people else £0per_person(£90, 3) menghasilkan £30.00per_person(£90, 0) menghasilkan £0.00Rekursi
Fungsi dapat memanggil dirinya sendiri asalkan ada kondisi yang akhirnya menghentikannya. Contoh ini menghitung jumlah jabat tangan ketika setiap orang dalam kelompok berjabat tangan sekali dengan setiap orang lainnya:
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)handshakes(6) menghasilkan 15handshakes(10) menghasilkan 45Setiap panggilan bersarang satu tingkat lebih dalam, dan paling banyak 12 panggilan bersarang diperbolehkan. handshakes(12) masih berfungsi, tetapi handshakes(13) menunjukkan Error: calculation limit. Sebuah fungsi yang tidak pernah mencapai kasus berhentinya diterima ketika Anda mendefinisikannya, dan mencapai batas yang sama ketika Anda memanggilnya. Dua fungsi juga dapat memanggil satu sama lain, dalam batas yang sama.
Untuk penghitungan sehari-hari, fungsi bawaan lebih cepat dan tidak memiliki batasan seperti itu. combination(10, 2) juga memberikan 45, dan factorial(n) atau n!, mencakup contoh rekursif klasik.
Daftar, matriks dan banyak lagi
Argumen dapat berupa daftar, matriks, atau bilangan kompleks, dan isi fungsi dapat memakai fungsi bawaan apa pun:
spread(scores) = max(scores) - min(scores)spread([12, 18, 9, 21]) menghasilkan 12Isi fungsi juga dapat memuat penjumlahan deret atau pemecah persamaan dengan variabel lokalnya sendiri. Lihat Daftar dan statistik serta Penjumlahan, penyelesaian persamaan, dan kalkulus.
Jebakan
- Tulis pangkat dengan
^.x²tidak diterima di dalam fungsi. Nama parameter yang pendek juga dapat tertukar dengan satuan: dalamw / h²,h²berarti jam kuadrat, bukan parameterh. Tulisw / h^2. - Periksa jumlah argumen. Memanggil
tip($48)ketika fungsi mengharapkan dua nilai menunjukkan kesalahan. - Harga tanpa satuan ditafsirkan sebagai harga per satuan. Dalam
oats(amount) = amount / 1 kg * £0.95, £0,95 dianggap harga per kilogram. Setiap pemanggilan menyertakan penjelasan; arahkan penunjuk untuk melihat bahwa £0,95 dalam oats ditafsirkan sebagai harga per kg dan bahwa penulisan £0,95/kg akan memperjelasnya. Menulis harga per satuan secara eksplisit dalam definisi menghilangkan pemberitahuan tersebut. - Satu baris, satu rumus. Definisi adalah ekspresi tunggal pada satu baris. Untuk perhitungan dengan beberapa langkah, tentukan fungsi kecil untuk setiap langkah dan gabungkan.
- Definisi ulang yang rusak mempertahankan versi lama. Jika definisi
tipbaru memiliki kesalahan, baris tersebut menunjukkan kesalahan dantipkerja sebelumnya tetap tersedia. - Jawaban dapat berubah saat catatan dihitung ulang. Panggilan dilakukan lagi setiap kali, sehingga fungsi yang menggunakan
randomatau tanggal hari ini dapat memberikan jawaban baru. - Kesalahan diteruskan ke hasil. Jika argumen membuat rumus gagal, misalnya karena pembagian dengan nol, pemanggilan menampilkan kesalahan tersebut.
Batasan
| Apa | Batas |
|---|---|
| Parameter per fungsi | 32 |
| Panggilan bersarang (fungsi yang memanggil dirinya sendiri atau yang lain) | 12 |
| Panggilan yang dilakukan saat mengerjakan satu panggilan tingkat atas | 16,384 |
| Fungsi yang didefinisikan dalam sebuah catatan | 1,024 |
Mencapai batas menunjukkan Error: calculation limit. Sisa catatan terus berfungsi. Lihat Kesalahan, diagnostik, dan batasan untuk setiap batasan.
Menggabungkan semuanya
Berikut contoh faktur pekerja lepas. Tarif dan PPN didefinisikan sebagai variabel di bagian atas, lalu tiga fungsi kecil melakukan perhitungannya:
# March invoiceday_rate = £450vat = 20%fee(days) = days * day_ratewith_vat(amount) = amount * (1 + vat)late_fee(amount, days_late) = if days_late > 30 then amount * 2% else £0design = fee(8) menghasilkan £3,600.00build = fee(4.5) menghasilkan £2,025.00subtotal = design + build menghasilkan £5,625.00with_vat(subtotal) menghasilkan £6,750.00late_fee(with_vat(subtotal), 45) menghasilkan £135.00Ubah day_rate atau vat dan setiap baris di bawah ini diperbarui. Ketika klien terlambat membayar, satu panggilan menambah biaya.