Selasa, 23 September 2025

Pertemuan 5 - Implementasi Grouping Objek

 

Sistem FRS Mata Kuliah dengan JAWA JAVA

Nama : Hosea Felix Sanjaya
Kelas : PBO - A
NRP : 5025241177


1. Class Dosen

public class Dosen { private String nama; private String nip; public Dosen(String nama, String nip) { this.nama = nama; this.nip = nip; } public String getNama() { return nama; } public String getNip() { return nip; } }

Penjelasan:

  • Dosen menyimpan nama dan NIP dosen.

  • Atribut bersifat private → hanya bisa diakses lewat getter.

  • Constructor digunakan untuk mengisi data saat objek Dosen dibuat.


2. Class Mahasiswa

public class Mahasiswa { private String nama; private String nrp; public Mahasiswa(String nama, String nrp) { this.nama = nama; this.nrp = nrp; } public String getNama() { return nama; } public String getNrp() { return nrp; } }

Penjelasan:

  • Mahasiswa menyimpan nama dan NRP mahasiswa.

  • Sama seperti Dosen, atribut bersifat private.

  • Objek Mahasiswa akan digunakan untuk mendaftar mata kuliah.


3. Class MatKul

public class MatKul { private String kode; private String nama; private int sks; private Dosen dosenPengampu; private String jadwal; private int kapasitas; private Mahasiswa[] peserta; private int jumlahPeserta; public MatKul(String kode, String nama, int sks, Dosen dosenPengampu, String jadwal, int kapasitas) { this.kode = kode; this.nama = nama; this.sks = sks; this.dosenPengampu = dosenPengampu; this.jadwal = jadwal; this.kapasitas = kapasitas; this.peserta = new Mahasiswa[kapasitas]; this.jumlahPeserta = 0; } public String getKode() { return kode; } public String getNama() { return nama; } public int getSks() { return sks; } public Dosen getDosenPengampu() { return dosenPengampu; } public String getJadwal() { return jadwal; } public int getKapasitas() { return kapasitas; } public int getJumlahPeserta() { return jumlahPeserta; } public boolean sudahTerdaftar(Mahasiswa m) { for (int i = 0; i < jumlahPeserta; i++) { if (peserta[i].getNrp().equals(m.getNrp())) { return true; } } return false; } public boolean daftarMahasiswa(Mahasiswa m) { if (sudahTerdaftar(m)) { return false; } if (jumlahPeserta < kapasitas) { peserta[jumlahPeserta] = m; jumlahPeserta++; return true; } return false; } }

Penjelasan:

  • MatKul menyimpan info kode MK, nama MK, SKS, dosen pengampu, jadwal, kapasitas kelas, dan daftar peserta.

  • Method sudahTerdaftar() mengecek apakah mahasiswa sudah ikut mata kuliah itu.

  • Method daftarMahasiswa() untuk mendaftarkan mahasiswa baru, hanya jika belum terdaftar dan kapasitas belum penuh.


4. Class Classroom

public class Classroom { private Mahasiswa mahasiswa; private MatKul matakuliah; public Classroom(Mahasiswa mahasiswa, MatKul matakuliah) { this.mahasiswa = mahasiswa; this.matakuliah = matakuliah; } public void tampilkanInfo() { System.out.println("Mahasiswa: " + mahasiswa.getNama() + " (" + mahasiswa.getNrp() + ")"); System.out.println("Mengambil Mata Kuliah: " + matakuliah.getNama() + " [" + matakuliah.getKode() + "]"); System.out.println("Dosen Pengampu: " + matakuliah.getDosenPengampu().getNama()); System.out.println("===================================="); } }

Penjelasan:

  • Classroom menghubungkan Mahasiswa dengan Mata Kuliah.

  • Method tampilkanInfo() untuk menampilkan detail mahasiswa yang mengambil mata kuliah tertentu.


5. Class Main

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Dosen d1 = new Dosen("Wahyu Suadi", "19700101"); Dosen d2 = new Dosen("Dwi Agung", "19720303"); Dosen d3 = new Dosen("Yudhi Purwanto", "197206789"); MatKul[] daftarMK = new MatKul[3]; daftarMK[0] = new MatKul("IF101", "Sistem Digital", 3, d1, "Senin 08.00-10.00", 2); daftarMK[1] = new MatKul("IF102", "Struktur Data", 3, d2, "Rabu 10.00-12.00", 1); daftarMK[2] = new MatKul("IF103", "Dasar Pemrograman", 3, d3, "Kamis 10.00-12.00", 3); int pilihanMenu = 0; while (pilihanMenu != 4) { System.out.println("\n===== SISTEM PENGAMBILAN MATA KULIAH ====="); System.out.println("1. Daftar Mahasiswa ke Mata Kuliah"); System.out.println("2. Lihat Daftar Mata Kuliah"); System.out.println("3. Lihat Histori Mahasiswa"); System.out.println("4. Keluar"); System.out.print("Pilih menu: "); pilihanMenu = sc.nextInt(); sc.nextLine(); if (pilihanMenu == 1) { System.out.print("Masukkan nama mahasiswa: "); String nama = sc.nextLine(); System.out.print("Masukkan NRP: "); String nrp = sc.nextLine(); Mahasiswa mhs = new Mahasiswa(nama, nrp); System.out.println("\nDaftar Mata Kuliah:"); for (int i = 0; i < daftarMK.length; i++) { MatKul mk = daftarMK[i]; System.out.println((i+1) + ". " + mk.getNama() + " (" + mk.getKode() + ") - Kapasitas: " + mk.getJumlahPeserta() + "/" + mk.getKapasitas()); } System.out.print("\nPilih mata kuliah (nomor): "); int pilihan = sc.nextInt(); sc.nextLine(); if (pilihan > 0 && pilihan <= daftarMK.length) { MatKul mk = daftarMK[pilihan - 1]; if (mk.sudahTerdaftar(mhs)) { System.out.println("\nPendaftaran gagal! Mahasiswa sudah mengambil mata kuliah ini."); } else { boolean berhasil = mk.daftarMahasiswa(mhs); if (berhasil) { System.out.println("\nPendaftaran berhasil!"); System.out.println("Mahasiswa: " + mhs.getNama() + " (" + mhs.getNrp() + ")"); System.out.println("Mengambil MK: " + mk.getNama() + " [" + mk.getKode() + "]"); System.out.println("Dosen: " + mk.getDosenPengampu().getNama()); System.out.println("Jadwal: " + mk.getJadwal()); } else { System.out.println("\nPendaftaran gagal! Kelas sudah penuh."); } } } else { System.out.println("Pilihan tidak valid."); } } else if (pilihanMenu == 2) { System.out.println("\nDaftar Mata Kuliah:"); for (int i = 0; i < daftarMK.length; i++) { MatKul mk = daftarMK[i]; System.out.println((i+1) + ". " + mk.getNama() + " (" + mk.getKode() + ") - Kapasitas: " + mk.getJumlahPeserta() + "/" + mk.getKapasitas()); } } else if (pilihanMenu == 3) { System.out.print("Masukkan NRP mahasiswa: "); String nrpCari = sc.nextLine(); System.out.println("\nHistori mata kuliah untuk NRP " + nrpCari + ":"); boolean ada = false; for (int i = 0; i < daftarMK.length; i++) { MatKul mk = daftarMK[i]; if (mk.sudahTerdaftar(new Mahasiswa("", nrpCari))) { System.out.println("- " + mk.getNama() + " (" + mk.getKode() + "), Dosen: " + mk.getDosenPengampu().getNama() + ", Jadwal: " + mk.getJadwal()); ada = true; } } if (!ada) { System.out.println("Belum ada mata kuliah yang diambil."); } } else if (pilihanMenu == 4) { System.out.println("Terima kasih, program selesai."); } else { System.out.println("Menu tidak valid."); } } sc.close(); } }

Penjelasan:

  • Main adalah class utama tempat program dijalankan.

  • Menyediakan menu interaktif:

    1. Daftar Mahasiswa ke Mata Kuliah

    2. Lihat Daftar Mata Kuliah

    3. Lihat Histori Mahasiswa

    4. Keluar

  • Program menggunakan array untuk menyimpan daftar mata kuliah dan mahasiswa yang sudah terdaftar.


Kesimpulan

Program ini menunjukkan bagaimana OOP dapat digunakan untuk membuat sistem sederhana FRS Mata Kuliah.

  • Dosen, Mahasiswa, dan MatKul adalah entitas utama.

  • Classroom menghubungkan mahasiswa dengan mata kuliah.

  • Main berperan sebagai interface pengguna (menu interaktif).

Dengan sistem ini, mahasiswa bisa mendaftar, melihat daftar mata kuliah, serta mengecek histori pengambilan kuliah.

Dokumentasi:





Senin, 15 September 2025

Pertemuan 4 - Interaksi Objek

Tugas 4 Pemrograman Berorientasi Objek (A) 2024

Nama : Hosea Felix Sanjaya

NRP   : 5025241177

Kelas : A

Program Digital Clock adalah sebuah aplikasi jam digital sederhana berbasis Java, yang ditampilkan menggunakan GUI menggunakan Swing.



Buat struktur seperti gambar tertera terlebih dahulu


Class NumberDisplay

Class NumberDisplay adalah Class yang berguna untuk mengelola nilai waktu (jam, menit, atau detik) yang memiliki batasan dan dapat melakukan rollover(kembali ke nilai nol ketika mencapai batasnya). Class ini digunakan oleh Class ClockDisplay untuk mempresentasikan jam, menit, dan detik.
public class NumberDisplay {
    private int limit;
    private int value;

    public NumberDisplay(int rollOverLimit) {
        limit = rollOverLimit;
        value = 0;
    }

    public int getValue() {
        return value;
    }

    public String getDisplayValue() {
        if (value < 10) {
            return "0" + value;
        } else {
            return "" + value;
        }
    }

    public void setValue(int replacementValue) {
        if ((replacementValue >= 0) && (replacementValue < limit)) {
            value = replacementValue;
        }
    }

    public void increment() {
        value = (value + 1) % limit;
    }
}

Penjelasan

  • Atribut
    • limit: Batas maksimum nilai yang bisa disimpan. Misalnya, untuk detik dan menit, batasnya adalah 60, sedangkan untuk jam, batasnya adalah 24.
    • value: Nilai waktu yang disimpan saat ini.
  • Metode
    • getValue(): Mengembalikan nilai waktu saat ini.
    • getDisplayValue(): Mengembalikan nilai waktu dalam bentuk string dengan format dua digit (misalnya, "02" untuk angka 2).
    • setValue(int replacementValue): Menetapkan nilai waktu dengan batasan tertentu. Jika nilainya valid (>= 0 dan < limit), nilai akan diperbarui.
    • increment(): Menambah nilai waktu. Jika mencapai batas, nilai akan kembali ke 0.

Class ClockDisplay

Class ClockDisplay adalah Class yang berguna untuk mengelola seluruh waktu (jam, menit, dan detik) menggunakan tiga objek dari Class NumberDisplay. Class ini mengelola pembaruan waktu dan menyediakan interface untuk mendapatkan waktu dalam format string yang dapat ditampilkan.
public class ClockDisplay {
    private NumberDisplay hours;
    private NumberDisplay minutes;
    private NumberDisplay seconds;
    private String displayString;

    public ClockDisplay(int hour, int minute, int second) {
        hours = new NumberDisplay(24);
        minutes = new NumberDisplay(60);
        seconds = new NumberDisplay(60);
        setTime(hour, minute, second);
    }

    public void timeTick() {
        seconds.increment();
        if (seconds.getValue() == 0) {
            minutes.increment();
            if (minutes.getValue() == 0) {
                hours.increment();
            }
        }
        updateDisplay();
    }

    public void setTime(int hour, int minute, int second) {
        hours.setValue(hour);
        minutes.setValue(minute);
        seconds.setValue(second);
        updateDisplay();
    }

    public String getTime() {
        return displayString;
    }

    private void updateDisplay() {
        displayString = hours.getDisplayValue() + ":" + minutes.getDisplayValue() + ":" + seconds.getDisplayValue();
    }
}

Penjelasan

  • Atribut
    • hours, minutes, seconds: Masing-masing merupakan objek Class NumberDisplay yang menyimpan jam, menit, dan detik.
    • displayString: Representasi waktu dalam bentuk string yang akan ditampilkan di GUI.
  • Metode
    • Constructor: Menginisialisasi objek NumberDisplay untuk jam, menit, dan detik. Nilai awal ditetapkan melalui parameter.
    • timeTick(): Metode ini dipanggil setiap detik. Ia akan menambah nilai detik, dan jika detik kembali menjadi nol, maka menit akan ditambah. Hal yang sama juga terjadi pada jam.
    • setTime(int hour, int minute, int second): Menetapkan nilai jam, menit, dan detik sesuai dengan parameter yang diberikan.
    • getTime(): Mengembalikan waktu dalam format string yang digunakan untuk ditampilkan di GUI.
    • updateDisplay(): Memperbarui string representasi waktu berdasarkan nilai terbaru dari jam, menit, dan detik.

Class ClockGUI

Class ClockGUI adalah Class yang berguna untuk mengelola tampilan antarmuka jam. Class ini menggunakan library Swing untuk menampilkan GUI jam digital. serta menggunakan Timer untuk mengatur interval pembaruan setiap detik.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.LocalTime;

class ClockGUI extends JFrame {
    private ClockDisplay clock;
    private JLabel timeLabel;
    private Timer timer;

    public ClockGUI() {
        LocalTime curTime = LocalTime.now();
        clock = new ClockDisplay(curTime.getHour(), curTime.getMinute(), curTime.getSecond());

        setTitle("This is a clock.");
        setSize(300, 150);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        timeLabel = new JLabel(clock.getTime(), SwingConstants.CENTER);
        timeLabel.setFont(new Font("Serif", Font.BOLD, 40));
        add(timeLabel, BorderLayout.CENTER);

        startClock();

        setVisible(true);
    }

    private void startClock() {
        timer = new Timer(1000, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                clock.timeTick();
                timeLabel.setText(clock.getTime());
            }
        });

        timer.start();
    }
}

Penjelasan

  • Atribut
    • clock: Objek dari Class ClockDisplay yang mengelola waktu.
    • timeLabel: Label GUI yang menampilkan waktu saat ini.
    • timer: Objek Timer dari Swing yang memicu pembaruan setiap detik.
  • Metode
    • Constructor: Inisialisasi waktu saat ini menggunakan LocalTime, membuat objek ClockDisplay, dan menampilkan GUI dengan label waktu di tengah. Metode ini juga mengatur timer untuk memperbarui waktu setiap detik.
    • startClock(): Memulai timer yang memanggil timeTick() dari ClockDisplay setiap detik, lalu memperbarui label waktu.

Class Main

Class Main adalah titik eksekusi program yang akan memanggil ClockGUI untuk memulai aplikasi jam digital.
import javax.swing.*;

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ClockGUI();
            }
        });
    }
}

Penjelasan

  • Metode
    • main(): Metode utama yang akan dipanggil ketika program dijalankan. SwingUtilities.invokeLater() memastikan bahwa antarmuka pengguna dibuat di thread event dispatch, sesuai standar penggunaan Swing untuk aplikasi GUI.
Dokumentasi



Senin, 08 September 2025

Pertemuan 3 - Membuat Class Ticket Machine

Pertemuan 3 - Membuat Class Ticket Machine

Nama : Hosea Felix Sanjaya

NRP : 5025241177

Kelas : A

Tahun : 2025
Pada pertemuan kali ini, kita akan belajar tentang pembuatan class sederhana di Java dengan studi kasus Ticket Machine. Program ini mensimulasikan sebuah mesin tiket sederhana yang menerima uang, memeriksa apakah saldo mencukupi, lalu mencetak tiket jika syarat terpenuhi.


Apa itu TicketMachine?

TicketMachine adalah sebuah class di Java yang merepresentasikan sebuah mesin penjual tiket otomatis. Mesin ini bekerja dengan konsep sederhana:

  1. Setiap tiket memiliki harga tetap (flat-fare).
  2. Pengguna memasukkan sejumlah uang.
  3. Jika saldo mencukupi, tiket akan dicetak.
  4. Jika saldo tidak mencukupi, sistem akan menampilkan pesan error.
  5. Pengguna bisa meminta refund jika ingin menarik kembali uang yang sudah dimasukkan.

Kode Lengkap TicketMachine


/**
* TicketMachine models a ticket machine that issues
* flat-fare tickets.
* The price of a ticket is specified via the constructor.
* Instances will check to ensure that a user only enters
* sensible amounts of money, and will only print a ticket
* if enough money has been input.
* @author ...
*/
public class TicketMachine
{
    private int price;
    private int balance;
    private int total;

    public TicketMachine(int cost) {
        price = cost;
        balance = 0;
        total = 0;
    }

    public int getPrice() {
        return price;
    }

    public int getBalance() {
        return balance;
    }

    public void insertMoney(int amount) {
        if(amount > 0) {
            balance = balance + amount;
        }
        else {
            System.out.println("Use a positive amount rather than: " + amount);
        }
    }

    public void printTicket() {
        if(balance >= price) {
            System.out.println("##################");
            System.out.println("# The BlueJ Line");
            System.out.println("# Ticket");
            System.out.println("# " + price + " cents.");
            System.out.println("##################");
            System.out.println();

            total = total + price;
            balance = balance - price;
        }
        else {
            System.out.println("You must insert at least: " +
                               (price - balance) + " cents.");
        }
    }

    public int refundBalance() {
        int amountToRefund = balance;
        balance = 0;
        return amountToRefund;
    }
}

Penjelasan Kode

1. Variabel Instans


private int price;
private int balance;
private int total;

2. Constructor


public TicketMachine(int cost) {
    price = cost;
    balance = 0;
    total = 0;
}

3. Method Getter


public int getPrice() { return price; }
public int getBalance() { return balance; }

4. Memasukkan Uang


public void insertMoney(int amount) {
    if(amount > 0) {
        balance = balance + amount;
    }
    else {
        System.out.println("Use a positive amount rather than: " + amount);
    }
}

5. Mencetak Tiket


public void printTicket() {
    if(balance >= price) {
        ...
        total = total + price;
        balance = balance - price;
    }
    else {
        System.out.println("You must insert at least: " +
                           (price - balance) + " cents.");
    }
}

6. Refund Uang


public int refundBalance() {
    int amountToRefund = balance;
    balance = 0;
    return amountToRefund;
}

Contoh Penggunaan


public class Main {
    public static void main(String[] args) {
        TicketMachine mesin = new TicketMachine(5000);

        System.out.println("Harga tiket: " + mesin.getPrice());

        mesin.insertMoney(2000);
        mesin.printTicket(); // saldo kurang

        mesin.insertMoney(5000);
        mesin.printTicket(); // tiket tercetak

        int refund = mesin.refundBalance();
        System.out.println("Uang dikembalikan: " + refund);
    }
}

Output:


Harga tiket: 5000
You must insert at least: 3000 cents.
##################
# The BlueJ Line
# Ticket
# 5000 cents.
##################

Uang dikembalikan: 2000

Kesimpulan

Pada pertemuan ini, kita sudah belajar cara membuat sebuah class sederhana di Java dengan contoh TicketMachine. Konsep penting yang bisa kita ambil adalah:

  1. Encapsulation → variabel dibuat private, hanya bisa diakses lewat method.
  2. Constructor → digunakan untuk inisialisasi objek.
  3. Method → tempat menuliskan perilaku/aksi dari objek.

TicketMachine adalah contoh bagus bagaimana sebuah objek nyata (mesin tiket) bisa dimodelkan dalam program menggunakan Object-Oriented Programming (OOP).


👉 Pertemuan selanjutnya kita bisa kembangkan program ini, misalnya menambahkan fitur cek total penjualan, atau bahkan membuat mesin tiket dengan banyak jenis tiket berbeda.

Dokumentasi :

Sabtu, 06 September 2025

Pemrograman Berbasis Objek (PBO) A 2025

Pertemuan 1 - Latihan Mengetik 10 Jari

Nama : Hosea Felix Sanjaya
NRP : 5025241177
Kelas : A
Tahun : 2025

Pada pertemuan pertama, saya diminta untuk mulai berlatih mengetik menggunakan 10 jari. Awalnya terasa aneh, kaku, bahkan cukup bikin frustasi karena jari-jari saya belum terbiasa bergerak sesuai posisi yang benar di keyboard.

Hari 1

Hari 2

Hari 3

Hari 4

Hari 5

Hari 6

Hari 7

Selama 7 hari latihan, saya mendokumentasikan setiap perkembangannya. Pada hari-hari awal (hari 1–6), akurasi saya sering turun. Hal ini wajar karena sebelumnya saya terbiasa hanya menggunakan 6 jari. Rasanya seperti harus “melupakan” kebiasaan lama, lalu membangun ulang dari nol dengan pola yang baru. Ada momen di mana saya merasa sudah cepat, tapi ternyata akurasi jeblok karena banyak salah ketik.

Namun, usaha itu mulai terbayar pada hari ke-7. Jari-jari saya terasa lebih luwes, koordinasi mata dan tangan semakin baik, dan hasilnya pun meningkat: saya berhasil mencatat 74.72 WPM dengan akurasi yang jauh lebih stabil dibandingkan hari-hari sebelumnya.

Pengalaman ini mengajarkan saya satu hal penting: kemajuan tidak datang secara instan, tapi lahir dari konsistensi. Dengan disiplin meluangkan waktu setiap hari, perlahan-lahan kemampuan mengetik saya mulai terbentuk. Perjalanannya memang tidak selalu mulus, tapi setiap salah ketik dan penurunan akurasi adalah bagian dari proses belajar.

Saya semakin yakin bahwa kebiasaan kecil yang dilakukan terus-menerus akan menghasilkan perubahan besar. Hari ke-7 ini baru permulaan, dan saya tidak sabar melihat perkembangan kecepatan mengetik saya di minggu-minggu berikutnya.





Pertemuan 15 : Aplikasi CRUD JAVA

Pertemuan 15 - Java CRUD Database Tanggal: 9 Desember 2025 Nama: Hosea Felix Sanjaya NRP: 5025241177 a. Setup & Persiapan Envi...