Kerangka dari Bagian 1 sudah mengalir dengan rapi, tetapi setiap perhitungan masih berakhir di teks penampung. Pada bagian ini kita mengisi empat operasi aritmatika sungguhan, mengganti pilihan menu menjadi pemanggilan function yang tepat, serta menambahkan pertanyaan hitung lagi agar sesi perhitungan terasa mengalir. Fokus kita adalah satu keputusan desain: memakai dictionary sebagai pusat dispatch operasi.
Merancang Operasi dan Dispatch #
Setiap operasi menjadi satu function kecil — tambah(), kurang(), kali(), dan bagi() — yang menerima dua angka dan mengembalikan hasilnya. Karena function adalah warga kelas satu di Python (materi Chapter First-Class Functions), kita dapat menyimpannya sebagai nilai di dalam dictionary:
OPERASI = {
"1": ("+", tambah),
"2": ("-", kurang),
"3": ("*", kali),
"4": ("/", bagi),
}Satu kunci menu memetakan ke tuple berisi simbol operator dan function yang bersangkutan. Dengan tabel ini, jalankan() tidak lagi membutuhkan rantai if/elif untuk memilih operasi: satu baris simbol, fungsi = OPERASI[pilihan] cukup. Menambah operasi baru kelak cukup menambah satu function dan satu baris pemetaan.
Operasi bagi() mendapat perhatian khusus. Pembagian dengan nol membuat program crash, sehingga untuk sementara kita tangani secara sederhana: bagi() mencetak pesan galat dan mengembalikan None sebagai tanda bahwa hasil tidak tersedia.
Kode Lengkap Bagian 2 #
"""Kalkulator Terminal - operasi aritmatika.
Bagian 2: empat operasi aritmatika, dispatch berbasis dictionary,
dan pertanyaan hitung lagi.
"""
def tampilkan_menu():
"""Cetak daftar operasi yang tersedia."""
print("=== Kalkulator Terminal ===")
print("1. Tambah")
print("2. Kurang")
print("3. Kali")
print("4. Bagi")
print("5. Keluar")
def baca_pilihan():
"""Baca nomor operasi yang dipilih pengguna."""
return input("Pilih operasi (1-5): ")
def baca_angka(label):
"""Baca satu angka dari pengguna berdasarkan label."""
teks = input(f"{label}: ")
return float(teks)
def tambah(a, b):
"""Kembalikan hasil a + b."""
return a + b
def kurang(a, b):
"""Kembalikan hasil a - b."""
return a - b
def kali(a, b):
"""Kembalikan hasil a * b."""
return a * b
def bagi(a, b):
"""Kembalikan hasil a / b, atau None bila pembagi bernilai nol."""
if b == 0:
print("Error: pembagian dengan nol tidak diperbolehkan.")
return None
return a / b
OPERASI = {
"1": ("+", tambah),
"2": ("-", kurang),
"3": ("*", kali),
"4": ("/", bagi),
}
def tanya_lagi():
"""Tanyakan apakah pengguna ingin menghitung lagi."""
jawaban = input("Hitung lagi? (y/t): ")
return jawaban.strip().lower() == "y"
def jalankan():
"""Jalankan loop utama kalkulator."""
while True:
tampilkan_menu()
pilihan = baca_pilihan()
if pilihan == "5":
break
if pilihan not in OPERASI:
print(f"Pilihan '{pilihan}' tidak dikenal.")
continue
simbol, fungsi = OPERASI[pilihan]
a = baca_angka("Angka pertama")
b = baca_angka("Angka kedua")
hasil = fungsi(a, b)
if hasil is not None:
print(f"Hasil: {a:g} {simbol} {b:g} = {hasil:g}")
if not tanya_lagi():
break
print("Terima kasih telah menggunakan Kalkulator Terminal.")
if __name__ == "__main__":
jalankan()Perhatikan bahwa pilihan not in OPERASI pada baris 75 kini memeriksa dictionary secara langsung — operator in pada dictionary mencocokkan kuncinya, persis perilaku yang dibahas pada Chapter Dictionary. Mari kita bedah bagian-bagian baru:
- Baris 29-41 (
tambah,kurang,kali): tiga operasi lurus — menerima dua angka, mengembalikan hasil aritmatika, tanpa efek samping apa pun. - Baris 44-49 (
def bagi(a, b):): pemeriksaanif b == 0berjalan sebelum pembagian dilakukan. Ketika pembagi nol, function mencetak pesan galat dan mengembalikanNone; pemanggil memeriksa nilai ini sebelum mencetak hasil. - Baris 52-57 (
OPERASI = {...}): tabel dispatch. Nilai berupa tuple(simbol, function); unpacking tuple dibahas pada Chapter Tuple. - Baris 60-63 (
def tanya_lagi():): membaca jawaban, merapikan dengan.strip().lower()agar" Y "tetap dianggap"y", lalu mengembalikan hasil perbandingan dengan"y"— jawaban selainyberarti berhenti. - Baris 79 (
simbol, fungsi = OPERASI[pilihan]): satu baris dispatch; tidak adaif/elifyang perlu dirawat. - Baris 83-86: hasil disimpan dulu ke variabel
hasil, lalu dicetak hanya bila nilainya bukanNone. Format:gpada f-string menampilkan15.0sebagai15namun tetap menampilkan2.5— materi Chapter f-strings. - Baris 88-89 (
if not tanya_lagi(): break): setelah setiap perhitungan, pengguna memutuskan lanjut atau berhenti. Ucapan perpisahan tetap tampil karena berada di luar loop.
Mencoba Program #
Sesi berikut menguji tiga operasi sekaligus — tambah, bagi, lalu kali:
printf '1\n10\n5\ny\n4\n10\n4\ny\n3\n6\n7\nt\n' | python3 main.pyOutput yang Dihasilkan:
=== Kalkulator Terminal ===
1. Tambah
2. Kurang
3. Kali
4. Bagi
5. Keluar
Pilih operasi (1-5): Angka pertama: Angka kedua: Hasil: 10 + 5 = 15
Hitung lagi? (y/t): === Kalkulator Terminal ===
1. Tambah
2. Kurang
3. Kali
4. Bagi
5. Keluar
Pilih operasi (1-5): Angka pertama: Angka kedua: Hasil: 10 / 4 = 2.5
Hitung lagi? (y/t): === Kalkulator Terminal ===
1. Tambah
2. Kurang
3. Kali
4. Bagi
5. Keluar
Pilih operasi (1-5): Angka pertama: Angka kedua: Hasil: 6 * 7 = 42
Hitung lagi? (y/t): Terima kasih telah menggunakan Kalkulator Terminal.Sekarang uji pembagian dengan nol dan pilihan menu yang salah:
printf '4\n10\n0\nt\n' | python3 main.pyOutput yang Dihasilkan:
=== Kalkulator Terminal ===
1. Tambah
2. Kurang
3. Kali
4. Bagi
5. Keluar
Pilih operasi (1-5): Angka pertama: Angka kedua: Error: pembagian dengan nol tidak diperbolehkan.
Hitung lagi? (y/t): Terima kasih telah menggunakan Kalkulator Terminal.printf '9\n2\n2.5\n0.5\nt\n' | python3 main.pyOutput yang Dihasilkan:
=== Kalkulator Terminal ===
1. Tambah
2. Kurang
3. Kali
4. Bagi
5. Keluar
Pilih operasi (1-5): Pilihan '9' tidak dikenal.
=== Kalkulator Terminal ===
1. Tambah
2. Kurang
3. Kali
4. Bagi
5. Keluar
Pilih operasi (1-5): Angka pertama: Angka kedua: Hasil: 2.5 - 0.5 = 2
Hitung lagi? (y/t): Terima kasih telah menggunakan Kalkulator Terminal.Namun coba kirim angka yang bukan angka sama sekali:
printf '1\ndua belas\n' | python3 main.pyOutput yang Dihasilkan:
=== Kalkulator Terminal ===
1. Tambah
2. Kurang
3. Kali
4. Bagi
5. Keluar
Pilih operasi (1-5): Angka pertama: Traceback (most recent call last):
File "main.py", line 95, in <module>
jalankan()
File "main.py", line 80, in jalankan
a = baca_angka("Angka pertama")
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "main.py", line 26, in baca_angka
return float(teks)
^^^^^^^^^^^
ValueError: could not convert string to float: 'dua belas'Program roboh total hanya karena satu ketikan yang salah. bagi() pun masih mencampur dua pekerjaan: menghitung sekaligus mencetak pesan galat. Kedua masalah ini menjadi agenda Bagian 3 dan Bagian 4.
Ringkasan Bagian 2 #
Empat operasi kini hidup, dispatch berjalan lewat dictionary OPERASI, dan sesi perhitungan mengalir berkat tanya_lagi(). Yang belum tertangani adalah input yang berbahaya: angka yang tidak valid merobohkan program, dan jawaban hitung lagi sembarang dianggap berhenti. Berkas lengkap bagian ini dapat diunduh di bagian bawah halaman.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
main.py
Unduh berkas"""Kalkulator Terminal - operasi aritmatika.
Bagian 2: empat operasi aritmatika, dispatch berbasis dictionary,
dan pertanyaan hitung lagi.
"""
def tampilkan_menu():
"""Cetak daftar operasi yang tersedia."""
print("=== Kalkulator Terminal ===")
print("1. Tambah")
print("2. Kurang")
print("3. Kali")
print("4. Bagi")
print("5. Keluar")
def baca_pilihan():
"""Baca nomor operasi yang dipilih pengguna."""
return input("Pilih operasi (1-5): ")
def baca_angka(label):
"""Baca satu angka dari pengguna berdasarkan label."""
teks = input(f"{label}: ")
return float(teks)
def tambah(a, b):
"""Kembalikan hasil a + b."""
return a + b
def kurang(a, b):
"""Kembalikan hasil a - b."""
return a - b
def kali(a, b):
"""Kembalikan hasil a * b."""
return a * b
def bagi(a, b):
"""Kembalikan hasil a / b, atau None bila pembagi bernilai nol."""
if b == 0:
print("Error: pembagian dengan nol tidak diperbolehkan.")
return None
return a / b
OPERASI = {
"1": ("+", tambah),
"2": ("-", kurang),
"3": ("*", kali),
"4": ("/", bagi),
}
def tanya_lagi():
"""Tanyakan apakah pengguna ingin menghitung lagi."""
jawaban = input("Hitung lagi? (y/t): ")
return jawaban.strip().lower() == "y"
def jalankan():
"""Jalankan loop utama kalkulator."""
while True:
tampilkan_menu()
pilihan = baca_pilihan()
if pilihan == "5":
break
if pilihan not in OPERASI:
print(f"Pilihan '{pilihan}' tidak dikenal.")
continue
simbol, fungsi = OPERASI[pilihan]
a = baca_angka("Angka pertama")
b = baca_angka("Angka kedua")
hasil = fungsi(a, b)
if hasil is not None:
print(f"Hasil: {a:g} {simbol} {b:g} = {hasil:g}")
if not tanya_lagi():
break
print("Terima kasih telah menggunakan Kalkulator Terminal.")
if __name__ == "__main__":
jalankan()