Thursday, October 24, 2024

Evaluasi Tengah Semester - Pertemuan 9

Nama: Muhammad Risyad Himawan Putra

NRP: 5025231205

Kelas: Pemrograman Berbasis Obyek (G)



ETS


1. Apa yang dimaksud dengan inheritance/perwarisan dalam OOP? Berikan contoh penerapan pewarisan dengan menunjukkan hubungan antara kelas induk dan kelas turunan.

Inheritance atau pewarisan merupakan pilar fundamental OOP di java di mana suatu class diperbolehkan untuk mewariskan fitur-fitur (atribut dan metode) dari class yang lainnya. Ini memungkinkan kita untuk menggunakan ulang metode dan atribut dari class lainnya sehingga mempromosikan penggunaan ulang kode. Contoh penerapan inheritance:

class Inventory {
    protected String itemName;
    protected int itemCount;

    public Inventory(String itemName, int itemCount) {
        this.itemName = itemName;
        this.itemCount = itemCount;
    }

    public void displayItem() {
        System.out.println("Ammunition: " + itemName + ", Amount: " + itemCount);
    }
}

class WeaponInventory extends Inventory {
    private int durability;

    public WeaponInventory(String itemName, int itemCount, int durability) {
        super(itemName, itemCount);
        this.durability = durability;
    }

    @Override
    public void displayItem() {
        System.out.println("Weapon: " + itemName + ", Amount: " + itemCount
                           + ", Durability: " + durability);
    }
}

public class Main {
    public static void main(String[] args) {
        Inventory ammo = new Inventory("5.56x45mm NATO", 120);
        ammo.displayItem();

        WeaponInventory weapon = new WeaponInventory("Ruger AR-556", 3, 85);
        weapon.displayItem();
    }
}

Class WeaponInventory mewarisi atribut itemName dan itemCount dari kelas induk Inventory sehingga kita dapat membuat objek WeaponInventory dan menggunakan atribut dan method yang didefinisikan di Inventory.


2. Apakah fungsi konstruktor dalam sebuah kelas atau obyek? Buatlah kelas Book yang memiliki dua atribut, yaitu judul, penulisan tahun terbit, nama penerbit, kategori buku. Tambahkan konstruktor untuk menginisialisasi atribut tersebut dan tambahkan metode printDetails() untuk mencetak detail buku.

Sebuah konstruktor di Java berfungsi untuk menginisialisasi objek yang telah dibuat dari class. Konstruktor bisa digunakan untuk memberikan nilai awalan dari atribut sebuah objek. Berikut implementasinya di java.

class Book {
    private String judul;
    private int tahunTerbit;
    private String namaPenerbit;
    private String kategori;

    public Book(String judul, int tahunTerbit, String namaPenerbit, String kategori) {
        this.judul = judul;
        this.tahunTerbit = tahunTerbit;
        this.namaPenerbit = namaPenerbit;
        this.kategori = kategori;
    }

    public void printDetails() {
        System.out.println("Judul Buku: " + judul);
        System.out.println("Tahun Terbit: " + tahunTerbit);
        System.out.println("Penerbit: " + namaPenerbit);
        System.out.println("Kategori: " + kategori);
    }
}

public class Main {
    public static void main(String[] args) {
        Book buku1 = new Book("BlueJ Introduction", 2012, "Waterloo", "Teknologi");
        Book buku2 = new Book("10 Resep Wajib saat Lebaran", 2018, "Gramedia", "Masakan");

        buku1.printDetails();
        System.out.println();
        buku2.printDetails();
    }
}
Class Book memiliki 4 atribut yaitu judul, tahunTerbit, namaPenerbit, dan kategori. Lalu Konstruktor Book(String judul, int tahunTerbit, String namaPenerbit, String kategori) menginisialisasi atribut-atribut tersebut saat objek Book dibuat. Metode printDetails() akan mencetak detail buku ke terminal.


3. Studi kasus Parking Ticket Machine

Buatlah kelas bernama Parking Ticket Machine yang mensimulasikan mesin tiket parkir dengan fitur berikut:

Atribut:

  • balance (jumlah nominal uang yang dimasukkan / di tap oleh pengguna).
  • ticket Price (harga tiket parkir per jam, misalnya Rp5.000).
  • ticketTime (jumlah waktu parkir yang dibeli dalam jam).

Metode:

  • insertMoney(int amount): Menambahkan uang yang dimasukkan.
  • issueTicket(): Mengeluarkan tiket berdasarkan uang yang dimasukkan (jika saldo cukup) dan mengatur waktu parkir sesuai dengan saldo.
  • getTimePurchased(): Mengembalikan jumlah jam parkir yang telah dibeli.

import java.util.Scanner;

class ParkingTicketMachine {
    private int balance;
    private int ticketPrice;
    private int ticketTime;

    public ParkingTicketMachine(int ticketPrice, int initialBalance) {
        this.ticketPrice = ticketPrice;
        this.balance = initialBalance;
        this.ticketTime = 0;
    }

    public void insertMoney(int amount) {
        if (amount > 0) {
            balance += amount;
        } else {
            System.out.println("Jumlah uang harus positif.");
        }
    }

    public void issueTicket() {
        if (balance >= ticketPrice) {
            //Menghitung lama waktu parkir
            ticketTime = balance / ticketPrice;
            //Menghitung sisa saldo anda
            balance = balance % ticketPrice;

            System.out.println("Sisa saldo anda Rp" + balance);
        } else {
            System.out.println("Saldo tidak cukup untuk membeli tiket parkir.");
        }
    }

    public int getTimePurchased() {
        return ticketTime;
    }

    public int getBalance() {
        return balance;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("\n----Selamat datang di Mesin Tiket Parkir!----\n\n");
        System.out.print("Silahkan masukkan saldo anda (Rp): ");
        int initialBalance = scanner.nextInt();
        System.out.print("\n");

        ParkingTicketMachine machine = new ParkingTicketMachine(5000, initialBalance);
       
        boolean issued = false;
        while (!issued) {
            machine.issueTicket();
            //Cek apakah saldo cukup untuk membeli tiket minimal 1 jam, jika tidak cukup maka
            //user disuruh untuk menginput lagi.
            if (machine.getTimePurchased() == 0) {
                System.out.print("Silahkan tambahkan saldo (Rp): ");
                int additionalAmount = scanner.nextInt();
                machine.insertMoney(additionalAmount);
            } else {
                issued = true;
                System.out.println("Anda telah mendapatkan waktu parkir selama " + machine.getTimePurchased() + " jam.");
                System.out.println("\n----Terima Kasih!----\n");
            }
        }
       
        scanner.close();
    }
}
Class ini mensimulasikan jalan program pembelian tiket parkir. Memiliki metode insertMoney untuk menghitung jumlah uang yang diinput. Metode IssueTicket menghitung lama waktu parkir berdasarkan saldo dan menghitung sisa jumlah saldo setelah membeli tiket parkir. Class main berisi alur dari program ParkingTicketMachine sendiri.

4. Buatlah Desain kelas untuk aplikasi FoodOrder yang menyimpan data pemesanan makanan di sebuah restoran. Setiap pesanan memiliki atribut menultems (daftar menu), totalPrice, dan isPaid. Implementasikan perilaku berikut: (Gunakan library java util, arraylist)

a. Gambarkan Class Diagramnya



b. Implementasikan kodenya

Main.java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        FoodOrder order = new FoodOrder();

        MenuItem[] menuItems = {
            new MenuItem("Nasi Ayam Geprek", 15000),
            new MenuItem("Nasi Ayam Bakar", 30000),
            new MenuItem("Nasi Ayam Goreng", 27000),
            new MenuItem("Es Teh Manis", 4000),
            new MenuItem("Es Jeruk", 6000)
        };


        System.out.println("\n+++ Selamat Datang di Warung Ayam! +++\n");
        System.out.println("----Daftar Menu----");
        for (int i = 0; i < menuItems.length; i++) {
            System.out.println((i + 1) + ". " + menuItems[i].getName() + " - Rp" + menuItems[i].getPrice());
        }

        while (true) {
            System.out.print("Pilih nomor menu (0 untuk selesai): ");
            int choice = scanner.nextInt();

            if (choice == 0) {
                break;
            } else if (choice > 0 && choice <= menuItems.length) {
                MenuItem selectedItem = menuItems[choice - 1];
                order.addMenuItem(selectedItem);
                System.out.println("Anda telah menambahkan " + selectedItem.getName() + " ke pesanan Anda.");
            } else {
                System.out.println("Pilihan tidak valid.");
            }
        }
        scanner.nextLine();  // Tambahkan ini untuk membersihkan sisa newline gara gara nextInt tadi.
        order.displayOrder();
        while (true) {
            System.out.print("\nApakah pesanan sudah sesuai? (bayar/batal): ");
            String choice = scanner.nextLine();
       
            if (choice.equals("bayar")) {
                order.markAsPaid();
                break;
            } else if (choice.equals("batal")) {
                System.out.println("Pesanan dibatalkan.");
                break;
            } else {
                System.out.println("Pilihan tidak valid. Coba lagi.");
            }
        }
        scanner.close();
    }
}
Class ini berfungsi sebagai class utama yang mengatur alur dari jalan program FoodOrder.

FoodOrder.java

import java.util.ArrayList;

public class FoodOrder {
    private ArrayList<MenuItem> menuItems;
    private int totalPrice;
    private boolean isPaid;

    public FoodOrder() {
        menuItems = new ArrayList<>();
        totalPrice = 0;
        isPaid = false;
    }

    public void addMenuItem(MenuItem item) {
        menuItems.add(item);
        totalPrice += item.getPrice();
    }

    public void displayOrder() {
        System.out.println("----Pesanan Anda----");
        for (MenuItem item : menuItems) {
            System.out.println(item.getName() + " - Rp" + item.getPrice());
        }
        System.out.println("Total Harga: Rp" + totalPrice);
    }

    public void markAsPaid() {
        isPaid = true;
        System.out.println("Pesanan telah dibayar.");
    }

    public boolean isPaid() {
        return isPaid;
    }

    public int getTotalPrice() {
        return totalPrice;
    }
}
Class ini yang menyimpan menu menu item di ArrayList dan class ini juga berisi metode metode untuk mendisplay pesanan, menandai apakah pembayaran sudah dilakukan, menghitung harga, dan menambah item ke pesanan.

MenuItem.java

public class MenuItem {
    private String name;
    private int price;

    public MenuItem(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }
}

Class ini yang menginisialisasi atribut atribut lalu mereturn sesuai data atribut tersebut (constructor).
























Wednesday, October 23, 2024

Pertemuan 8 - World of Zuul

Nama: Muhammad Risyad Himawan Putra

NRP: 5025231205

Kelas: Pemrograman Berbasis Obyek (G)

World of Zuul in BlueJ


 Source Code: MRHP1/WorldOfZuul

Class Game

Class ini merupakan class utama dalam aplikasi World of Zuul yang bertanggung jawab untuk membuat ruangan, parser, dan runtut game sendiri.
public class Game {
    private Parser parser;
    private Room currentRoom;
    
    public Game() {
        createRooms();
        parser = new Parser();
    }
    
    private void createRooms() {
        Room outside, theater, pub, lab, office;
        
        outside = new Room("outside the main entrance of the university");
        theater = new Room("in a lecture theater");
        pub = new Room("in the campus pub");
        lab = new Room("in a computing lab");
        office = new Room("in the computing admin office");
        
        outside.setExits(null, theater, lab, pub);
        theater.setExits(null, null, null, outside);
        pub.setExits(null, outside, null, null);
        lab.setExits(outside, office, null, null);
        office.setExits(null, null, null, lab);

        currentRoom = outside;
    }
    
    public void play() {
        printWelcome();
        boolean finished = false;
        while (!finished) {
            Command command = parser.getCommand();
            finished = processCommand(command);
        }
        System.out.println("Thank you for playing. Good bye.");
    }
}

Class Game ini adalah inti dari game World of Zuul. Pada method Game(), beberapa ruangan dbuat dan dihubungkan dengan method createRooms(). Pemain memulai game dari ruangan outside dan dapat berpindah dari satu ruangan ke ruangan lain menggunakan input yang ditangani oleh parser.

Class Command

Class ini menyimpan informasi tentang command yang diberikan oleh pemain. Perintah terdiri dari dua kata.
public class Command {
    private String commandWord;
    private String secondWord;
    
    public Command(String firstWord, String secondWord) {
        commandWord = firstWord;
        this.secondWord = secondWord;
    }
    
    public String getCommandWord() {
        return commandWord;
    }
    
    public String getSecondWord() {
        return secondWord;
    }
    
    public boolean isUnknown() {
        return (commandWord == null);
    }
    
    public boolean hasSecondWord() {
        return (secondWord != null);
    }
}

Class Command bertugas untuk menyimpan command-command yang dimasukkan oleh pemain. Perintah ini terdiri dari dua kata. Jika kata pertama tidak dikenali, maka command dianggap unknown.

Class Parser

Class Parser bertugas untuk membaca input dari pemain dan mencocokkan input tersebut dengan command yang valid dalam game.
public class Parser {
    private CommandWords commands;
    private Scanner reader;
    
    public Parser() {
        commands = new CommandWords();
        reader = new Scanner(System.in);
    }
    
    public Command getCommand() {
        String inputLine;
        String word1 = null;
        String word2 = null;
        
        System.out.print("> ");
        inputLine = reader.nextLine();
        
        Scanner tokenizer = new Scanner(inputLine);
        if (tokenizer.hasNext()) {
            word1 = tokenizer.next();
            if (tokenizer.hasNext()) {
                word2 = tokenizer.next();
            }
        }
        
        if (commands.isCommand(word1)) {
            return new Command(word1, word2);
        } else {
            return new Command(null, word2);
        }
    }
}

Parser membaca input dari pemain melalui terminal. Setelah membaca input, ia akan memisahkan dua input dan digunakan sebagai perintah. Jika kata pertama valid, perintah dikirimkan sebagai instance Command; jika tidak, Parser menghasilkan command unknown.

Class Room

Class Room memberi direksi dalam game. Setiap ruangan terhubung ke ruangan lain melalui empat arah yaitu utara, selatan, timur, dan barat.
public class Room {
    public String description;
    public Room northExit;
    public Room southExit;
    public Room eastExit;
    public Room westExit;
    
    public Room(String description) {
        this.description = description;
    }
    
    public void setExits(Room north, Room east, Room south, Room west) {
        if (north != null) northExit = north;
        if (east != null) eastExit = east;
        if (south != null) southExit = south;
        if (west != null) westExit = west;
    }
    
    public String getDescription() {
        return description;
    }
}

Class Room digunakan untuk memberi arah dalam game. Ruangan ini dapat terhubung dengan ruangan lain melalui empat arah. Pemain dapat berpindah ruangan dengan menggunakan command yang valid.

Class CommandWords

Class ini mengecek kata perintah yang valid dalam game. Setiap perintah yang diberikan pemain akan dicocokkan dengan daftar ini.
public class CommandWords {
    private static final String[] validCommands = {
        "go", "quit", "help"
    };
    
    public boolean isCommand(String aString) {
        for (int i = 0; i < validCommands.length; i++) {
            if (validCommands[i].equals(aString)) {
                return true;
            }
        }
        return false;
    }
}

CommandWords menyimpan daftar command/perintah yang valid dalam game. Jika perintah yang dimasukkan pemain valid dengan salah satu command yang ada, maka command tersebut dianggap valid dan diteruskan untuk memberi respons yang tepat.

Wednesday, October 9, 2024

Pertemuan 6 - Support System

Nama: Muhammad Risyad Himawan Putra

NRP: 5025231205

Kelas: Pemrograman Berbasis Obyek (G)


 Support System in BlueJ




Source Code Github


Class SupportSystem
public class SupportSystem { private InputReader reader; private Responder responder; /** * Creates a technical support system. */ public SupportSystem() { reader = new InputReader(); responder = new Responder(); } /** * Start the technical support system. This will print a welcome * message and enter into a dialog with the user, until the user * ends the dialog. */ public void start() { boolean finished = false; printWelcome(); while(!finished) { String input = reader.getInput(); if(input.toLowerCase().startsWith("bye")) { finished = true; } else { String response = responder.generateResponse(input.toLowerCase()); System.out.println(response); } } printGoodbye(); } /** * Print a welcome message to the screen. */ private void printWelcome() { System.out.println("Welcome to the DodgySoft Technical Support System."); System.out.println(); System.out.println("Please tell us about your problem."); System.out.println("We will assist you with any problem you might have."); System.out.println("Please type 'bye' to exit our system."); } /** * Print a good-bye message to the screen. */ private void printGoodbye() { System.out.println("Nice talking to you. Bye..."); } }

Class ini menghubungkan class InputReader yang digunakan untuk membaca input
user dan class Responder yang digunakan untuk meng-output respons berdasarkan
input tersebut. SupportSystem juga dapat mengakhiri chat dengan meng-input
kata "bye" di terminal.

Class InputReader
import java.util.HashSet; import java.util.Scanner; public class InputReader { private Scanner reader; /** * Create a new InputReader that reads text from the text terminal. */ public InputReader() { reader = new Scanner(System.in); } /** * Read a line of text from standard input (the text terminal), * and return it as a String. * * @return A String typed by the user. */ public String getInput() { System.out.print("> "); // print prompt String inputLine = reader.nextLine(); return inputLine; } }


Class ini berfungsi sebagai pembaca input dari pengguna lewat terminal.
Menggunakan Scanner dari system untuk membaca input dan me-return input
menjadi sebuah string.

Class Responder

import java.util.Random; import java.util.HashMap; public class Responder { Random answerNum; private String[] answers; private HashMap<String, Integer> keywords; int allAnswers = 22; /** * Construct a Responder * generating the answer-Array and keyword-HashMap */ public Responder(){ answers(); keywordlist(); } /** * Generate a response. * @return A string that should be displayed as the response * @param ai answer-index * @param lastAnswer stores last answer-index, so it does not show up twice in row */ public String generateResponse(String input){ answerNum = new Random(); int ai = 0; int lastAnswer = 0; boolean match = false; String[] splitInput = input.split("[^a-zA-Z]"); for(int i = 0; i < splitInput.length && !match; i++){ if(keywords.containsKey(splitInput[i])){ match = true; ai = keywords.get(splitInput[i]); } } if(!match){ while(ai == lastAnswer){ ai = answerNum.nextInt(10); } } lastAnswer = ai; return answers[ai]; } /** * Setting up an Array with potential answers */ private void answers(){ answers = new String[allAnswers]; answers[0] = "Did you ask google?"; answers[1] = "Did you turn it off and on?"; answers[2] = "Keep talking, i'll get myself a coffee."; answers[3] = "ohhh my gosh..."; answers[4] = "42"; answers[5] = "i have no clue."; answers[6] = "have a break, have a kitkat"; answers[7] = "wenn's mal wieder länger dauert..."; answers[8] = "loading 31%"; answers[9] = "talk to the hand."; answers[10] = "java, java, java"; answers[11] = "Computer, Rechner, Ordenador"; answers[12] = "apple, apple, apple, ..."; answers[13] = "Microsoft, Winzigweich, pico fofo"; answers[14] = "the answer to life, the universe and everything is 42"; answers[15] = "Mac, mac, mack, muck, mick..."; answers[16] = "Aaahhh... we're all gonna die..."; answers[17] = "this might take a li'l while."; answers[18] = "printing is not good for the enviroment."; answers[19] = "which distribution?"; answers[20] = "did you try rooting it?"; } /** * setting up a HashMap with potential keywords */ private void keywordlist(){ keywords = new HashMap<String, Integer>(); keywords.put("java", 10); keywords.put("computer", 11); keywords.put("ios", 12); keywords.put("windows", 13); keywords.put("life", 14); keywords.put("mac", 15); keywords.put("crashed", 16); keywords.put("loading", 17); keywords.put("print", 18); keywords.put("linux", 19); keywords.put("android", 20); keywords.put("problem", 2); } }

Class ini berfungsi untuk memberikan output berupa respons berdasarkan input
dari pengguna. Respons yang dikeluarkan berdasarkan list jawaban dan keyword
dari HashMap. Jika keyword ditemukan maka akan memberikan respons yang sesuai
dengan input tersebut, jika keyword tidak ditemukan maka respons akan diacak
dari list respons yang ada.


Cara Kerja

1. Buat object SUpportSystem. Lalu start object tersebut menggunakan
   fungsi Start.





2. Lakukan percakapan lewat terminal. Akhiri chat dengan mengetik "bye".































Wednesday, October 2, 2024

Pertemuan 5 - Auction System

Nama: Muhammad Risyad Himawan Putra

NRP: 5025231205

Kelas: Pemrograman Berbasis Obyek (G)


 Auction System in BlueJ


Source Code Github


Class Auction
public class Auction
{
private int nextLotNumber;
public Auction()
{
lots = new ArrayList();
nextLotNumber = 1;
}
public void enterLot(String description)
{
lots.add(new Lot(nextLotNumber, description));
nextLotNumber++;
}
public void showLots()
{
for (Lot lot : lots) {
System.out.println(lot.toString());
}
}
public void bidFor(int lotNumber, Person bidder, long value)
{
Lot selectedLot = getLot(lotNumber);
if(selectedLot != null) {
if(selectedLot.bidFor(new Bid(bidder, value))) {
System.out.println("The bid for lot number " +
lotNumber + " was successful.");
}
else {
System.out.println("Lot number: " + lotNumber +
" already has a bid of: " +
selectedLot.getHighestBid().getValue());
}
}
}
public Lot getLot(int lotNumber)
{
if((lotNumber >= 1) && (lotNumber < nextLotNumber)) {
Lot selectedLot = (Lot) lots.get(lotNumber - 1);
if(selectedLot.getNumber() != lotNumber) {
System.out.println("Internal error: " +
"Wrong lot returned. " +
"Number: " + lotNumber);
}
return selectedLot;
}
else {
System.out.println("Lot number: " + lotNumber +
" does not exist.");
return null;
}
}
}

Class ini mengelola seluruh proses auction. Berfungsi untuk menyimpan lot, menerima penawaran,
dan menampilkan status dari lot yang dilelang.

Class Lot
public class Lot
{
public Lot(int number, String description)
{
this.number = number;
this.description = description;
}
public boolean bidFor(Bid bid)
{
if((highestBid == null) ||
(bid.getValue() > highestBid.getValue())) {
// This bid is the best so far.
highestBid = bid;
return true;
}
else {
return false;
}
}
public String toString()
{
String details = number + ": " + description;
if(highestBid != null) {
details += " Bid: " +
highestBid.getValue();
}
else {
details += " (No bid)";
}
return details;
}
public int getNumber()
{
return number;
}
public String getDescription()
{
return description;
}
public Bid getHighestBid()
{
return highestBid;
}
}

Class ini sebagai wadah untuk seluruh barang-barang yang akan dilelang. Berfungsi untuk
memasukkan nama barang yang dilelamg dan menyimpan bid tertinggi dari person.

Class Bid

public class Bid
{
private final long value;
public Bid(Person bidder, long value)
{
this.bidder = bidder;
this.value = value;
}
public Person getBidder()
{
return bidder;
}
public long getValue()
{
return value;
}
}

Class ini mewakili penawaran dalam lelang, yang mencakup informasi tentang penawar dan
jumlah uang yang ditawarkan.

Class Person

public class Person
{
private final String name;
public Person(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}

Class ini menyimpan identitas seseorang yang berperan sebagai penawar di sebuah lelang.



Cara Kerja

1. Buat sebuah auction.


2. Buat lot. Lot yang telah dibuat dapat ditampilkan dengan fungsi ShowLots()





3. Buat profile untuk para pelelang.



4. Bid menggunakan fungsi BidFor(). ShowLots() akan menampilkan bid tertinggi sekarang.































PPB EAS - Aplikasi Member Timezone

Manajemen Keanggotaan & Loyalty Program Timezone dengan Room Database dan Jetpack Compose Aryaka Leorgi Epridaka - 5025231117 Muhammad ...