Senin, 13 Oktober 2025

PBO A - Pertemuan 7 - FRS Tech Support System

 Nama    : Erlangga Rizqi Dwi Raswanto

NRP      : 5025241179

Kelas     : PBO A


Pada pertemuan ini, dibuat implementasi support system yang berkaitan dengan FRS. Program bekerja sebagai chatbot sederhana yang membaca keluhan pengguna lalu memberikan saran berbasis kata kunci. Solusi memanfaatkan struktur data Map (LinkedHashMap) untuk pemetaan keyword → respons, List (ArrayList) untuk fallback jawaban generik, serta Random untuk merandom jawaban generik ketika tidak ada kata kunci yang cocok.
Agar pencocokan lebih akurat, sistem menerapkan strategi “prioritas frasa terpanjang”: contoh, frasa “login gagal” akan dipilih lebih dulu dibanding kata tunggal “login”.

Kode FRSSupportApp.java

Tujuan: titik masuk program, menangani loop input, menampilkan bantuan, daftar kata kunci (faq), dan keluar program.

 import java.util.Scanner;  
   
 public class FRSSupportApp  
 {  
   public static void main(String[] args){  
     Scanner sc = new Scanner(System.in);  
     Responder responder = new Responder();  
       
     System.out.println("=== FRS Technical Support (Console) ===");  
     System.out.println("Ketik keluhan Anda (contoh: 'login gagal', 'jadwal bentrok').");  
     System.out.println("Perintah: 'faq' (lihat kata kunci), 'help' (bantuan), 'exit' (keluar).\n");  
       
     while(true){  
       System.out.print("> ");  
         
       if (!sc.hasNextLine()) break;  
         
       String input = sc.nextLine().trim();  
         
       if (input.equalsIgnoreCase("exit")){  
         System.out.println("Terimakasih! Semoga masalah anda terselesaikan!");  
         break;  
       }  
         
       if (input.equalsIgnoreCase("help")){  
         System.out.println("Bantuan: ");  
         System.out.println("Sistem cocokan kata kunci dan beri solusi");  
         System.out.println("Perintah: faq, help, exit.\n");  
         continue;  
       }  
         
       if (input.equalsIgnoreCase("faq")){  
         System.out.println(responder.faq());  
         continue;  
       }  
         
       System.out.println(responder.getResponse(input));  
     }  
       
     sc.close();  
   }  
 }  

Penjelasan singkat:

  • Menampilkan welcome dan daftar perintah (faq, help, exit).

  • Membaca input pengguna baris demi baris.

  • Mengarahkan pemrosesan ke Responder.getResponse(...).

  • faq memanggil Responder.faq() untuk menampilkan kata kunci yang dikenali.


Kode Responder.java

Tujuan: menyimpan basis pengetahuan (kata kunci → jawaban), menyiapkan jawaban generik, dan mengimplementasikan strategi pencocokan.

 import java.util.*;  
   
 public class Responder{  
   private final Map<String, String> responses = new LinkedHashMap();  
   private final List<String> generics     = new ArrayList<>();  
   private final List<String> keysByLength   = new ArrayList<>();  
   private final Random rng          = new Random();  
     
   public Responder() {  
     responses.put("kelas penuh", "Hubungi TU/dosen pengampu untuk pembukaan kelas tambahan atau cari kelas paralel lain.");  
     responses.put("salah ambil kelas", "Drop kelas yang salah dan ambil kelas yang sesuai pada periode revisi.");  
     responses.put("login gagal", "Periksa NRP/password. Jika tetap gagal, reset password via portal DPTSI.");  
     responses.put("gagal ambil kelas", "Cek prasyarat & sisa SKS. Pastikan prasyarat mata kuliah terpenuhi.");  
     responses.put("jadwal bentrok", "Pilih kelas lain dengan jadwal berbeda atau konsultasi ke dosen wali.");  
     responses.put("gagal akses website", "Coba beberapa saat lagi, cek koneksi, nonaktifkan VPN, atau hubungi DPTSI.");  
     responses.put("pilihan tidak muncul", "Pastikan periode FRS sudah dibuka & data semester benar. Jika belum, hubungi TU.");  
     responses.put("captcha salah", "Ketik ulang captcha, refresh halaman, atau coba browser lain.");  
     responses.put("frs belum disetujui", "Hubungi dosen wali untuk persetujuan FRS.");  
     responses.put("frs ditutup", "Periode FRS berakhir. Koordinasikan dengan dosen wali/TU untuk opsi lanjutan.");  
     responses.put("web lag", "Bersihkan cache browser, coba jaringan lain, dan muat ulang halaman.");  
     responses.put("sks", "Cek batas maksimum SKS semester ini di portal & total SKS yang diambil.");  
     responses.put("prasyarat", "Pastikan MK prasyarat telah lulus/terpenuhi sebelum mengambil MK terkait.");  
     responses.put("hapus matkul", "Ubah/drop KRS hanya saat periode revisi. Cek kalender akademik.");  
   
     generics.add("Bisa jelaskan lebih detail kendalanya?");  
     generics.add("Saya belum paham, boleh diulang lebih spesifik?");  
   
     keysByLength.addAll(responses.keySet());  
     keysByLength.sort((a, b) -> Integer.compare(b.length(), a.length()));  
   }  
     
   public String faq(){  
     StringBuilder sb = new StringBuilder("Kata kunci yang dikenali:\n");  
     int i = 1;  
     for (String k : keysByLength) sb.append(i++).append(". ").append(k).append("\n");  
     sb.append("\nContoh: 'Saya login gagal dari tadi malam'.");  
     return sb.toString();  
   }  
     
   public String getResponse(String userInput){  
     if (userInput == null || userInput.trim().isEmpty()){  
       return pickGeneric();  
     }  
       
     String text = normalize(userInput);  
       
     for (String key : keysByLength){  
       if (text.contains(key)){  
         return responses.get(key);  
       }  
     }  
       
     for (String w : text.split("\\s+")){  
       if(responses.containsKey(w)){  
         return responses.get(w);  
       }  
     }  
       
     return pickGeneric();  
   }  
   
   private String pickGeneric(){  
     return generics.get(rng.nextInt(generics.size()));  
   }  
     
   private String normalize(String s){  
     String lower = s.toLowerCase();  
     lower = lower.replaceAll("[^\\p{L}\\p{Nd}\\s]", " ");  
     return lower.replaceAll("\\s+", " ").trim();  
   }  
 }  

Penjelasan singkat:

  • responses (LinkedHashMap) menyimpan keyword → saran. Pemakaian LinkedHashMap mempertahankan urutan penambahan, sehingga daftar pada faq() tampil rapi dan konsisten.

  • generics (ArrayList) berisi jawaban umum jika tidak ada kecocokan.

  • keysByLength menyimpan semua kata kunci yang diurutkan dari yang terpanjang. Ini penting agar frasa seperti “login gagal” tidak kalah oleh kata tunggal “login”.

  • normalize(...) menurunkan huruf, menghapus tanda baca, serta merapikan spasi supaya pencocokan .contains(...) lebih stabil.

  • Alur pencocokan:

    1. Coba cocokkan frasa terpanjang (keysByLength).

    2. Jika gagal, coba cocokkan per-kata.

    3. Jika tetap tidak ada, kembalikan jawaban generik acak (pickGeneric()).


Contoh Penggunaan






Tidak ada komentar:

Posting Komentar

PBO A - Pertemuan 15 - Pong!

Nama : Erlangga Rizqi Dwi Raswanto NRP : 5025241179 Kelas : PBO A 1. Pendahuluan Pada pertemuan 15, kita mempraktikkan pembuatan game...