Repository navigation
spam #159891
Description
=================================================================
NAMA PROGRAM : program_apotek.py
MAHASISWA : LASARUS YAKX KAMUR
NIM : 2655050003
MATAKULIAH : Rekayasa Perangkat Lunak / Struktur Data - Pertemuan 3
DESKRIPSI : Implementasi Array, Queue (FIFO), dan Stack (LIFO)
=================================================================
class ApotekData:
def init(self):
# 1. ARRAY / LIST: Menyimpan data statis/tetap 10 obat beserta harganya
self.daftar_obat = [
{"nama": "Paracetamol", "harga": 7500},
{"nama": "Amoxicillin", "harga": 15000},
{"nama": "Ibuprofen", "harga": 12000},
{"nama": "Cefadroxil", "harga": 25000},
{"nama": "Metformin", "harga": 9000},
{"nama": "Omeprazole", "harga": 18000},
{"nama": "Vitamin C", "harga": 5000},
{"nama": "Cetirizine", "harga": 11000},
{"nama": "Asam Mefenamat", "harga": 9500},
{"nama": "Antasida", "harga": 6000}
]
# 2. QUEUE: Antrean resep masuk (Prinsip FIFO - First In, First Out)
self.antrean_resep = []
# 3. STACK: Riwayat transaksi penjualan dengan fitur Undo (Prinsip LIFO)
self.riwayat_transaksi = []
# --- FITUR ARRAY / LIST ---
def tampilkan_obat_dan_statistik(self):
print("\n" + "="*35)
print(" DAFTAR 10 HARGA OBAT")
print("="*35)
for i, obat in enumerate(self.daftar_obat, 1):
print(f" {i}. {obat['nama']:<18} : Rp {obat['harga']}")
# Perhitungan Statistik
total_harga = sum(obat['harga'] for obat in self.daftar_obat)
rata_rata = total_harga / len(self.daftar_obat)
obat_termahal = max(self.daftar_obat, key=lambda x: x['harga'])
print("-"*35)
print(f"Total Harga Keseluruhan : Rp {total_harga}")
print(f"Rata-rata Harga Obat : Rp {rata_rata:.2f}")
print(f"Obat Termahal : {obat_termahal['nama']} (Rp {obat_termahal['harga']})")
print("="*35)
def cari_obat_by_nama(self, nama_cari):
print(f"\n[Hasil Pencarian untuk: '{nama_cari}']")
ditemukan = False
for obat in self.daftar_obat:
if nama_cari.lower() in obat['nama'].lower():
print(f"-> {obat['nama']}: Rp {obat['harga']}")
ditemukan = True
if not ditemukan:
print("Obat tidak ditemukan dalam sistem apotek.")
# --- FITUR QUEUE (FIFO) ---
def tambah_antrean(self, nama_pasien):
self.antrean_resep.append(nama_pasien)
print(f"Sukses: Resep [{nama_pasien}] ditambahkan ke barisan antrean.")
def layani_antrean(self):
if len(self.antrean_resep) > 0:
pasien_dilayani = self.antrean_resep.pop(0) # FIFO: mengambil indeks 0
print(f"Proses: Resep atas nama [{pasien_dilayani}] sedang dilayani di kasir.")
# Otomatis mencatat histori ke dalam Stack
catatan_tx = f"Penjualan resep obat pasien {pasien_dilayani}"
self.riwayat_transaksi.append(catatan_tx)
else:
print("Info: Antrean kosong. Tidak ada resep yang perlu dilayani.")
def tampilkan_antrean(self):
print("\n=== DAFTAR ANTREAN RESEP SAAT INI (FIFO) ===")
if not self.antrean_resep:
print("[ Belum ada antrean ]")
else:
for idx, pasien in enumerate(self.antrean_resep, 1):
print(f" Urutan ke-{idx}: Pasien {pasien}")
# --- FITUR STACK (LIFO - UNDO) ---
def tampilkan_riwayat(self):
print("\n=== RIWAYAT TRANSAKSI TERAKHIR (STACK) ===")
if not self.riwayat_transaksi:
print("[ Belum ada transaksi tercatat ]")
else:
# Ditampilkan terbalik (elemen transaksi terbaru berada paling atas)
for idx, tx in enumerate(reversed(self.riwayat_transaksi), 1):
print(f" [{idx}] {tx}")
def undo_transaksi(self):
if len(self.riwayat_transaksi) > 0:
transaksi_batal = self.riwayat_transaksi.pop() # LIFO: menghapus elemen paling akhir
print(f"\n[UNDO BERHASIL]: Aktivitas '{transaksi_batal}' dibatalkan dari log.")
else:
print("Info: Tidak ada transaksi aktif di dalam memory untuk di-undo.")
--- MENU UTAMA PROGRAM ---
def main():
aplikasi = ApotekData()
while True:
print("\n" + "="*45)
print(f" APLIKASI DATA APOTEK | NIM: 2655050003 ")
print("="*45)
print(" 1. Lihat Daftar Obat & Analisis Statistik")
print(" 2. Cari Obat berdasarkan Nama")
print(" 3. Registrasi Antrean Resep Baru (Queue)")
print(" 4. Layani Antrean Resep Terdepan (FIFO)")
print(" 5. Monitor Antrean Pasien")
print(" 6. Lihat Log Riwayat Transaksi")
print(" 7. Batalkan Transaksi Terakhir (Stack Undo)")
print(" 8. Keluar Aplikasi")
print("="*45)
pilihan = input("Masukkan menu pilihan Anda (1-8): ")
if pilihan == '1':
aplikasi.tampilkan_obat_dan_statistik()
elif pilihan == '2':
nama = input("Ketik nama obat yang dicari: ")
aplikasi.cari_obat_by_nama(nama)
elif pilihan == '3':
pasien = input("Nama pasien penyerah resep: ")
aplikasi.tambah_antrean(pasien)
elif pilihan == '4':
aplikasi.layani_antrean()
elif pilihan == '5':
aplikasi.tampilkan_antrean()
elif pilihan == '6':
aplikasi.tampilkan_riwayat()
elif pilihan == '7':
aplikasi.undo_transaksi()
elif pilihan == '8':
print("\nSistem dimatikan. Terima kasih dan sukses untuk tugas kuliahnya!")
break
else:
print("Pilihan salah. Silakan ketik angka 1 sampai 8.")
if name == "main":
main()
Activity
[-]program_apotek . py[/-][+]spam[/+]