Minggu, 28 September 2025

Pertemuan 5 - Aplikasi Sistem Pengambilan Mata Kuliah

 Nama    : Safa Mashita

 NRP      : 5025241022


Pertemuan 5 - Aplikasi Sistem Pengambilan Mata Kuliah


Hari ini saya belajar mengenai grouping object atau pengelompokan objek dalam PBO. Sebagai latihan, saya diminta untuk membuat sistem FRS (Formulir Rencana Studi) pengambilan mata kuliah sederhana menggunakan bahasa Java. Sistem ini melibatkan beberapa objek seperti mahasiswa, dosen, mata kuliah, dan kelas (classroom). Objek-objek tersebut saling berhubungan satu sama lain sehingga membentuk sebuah sistem yang terintegrasi.


A. Visualisasi Hubungan



Penjelasan :

  • Main → Semua class
    Main jadi pusat kontrol (entry point), semua interaksi user lewat sini.

  • Classroom ↔ Matakuliah
    Satu matakuliah bisa punya banyak kelas (misal JK Senin & Rabu).

  • Classroom ↔ Dosen
    Satu kelas diajar satu dosen, tapi dosen bisa mengajar banyak kelas.

  • Classroom ↔ Mahasiswa
    Relasi many-to-many: mahasiswa bisa ambil banyak kelas, kelas bisa diikuti banyak mahasiswa.

  • Mahasiswa ↔ Main
    Mahasiswa login lewat Main, lalu akses data kelas, dosen, dan matakuliah.


B. Alur Sistem FRS

Sistem FRS yang saya buat memiliki alur sebagai berikut.

1. Login

  • User (mahasiswa) harus login terlebih dahulu pakai NRP, Nama, dan Password.

  • Kalau cocok dengan data di sistem : masuk.

  • Kalau salah : gagal login.

2. Mahasiswa memilih menu
  • (1) Lihat Daftar Mata Kuliah : tampilkan semua kelas yang tersedia (info singkat: kode, nama, kapasitas).

  • (2) Lihat Daftar Mahasiswa di Suatu Kelas : pilih kelas, lalu tampilkan daftar mahasiswa yang sudah daftar kelas itu.

  • (3) Cari Mata Kuliah : masukkan kata kunci (nama/kode), sistem menampilkan kelas yang cocok.

  • (4) Registrasi Mata Kuliah : pilih kelas dari daftar, lalu sistem akan menambahkan mahasiswa ke kelas itu (jika belum penuh & belum terdaftar).

  • (5) Drop Mata Kuliah : lihat daftar kelas yang sudah diambil, pilih salah satu untuk di-drop.

  • (6) Lihat Riwayat KRS : tampilkan semua kelas yang sudah diambil oleh mahasiswa yang sedang login.

  • (7) Keluar : keluar dari sistem.


C. Code dan Penjelasan

Ada 5 class dalam sistem ini:

  1. Mahasiswa : Menyimpan data mahasiswa & kelas yang diambil.

  2. Dosen : Menyimpan data dosen pengajar.

  3. Matakuliah : Menyimpan data matakuliah.

  4. Classroom : Representasi kelas (gabungan matakuliah + dosen + jadwal + peserta).

  5. Main : Mengatur jalannya program (menu, login, registrasi, drop, dll).


1. Mahasiswa.java

import java.util.ArrayList;


public class Mahasiswa {

    private String nrp;  

    private String nama;

    private String password;

    private ArrayList<Classroom> kelasDiambil; 


    public Mahasiswa(String nrp, String nama, String password) {

        this.nrp = nrp;

        this.nama = nama;

        this.password = password;

        this.kelasDiambil = new ArrayList<>();

    }


    public String getNrp() { return nrp; }

    public String getNama() { return nama; }

    public String getPassword() { return password; }

    public ArrayList<Classroom> getKelasDiambil() { return kelasDiambil; }


    public void tambahKelas(Classroom c) {

        if (!kelasDiambil.contains(c)) {

            kelasDiambil.add(c);

        }

    }


    public void hapusKelas(Classroom c) {

        kelasDiambil.remove(c);

    }

}

Kegunaan:

Mewakili data mahasiswa dan kelas-kelas yang diambilnya.

Atribut:

  • nrp : Nomor registrasi mahasiswa, unik untuk setiap mahasiswa.

  • nama : Nama mahasiswa.

  • password : Password untuk login ke sistem.

  • kelasDiambil : List (ArrayList) dari Classroom yang sudah diambil mahasiswa.

Method:

  • Constructor Mahasiswa(String nrp, String nama, String password) : Membuat objek mahasiswa baru dan menginisialisasi daftar kelas kosong.

  • getNrp(), getNama(), getPassword() : Mengambil atribut masing-masing.

  • getKelasDiambil() : Mengembalikan list kelas yang diambil mahasiswa.

  • tambahKelas(Classroom c) : Menambahkan kelas ke daftar kelas mahasiswa jika belum ada.

  • hapusKelas(Classroom c) : Menghapus kelas dari daftar kelas mahasiswa.

Hubungan:
Mahasiswa bisa mengambil banyak Classroom. Jadi, Mahasiswa punya relasi many-to-many dengan Classroom (seorang mahasiswa bisa ikut banyak kelas, satu kelas bisa diikuti banyak mahasiswa).


2. Dosen.java

public class Dosen {

    private String nama;


    public Dosen(String nama) {

        this.nama = nama;

    }


    public String getNama() { return nama; }

}

Kegunaan:
Mewakili data dosen pengajar.

Atribut:

  • nama : Nama dosen.

Method:

  • Constructor Dosen(String nama) : Membuat objek dosen baru.

  • getNama() : Mengambil nama dosen.

Hubungan:
Setiap Classroom memiliki satu Dosen sebagai pengajar. Jadi, Classroom memiliki satu Dosen.


3. MataKuliah.java

public class Matakuliah {

    private String kode;

    private String nama;


    public Matakuliah(String kode, String nama) {

        this.kode = kode;

        this.nama = nama;

    }


    public String getKode() { return kode; }

    public String getNama() { return nama; }

}

Kegunaan:
Mewakili data mata kuliah.

Atribut:

  • kode : Kode mata kuliah, misal IF101.

  • nama : Nama mata kuliah, misal "Jaringan Komputer".

Method:

  • Constructor Matakuliah(String kode, String nama) : Membuat mata kuliah baru.

  • getKode(), getNama() : Mengambil kode dan nama mata kuliah.

Hubungan:
Setiap Classroom mengaitkan satu Matakuliah. Jadi, Classroom memiliki satu Matakuliah.


4. Classroom.java

import java.util.ArrayList;


public class Classroom {

    private Matakuliah matakuliah;

    private Dosen dosen;

    private String jadwal;

    private int kapasitas;

    private ArrayList<Mahasiswa> peserta;


    public Classroom(Matakuliah mk, Dosen dosen, String jadwal, int kapasitas) {

        this.matakuliah = mk;

        this.dosen = dosen;

        this.jadwal = jadwal;

        this.kapasitas = kapasitas;

        this.peserta = new ArrayList<>();

    }


    public Matakuliah getMatakuliah() { return matakuliah; }

    public Dosen getDosen() { return dosen; }

    public String getJadwal() { return jadwal; }

    public int getKapasitas() { return kapasitas; }

    public ArrayList<Mahasiswa> getPeserta() { return peserta; }


    public boolean tambahPeserta(Mahasiswa m) {

        if (peserta.size() < kapasitas && !peserta.contains(m)) {

            peserta.add(m);

            m.tambahKelas(this);

            return true;

        }

        return false;

    }


    public void hapusPeserta(Mahasiswa m) {

        peserta.remove(m);

        m.hapusKelas(this);

    }


    public String infoSingkat() {

        return matakuliah.getKode() + " - " + matakuliah.getNama() +

               " | Kapasitas: " + peserta.size() + "/" + kapasitas;

    }


    public String infoLengkap() {

        return matakuliah.getKode() + " - " + matakuliah.getNama() + "\n" +

               "Dosen  : " + dosen.getNama() + "\n" +

               "Jadwal : " + jadwal;

    }

}

Kegunaan:
Mewakili sebuah kelas dari mata kuliah tertentu, termasuk jadwal, dosen, dan peserta.

Atribut:

  • matakuliah : Objek Matakuliah dari kelas ini.

  • dosen : Objek Dosen pengajar.

  • jadwal : Waktu pelaksanaan kelas, misal "Senin 08:00".

  • kapasitas : Batas maksimal mahasiswa yang bisa ikut.

  • peserta : List (ArrayList) mahasiswa yang sudah mendaftar.

Method:

  • Constructor Classroom(Matakuliah mk, Dosen dosen, String jadwal, int kapasitas): Membuat kelas baru.

  • getMatakuliah(), getDosen(), getJadwal(), getKapasitas(), getPeserta() : Mengambil masing-masing atribut.

  • tambahPeserta(Mahasiswa m) : Menambahkan mahasiswa ke kelas jika kapasitas belum penuh, juga menambahkan kelas ke daftar mahasiswa.

  • hapusPeserta(Mahasiswa m) : Menghapus mahasiswa dari kelas dan dari daftar kelas mahasiswa.

  • infoSingkat() : Menampilkan ringkasan info kelas (kode, nama, kapasitas terisi).

  • infoLengkap() : Menampilkan info detail kelas (kode, nama, dosen, jadwal).

Hubungan:

  • Classroom mengaitkan 1 Matakuliah, 1 Dosen, dan banyak Mahasiswa.


5. Main.java

import java.util.*;


public class Main {

    private static ArrayList<Mahasiswa> daftarMahasiswa = new ArrayList<>();

    private static ArrayList<Classroom> daftarKelas = new ArrayList<>();

    private static Scanner sc = new Scanner(System.in);

    private static Mahasiswa currentUser;


    public static void main(String[] args) {

        seedData();

        if (login()) {

            int pilihan;

            do {

                System.out.println("\n=== MENU SISTEM FRS ===");

                System.out.println("1. Lihat Daftar Mata Kuliah");

                System.out.println("2. Lihat Daftar Mahasiswa di Suatu Kelas");

                System.out.println("3. Cari Mata Kuliah");

                System.out.println("4. Registrasi Mata Kuliah");

                System.out.println("5. Drop Mata Kuliah");

                System.out.println("6. Lihat Riwayat KRS");

                System.out.println("7. Keluar");

                System.out.print("Pilih menu: ");

                pilihan = sc.nextInt();

                sc.nextLine();


                switch (pilihan) {

                    case 1: lihatDaftarMK(); break;

                    case 2: lihatMahasiswaDalamKelas(); break;

                    case 3: cariMK(); break;

                    case 4: registrasiMK(); break;

                    case 5: dropMK(); break;

                    case 6: lihatRiwayat(); break;

                    case 7: System.out.println("Terima kasih!"); break;

                    default: System.out.println("Pilihan tidak valid");

                }

            } while (pilihan != 7);

        }

    }


    private static boolean login() {

        System.out.println("=== LOGIN SISTEM FRS ===");

        System.out.print("NRP      : ");

        String nrp = sc.nextLine();

        System.out.print("Nama     : ");

        String nama = sc.nextLine();

        System.out.print("Password : ");

        String pass = sc.nextLine();


        for (Mahasiswa m : daftarMahasiswa) {

            if (m.getNrp().equals(nrp) && m.getNama().equals(nama) && m.getPassword().equals(pass)) {

                currentUser = m;

                System.out.println("\nLogin berhasil, selamat datang " + m.getNama() + "!");

                lihatRiwayat();

                return true;

            }

        }

        System.out.println("Login gagal. Data tidak cocok.");

        return false;

    }


    private static void lihatDaftarMK() {

        System.out.println("\n=== Daftar Mata Kuliah ===");

        int i = 1;

        for (Classroom c : daftarKelas) {

            System.out.println(i++ + ". " + c.infoSingkat());

        }

    }


    private static void lihatMahasiswaDalamKelas() {

        lihatDaftarMK();

        System.out.print("Pilih nomor kelas: ");

        int idx = sc.nextInt(); sc.nextLine();

        if (idx > 0 && idx <= daftarKelas.size()) {

            Classroom c = daftarKelas.get(idx-1);

            System.out.println("\nMahasiswa di " + c.getMatakuliah().getKode() + " - " + c.getMatakuliah().getNama() + ":");

            if (c.getPeserta().isEmpty()) {

                System.out.println("Belum ada mahasiswa terdaftar.");

            } else {

                for (Mahasiswa m : c.getPeserta()) {

                    System.out.println(m.getNrp() + " - " + m.getNama());

                }

            }

        }

    }


    private static void cariMK() {

        System.out.print("Masukkan kata kunci mata kuliah: ");

        String key = sc.nextLine().toLowerCase();

        for (Classroom c : daftarKelas) {

            if (c.getMatakuliah().getNama().toLowerCase().contains(key) || 

                c.getMatakuliah().getKode().toLowerCase().contains(key)) {

                System.out.println(c.infoSingkat());

            }

        }

    }


    private static void registrasiMK() {

        lihatDaftarMK();

        System.out.print("Pilih nomor kelas untuk registrasi: ");

        int idx = sc.nextInt(); sc.nextLine();

        if (idx > 0 && idx <= daftarKelas.size()) {

            Classroom c = daftarKelas.get(idx-1);

            if (c.tambahPeserta(currentUser)) {

                System.out.println("\nRegistrasi berhasil!");

                System.out.println(c.infoLengkap());

            } else {

                System.out.println("Gagal registrasi. Mungkin kelas penuh atau sudah terdaftar.");

            }

        }

    }


    private static void dropMK() {

        lihatRiwayat();

        System.out.print("Pilih nomor kelas untuk drop: ");

        int idx = sc.nextInt(); sc.nextLine();

        if (idx > 0 && idx <= currentUser.getKelasDiambil().size()) {

            Classroom c = currentUser.getKelasDiambil().get(idx-1);

            c.hapusPeserta(currentUser);

            System.out.println("Berhasil drop kelas " + c.getMatakuliah().getNama());

        }

    }


    private static void lihatRiwayat() {

        System.out.println("\n=== Riwayat KRS " + currentUser.getNama() + " ===");

        ArrayList<Classroom> list = currentUser.getKelasDiambil();

        if (list.isEmpty()) {

            System.out.println("Belum ada mata kuliah yang diambil.");

        } else {

            int i = 1;

            for (Classroom c : list) {

                System.out.println(i++ + ". " + c.infoLengkap());

            }

        }

    }


    private static void seedData() {

        // Daftar mahasiswa dummy

        daftarMahasiswa.add(new Mahasiswa("5025241022", "Safa Mashita", "hai123"));

        daftarMahasiswa.add(new Mahasiswa("5025241023", "Andi Prasetyo", "andi123"));

        daftarMahasiswa.add(new Mahasiswa("5025241024", "Budi Santoso", "budi123"));


        // Daftar mata kuliah

        Matakuliah jk = new Matakuliah("IF101", "Jaringan Komputer");

        Matakuliah tg = new Matakuliah("IF102", "Teori Graf");

        Matakuliah kppl = new Matakuliah("IF103", "Konsep Pengembangan Perangkat Lunak");

        Matakuliah pw = new Matakuliah("IF104", "Pemrograman Web");


        daftarKelas.add(new Classroom(jk, new Dosen("Royyana Muslim Ijtihadie, S.Kom, M.Kom, Ph.D"), "Senin 08:00", 40));

        daftarKelas.add(new Classroom(jk, new Dosen("Dr. Baskoro Adi P., S.Kom., M.Kom."), "Rabu 10:00", 40));

        daftarKelas.add(new Classroom(tg, new Dosen("Victor Hariadi, S.Si., M.Kom."), "Selasa 09:00", 30));

        daftarKelas.add(new Classroom(tg, new Dosen("Arya Yudhi Wijaya, S.Kom, M.Kom."), "Kamis 13:00", 30));

        daftarKelas.add(new Classroom(kppl, new Dosen("Dr. Sarwosri, S.Kom., MT."), "Senin 13:00", 35));

        daftarKelas.add(new Classroom(kppl, new Dosen("Dr. Adhatus Solichah Ahmadiyah, S.Kom., M.Sc."), "Jumat 09:00", 35));

        daftarKelas.add(new Classroom(pw, new Dosen("Fajar Baskoro, S.Kom., MT."), "Selasa 13:00", 40));

        daftarKelas.add(new Classroom(pw, new Dosen("Misbakhul Munir Irfan Subakti, S.Kom., M.Sc."), "Kamis 10:00", 40));

    }

}

Kegunaan:

  • Menjadi program utama untuk menjalankan sistem FRS melalui menu interaktif.

  • Mengelola login, menampilkan daftar mata kuliah, registrasi, drop kelas, dan riwayat KRS mahasiswa.

Atribut:

  • daftarMahasiswa : List semua mahasiswa.

  • daftarKelas : List semua kelas (Classroom).

  • currentUser : Mahasiswa yang sedang login.

  • sc : Scanner untuk input dari user.

Method:

  • main() : Menjalankan program.

  • login() : Autentikasi mahasiswa.

  • lihatDaftarMK() : Menampilkan semua kelas.

  • lihatMahasiswaDalamKelas() : Menampilkan mahasiswa di kelas tertentu.

  • cariMK() : Mencari mata kuliah berdasarkan keyword.

  • registrasiMK() : Menambahkan mahasiswa ke kelas.

  • dropMK() : Menghapus mahasiswa dari kelas.

  • lihatRiwayat() : Menampilkan daftar kelas yang diambil mahasiswa.

  • seedData() : Mengisi data dummy mahasiswa, matakuliah, dosen, dan kelas untuk simulasi.

Hubungan:
Main menggunakan semua kelas (Mahasiswa, Classroom, Matakuliah, Dosen) untuk mewakili sistem FRS secara utuh.


D. Output

(1) Lihat Daftar Mata Kuliah



(2) Lihat Daftar Mahasiswa di Suatu Kelas 

      Berikut daftar mahasiswa yang ditampilkan setelah saya melakukan registrasi (menu 4).



(3) Cari Mata Kuliah 



(4) Registrasi Mata Kuliah 





(5) Drop Mata Kuliah 




(6) Lihat Riwayat KRS 


(7) Keluar 









Tidak ada komentar:

Posting Komentar

Pertemuan 16 - Membuat Aplikasi CRUD Java

 Nama          : Safa Mashita  NRP            : 5025241022 Membuat Aplikasi CRUD Java - Manajemen Buku Perpustakaan Pada pertemuan ini, saya...