Senin, 13 Oktober 2025

PBO A - Pertemuan 8 - Evaluasi Tengah Semester

 Nama    : Erlangga Rizqi Dwi Raswanto

NRP      : 5025241179

Kelas     : PBO A

Soal Evaluasi Tengah Semester

Demo              https://youtu.be/ucMWWojthF8

Link Github    https://github.com/erlanggardr/ETS_PBO_5025241179


Mengimplementasikan Vending Coffee Machine 


Adapun fitur-fitur yang ada didalam program ini adalah :

  • Menu Kopi dengan harga dasar ukuran S
  • Pemilihan Ukuran Gelas, terdapat 3 pilihan yaitu S/M/L (Small/Medium/Large)
    • Multiplier harga per ukuran (M=1.2, L=1.4)
    • Multiplier penggunaan resource per ukuran (M=1.1, L=1.4)
  • Pemilihan addon
    • Gula : gratis
    • Susu : +Rp2000
  • Pembayaran & Kembalian
  • Manajemen stok & Peringatan Refill saat mau habis
  • Menu Admin:
    • Laporan stok 
    • Log Transaksi dengan keterangan tanggal/jam, id transaksi, nama produk, total harga, beserta keterangan kembalian jika ada

Diagram pada BlueJ



Rancangan Kelas :

 Coffee  
  ├─ name:String  
  ├─ price:int  
  └─ +getName():String, +getPrice():int  
   
 Size  
  ├─ SMALL=1, MEDIUM=2, LARGE=3  
  ├─ +sizeCup(int):String  
  ├─ +multiplierPrice(int):double  // S=1.0, M=1.2, L=1.4  
  └─ +multiplierResource(int):double// S=1.0, M=1.1, L=1.2  
   
 Inventory  
  ├─ coffeeGram:int, waterML:int, sugarGram:int, milkML:int  
  ├─ BASE_COFFEE=5g, BASE_WATER=150ml, MILK_PER_CUP=50ml, SUGAR_PER_CUP=10g  
  ├─ +enoughFor(addSugar, addMilk, size):boolean  
  ├─ +lackingMessage(addSugar, addMilk, size):String  
  ├─ +consume(addSugar, addMilk, size):void  
  ├─ +quickRefill():void  
  ├─ +lowStockWarning():String  
  └─ +toString():String  
   
 Transaction  
  ├─ id:int, time:String (yyyy-MM-dd HH:mm:ss)  
  ├─ coffeeName:String, size:int, sugar:boolean, milk:boolean  
  ├─ total:int, paid:int, change:int  
  └─ +toString():String  
   
 CoffeeMachine (program utama)  
  ├─ menu: Coffee[]  
  ├─ inv: Inventory  
  ├─ log: ArrayList<Transaction>  
  ├─ +main(String[]):void  
  ├─ +showMenu():void  
  ├─ +showReport():void  
  ├─ +readInt(Scanner,String):int  
  └─ +readYesNo(Scanner,String):boolean  
   

Rancangan objek :

 CoffeeMachine  
  ├─ menu[4] → Coffee("Espresso",13000), ("Americano",10000),  
  │       ("Cappuccino",15000), ("Latte",18000)  
  ├─ inv → Inventory(coffeeGram=300, waterML=2000, sugarGram=100, milkML=500)  
  └─ log → [] 

Penjelasan masing-masing class/file :



Coffee.java



Kelas Coffee merepresentasikan satu item menu kopi. Kelas ini hanya menyimpan dua informasi: name (nama kopi) dan price.

Atribut:

  • name: String  - nama kopi yang ditampilkan di menu dan dicetak pada transaksi.

  • price: int  - harga dasar  (ukuran Small).

Konstruktor:

  • Menerima name dan price lalu menyimpannya ke field. 

Metode:

  • getName() -  mengembalikan nama kopi.

  • getPrice()  -  mengembalikan harga dasar.


Size.java


Kelas Size menyediakan konstanta untuk ukuran cup (SMALL=1, MEDIUM=2, LARGE=3) dan fungsi bantu untuk:

  • menampilkan label ukuran S/M/L,

  • mengembalikan multiplier harga (untuk menghitung total rupiah),

  • mengembalikan multiplier resource (untuk menghitung pemakaian bahan).

Konstanta:

  • SMALL=1, MEDIUM=2, LARGE=3 

Fungsi Bantu:

  • sizeCup(int s)"S", "M", atau "L" sesuai kode ukuran. Jika kode tidak cocok, mengembalikan "Not Valid".

  • multiplierPrice(int s) → pengali harga:

    • M → 1.2 (naik 20%), L → 1.4 (naik 40%), S → 1.0 (tidak berubah).

  • multiplierResource(int s) → pengali pemakaian bahan (kopi & air):

    • M → 1.1 (naik 10%), L → 1.4 (naik 40%), S → 1.0.


Transaction.java



Kelas Transaction merekam satu transaksi yang berhasil: identitas, waktu, pilihan user, dan angka-angka uangnya. Dengan menyimpan jejak transaksi, aplikasi bisa menampilkan laporan di menu admin.

Field:

  • id: int - nomor urut transaksi. 

  • time: Stringtimestamp transaksi dalam format yyyy-MM-dd HH:mm:ss.

  • coffeeName: String - nama kopi yang dibeli.

  • size: int - kode ukuran (1/2/3)

  • sugar: boolean - apakah menambah gula.

  • milk: boolean - apakah menambah susu.

  • total: int - total harga yang dihitung.

  • paid: int - jumlah uang yang dibayarkan pengguna.

  • change: int - kembalian (paid − total).

Konstruktor:

  • Mengisi semua field berdasarkan parameter.

  • Membentuk waktu sekarang dengan LocalDateTime.now() dan memformatnya secara manual menggunakan String.format agar menjadi YYYY-MM-DD HH:MM:SS.

Representasi Teks:

  • toString() menghasilkan satu baris ringkas untuk laporan, misalnya:
    [2025-10-15 10:07:02] #002 Espresso ukuran M + susu. total Rp14000, bayar Rp20000, kembali Rp6000
    Label ukuran didapat dari Size.sizeCup(size)S/M/L. Add-on (gula/susu) hanya dituliskan jika true.

Inventory.java



Kelas Inventory menyimpan stok bahan untuk:

  • Menghitung kebutuhan bahan per 1 gelas berdasarkan ukuran + add-on,

  • Memeriksa apakah stok cukup,

  • Menghasilkan pesan komponen mana yang kurang,

  • Mengurangi stok setelah transaksi sukses,

  • Memberi peringatan stok rendah,

  • Menampilkan ringkasan stok sebagai teks.

Field Stok (state mesin):

  • coffeeGram: int - stok kopi dalam gram.

  • waterML: int  - stok air dalam mililiter.

  • sugarGram: int  - stok gula dalam gram.

  • milkML: int -  stok susu dalam mililiter.

Konstanta konsumsi (ukuran Small):

  • BASE_COFFEE = 5 gram kopi per cup ukuran S.

  • BASE_WATER = 150 ml air per cup ukuran S.

  • MILK_PER_CUP = 50 ml susu jika pengguna pilih susu.

  • SUGAR_PER_CUP = 10 gram gula jika pengguna pilih gula.

Konstruktor:

  • Menerima nilai awal stok untuk keempat bahan. Nilai ini menjadi state awal mesin saat aplikasi mulai.

Perhitungan Kebutuhan Bahan (per 1 gelas):

  • Kopi: ceil(BASE_COFFEE × multiplierResource(size)).

  • Air: ceil(BASE_WATER × multiplierResource(size)).

  • Susu: tetap 50 ml jika dipilih.

  • Gula: tetap 10 g jika dipilih.

Pemeriksaan & Konsumsi:

  • enoughFor(addSugar, addMilk, size)
    Menghitung kebutuhan bahan untuk kombinasi tersebut lalu membandingkan dengan stok. Mengembalikan true jika semua bahan mencukupi.

  • lackingMessage(addSugar, addMilk, size)
    Jika ada yang kurang, membangun string “Stok tidak cukup: …” yang menyebutkan bahan mana saja yang kurang (kopi/air/gula/susu).

  • consume(addSugar, addMilk, size)
    Mengurangi stok sesuai kebutuhan yang telah dihitung. Dipanggil hanya setelah pembayaran cukup (transaksi sukses).

Informasi & Peringatan:

  • lowStockWarning()
    Mengembalikan teks peringatan jika ada bahan di bawah ambang (kopi < 30g, air < 200ml, gula < 20g, susu < 50ml). Jika aman, mengembalikan “Stok aman.”.

  • toString()
    Mengembalikan ringkasan stok: “Stok: Kopi Xg, Air Yml, Gula Zg, Susu Wml”.


CoffeeMachine.java



Kelas CoffeeMachine adalah program utama yaitu: membaca input, menampilkan menu, memanggil perhitungan harga & stok, memverifikasi pembayaran, mengurangi stok, mencatat transaksi, dan menyediakan laporan admin.

Data statis:

  • menu: Coffee[] - daftar item kopi 

  • MILK_PRICE: int - biaya tambahan

  • inven: Inventory - stok awal bahan

  • log: ArrayList<Transaction> - daftar transaksi yang berhasil, untuk laporan.

Metode main :

  1. Membuat Scanner untuk baca input dari konsol.

  2. While loop sebagai representasi mesin yang selalu aktif sampai user keluar:

    • Tampilkan menu dengan showMenu():
      a) nomor 1..N untuk kopi,
      b) 8 untuk Laporan admin,
      c) 0 untuk Keluar.

    • Baca pilihan pengguna dengan readInt(...). Metode ini memaksa input angka non-negatif; jika bukan angka, token dibuang dan diminta ulang.

    • Kondisi khusus pilihan:

      • 0 → ucapkan terima kasih dan break (keluar dari program).

      • 8 → panggil showReport() untuk menampilkan stok & semua transaksi; kemudian continue (kembali ke menu).

    • Validasi pilihan kopi: jika tidak di rentang 1..menu.length, tampilkan error dan kembali ke menu.

    • Ambil kopi terpilih: Coffee pesanan = menu[pilih - 1].

    • Pilih ukuran: tampilkan opsi 1) S 2) M 3) L

    • Pilih add-on: tanya Tambah gula? (y/n) dan Tambah susu? (y/n).

    • Cek stok: panggil inven.enoughFor(addSugar, addMilk, size).

      • Jika tidak cukup, tampilkan inven.lackingMessage(...) (menyebut bahan apa yang kurang), cetak ringkasan stok (inven.toString()) dan peringatan (inven.lowStockWarning()), lalu kembali ke menu.

    • Hitung total:

      • priceMult = Size.multiplierPrice(size)

      • total = round(pesanan.getPrice() × priceMult) + (addMilk ? MILK_PRICE : 0)

    • Pembayaran:

      • Cetak total dan minta Bayar (Rp):.

      • Jika bayar kurang dari total → tolak transaksi (“Kurang Rp …”) dan kembali ke menu.

      • Jika cukup → lanjut.

    • Seduh & konsumsi stok:

      • Cetak “Menyeduh … (S/M/L) + gula/susu …” sebagai feedback proses.

      • Kurangi stok dengan inven.consume(addSugar, addMilk, size).

    • Kembalian & log:

      • Hitung kembalian = bayar − total dan cetak.

      • Buat ID transaksi baru = log.size() + 1.

      • Tambahkan objek Transaction baru ke log (berisi waktu, item, ukuran, add-on, total, bayar, kembalian).

    • Info stok:

      • Cetak inven.lowStockWarning() untuk memberi tau kalau bahan ada yang mulai menipis.

  3. Menutup Scanner saat keluar loop.

Metode helper:

  • showMenu() - Mencetak daftar menu + opsi admin/keluar.

  • showReport() - Mencetak ringkasan stok (inven.toString()), lalu setiap transaksi (t.toString()), atau pesan “Belum ada transaksi.” jika log kosong.

  • readInt(Scanner, String): int -  Membaca input bilangan bulat non-negatif. Jika input bukan angka, menolak dan meminta ulang

  • readYesNo(Scanner, String): boolean - Membaca jawaban "y" atau "n"


Flowchart / Alur Sistem Program



Tidak ada komentar:

Posting Komentar

PBO A - Pertemuan 15 - Pong!

Nama : Erlangga Rizqi Dwi Raswanto NRP : 5025241179 Kelas : PBO A 1. Pendahuluan Pada pertemuan 15, kita mempraktikkan pembuatan game...