Semua Artikel
Diposting pada 23 November 2024

Arsip Tugas 1 - Pemrograman Berbasis Desktop - Universitas Terbuka - 2024

By Khafid Ilham
Penulis

Tugas 1 Pemrograman Berbasis Desktop - Sistem Pemesanan Restoran

Oleh: Khafid Ilham

#TetaplahBerbeda

Catatan Penting: Artikel ini adalah penjelasan dari arsip Tugas 1 yang sudah selesai dikerjakan. Tujuan saya membagikan ini adalah untuk membantu teman-teman yang mungkin masih kesulitan memahami konsep pemrograman desktop, khususnya implementasi sistem restoran sederhana menggunakan Java. Mari kita belajar bersama! 😊

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:

  1. Kelas Menu
  2. Kelas Pesanan
  3. 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;
}
Tips: Constructor ini menggunakan konsep encapsulation, salah satu prinsip OOP yang penting untuk dipahami.

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)
Pro tip: Perhatikan bagaimana kelas ini memisahkan concerns antara data pesanan dan perhitungannya.

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
Tips implementasi promosi:
  • 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)
Tips perhitungan:
  • 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:

  1. Pahami dulu konsep OOP sebelum implementasi
  2. Buat flowchart/diagram sebelum coding
  3. Test program dengan berbagai skenario input
  4. Jangan ragu untuk eksplorasi dan modifikasi kode
  5. 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