Nama : Erlangga Rizqi Dwi Raswanto
NRP : 5025241179
Kelas : PBO A
1) Pendahuluan
Pada minggu ini dibuat sebuah sistem mini FRS (Formulir Rencana Studi) untuk mendemonstrasikan konsep OOP dengan kode Java sederhana. Fungsi aplikasi :
-
Melihat daftar mata kuliah yang tersedia
-
Mengambil mata kuliah (cek kapasitas & duplikasi)
-
Drop mata kuliah
-
Melihat KRS (daftar MK diambil + total SKS)
2) Empat Pilar OOP (dan bagaimana diterapkan)
-
Encapsulation (Enkapsulasi)
-
Seluruh atribut pada
Dosen,MataKuliah,Mahasiswabersifatprivatedan diakses via getter (dan operasi khusus sepertidaftar(),batal(),ambil(),drop()). -
Efeknya: aturan kapasitas, larangan duplikasi, dsb terkendali di dalam kelasnya masing-masing.
-
-
Abstraction (Abstraksi)
-
Detail teknis seperti logika naik/turun kapasitas disembunyikan melalui metode
daftar()/batal()padaMataKuliah. -
Kelas
Maincukup memanggil API sederhana (mis.m.ambil(mk)), tanpa tahu bagaimana kapasitas dihitung.
-
-
Inheritance (Pewarisan)
-
Program ini tidak memakai pewarisan eksplisit (selain turunan implisit dari
Object). -
Jika diperlukan, sangat mudah menambahkan superkelas
Orang(punyanama) laluDosen&Mahasiswamewarisinya.
-
-
Polymorphism (Polimorfisme)
-
Method overriding pada
toString()(diDosen,MataKuliah). Saat objek dicetak, Java memilih implementasitoStringmilik objek aktual (polimorfisme berbasisObject).
-
3) Diagram Kelas (UML)
classDiagram
class Dosen {
- nama : String
- nip : String
+ Dosen(nama:String, nip:String)
+ getNama() String
+ getNip() String
+ toString() String
}
class MataKuliah {
- kode : String
- nama : String
- sks : int
- kapasitas : int
- terisi : int
- jadwal : String
- dosen : Dosen
+ MataKuliah(kode,nama,sks,kapasitas,jadwal,dosen)
+ getKode() String
+ getNama() String
+ getSks() int
+ getJadwal() String
+ getDosen() Dosen
+ isPenuh() boolean
+ daftar() boolean
+ batal() boolean
+ toString() String
}
class Mahasiswa {
- nama : String
- nrp : String
- krs : List<MataKuliah>
+ Mahasiswa(nama:String, nrp:String)
+ getNama() String
+ getNrp() String
+ getKRS() List<MataKuliah>
+ ambil(MataKuliah) boolean
+ drop(MataKuliah) boolean
+ totalSks() int
}
class Main {
+ main(String[]) void
- tampilKatalog(List<MataKuliah>) void
- cetakKRS(Mahasiswa) void
- bacaInt() int
- valid(int, List<?>) boolean
}
Dosen <.. MataKuliah : dosen pengampu
Mahasiswa "1" --> "*" MataKuliah : mengambil
4) Rincian Kelas & Metode
A. Dosen
-
Atribut:
nama,nip(keduanyafinal) -
Metode kunci:
toString()untuk menampilkan dosen rapi di konsol. -
Peran: metadata pengampu MK (tanpa logika bisnis).
B. MataKuliah
-
Atribut:
kode,nama,sks,kapasitas,terisi,jadwal,dosen. -
Metode bisnis:
-
isPenuh()→truejikaterisi >= kapasitas -
daftar()→ tambah 1 kursi jika belum penuh -
batal()→ kurangi 1 kursi jika ada yang terdaftar
-
-
Tujuan: menjaga aturan kapasitas dan format tampilan.
C. Mahasiswa
-
Atribut:
nama,nrp,krs(list MK yang diambil) -
Metode bisnis:
-
ambil(mk)→ gagal jika sudah diambil atau kapasitas penuh -
drop(mk)→ gagal jika MK belum ada di KRS -
totalSks()→ jumlahkanskssemua MK dikrs
-
-
Tujuan: menjaga aturan duplikasi di sisi mahasiswa.
D. Main
-
-
Inisialisasi data contoh (
Dosen, daftarMataKuliah) -
Input 1 mahasiswa
-
Menu: daftar MK / ambil / drop / lihat KRS
-
Utilitas:
tampilKatalog,cetakKRS,bacaInt,valid
-
5) Alur Operasi (Ringkas)
sequenceDiagram
participant U as User
participant Main
participant Mhs as Mahasiswa
participant MK as MataKuliah
U->>Main: Pilih (1) Lihat daftar MK
Main->>Main: tampilKatalog(katalog)
U->>Main: Pilih (2) Ambil MK (nomor i)
Main->>MK: katalog.get(i)
Main->>Mhs: ambil(MK)
Mhs->>MK: daftar() (cek kapasitas)
MK-->>Mhs: true/false
Mhs-->>Main: true/false (tambah ke KRS jika true)
Main-->>U: Berhasil/Gagal
U->>Main: Pilih (3) Drop MK (nomor j di KRS)
Main->>Mhs: drop(MK_j)
Mhs->>MK: batal() (kurangi terisi)
MK-->>Mhs: true/false
Mhs-->>Main: true/false
Main-->>U: Berhasil/Gagal
U->>Main: Pilih (4) Lihat KRS
Main->>Mhs: getKRS(), totalSks()
Main-->>U: Daftar MK + total SKS
6) Source Code
Dosen.java
public class Dosen {
private final String nama;
private final String nip;
public Dosen(String nama, String nip) {
this.nama = nama;
this.nip = nip;
}
public String getNama() { return nama; }
public String getNip() { return nip; }
@Override
public String toString() {
return nama + " (NIP: " + nip + ")";
}
}
Mahasiswa.javaimport java.util.ArrayList; import java.util.Collections; import java.util.List; public class Mahasiswa { private String nama; private String nrp; private List<MataKuliah> krs = new ArrayList<>(); public Mahasiswa(String nama, String nrp) { this.nama = nama; this.nrp = nrp; } public String getNama() { return nama; } public String getNrp() { return nrp; } public List<MataKuliah> getKRS() { return Collections.unmodifiableList(krs); } public boolean ambil(MataKuliah mk) { if (krs.contains(mk)) return false; // sudah diambil if (mk.daftar()) { krs.add(mk); return true; } return false; // penuh } public boolean drop(MataKuliah mk) { if (!krs.contains(mk)) return false; if (mk.batal()) { krs.remove(mk); return true; } return false; } public int totalSks() { int sum = 0; for (MataKuliah mk : krs) sum += mk.getSks(); return sum; } }
MataKuliah.java
public class MataKuliah {
private String kode;
private String nama;
private int sks;
private int kapasitas;
private int terisi = 0;
private String jadwal; // contoh: "Senin 10:00-11:50"
private Dosen dosen;
public MataKuliah(String kode, String nama, int sks, int kapasitas, String jadwal, Dosen dosen) {
this.kode = kode;
this.nama = nama;
this.sks = sks;
this.kapasitas = kapasitas;
this.jadwal = jadwal;
this.dosen = dosen;
}
public String getKode() { return kode; }
public String getNama() { return nama; }
public int getSks() { return sks; }
public String getJadwal() { return jadwal; }
public Dosen getDosen() { return dosen; }
public boolean isPenuh() { return terisi >= kapasitas; }
/** Coba daftar satu kursi. true jika berhasil */
public boolean daftar() {
if (isPenuh()) return false;
terisi++;
return true;
}
/** Batalkan satu kursi. true jika berhasil */
public boolean batal() {
if (terisi <= 0) return false;
terisi--;
return true;
}
@Override
public String toString() {
String d = (dosen == null ? "-" : dosen.getNama());
return String.format("%s - %s (%d SKS) | %s | %d/%d | Dosen: %s",
kode, nama, sks, jadwal, terisi, kapasitas, d);
}
}Main.javaimport java.util.*;
public class Main {
private static final Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
// Data contoh dosen
Dosen d1 = new Dosen("Fajar Baskoro", "19700001");
Dosen d2 = new Dosen("Victor Hariadi", "19700002");
// Input satu mahasiswa
System.out.print("Nama mahasiswa : ");
String nama = sc.nextLine();
System.out.print("NRP mahasiswa : ");
String nrp = sc.nextLine();
Mahasiswa m = new Mahasiswa(nama, nrp);
// Katalog MK minimal
List<MataKuliah> katalog = new ArrayList<>();
katalog.add(new MataKuliah("IF101", "PBO", 3, 2, "Senin 10:00-11:50", d1));
katalog.add(new MataKuliah("IF102", "Teori Graf", 3, 3, "Selasa 08:00-09:40", d2));
katalog.add(new MataKuliah("IF103", "Struktur Data",3, 1, "Kamis 10:00-11:50", d2));
int pilih;
do {
System.out.println("\n==== MENU FRS (Sederhana) ====");
System.out.println("Login: " + m.getNama() + " (" + m.getNrp() + ")");
System.out.println("1. Lihat daftar mata kuliah");
System.out.println("2. Ambil mata kuliah");
System.out.println("3. Drop mata kuliah");
System.out.println("4. Lihat KRS");
System.out.println("0. Keluar");
System.out.print("Pilih: ");
pilih = bacaInt();
switch (pilih) {
case 1:
tampilKatalog(katalog);
break;
case 2:
tampilKatalog(katalog);
System.out.print("Pilih nomor MK: ");
int ambil = bacaInt() - 1;
if (valid(ambil, katalog)) {
boolean ok = m.ambil(katalog.get(ambil));
System.out.println(ok ? "Berhasil ambil." : "Gagal (penuh/duplikat).");
}
break;
case 3:
List<MataKuliah> list = new ArrayList<>(m.getKRS());
if (list.isEmpty()) { System.out.println("KRS kosong."); break; }
for (int i = 0; i < list.size(); i++) {
System.out.println((i+1) + ". " + list.get(i));
}
System.out.print("Pilih nomor MK untuk di-drop: ");
int drop = bacaInt() - 1;
if (valid(drop, list)) {
boolean ok = m.drop(list.get(drop));
System.out.println(ok ? "Berhasil drop." : "Gagal drop.");
}
break;
case 4:
cetakKRS(m);
break;
case 0:
System.out.println("Selesai.");
break;
default:
System.out.println("Menu tidak valid.");
}
} while (pilih != 0);
}
private static void tampilKatalog(List<MataKuliah> katalog) {
System.out.println("\nDaftar Mata Kuliah:");
for (int i = 0; i < katalog.size(); i++) {
System.out.println((i + 1) + ". " + katalog.get(i));
}
}
private static void cetakKRS(Mahasiswa m) {
List<MataKuliah> list = new ArrayList<>(m.getKRS());
if (list.isEmpty()) { System.out.println("KRS kosong."); return; }
System.out.println("\nKRS Saat Ini:");
int total = 0;
for (MataKuliah mk : list) {
System.out.println("- " + mk.getNama() + " (" + mk.getSks() + " SKS)");
total += mk.getSks();
}
System.out.println("Total SKS: " + total);
}
private static int bacaInt() {
while (true) {
try {
return Integer.parseInt(sc.nextLine().trim());
} catch (Exception e) {
System.out.print("Masukkan angka: ");
}
}
}
private static boolean valid(int idx, List<?> list) {
if (idx < 0 || idx >= list.size()) {
System.out.println("Nomor tidak valid.");
return false;
}
return true;
}
}
7) Contoh Penggunaan
Tidak ada komentar:
Posting Komentar