Membuat Aplikasi Kalkulator dengan VB.NET (Source Code Lengkap)
Oleh Afa HernandesDiperbarui 6 menit baca
Seri · Bagian 3 dari 3VB.NET untuk Pemula
Daftar isi
Kalkulator adalah project klasik untuk belajar VB.NET dan Windows Forms. Dari satu aplikasi sederhana, Anda belajar membaca input dari TextBox, menangani klik Button, memakai fungsi matematika dari class Math, dan menampilkan hasil.
Di tutorial ini kita membuat tiga versi kalkulator dengan logika perhitungan yang sama, tetapi cara memilih operasinya berbeda:
- Kalkulator 1: setiap operasi punya tombol sendiri (
Button) - Kalkulator 2: operasi dipilih dari daftar (
ComboBox) - Kalkulator 3: operasi dipilih dengan pilihan bulat (
RadioButton)
Operasi yang didukung: tambah, kurang, kali, bagi, pangkat, mod, akar, sin, cos, tan, log, dan membandingkan dua bilangan.
Persiapan
- Visual Studio Community (gratis) dengan workload .NET desktop development
- Buat project baru dengan template Windows Forms App dan bahasa Visual Basic
Langkah 1: Buat modul perhitungan
Agar ketiga kalkulator tidak menulis ulang kode yang sama, logika perhitungan kita taruh di satu Module. Klik kanan project → Add → Module…, beri nama Kalkulator.vb, lalu isi:
Imports System.GlobalizationImports System.LinqImports System.Windows.Forms
Public Module Kalkulator
' Mengubah teks menjadi angka. Menerima koma maupun titik sebagai pemisah desimal. Public Function BacaAngka(teks As String, ByRef nilai As Double) As Boolean Return Double.TryParse(teks.Trim().Replace(",", "."), NumberStyles.Float, CultureInfo.InvariantCulture, nilai) End Function
' Menghitung hasil operasi. Sin/Cos/Tan/Akar/Log hanya memakai Bilangan 1. Public Function Hitung(b1 As Double, b2 As Double, operasi As String) As String Select Case operasi Case "Tambah" : Return (b1 + b2).ToString() Case "Kurang" : Return (b1 - b2).ToString() Case "Kali" : Return (b1 * b2).ToString() Case "Bagi" If b2 = 0 Then Return "Tidak bisa dibagi nol" Return (b1 / b2).ToString() Case "Mod" If b2 = 0 Then Return "Tidak bisa dibagi nol" Return (b1 Mod b2).ToString() Case "Pangkat" : Return Math.Pow(b1, b2).ToString() Case "Akar" If b1 < 0 Then Return "Akar bilangan negatif tidak terdefinisi" Return Math.Sqrt(b1).ToString() Case "Sin" : Return Math.Round(Math.Sin(b1 * Math.PI / 180), 4).ToString() Case "Cos" : Return Math.Round(Math.Cos(b1 * Math.PI / 180), 4).ToString() Case "Tan" : Return Math.Round(Math.Tan(b1 * Math.PI / 180), 4).ToString() Case "Log" If b1 <= 0 Then Return "Log hanya untuk bilangan positif" Return Math.Round(Math.Log10(b1), 4).ToString() Case "Compare" If b1 > b2 Then Return "Bilangan 1 lebih besar" If b1 < b2 Then Return "Bilangan 2 lebih besar" Return "Kedua bilangan sama" Case Else Return "Operasi tidak dikenal" End Select End Function
' Membaca input dari form, memvalidasi, lalu menampilkan hasil. Dipakai oleh ketiga form. Public Sub Proses(txtBil1 As TextBox, txtBil2 As TextBox, txtHasil As TextBox, operasi As String) Dim b1, b2 As Double
If Not BacaAngka(txtBil1.Text, b1) Then MessageBox.Show("Bilangan 1 harus berupa angka.", "Input tidak valid", MessageBoxButtons.OK, MessageBoxIcon.Warning) txtBil1.Focus() Return End If
' Sin, Cos, Tan, Akar, dan Log hanya butuh Bilangan 1 Dim cukupSatu As Boolean = {"Sin", "Cos", "Tan", "Akar", "Log"}.Contains(operasi) If Not cukupSatu AndAlso Not BacaAngka(txtBil2.Text, b2) Then MessageBox.Show("Bilangan 2 harus berupa angka.", "Input tidak valid", MessageBoxButtons.OK, MessageBoxIcon.Warning) txtBil2.Focus() Return End If
txtHasil.Text = Hitung(b1, b2, operasi) End Sub
End ModuleBeberapa hal penting dari modul ini:
Double.TryParsemengembalikanFalsejika teks bukan angka, sehingga aplikasi tidak crash. Fungsi lamaVal()diam-diam menganggap"12abc"sebagai 12, yang bisa menghasilkan jawaban salah tanpa disadari.- Koma diganti titik sebelum dibaca dengan
InvariantCulture. Di Windows berbahasa Indonesia, titik dianggap pemisah ribuan, sehingga"2.5"bisa terbaca sebagai 25. Dengan cara ini, pengguna boleh mengetik2,5maupun2.5. - Sin, Cos, dan Tan di
Mathmemakai radian, jadi derajat dikaliMath.PI / 180lebih dulu. Hasilnya dibulatkan 4 angka di belakang koma agarSin(30)tampil0,5, bukan0,49999999999999994. - Pembagian dengan nol dicek manual. Untuk tipe
Double, VB.NET tidak memunculkan error, tetapi menghasilkanInfinityatauNaNyang membingungkan pengguna.
Kalkulator 1: menggunakan Button

Susun form seperti gambar, lalu atur properti Name setiap komponen:
| Komponen | Name | Keterangan |
|---|---|---|
| TextBox | txtBil1, txtBil2 |
input bilangan |
| TextBox | txtHasil |
hasil, atur ReadOnly = True |
| Button | btnTambah, btnKurang, btnKali, btnBagi, btnPangkat, btnSin, btnCos, btnTan, btnAkar, btnLog, btnCompare, btnMod |
tombol operasi |
| Button | btnClean, btnExit |
bersihkan dan keluar |
Lalu isi properti Tag setiap tombol operasi dengan nama operasinya, persis seperti di Select Case: Tambah, Kurang, Kali, Bagi, Pangkat, Sin, Cos, Tan, Akar, Log, Compare, Mod. Dengan begitu, satu handler bisa melayani semua tombol:
Public Class Kalkulator1
' Satu handler untuk semua tombol operasi. Nama operasi disimpan di properti Tag tiap tombol. Private Sub Operasi_Click(sender As Object, e As EventArgs) Handles _ btnTambah.Click, btnKurang.Click, btnKali.Click, btnBagi.Click, btnPangkat.Click, btnSin.Click, btnCos.Click, btnTan.Click, btnAkar.Click, btnLog.Click, btnCompare.Click, btnMod.Click
Dim tombol As Button = DirectCast(sender, Button) Proses(txtBil1, txtBil2, txtHasil, tombol.Tag.ToString()) End Sub
Private Sub btnClean_Click(sender As Object, e As EventArgs) Handles btnClean.Click txtBil1.Clear() txtBil2.Clear() txtHasil.Clear() txtBil1.Focus() End Sub
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click Close() End Sub
End ClassParameter sender berisi komponen yang memicu event, dalam hal ini tombol yang diklik. Versi lama tutorial ini memakai 12 prosedur terpisah yang isinya hampir sama. Dengan Handles yang mendaftarkan banyak tombol sekaligus, kodenya jauh lebih ringkas dan mudah dirawat.
Kalkulator 2: menggunakan ComboBox

Komponen: txtBil1, txtBil2, txtHasil, ComboBox cboProses, serta tombol btnClean dan btnExit. Daftar operasi diisi saat form dimuat, dan perhitungan berjalan otomatis setiap kali pilihan berubah:
Public Class Kalkulator2
Private Sub Kalkulator2_Load(sender As Object, e As EventArgs) Handles MyBase.Load cboProses.DropDownStyle = ComboBoxStyle.DropDownList ' pengguna tidak bisa mengetik bebas cboProses.Items.AddRange(New Object() { "Tambah", "Kurang", "Kali", "Bagi", "Pangkat", "Mod", "Akar", "Sin", "Cos", "Tan", "Log", "Compare"}) End Sub
Private Sub cboProses_SelectedIndexChanged(sender As Object, e As EventArgs) _ Handles cboProses.SelectedIndexChanged If cboProses.SelectedIndex >= 0 Then Proses(txtBil1, txtBil2, txtHasil, cboProses.Text) End If End Sub
Private Sub btnClean_Click(sender As Object, e As EventArgs) Handles btnClean.Click txtBil1.Clear() txtBil2.Clear() txtHasil.Clear() cboProses.SelectedIndex = -1 End Sub
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click Close() End Sub
End ClassDropDownStyle = DropDownList memastikan pengguna hanya bisa memilih dari daftar, sehingga tidak ada operasi yang salah ketik.
Kalkulator 3: menggunakan RadioButton

Letakkan semua RadioButton di dalam satu GroupBox bernama grpProses, supaya hanya satu yang bisa dipilih. Beri nama rbTambah, rbKurang, dan seterusnya, lalu isi Tag masing-masing dengan nama operasinya (sama seperti tombol di Kalkulator 1).
Public Class Kalkulator3
' CheckedChanged terpanggil dua kali saat pilihan berpindah (yang lama & yang baru), ' jadi hanya proses RadioButton yang sedang tercentang. Private Sub Radio_CheckedChanged(sender As Object, e As EventArgs) Handles _ rbTambah.CheckedChanged, rbKurang.CheckedChanged, rbKali.CheckedChanged, rbBagi.CheckedChanged, rbPangkat.CheckedChanged, rbAkar.CheckedChanged, rbMod.CheckedChanged, rbSin.CheckedChanged, rbCos.CheckedChanged, rbTan.CheckedChanged, rbLog.CheckedChanged, rbCompare.CheckedChanged
Dim rb As RadioButton = DirectCast(sender, RadioButton) If rb.Checked Then Proses(txtBil1, txtBil2, txtHasil, rb.Tag.ToString()) End If End Sub
Private Sub btnClean_Click(sender As Object, e As EventArgs) Handles btnClean.Click txtBil1.Clear() txtBil2.Clear() txtHasil.Clear() For Each rb In grpProses.Controls.OfType(Of RadioButton)() rb.Checked = False Next End Sub
Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click Close() End Sub
End ClassJam di pojok kanan atas Kalkulator 3 dibuat dengan komponen Timer. Caranya dibahas di Cara Menggunakan Timer Otomatis di VB.NET.
Contoh hasil perhitungan
Logika di modul Kalkulator.vb sudah kami uji dengan hasil berikut:
| Input | Operasi | Hasil |
|---|---|---|
| 10 dan 4 | Tambah / Kurang / Kali | 14 / 6 / 40 |
| 10 dan 4 | Bagi / Mod / Pangkat | 2,5 / 2 / 10000 |
| 5 dan 0 | Bagi | Tidak bisa dibagi nol |
| 30 | Sin | 0,5 |
| 60 / 45 | Cos / Tan | 0,5 / 1 |
| 16 / −4 | Akar | 4 / Akar bilangan negatif tidak terdefinisi |
| 1000 | Log | 3 |
| 2 dan 9 | Compare | Bilangan 2 lebih besar |
Tanda desimal yang tampil (koma atau titik) mengikuti pengaturan bahasa Windows Anda.
Error yang sering muncul
Handles clause requires a WithEvents variable defined in the containing type. Nama komponen di Handles tidak sama dengan properti Name di form. Periksa ejaannya, misalnya btnTambah dan bukan btntambah1.
NullReferenceException di tombol.Tag.ToString(). Properti Tag salah satu tombol atau RadioButton masih kosong. Isi Tag semua komponen operasi.
Hasil menampilkan “Operasi tidak dikenal”. Isi Tag atau item ComboBox berbeda dengan teks di Select Case, misalnya tambah (huruf kecil) atau ada spasi di belakangnya.
'Closet' is not declared. Versi lama tutorial ini memuat salah ketik Closet() di tombol Exit. Yang benar adalah Close().
Pertanyaan yang sering diajukan
Apa bedanya Windows Forms App dan Windows Forms App (.NET Framework)? Keduanya bisa dipakai dan kodenya sama. Versi .NET lebih baru dan direkomendasikan untuk project baru. Versi .NET Framework cocok jika tugas atau kampus Anda mensyaratkan .NET Framework 4.x.
Bagaimana menambah operasi baru, misalnya faktorial?
Tambahkan satu Case "Faktorial" di fungsi Hitung, lalu tambahkan tombol, item ComboBox, atau RadioButton dengan Tag Faktorial. Kode di ketiga form tidak perlu diubah.
Kesimpulan
Ketiga kalkulator berbagi satu modul Kalkulator.vb. Yang berbeda hanya cara memilih operasi: Button, ComboBox, atau RadioButton. Pola ini mengajarkan tiga kebiasaan baik: validasi input dengan TryParse, satu handler untuk banyak kontrol lewat sender dan Tag, serta memisahkan logika dari tampilan.
Lihat juga bagian sebelumnya di seri VB.NET untuk Pemula: Contoh Desain Form VB.NET Sederhana.



