Tugas 1 Pemrograman Berbasis Desktop - Sistem Pemesanan Restoran
Oleh: Khafid Ilham
#TetaplahBerbeda
Halo teman-teman semua! Kali ini saya akan berbagi pengalaman dan penjelasan detail tentang tugas pertama mata kuliah Pemrograman Berbasis Desktop di Universitas Terbuka yang sudah saya selesaikan sebelumnya. Sebagai sesama mahasiswa, saya paham kadang kita butuh referensi dan penjelasan tambahan untuk memahami materi dengan lebih baik. Jadi, anggap saja ini sebagai sharing pengalaman dan pembelajaran bersama ya!
Latar Belakang
Sebelum kita masuk ke detail teknis, penting untuk dipahami bahwa tugas ini adalah implementasi sederhana sistem pemesanan restoran. Meski terlihat sederhana, program ini sebenarnya mencakup banyak konsep dasar pemrograman yang penting untuk dipahami.
Struktur Program
Program ini terdiri dari tiga kelas utama:
- Kelas Menu
- Kelas Pesanan
- Kelas Main (kelas utama)
1. Kelas Menu
Kelas Menu adalah blueprint untuk setiap item menu di restoran kita. Setiap menu memiliki tiga properti:
String namaMenu; // Nama item menu
double harga; // Harga item
String kategori; // Kategori (Makanan/Minuman)
Saya membuat constructor dan getter sederhana untuk memudahkan akses ke properti menu:
Menu(String namaMenu, double harga, String kategori) {
this.namaMenu = namaMenu;
this.harga = harga;
this.kategori = kategori;
}
2. Kelas Pesanan
Kelas Pesanan menangani detail setiap pesanan pelanggan. Setiap pesanan mencatat:
String namaPesanan; // Nama item yang dipesan
int jumlahPesanan; // Jumlah yang dipesan
double hargaPerItem; // Harga per item
double totalHarga; // Total harga (jumlah × harga per item)
3. Kelas Main
Kelas Main adalah jantung dari program kita. Di sini saya mendefinisikan menu-menu yang tersedia:
private static Menu makanan1 = new Menu("Nasi Padang", 25000, "Makanan");
private static Menu makanan2 = new Menu("Ayam Goreng", 30000, "Makanan");
private static Menu makanan3 = new Menu("Sate", 35000, "Makanan");
private static Menu makanan4 = new Menu("Gulai Ikan", 40000, "Makanan");
private static Menu minuman1 = new Menu("Es Teh", 10000, "Minuman");
private static Menu minuman2 = new Menu("Es Jeruk", 12000, "Minuman");
private static Menu minuman3 = new Menu("Kopi", 15000, "Minuman");
private static Menu minuman4 = new Menu("Air Mineral", 5000, "Minuman");
Fitur-Fitur Utama dan Tips Implementasi
1. Input Pesanan
System.out.print("Masukkan pemesanan ke-" + menuKe + " (contoh: Nasi Padang = 2): ");
- Gunakan validasi input untuk mencegah error
- Perhatikan format input yang konsisten
- Selalu beri contoh format input ke user
2. Sistem Promosi
Fitur-fitur promosi:
- Diskon 10% untuk total pembelian > Rp 100.000
- Minuman gratis untuk pembelian > Rp 50.000
- Pilihan minuman gratis
- Selalu validasi total belanja sebelum memberi diskon
- Gunakan konstanta untuk nilai diskon agar mudah diubah
- Berikan feedback yang jelas ke user saat mendapat promosi
3. Perhitungan Biaya
Komponen biaya:
- Sub-total pesanan
- Pajak 10%
- Biaya pelayanan Rp 20.000
- Diskon (jika ada)
- Gunakan tipe data double untuk presisi
- Selalu format output dalam bentuk mata uang
- Pisahkan logika perhitungan dan display
Kesimpulan dan Tips Belajar
Untuk teman-teman yang sedang mempelajari materi ini, beberapa tips dariku:
- Pahami dulu konsep OOP sebelum implementasi
- Buat flowchart/diagram sebelum coding
- Test program dengan berbagai skenario input
- Jangan ragu untuk eksplorasi dan modifikasi kode
- Manfaatkan fitur debugging di IDE
Yang membuat program ini berbeda (#TetaplahBerbeda) adalah pendekatan yang sistematis dan user-friendly. Ingat, tujuan sharing ini bukan untuk dicontek, tapi untuk dipahami konsepnya dan dikembangkan sesuai kreativitas masing-masing.
Code Fullnya
import java.text.DecimalFormat;
import java.util.Scanner;
class Menu {
String namaMenu;
double harga;
String kategori;
// Konstruktor untuk kelas Menu
Menu(String namaMenu, double harga, String kategori) {
this.namaMenu = namaMenu;
this.harga = harga;
this.kategori = kategori;
}
// Getter untuk nama menu
public String getNamaMenu() {
return namaMenu;
}
}
class Pesanan {
String namaPesanan;
int jumlahPesanan;
double hargaPerItem;
double totalHarga;
// Konstruktor untuk kelas Pesanan
Pesanan(String namaPesanan, int jumlahPesanan, double hargaPerItem) {
this.namaPesanan = namaPesanan;
this.jumlahPesanan = jumlahPesanan;
this.hargaPerItem = hargaPerItem;
this.totalHarga = jumlahPesanan * hargaPerItem;
}
}
public class Main {
// Daftar menu makanan dan minuman
private static Menu makanan1 = new Menu("Nasi Padang", 25000, "Makanan");
private static Menu makanan2 = new Menu("Ayam Goreng", 30000, "Makanan");
private static Menu makanan3 = new Menu("Sate", 35000, "Makanan");
private static Menu makanan4 = new Menu("Gulai Ikan", 40000, "Makanan");
private static Menu minuman1 = new Menu("Es Teh", 10000, "Minuman");
private static Menu minuman2 = new Menu("Es Jeruk", 12000, "Minuman");
private static Menu minuman3 = new Menu("Kopi", 15000, "Minuman");
private static Menu minuman4 = new Menu("Air Mineral", 5000, "Minuman");
// Deklarasi awal pesanan
private static Pesanan pesanan1 = null;
private static Pesanan pesanan2 = null;
private static Pesanan pesanan3 = null;
private static Pesanan pesanan4 = null;
public static void main(String[] args) {
// Tampilkan daftar menu
System.out.println("========== DAFTAR MENU ==========");
System.out.println("Makanan:");
System.out.println("1. " + makanan1.namaMenu + " - " + formatRupiah(makanan1.harga));
System.out.println("2. " + makanan2.namaMenu + " - " + formatRupiah(makanan2.harga));
System.out.println("3. " + makanan3.namaMenu + " - " + formatRupiah(makanan3.harga));
System.out.println("4. " + makanan4.namaMenu + " - " + formatRupiah(makanan4.harga));
System.out.println("Minuman:");
System.out.println("1. " + minuman1.namaMenu + " - " + formatRupiah(minuman1.harga));
System.out.println("2. " + minuman2.namaMenu + " - " + formatRupiah(minuman2.harga));
System.out.println("3. " + minuman3.namaMenu + " - " + formatRupiah(minuman3.harga));
System.out.println("4. " + minuman4.namaMenu + " - " + formatRupiah(minuman4.harga));
System.out.println("==============================\n");
// Scanner untuk input
Scanner scanner = new Scanner(System.in);
// Input pemesanan pertama
pesanan1 = inputPesanan(scanner, 1);
if (pesanan1 != null) {
System.out.println("Total Harga untuk " + pesanan1.namaPesanan + ": " + formatRupiah(pesanan1.totalHarga));
}
// Tanyakan apakah ingin lanjut ke menu berikutnya
if (!tanyaLanjut(scanner)) {
cetakStruk(scanner);
return;
}
// Input pemesanan kedua
pesanan2 = inputPesanan(scanner, 2);
if (pesanan2 != null) {
System.out.println("Total Harga untuk " + pesanan2.namaPesanan + ": " + formatRupiah(pesanan2.totalHarga));
}
// Tanyakan apakah ingin lanjut ke menu berikutnya
if (!tanyaLanjut(scanner)) {
cetakStruk(scanner);
return;
}
// Input pemesanan ketiga
pesanan3 = inputPesanan(scanner, 3);
if (pesanan3 != null) {
System.out.println("Total Harga untuk " + pesanan3.namaPesanan + ": " + formatRupiah(pesanan3.totalHarga));
}
// Tanyakan apakah ingin lanjut ke menu berikutnya
if (!tanyaLanjut(scanner)) {
cetakStruk(scanner);
return;
}
// Input pemesanan keempat
pesanan4 = inputPesanan(scanner, 4);
if (pesanan4 != null) {
System.out.println("Total Harga untuk " + pesanan4.namaPesanan + ": " + formatRupiah(pesanan4.totalHarga));
}
// Cetak struk setelah selesai memesan
cetakStruk(scanner);
}
// Method untuk menangani input pemesanan
public static Pesanan inputPesanan(Scanner scanner, int menuKe) {
System.out.print("Masukkan pemesanan ke-" + menuKe + " (contoh: Nasi Padang = 2): ");
String pemesanan = scanner.nextLine();
if (pemesanan.isEmpty()) {
return null; // Tidak ada pesanan, kembali null
}
String[] parts = pemesanan.split("=");
return createPesanan(parts[0].trim(), Integer.parseInt(parts[1].trim()));
}
// Method untuk membuat pesanan dengan menghitung total harga
public static Pesanan createPesanan(String namaPesanan, int jumlahPesanan) {
double hargaPerItem = 0;
String namaPesananClassMenu = "";
if (namaPesanan.equalsIgnoreCase(makanan1.namaMenu)){ namaPesananClassMenu = makanan1.namaMenu;hargaPerItem = makanan1.harga; }
else if (namaPesanan.equalsIgnoreCase(makanan2.namaMenu)){ namaPesananClassMenu = makanan2.namaMenu;hargaPerItem = makanan2.harga; }
else if (namaPesanan.equalsIgnoreCase(makanan3.namaMenu)){ namaPesananClassMenu = makanan3.namaMenu;hargaPerItem = makanan3.harga; }
else if (namaPesanan.equalsIgnoreCase(makanan4.namaMenu)){ namaPesananClassMenu = makanan4.namaMenu;hargaPerItem = makanan4.harga; }
else if (namaPesanan.equalsIgnoreCase(minuman1.namaMenu)){ namaPesananClassMenu = minuman1.namaMenu;hargaPerItem = minuman1.harga; }
else if (namaPesanan.equalsIgnoreCase(minuman2.namaMenu)){ namaPesananClassMenu = minuman2.namaMenu;hargaPerItem = minuman2.harga; }
else if (namaPesanan.equalsIgnoreCase(minuman3.namaMenu)){ namaPesananClassMenu = minuman3.namaMenu;hargaPerItem = minuman3.harga; }
else if (namaPesanan.equalsIgnoreCase(minuman4.namaMenu)){ namaPesananClassMenu = minuman4.namaMenu;hargaPerItem = minuman4.harga; }
return new Pesanan(namaPesananClassMenu, jumlahPesanan, hargaPerItem);
}
// Fungsi untuk memilih minuman gratis
public static Menu pilihMinumanGratis(String namaMinuman) {
// Cek jika nama minuman cocok dengan nama menu yang ada
if (namaMinuman.equalsIgnoreCase(minuman1.getNamaMenu())) return minuman1;
else if (namaMinuman.equalsIgnoreCase(minuman2.getNamaMenu())) return minuman2;
else if (namaMinuman.equalsIgnoreCase(minuman3.getNamaMenu())) return minuman3;
else if (namaMinuman.equalsIgnoreCase(minuman4.getNamaMenu())) return minuman4;
return null; // Jika tidak ada yang cocok
}
// Fungsi cetakStruk untuk mencetak struk akhir semua pesanan
public static void cetakStruk(Scanner scanner) {
Menu minumanGratis = null;
double totalHargaPesanan = 0;
// Hitung total harga semua pesanan
if (pesanan1 != null) totalHargaPesanan += pesanan1.totalHarga;
if (pesanan2 != null) totalHargaPesanan += pesanan2.totalHarga;
if (pesanan3 != null) totalHargaPesanan += pesanan3.totalHarga;
if (pesanan4 != null) totalHargaPesanan += pesanan4.totalHarga;
// Penawaran minuman gratis jika total lebih dari 50.000
if (totalHargaPesanan > 50000) {
while (minumanGratis == null) {
System.out.print("\nAnda berhak memilih minuman gratis. Masukkan nama minuman: ");
String pilihanMinuman = scanner.nextLine();
// Pilih minuman gratis berdasarkan input pengguna
minumanGratis = pilihMinumanGratis(pilihanMinuman);
// Jika pilihan minuman tidak valid
if (minumanGratis == null) {
System.out.println("Minuman tidak valid. Silakan coba lagi.");
}
}
}
System.out.println("\n========== STRUK PEMBELIAN ==========");
double totalHargaAkhir = 0;
double totalBiayaMakananDanMinuman = 0;
if (pesanan1 != null) {
System.out.println(pesanan1.namaPesanan + " " + formatRupiah(pesanan1.hargaPerItem) + " x " + pesanan1.jumlahPesanan + " = " + formatRupiah(pesanan1.totalHarga));
totalHargaAkhir += pesanan1.totalHarga;
totalBiayaMakananDanMinuman += pesanan1.totalHarga;
}
if (pesanan2 != null) {
System.out.println(pesanan2.namaPesanan + " " + formatRupiah(pesanan2.hargaPerItem) + " x " + pesanan2.jumlahPesanan + " = " + formatRupiah(pesanan2.totalHarga));
totalHargaAkhir += pesanan2.totalHarga;
totalBiayaMakananDanMinuman += pesanan2.totalHarga;
}
if (pesanan3 != null) {
System.out.println(pesanan3.namaPesanan + " " + formatRupiah(pesanan3.hargaPerItem) + " x " + pesanan3.jumlahPesanan + " = " + formatRupiah(pesanan3.totalHarga));
totalHargaAkhir += pesanan3.totalHarga;
totalBiayaMakananDanMinuman += pesanan3.totalHarga;
}
if (pesanan4 != null) {
System.out.println(pesanan4.namaPesanan + " " + formatRupiah(pesanan4.hargaPerItem) + " x " + pesanan4.jumlahPesanan + " = " + formatRupiah(pesanan4.totalHarga));
totalHargaAkhir += pesanan4.totalHarga;
totalBiayaMakananDanMinuman += pesanan4.totalHarga;
}
System.out.println("Sub-Total : " + formatRupiah(totalHargaAkhir));
// Pajak 10%
double pajak = totalHargaAkhir * 0.10;
// Biaya pelayanan tetap
double biayaPelayanan = 20000;
// Diskon 10% jika lebih dari 100.000
if (totalHargaAkhir > 100000) {
totalHargaAkhir -= totalHargaAkhir * 0.10; // Diskon 10%
System.out.println("\nDiskon 10% diberikan karena total lebih dari 100.000,-");
System.out.println("Dipotong Diskon 10% Menjadi : " + formatRupiah(totalHargaAkhir));
}
// Penawaran beli satu gratis satu minuman jika total lebih dari 50.000
if (totalHargaAkhir > 50000) {
System.out.println("\nPenawaran beli satu gratis satu untuk kategori minuman diterapkan.");
if (minumanGratis != null) {
System.out.println("Minuman Gratis : " + minumanGratis.namaMenu);
}
// totalHargaAkhir -= totalBiayaMakananDanMinuman * 0.10; // Potong 10% untuk kategori minuman
}
// Hitung total akhir
totalHargaAkhir += pajak + biayaPelayanan;
System.out.println("\nPajak (10%): " + formatRupiah(pajak));
System.out.println("Biaya Pelayanan: " + formatRupiah(biayaPelayanan));
System.out.println("\nTotal Pembayaran: " + formatRupiah(totalHargaAkhir));
}
// Fungsi untuk format angka dalam Rupiah
public static String formatRupiah(double angka) {
DecimalFormat formatter = new DecimalFormat("#,###");
return "Rp. " + formatter.format(angka);
}
// Fungsi untuk menanyakan apakah pengguna ingin melanjutkan ke menu berikutnya
public static boolean tanyaLanjut(Scanner scanner) {
System.out.print("Apakah Anda ingin melanjutkan ke menu berikutnya? (ya/tidak): ");
String jawab = scanner.nextLine().trim().toLowerCase();
return jawab.equals("ya");
}
}
Penutup
Sekali lagi, ini adalah arsip tugas yang sudah selesai dan mendapat nilai baik. Tujuan saya membagikan ini adalah murni untuk pembelajaran bersama. Jangan ragu untuk:
- Mengajukan pertanyaan jika ada yang kurang jelas
- Mengembangkan program ini dengan ide-ide kreatif kalian
- Sharing pengalaman kalian sendiri
Mari kita tumbuh bersama dalam dunia programming! Keep coding, keep learning, dan #TetaplahBerbeda!
Kontak dan Diskusi
Untuk teman-teman yang ingin diskusi lebih lanjut tentang pemrograman desktop atau mata kuliah lainnya di UT, jangan ragu untuk menghubungi saya. Sharing is caring!
#TetaplahBerbeda #PemrogramanDesktop #UniversitasTerbuka #Java #Programming #BelajarBersama