(Bahasa pemrograman: bebas)Buatlah dan rancanglah sebuah program yang dapat menerima

Berikut ini adalah pertanyaan dari unknown pada mata pelajaran TI untuk jenjang Sekolah Dasar

(Bahasa pemrograman: bebas)Buatlah dan rancanglah sebuah program yang dapat menerima input berupa teks berikut ini:
1. "fpb(a, b)", dan menghasilkan output berupa FPB dari bilangan a dan b.
2. "kpk(a, b)", dan menghasilkan output berupa KPK dari bilangan a dan b.

Batasan:
(1) a dan b adalah bilangan bulat positif.
(2) Dilarang menggunakan fungsi built-in dari bahasa pemrograman yang digunakan dan paket-paket yang mungkin sudah tersedia, untuk menghitung FPB dan KPK.​

Jawaban dan Penjelasan

Berikut ini adalah pilihan jawaban terbaik dari pertanyaan diatas.

Kode Program (Python)

# fpbkpk.py
# oleh hy

class InterpreterMtk:

   def __init__(self, prompt = ">>>") -> None:
       """Konstruktor"""
       self.perintah = self.hasil = ''
       self.prompt = prompt
       self.judul = 'Interpreter Matematika Sederhana'
       self.fitur = {
           'fpb': {
               'info': 'FPB dari 2 bilangan bulat positif',
               'sintaks': 'fpb(a, b)'
           },
           'kpk': {
               'info': 'KPK dari 2 bilangan bulat positif',
               'sintaks': 'kpk(a, b)'
           }
       }

   def info(self):
       """Tampilkan informasi."""
       print('Fitur yang tersedia:')
       i = 0
       for fitur in self.fitur.values():
           i += 1
           print(f'{i:2}. {fitur["info"]}')
           print(f'    Sintaks: {fitur["sintaks"]}')
       print('Untuk mengakhiri, tekan Enter saja.\n')

   def mulai(self):
       """Interpreter dimulai."""
       print()
       print(self.judul)
       self.info()
       while True:
           self.perintah = input(self.prompt + " ").strip()
           if self.perintah == '':
              self.selesai()
               return
           self.interpret()

   def interpret(self):
       """Method utama untuk nterpretasi input."""
       # Interpretasi perintah
       # Cari perintah di dict fitur
       key = self.perintah.lower().split('(')[0].strip()
       fitur = self.fitur.get(key)
       # Jika fitur tidak ada, atau sintaks salah
       try:
           if fitur is None:
               raise SyntaxError
           self.hasil = eval(f'self.{self.perintah}')
       except SyntaxError:
           print('[ERR] Sintaks salah, atau fitur tidak/belum tersedia.')
           self.info()
       except TypeError:
           print('[ERR] Parameter a dan b harus merupakan bilangan bulat.')
           self.info()
       # Jika fitur ada, dan sintaks benar
       else:
           print(f'{" " * (len(self.prompt)+1)}= {self.hasil}\n')

   def selesai(self):
       """Interpreter selesai."""
       print("\nTerima kasih.\n")

   def fpb(self, a: int, b: int) -> int:
       """Faktor Persekutuan terBesar"""
       if not (isinstance(a, int) and isinstance(b, int)):
           raise TypeError
       # Baik a maupun b harus positif
       a = abs(a); b = abs(b)
       if a < b: # swap
           return self.fpb(b, a)
       if b == 0:
           return a
       return self.fpb(b, a % b)

   def kpk(self, a: int, b: int) -> int:
       """Kelipatan Persekutuan terKecil"""
       if not (isinstance(a, int) and isinstance(b, int)):
           raise TypeError
       if (a == 0) or (b == 0):
           return 0
       return (a * b) // self.fpb(a, b)

def program_utama():
   interpreter = InterpreterMtk()
   interpreter.mulai()

if __name__ == '__main__':
   program_utama()

____________

Pembahasan

Pada saat membaca pertanyaan, saya berpikir akan lebih baik jika program dirancang menyerupai interpreter, yang menerima masukan terus menerus sampai suatu cara berhenti tertentu. Oleh karena itu, program di atas mengimplementasikan penyelesaian persoalan ini dalam bentuk interpreter, yang dibungkus pada class InterpreterMtk.

  • Untuk menghitung FPB dari dua bilangan bulat positif, kita dapat menggunakan algoritma pembagian berulang Euclidean, yang diimplementasikan pada method fpb(self, a: int, b: int) -> int.
  • Sedangkan untuk menghitung KPK, kita dapat memanfaatkan FPB. KPK dari bilangan bulat positif a dan badalah(a × b) / FPB(a, b). Hal ini diimplementasikan pada method kpk(self, a: int, b: int) -> int.

Method lain milik class InterpreterMtk hanya sebagai pendukung, sehingga program dapat berjalan sesuai rancangan awal.
Silahkan amati program, jika ada yang kurang dimengerti, silahkan bertanya.

____________

Contoh Hasil Eksekusi Program

Interpreter Matematika Sederhana
Fitur yang tersedia:
1. FPB dari 2 bilangan bulat positif
   Sintaks: fpb(a, b)
2. KPK dari 2 bilangan bulat positif
   Sintaks: kpk(a, b)
Untuk mengakhiri, tekan Enter saja.

>>> fpb(2, 5)
   = 1

>>> kpk(2, 5)
   = 10

>>> fpb(12, 18)
   = 6

>>> kpk(12, 18)
   = 36

>>> fpb(1024, 512)
   = 512

>>> kpk(1024, 512)
   = 1024

>>> fpb(145, 305)
   = 5

>>> kpk(145, 305)
   = 8845

>>> fpb    (30, 70)
   = 10

>>> kpk    (30, 70)
   = 210

>>> fpb(
[ERR] Sintaks salah, atau fitur tidak/belum tersedia.
Fitur yang tersedia:
1. FPB dari 2 bilangan bulat positif
   Sintaks: fpb(a, b)
2. KPK dari 2 bilangan bulat positif
   Sintaks: kpk(a, b)
Untuk mengakhiri, tekan Enter saja.

>>> kpk(
[ERR] Sintaks salah, atau fitur tidak/belum tersedia.
Fitur yang tersedia:
1. FPB dari 2 bilangan bulat positif
   Sintaks: fpb(a, b)
2. KPK dari 2 bilangan bulat positif
   Sintaks: kpk(a, b)
Untuk mengakhiri, tekan Enter saja.

>>>

Terima kasih.

Kode Program (Python)# fpbkpk.py# oleh hyclass InterpreterMtk:    def __init__(self, prompt = Kode Program (Python)# fpbkpk.py# oleh hyclass InterpreterMtk:    def __init__(self, prompt = Kode Program (Python)# fpbkpk.py# oleh hyclass InterpreterMtk:    def __init__(self, prompt = Kode Program (Python)# fpbkpk.py# oleh hyclass InterpreterMtk:    def __init__(self, prompt =

Semoga dengan pertanyaan yang sudah terjawab oleh henriyulianto dapat membantu memudahkan mengerjakan soal, tugas dan PR sekolah kalian.

Apabila terdapat kesalahan dalam mengerjakan soal, silahkan koreksi jawaban dengan mengirimkan email ke yomemimo.com melalui halaman Contact

Last Update: Thu, 24 Nov 22