Skip to content

spam #159891

Closed as not planned
Closed as not planned

Description

@lasarus2843-cpu

=================================================================

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

  1. changed the title [-]program_apotek . py[/-] [+]spam[/+] on Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions