Senin, 26 November 2018

Tugas 9 PBO A



1. Counter

 import java.awt.Color;   
  /**   
  * Write a description of class Counter here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119  
  */   
  /**   
  * Provide a counter for a participant in the simulation.   
  * This includes an identifying string and a count of how   
  * many participants of this type currently exist within    
  * the simulation.   
  *    
  */   
  public class Counter   
  {   
   // A name for this type of simulation participant   
   private String name;   
   // How many of this type exist in the simulation.   
   private int count;   
   /**   
   * Provide a name for one of the simulation types.   
   * @param name A name, e.g. "Fox".   
   */   
   public Counter(String name)   
   {   
    this.name = name;   
    count = 0;   
   }   
   /**   
   * @return The short description of this type.   
   */   
   public String getName()   
   {   
    return name;   
   }   
   /**   
   * @return The current count for this type.   
   */   
   public int getCount()   
   {   
    return count;   
   }   
   /**   
   * Increment the current count by one.   
   */   
   public void increment()   
   {   
    count++;   
   }   
   /**   
   * Reset the current count to zero.   
   */   
   public void reset()   
   {   
    count = 0;   
   }   
  }   

2. Field

  import java.util.Collections;   
  import java.util.Iterator;   
  import java.util.LinkedList;   
  import java.util.List;   
  import java.util.Random;   
  /**   
  * Write a description of class Field here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  /**   
  * Represent a rectangular grid of field positions.   
  * Each position is able to store a single animal.   
  */   
  public class Field   
  {   
   // A random number generator for providing random locations.   
   private static final Random rand = Randomizer.getRandom();   
   // The depth and width of the field.   
   private int depth, width;   
   // Storage for the animals.   
   private Object[][] field;   
   /**   
   * Represent a field of the given dimensions.   
   * @param depth The depth of the field.   
   * @param width The width of the field.   
   */   
   public Field(int depth, int width)   
   {   
    this.depth = depth;   
    this.width = width;   
    field = new Object[depth][width];   
   }   
   /**   
   * Empty the field.   
   */   
   public void clear()   
   {   
    for(int row = 0; row < depth; row++) {   
     for(int col = 0; col < width; col++) {   
      field[row][col] = null;   
     }   
    }   
   }   
   /**   
   * Clear the given location.   
   * @param location The location to clear.   
   */   
   public void clear(Location location)   
   {   
    field[location.getRow()][location.getCol()] = null;   
   }   
   /**   
   * Place an animal at the given location.   
   * If there is already an animal at the location it will   
   * be lost.   
   * @param animal The animal to be placed.   
   * @param row Row coordinate of the location.   
   * @param col Column coordinate of the location.   
   */   
   public void place(Object animal, int row, int col)   
   {   
    place(animal, new Location(row, col));   
   }   
   /**   
   * Place an animal at the given location.   
   * If there is already an animal at the location it will   
   * be lost.   
   * @param animal The animal to be placed.   
   * @param location Where to place the animal.   
   */   
   public void place(Object animal, Location location)   
   {   
    field[location.getRow()][location.getCol()] = animal;   
   }   
   /**   
   * Return the animal at the given location, if any.   
   * @param location Where in the field.   
   * @return The animal at the given location, or null if there is none.   
   */   
   public Object getObjectAt(Location location)   
   {   
    return getObjectAt(location.getRow(), location.getCol());   
   }   
   /**   
   * Return the animal at the given location, if any.   
   * @param row The desired row.   
   * @param col The desired column.   
   * @return The animal at the given location, or null if there is none.   
   */   
   public Object getObjectAt(int row, int col)   
   {   
    return field[row][col];   
   }   
   /**   
   * Generate a random location that is adjacent to the   
   * given location, or is the same location.   
   * The returned location will be within the valid bounds   
   * of the field.   
   * @param location The location from which to generate an adjacency.   
   * @return A valid location within the grid area.   
   */   
   public Location randomAdjacentLocation(Location location)   
   {   
    List<Location> adjacent = adjacentLocations(location);   
    return adjacent.get(0);   
   }   
   /**   
   * Get a shuffled list of the free adjacent locations.   
   * @param location Get locations adjacent to this.   
   * @return A list of free adjacent locations.   
   */   
   public List<Location> getFreeAdjacentLocations(Location location)   
   {   
    List<Location> free = new LinkedList<Location>();   
    List<Location> adjacent = adjacentLocations(location);   
    for(Location next : adjacent) {   
     if(getObjectAt(next) == null) {   
      free.add(next);   
     }   
    }   
    return free;   
   }   
   /**   
   * Try to find a free location that is adjacent to the   
   * given location. If there is none, return null.   
   * The returned location will be within the valid bounds   
   * of the field.   
   * @param location The location from which to generate an adjacency.   
   * @return A valid location within the grid area.   
   */   
   public Location freeAdjacentLocation(Location location)   
   {   
    // The available free ones.   
    List<Location> free = getFreeAdjacentLocations(location);   
    if(free.size() > 0) {   
     return free.get(0);   
    }   
    else {   
     return null;   
    }   
   }   
   /**   
   * Return a shuffled list of locations adjacent to the given one.   
   * The list will not include the location itself.   
   * All locations will lie within the grid.   
   * @param location The location from which to generate adjacencies.   
   * @return A list of locations adjacent to that given.   
   */   
   public List<Location> adjacentLocations(Location location)   
   {   
    assert location != null : "Null location passed to adjacentLocations";   
    // The list of locations to be returned.   
    List<Location> locations = new LinkedList<Location>();   
    if(location != null) {   
     int row = location.getRow();   
     int col = location.getCol();   
     for(int roffset = -1; roffset <= 1; roffset++) {   
      int nextRow = row + roffset;   
      if(nextRow >= 0 && nextRow < depth) {   
       for(int coffset = -1; coffset <= 1; coffset++) {   
        int nextCol = col + coffset;   
        // Exclude invalid locations and the original location.   
        if(nextCol >= 0 && nextCol < width && (roffset != 0 || coffset != 0)) {   
         locations.add(new Location(nextRow, nextCol));   
        }   
       }   
      }   
     }   
     // Shuffle the list. Several other methods rely on the list   
     // being in a random order.   
     Collections.shuffle(locations, rand);   
    }   
    return locations;   
   }   
   /**   
   * Return the depth of the field.   
   * @return The depth of the field.   
   */   
   public int getDepth()   
   {   
    return depth;   
   }   
   /**   
   * Return the width of the field.   
   * @return The width of the field.   
   */   
   public int getWidth()   
   {   
    return width;   
   }   
  }   

3. FieldStat

 import java.awt.Color;   
  import java.util.HashMap;   
  /**   
  * Write a description of class FieldStat here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119  
  */   
  /**   
  * This class collects and provides some statistical data on the state    
  * of a field. It is flexible: it will create and maintain a counter    
  * for any class of object that is found within the field.   
  *    
  */   
  public class FieldStats   
  {   
   // Counters for each type of entity (fox, rabbit, etc.) in the simulation.   
   private HashMap<Class, Counter> counters;   
   // Whether the counters are currently up to date.   
   private boolean countsValid;   
   /**   
   * Construct a FieldStats object.   
   */   
   public FieldStats()   
   {   
    // Set up a collection for counters for each type of animal that   
    // we might find   
    counters = new HashMap<Class, Counter>();   
    countsValid = true;   
   }   
   /**   
   * Get details of what is in the field.   
   * @return A string describing what is in the field.   
   */   
   public String getPopulationDetails(Field field)   
   {   
    StringBuffer buffer = new StringBuffer();   
    if(!countsValid) {   
     generateCounts(field);   
    }   
    for(Class key : counters.keySet()) {   
     Counter info = counters.get(key);   
     buffer.append(info.getName());   
     buffer.append(": ");   
     buffer.append(info.getCount());   
     buffer.append(' ');   
    }   
    return buffer.toString();   
   }   
   /**   
   * Invalidate the current set of statistics; reset all    
   * counts to zero.   
   */   
   public void reset()   
   {   
    countsValid = false;   
    for(Class key : counters.keySet()) {   
     Counter count = counters.get(key);   
     count.reset();   
    }   
   }   
   /**   
   * Increment the count for one class of animal.   
   * @param animalClass The class of animal to increment.   
   */   
   public void incrementCount(Class animalClass)   
   {   
    Counter count = counters.get(animalClass);   
    if(count == null) {   
     // We do not have a counter for this species yet.   
     // Create one.   
     count = new Counter(animalClass.getName());   
     counters.put(animalClass, count);   
    }   
    count.increment();   
   }   
   /**   
   * Indicate that an animal count has been completed.   
   */   
   public void countFinished()   
   {   
    countsValid = true;   
   }   
   /**   
   * Determine whether the simulation is still viable.   
   * I.e., should it continue to run.   
   * @return true If there is more than one species alive.   
   */   
   public boolean isViable(Field field)   
   {   
    // How many counts are non-zero.   
    int nonZero = 0;   
    if(!countsValid) {   
     generateCounts(field);   
    }   
    for(Class key : counters.keySet()) {   
     Counter info = counters.get(key);   
     if(info.getCount() > 0) {   
      nonZero++;   
     }   
    }   
    return nonZero > 1;   
   }   
   /**   
   * Generate counts of the number of foxes and rabbits.   
   * These are not kept up to date as foxes and rabbits   
   * are placed in the field, but only when a request   
   * is made for the information.   
   * @param field The field to generate the stats for.   
   */   
   private void generateCounts(Field field)   
   {   
    reset();   
    for(int row = 0; row < field.getDepth(); row++) {   
     for(int col = 0; col < field.getWidth(); col++) {   
      Object animal = field.getObjectAt(row, col);   
      if(animal != null) {   
       incrementCount(animal.getClass());   
      }   
     }   
    }   
    countsValid = true;   
   }   
  }   

4. Fox

  import java.util.List;   
  import java.util.Iterator;   
  import java.util.Random;   
  /**   
  * Write a description of class Fox here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  /**   
  * A simple model of a fox.   
  * Foxes age, move, eat rabbits, and die.   
  *    
  */   
  public class Fox   
  {   
   // Characteristics shared by all foxes (static fields).   
   // The age at which a fox can start to breed.   
   private static final int BREEDING_AGE = 10;   
   // The age to which a fox can live.   
   private static final int MAX_AGE = 150;   
   // The likelihood of a fox breeding.   
   private static final double BREEDING_PROBABILITY = 0.35;   
   // The maximum number of births.   
   private static final int MAX_LITTER_SIZE = 5;   
   // The food value of a single rabbit. In effect, this is the   
   // number of steps a fox can go before it has to eat again.   
   private static final int RABBIT_FOOD_VALUE = 7;   
   // A shared random number generator to control breeding.   
   private static final Random rand = Randomizer.getRandom();   
   // Individual characteristics (instance fields).   
   // The fox's age.   
   private int age;   
   // Whether the fox is alive or not.   
   private boolean alive;   
   // The fox's position.   
   private Location location;   
   // The field occupied.   
   private Field field;   
   // The fox's food level, which is increased by eating rabbits.   
   private int foodLevel;   
   /**   
   * Create a fox. A fox can be created as a new born (age zero   
   * and not hungry) or with a random age and food level.   
   *    
   * @param randomAge If true, the fox will have random age and hunger level.   
   * @param field The field currently occupied.   
   * @param location The location within the field.   
   */   
   public Fox(boolean randomAge, Field field, Location location)   
   {   
    age = 0;   
    alive = true;   
    this.field = field;   
    setLocation(location);   
    if(randomAge) {   
     age = rand.nextInt(MAX_AGE);   
     foodLevel = rand.nextInt(RABBIT_FOOD_VALUE);   
    }   
    else {   
     // leave age at 0   
     foodLevel = RABBIT_FOOD_VALUE;   
    }   
   }   
   /**   
   * This is what the fox does most of the time: it hunts for   
   * rabbits. In the process, it might breed, die of hunger,   
   * or die of old age.   
   * @param field The field currently occupied.   
   * @param newFoxes A list to add newly born foxes to.   
   */   
   public void hunt(List<Fox> newFoxes)   
   {   
    incrementAge();   
    incrementHunger();   
    if(alive) {   
     giveBirth(newFoxes);      
     // Move towards a source of food if found.   
     Location newLocation = findFood(location);   
     if(newLocation == null) {    
      // No food found - try to move to a free location.   
      newLocation = field.freeAdjacentLocation(location);   
     }   
     // See if it was possible to move.   
     if(newLocation != null) {   
      setLocation(newLocation);   
     }   
     else {   
      // Overcrowding.   
      setDead();   
     }   
    }   
   }   
   /**   
   * Check whether the fox is alive or not.   
   * @return True if the fox is still alive.   
   */   
   public boolean isAlive()   
   {   
    return alive;   
   }   
   /**   
   * Return the fox's location.   
   * @return The fox's location.   
   */   
   public Location getLocation()   
   {   
    return location;   
   }   
   /**   
   * Place the fox at the new location in the given field.   
   * @param newLocation The fox's new location.   
   */   
   private void setLocation(Location newLocation)   
   {   
    if(location != null) {   
     field.clear(location);   
    }   
    location = newLocation;   
    field.place(this, newLocation);   
   }   
   /**   
   * Increase the age. This could result in the fox's death.   
   */   
   private void incrementAge()   
   {   
    age++;   
    if(age > MAX_AGE) {   
     setDead();   
    }   
   }   
   /**   
   * Make this fox more hungry. This could result in the fox's death.   
   */   
   private void incrementHunger()   
   {   
    foodLevel--;   
    if(foodLevel <= 0) {   
     setDead();   
    }   
   }   
   /**   
   * Tell the fox to look for rabbits adjacent to its current location.   
   * Only the first live rabbit is eaten.   
   * @param location Where in the field it is located.   
   * @return Where food was found, or null if it wasn't.   
   */   
   private Location findFood(Location location)   
   {   
    List<Location> adjacent = field.adjacentLocations(location);   
    Iterator<Location> it = adjacent.iterator();   
    while(it.hasNext()) {   
     Location where = it.next();   
     Object animal = field.getObjectAt(where);   
     if(animal instanceof Rabbit) {   
      Rabbit rabbit = (Rabbit) animal;   
      if(rabbit.isAlive()) {    
       rabbit.setDead();   
       foodLevel = RABBIT_FOOD_VALUE;   
       // Remove the dead rabbit from the field.   
       return where;   
      }   
     }   
    }   
    return null;   
   }   
   /**   
   * Check whether or not this fox is to give birth at this step.   
   * New births will be made into free adjacent locations.   
   * @param newFoxes A list to add newly born foxes to.   
   */   
   private void giveBirth(List<Fox> newFoxes)   
   {   
    // New foxes are born into adjacent locations.   
    // Get a list of adjacent free locations.   
    List<Location> free = field.getFreeAdjacentLocations(location);   
    int births = breed();   
    for(int b = 0; b < births && free.size() > 0; b++) {   
     Location loc = free.remove(0);   
     Fox young = new Fox(false, field, loc);   
     newFoxes.add(young);   
    }   
   }   
   /**   
   * Generate a number representing the number of births,   
   * if it can breed.   
   * @return The number of births (may be zero).   
   */   
   private int breed()   
   {   
    int births = 0;   
    if(canBreed() && rand.nextDouble() <= BREEDING_PROBABILITY) {   
     births = rand.nextInt(MAX_LITTER_SIZE) + 1;   
    }   
    return births;   
   }   
   /**   
   * A fox can breed if it has reached the breeding age.   
   */   
   private boolean canBreed()   
   {   
    return age >= BREEDING_AGE;   
   }   
   /**   
   * Indicate that the fox is no longer alive.   
   * It is removed from the field.   
   */   
   private void setDead()   
   {   
    alive = false;   
    if(location != null) {   
     field.clear(location);   
     location = null;   
     field = null;   
    }   
   }   
  }   

5. Location

 /**   
  * Write a description of class Location here.   
  *   
  * @author Nadia Hasna  
  * @version 20181119  
  */   
  /**   
  * Represent a location in a rectangular grid.   
  *    
  */   
  public class Location   
  {   
   // Row and column positions.   
   private int row;   
   private int col;   
   /**   
   * Represent a row and column.   
   * @param row The row.   
   * @param col The column.   
   */   
   public Location(int row, int col)   
   {   
    this.row = row;   
    this.col = col;   
   }   
   /**   
   * Implement content equality.   
   */   
   public boolean equals(Object obj)   
   {   
    if(obj instanceof Location) {   
     Location other = (Location) obj;   
     return row == other.getRow() && col == other.getCol();   
    }   
    else {   
     return false;   
    }   
   }   
   /**   
   * Return a string of the form row,column   
   * @return A string representation of the location.   
   */   
   public String toString()   
   {   
    return row + "," + col;   
   }   
   /**   
   * Use the top 16 bits for the row value and the bottom for   
   * the column. Except for very big grids, this should give a   
   * unique hash code for each (row, col) pair.   
   * @return A hashcode for the location.   
   */   
   public int hashCode()   
   {   
    return (row << 16) + col;   
   }   
   /**   
   * @return The row.   
   */   
   public int getRow()   
   {   
    return row;   
   }   
   /**   
   * @return The column.   
   */   
   public int getCol()   
   {   
    return col;   
   }   
  }   

6. Rabbits

 import java.util.List;   
  import java.util.Random;   
  /**   
  * Write a description of class Rabbit here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  /**   
  * A simple model of a rabbit.   
  * Rabbits age, move, breed, and die.   
  *    
  */   
  public class Rabbit   
  {   
   // Characteristics shared by all rabbits (static fields).   
   // The age at which a rabbit can start to breed.   
   private static final int BREEDING_AGE = 5;   
   // The age to which a rabbit can live.   
   private static final int MAX_AGE = 40;   
   // The likelihood of a rabbit breeding.   
   private static final double BREEDING_PROBABILITY = 0.15;   
   // The maximum number of births.   
   private static final int MAX_LITTER_SIZE = 4;   
   // A shared random number generator to control breeding.   
   private static final Random rand = Randomizer.getRandom();   
   // Individual characteristics (instance fields).   
   // The rabbit's age.   
   private int age;   
   // Whether the rabbit is alive or not.   
   private boolean alive;   
   // The rabbit's position.   
   private Location location;   
   // The field occupied.   
   private Field field;   
   /**   
   * Create a new rabbit. A rabbit may be created with age   
   * zero (a new born) or with a random age.   
   *    
   * @param randomAge If true, the rabbit will have a random age.   
   * @param field The field currently occupied.   
   * @param location The location within the field.   
   */   
   public Rabbit(boolean randomAge, Field field, Location location)   
   {   
    age = 0;   
    alive = true;   
    this.field = field;   
    setLocation(location);   
    if(randomAge) {   
     age = rand.nextInt(MAX_AGE);   
    }   
   }   
   /**   
   * This is what the rabbit does most of the time - it runs    
   * around. Sometimes it will breed or die of old age.   
   * @param newRabbits A list to add newly born rabbits to.   
   */   
   public void run(List<Rabbit> newRabbits)   
   {   
    incrementAge();   
    if(alive) {   
     giveBirth(newRabbits);      
     // Try to move into a free location.   
     Location newLocation = field.freeAdjacentLocation(location);   
     if(newLocation != null) {   
      setLocation(newLocation);   
     }   
     else {   
      // Overcrowding.   
      setDead();   
     }   
    }   
   }   
   /**   
   * Check whether the rabbit is alive or not.   
   * @return true if the rabbit is still alive.   
   */   
   public boolean isAlive()   
   {   
    return alive;   
   }   
   /**   
   * Indicate that the rabbit is no longer alive.   
   * It is removed from the field.   
   */   
   public void setDead()   
   {   
    alive = false;   
    if(location != null) {   
     field.clear(location);   
     location = null;   
     field = null;   
    }   
   }   
   /**   
   * Return the rabbit's location.   
   * @return The rabbit's location.   
   */   
   public Location getLocation()   
   {   
    return location;   
   }   
   /**   
   * Place the rabbit at the new location in the given field.   
   * @param newLocation The rabbit's new location.   
   */   
   private void setLocation(Location newLocation)   
   {   
    if(location != null) {   
     field.clear(location);   
    }   
    location = newLocation;   
    field.place(this, newLocation);   
   }   
   /**   
   * Increase the age.   
   * This could result in the rabbit's death.   
   */   
   private void incrementAge()   
   {   
    age++;   
    if(age > MAX_AGE) {   
     setDead();   
    }   
   }   
   /**   
   * Check whether or not this rabbit is to give birth at this step.   
   * New births will be made into free adjacent locations.   
   * @param newRabbits A list to add newly born rabbits to.   
   */   
   private void giveBirth(List<Rabbit> newRabbits)   
   {   
    // New rabbits are born into adjacent locations.   
    // Get a list of adjacent free locations.   
    List<Location> free = field.getFreeAdjacentLocations(location);   
    int births = breed();   
    for(int b = 0; b < births && free.size() > 0; b++) {   
     Location loc = free.remove(0);   
     Rabbit young = new Rabbit(false, field, loc);   
     newRabbits.add(young);   
    }   
   }   
   /**   
   * Generate a number representing the number of births,   
   * if it can breed.   
   * @return The number of births (may be zero).   
   */   
   private int breed()   
   {   
    int births = 0;   
    if(canBreed() && rand.nextDouble() <= BREEDING_PROBABILITY) {   
     births = rand.nextInt(MAX_LITTER_SIZE) + 1;   
    }   
    return births;   
   }   
   /**   
   * A rabbit can breed if it has reached the breeding age.   
   * @return true if the rabbit can breed, false otherwise.   
   */   
   private boolean canBreed()   
   {   
    return age >= BREEDING_AGE;   
   }   
  }   

7. Randomizer

 import java.util.Random;   
  /**   
  * Write a description of class Randomizer here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  /**   
  * Provide control over the randomization of the simulation.   
  *    
  */   
  public class Randomizer   
  {   
   // The default seed for control of randomization.   
   private static final int SEED = 1111;   
   // A shared Random object, if required.   
   private static final Random rand = new Random(SEED);   
   // Determine whether a shared random generator is to be provided.   
   private static final boolean useShared = true;   
   /**   
   * Constructor for objects of class Randomizer   
   */   
   public Randomizer()   
   {   
   }   
   /**   
   * Provide a random generator.   
   * @return A random object.   
   */   
   public static Random getRandom()   
   {   
    if(useShared) {   
     return rand;   
    }   
    else {   
     return new Random();   
    }   
   }   
   /**   
   * Reset the randomization.   
   * This will have no effect if randomization is not through   
   * a shared Random generator.   
   */   
   public static void reset()   
   {   
    if(useShared) {   
     rand.setSeed(SEED);   
    }   
   }   
  }   

8. Simulator

 import java.util.Random;   
  import java.util.List;   
  import java.util.ArrayList;   
  import java.util.Iterator;   
  import java.awt.Color;   
  /**   
  * Write a description of class Simulator here.   
  *   
  * @author (Nitama Nurlingga Yotifa)   
  * @version (20181119)   
  */   
  /**   
  * A simple predator-prey simulator, based on a rectangular field   
  * containing rabbits and foxes.   
  *    
  * @author Nadia Hasna   
  * @version 20181120   
  */   
  public class Simulator   
  {   
   // Constants representing configuration information for the simulation.   
   // The default width for the grid.   
   private static final int DEFAULT_WIDTH = 50;   
   // The default depth of the grid.   
   private static final int DEFAULT_DEPTH = 50;   
   // The probability that a fox will be created in any given grid position.   
   private static final double FOX_CREATION_PROBABILITY = 0.02;   
   // The probability that a rabbit will be created in any given grid position.   
   private static final double RABBIT_CREATION_PROBABILITY = 0.08;    
   // Lists of animals in the field. Separate lists are kept for ease of iteration.   
   private List<Rabbit> rabbits;   
   private List<Fox> foxes;   
   // The current state of the field.   
   private Field field;   
   // The current step of the simulation.   
   private int step;   
   // A graphical view of the simulation.   
   private SimulatorView view;   
   /**   
   * Construct a simulation field with default size.   
   */   
   public Simulator()   
   {   
    this(DEFAULT_DEPTH, DEFAULT_WIDTH);   
   }   
   /**   
   * Create a simulation field with the given size.   
   * @param depth Depth of the field. Must be greater than zero.   
   * @param width Width of the field. Must be greater than zero.   
   */   
   public Simulator(int depth, int width)   
   {   
    if(width <= 0 || depth <= 0) {   
     System.out.println("The dimensions must be greater than zero.");   
     System.out.println("Using default values.");   
     depth = DEFAULT_DEPTH;   
     width = DEFAULT_WIDTH;   
    }   
    rabbits = new ArrayList<Rabbit>();   
    foxes = new ArrayList<Fox>();   
    field = new Field(depth, width);   
    // Create a view of the state of each location in the field.   
    view = new SimulatorView(depth, width);   
    view.setColor(Rabbit.class, Color.orange);   
    view.setColor(Fox.class, Color.blue);   
    // Setup a valid starting point.   
    reset();   
   }   
   /**   
   * Run the simulation from its current state for a reasonably long period,   
   * e.g. 500 steps.   
   */   
   public void runLongSimulation()   
   {   
    simulate(500);   
   }   
   /**   
   * Run the simulation from its current state for the given number of steps.   
   * Stop before the given number of steps if it ceases to be viable.   
   * @param numSteps The number of steps to run for.   
   */   
   public void simulate(int numSteps)   
   {   
    for(int step = 1; step <= numSteps && view.isViable(field); step++) {   
     simulateOneStep();   
    }   
   }   
   /**   
   * Run the simulation from its current state for a single step.   
   * Iterate over the whole field updating the state of each   
   * fox and rabbit.   
   */   
   public void simulateOneStep()   
   {   
    step++;   
    // Provide space for newborn rabbits.   
    List<Rabbit> newRabbits = new ArrayList<Rabbit>();     
    // Let all rabbits act.   
    for(Iterator<Rabbit> it = rabbits.iterator(); it.hasNext(); ) {   
     Rabbit rabbit = it.next();   
     rabbit.run(newRabbits);   
     if(! rabbit.isAlive()) {   
      it.remove();   
     }   
    }   
    // Provide space for newborn foxes.   
    List<Fox> newFoxes = new ArrayList<Fox>();     
    // Let all foxes act.   
    for(Iterator<Fox> it = foxes.iterator(); it.hasNext(); ) {   
     Fox fox = it.next();   
     fox.hunt(newFoxes);   
     if(! fox.isAlive()) {   
      it.remove();   
     }   
    }   
    // Add the newly born foxes and rabbits to the main lists.   
    rabbits.addAll(newRabbits);   
    foxes.addAll(newFoxes);   
    view.showStatus(step, field);   
   }   
   /**   
   * Reset the simulation to a starting position.   
   */   
   public void reset()   
   {   
    step = 0;   
    rabbits.clear();   
    foxes.clear();   
    populate();   
    // Show the starting state in the view.   
    view.showStatus(step, field);   
   }   
   /**   
   * Randomly populate the field with foxes and rabbits.   
   */   
   private void populate()   
   {   
    Random rand = Randomizer.getRandom();   
    field.clear();   
    for(int row = 0; row < field.getDepth(); row++) {   
     for(int col = 0; col < field.getWidth(); col++) {   
      if(rand.nextDouble() <= FOX_CREATION_PROBABILITY) {   
       Location location = new Location(row, col);   
       Fox fox = new Fox(true, field, location);   
       foxes.add(fox);   
      }   
      else if(rand.nextDouble() <= RABBIT_CREATION_PROBABILITY) {   
       Location location = new Location(row, col);   
       Rabbit rabbit = new Rabbit(true, field, location);   
       rabbits.add(rabbit);   
      }   
      // else leave the location empty.   
     }   
    }   
   }   
  }   

9. SimulatorView

 import java.awt.*;   
  import java.awt.event.*;   
  import javax.swing.*;   
  import java.util.LinkedHashMap;   
  import java.util.Map;   
  /**   
  * Write a description of class SimulatorView here.   
  *   
  * @author (Nitama Nurlingga Yotifa)   
  * @version (20181119)   
  */   
  /**   
  * A graphical view of the simulation grid.   
  * The view displays a colored rectangle for each location    
  * representing its contents. It uses a default background color.   
  * Colors for each type of species can be defined using the   
  * setColor method.   
  *    
  * @author Nadia Hasna  
  * @version 20181120   
  */   
  public class SimulatorView extends JFrame   
  {   
   // Colors used for empty locations.   
   private static final Color EMPTY_COLOR = Color.white;   
   // Color used for objects that have no defined color.   
   private static final Color UNKNOWN_COLOR = Color.gray;   
   private final String STEP_PREFIX = "Step: ";   
   private final String POPULATION_PREFIX = "Population: ";   
   private JLabel stepLabel, population;   
   private FieldView fieldView;   
   // A map for storing colors for participants in the simulation   
   private Map<Class, Color> colors;   
   // A statistics object computing and storing simulation information   
   private FieldStats stats;   
   /**   
   * Create a view of the given width and height.   
   * @param height The simulation's height.   
   * @param width The simulation's width.   
   */   
   public SimulatorView(int height, int width)   
   {   
    stats = new FieldStats();   
    colors = new LinkedHashMap<Class, Color>();   
    setTitle("Fox and Rabbit Simulation");   
    stepLabel = new JLabel(STEP_PREFIX, JLabel.CENTER);   
    population = new JLabel(POPULATION_PREFIX, JLabel.CENTER);   
    setLocation(100, 50);   
    fieldView = new FieldView(height, width);   
    Container contents = getContentPane();   
    contents.add(stepLabel, BorderLayout.NORTH);   
    contents.add(fieldView, BorderLayout.CENTER);   
    contents.add(population, BorderLayout.SOUTH);   
    pack();   
    setVisible(true);   
   }   
   /**   
   * Define a color to be used for a given class of animal.   
   * @param animalClass The animal's Class object.   
   * @param color The color to be used for the given class.   
   */   
   public void setColor(Class animalClass, Color color)   
   {   
    colors.put(animalClass, color);   
   }   
   /**   
   * @return The color to be used for a given class of animal.   
   */   
   private Color getColor(Class animalClass)   
   {   
    Color col = colors.get(animalClass);   
    if(col == null) {   
     // no color defined for this class   
     return UNKNOWN_COLOR;   
    }   
    else {   
     return col;   
    }   
   }   
   /**   
   * Show the current status of the field.   
   * @param step Which iteration step it is.   
   * @param field The field whose status is to be displayed.   
   */   
   public void showStatus(int step, Field field)   
   {   
    if(!isVisible()) {   
     setVisible(true);   
    }   
    stepLabel.setText(STEP_PREFIX + step);   
    stats.reset();   
    fieldView.preparePaint();   
    for(int row = 0; row < field.getDepth(); row++) {   
     for(int col = 0; col < field.getWidth(); col++) {   
      Object animal = field.getObjectAt(row, col);   
      if(animal != null) {   
       stats.incrementCount(animal.getClass());   
       fieldView.drawMark(col, row, getColor(animal.getClass()));   
      }   
      else {   
       fieldView.drawMark(col, row, EMPTY_COLOR);   
      }   
     }   
    }   
    stats.countFinished();   
    population.setText(POPULATION_PREFIX + stats.getPopulationDetails(field));   
    fieldView.repaint();   
   }   
   /**   
   * Determine whether the simulation should continue to run.   
   * @return true If there is more than one species alive.   
   */   
   public boolean isViable(Field field)   
   {   
    return stats.isViable(field);   
   }   
   /**   
   * Provide a graphical view of a rectangular field. This is    
   * a nested class (a class defined inside a class) which   
   * defines a custom component for the user interface. This   
   * component displays the field.   
   * This is rather advanced GUI stuff - you can ignore this    
   * for your project if you like.   
   */   
   private class FieldView extends JPanel   
   {   
    private final int GRID_VIEW_SCALING_FACTOR = 6;   
    private int gridWidth, gridHeight;   
    private int xScale, yScale;   
    Dimension size;   
    private Graphics g;   
    private Image fieldImage;   
    /**   
    * Create a new FieldView component.   
    */   
    public FieldView(int height, int width)   
    {   
     gridHeight = height;   
     gridWidth = width;   
     size = new Dimension(0, 0);   
    }   
    /**   
    * Tell the GUI manager how big we would like to be.   
    */   
    public Dimension getPreferredSize()   
    {   
     return new Dimension(gridWidth * GRID_VIEW_SCALING_FACTOR,   
          gridHeight * GRID_VIEW_SCALING_FACTOR);   
    }   
    /**   
    * Prepare for a new round of painting. Since the component   
    * may be resized, compute the scaling factor again.   
    */   
    public void preparePaint()   
    {   
     if(! size.equals(getSize())) { // if the size has changed...   
      size = getSize();   
      fieldImage = fieldView.createImage(size.width, size.height);   
      g = fieldImage.getGraphics();   
      xScale = size.width / gridWidth;   
      if(xScale < 1) {   
       xScale = GRID_VIEW_SCALING_FACTOR;   
      }   
      yScale = size.height / gridHeight;   
      if(yScale < 1) {   
       yScale = GRID_VIEW_SCALING_FACTOR;   
      }   
     }   
    }   
    /**   
    * Paint on grid location on this field in a given color.   
    */   
    public void drawMark(int x, int y, Color color)   
    {   
     g.setColor(color);   
     g.fillRect(x * xScale, y * yScale, xScale-1, yScale-1);   
    }   
    /**   
    * The field view component needs to be redisplayed. Copy the   
    * internal image to screen.   
    */   
    public void paintComponent(Graphics g)   
    {   
     if(fieldImage != null) {   
      Dimension currentSize = getSize();   
      if(size.equals(currentSize)) {   
       g.drawImage(fieldImage, 0, 0, null);   
      }   
      else {   
       // Rescale the previous image.   
       g.drawImage(fieldImage, 0, 0, currentSize.width, currentSize.height, null);   
      }   
     }   
    }   
   }   
  }   





Tugas 8 PBO A : Database



1. Data

 /**   
  * Write a description of class Data here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  public class Data   
  {   
   private String nama;   
   private String noTelp;   
   public Data(String Nama, String NoTelp)   
   {   
    nama = Nama;   
    noTelp = NoTelp;   
   }   
   public void display()   
   {   
    System.out.println("Nama : "+nama);   
    System.out.println("No Telepon : "+noTelp);   
   }   
   public String getNama()   
   {   
    return nama;   
   }   
  }   

2.  Database

 /**  
  * Write a description of class database here.  
  *  
  * @author Nadia Hasna  
  * @version 20181119  
  */  
 public class database  
 {  
   // instance variables - replace the example below with your own  
   private int x;  
   /**  
    * Constructor for objects of class database  
    */  
   public database()  
   {  
     // initialise instance variables  
     x = 0;  
   }  
   /**  
    * An example of a method - replace this comment with your own  
    *  
    * @param y a sample parameter for a method  
    * @return  the sum of x and y  
    */  
   public int sampleMethod(int y)  
   {  
     // put your code here  
     return x + y;  
   }  
 }  

3. Dosen

 import java.util.ArrayList;   
  /**   
  * Write a description of class Dosen here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  public class Dosen extends Data   
  {   
   private String NIP;   
   private String email;   
   public Dosen(String Nama, String NoTelp, String Nip, String Email)   
   {   
    super(Nama, NoTelp);   
    NIP = Nip;   
    email = Email;   
   }   
   public String getDosen()   
   {   
    return super.getNama();   
   }   
   public void display()   
   {   
    super.display();   
    System.out.println("NIP : "+NIP);   
    System.out.println("Email : "+email);   
   }   
   public void displayDosen()   
   {   
    super.display();   
    System.out.println("NIP : "+NIP);   
    System.out.println("Email : "+email);   
   }   
  }   

4. Buku

  /**   
  * Write a description of class Buku here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  public class Buku   
  {   
   private String kodeBuku;   
   private String judul;   
   public Buku (String KodeBuku, String Judul)   
   {   
    kodeBuku = KodeBuku;   
    judul = Judul;   
   }   
   public String getKodeBuku()   
   {   
    return kodeBuku;   
   }   
   public String getJudulBuku()   
   {   
    return judul;   
   }   
  }   

5. Pegawai

  import java.util.ArrayList;    
  /**   
  * Write a description of class Pegawai here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  public class Pegawai extends Data   
  {   
   private String kodePegawai;   
   public Pegawai(String Nama, String NoTelp, String KodePegawai)   
   {   
    super(Nama, NoTelp);   
    kodePegawai = KodePegawai;   
   }   
   public void display()   
   {   
    super.display();   
    System.out.println("Kode pegawai : "+kodePegawai);   
   }   
   public void displayPegawai()   
   {   
    super.display();   
    System.out.println("Kode pegawai : "+kodePegawai);   
   }   
  }   

6. Mata kuliah

  /**   
  * Write a description of class Matakuliah here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  public class Matakuliah   
  {   
   private String namaMk;   
   public Matakuliah (String NamaMk)   
   {   
    namaMk = NamaMk;   
   }   
   public String getMatakuliah()   
   {   
    return namaMk;   
   }   
   public void display()   
   {   
    System.out.println("Nama matakuliah : "+namaMk);   
   }   
  }   

7. Kelas

 /**   
  * Write a description of class Kelas here.   
  *   
  * @author Nadia Hasna   
  * @version 20181119   
  */   
  public class Kelas   
  {   
   private String kelas;   
   private String dosen;   
   private String matakuliah;   
   public Kelas(String Kelas)   
   {   
    kelas = Kelas;   
   }   
   public String getKelas()   
   {   
    return kelas;   
   }   
   public void addMatakuliah(Matakuliah MATKUL)   
   {   
    matakuliah = MATKUL.getMatakuliah();   
   }   
   public String getMatakuliah()   
   {   
    return matakuliah;   
   }   
   public void addDosen(Dosen DOSEN)   
   {   
    dosen = DOSEN.getDosen();   
   }   
   public String getDosen()   
   {   
    return dosen;   
   }   
  }   

8. Mahasiswa

 import java.util.ArrayList;   
  /**   
  * Write a description of class Mahasiswa here.   
  *   
  * @author nadia Hasna   
  * @version 20181119   
  */   
  public class Mahasiswa extends Data   
  {   
   private String NRP;   
   private String email;   
   private ArrayList <Buku> buku;   
   private ArrayList <Kelas> kelas;   
   public Mahasiswa (String Nama, String NoTelp, String Nrp, String Email)   
   {   
    super(Nama, NoTelp);   
    NRP = Nrp;   
    email = Email;   
    kelas = new ArrayList <Kelas>();   
    buku = new ArrayList <Buku>();   
   }   
   public String getNRP()   
   {   
    return NRP;   
   }   
   public void peminjamanBuku(Buku bukuku)   
   {   
    buku.add(bukuku);   
   }   
   public void pengembalianBuku (Buku bukuku)   
   {   
    buku.remove(bukuku);   
   }   
   public void pengambilanKelas (Kelas KELAS)   
   {   
    kelas.add(KELAS);   
   }   
   public void dropKelas (Kelas KELAS)   
   {   
    kelas.remove(KELAS);   
   }   
   public void display()   
   {   
    super.display();   
    System.out.println("NRP : "+NRP);   
    System.out.println("Email : "+email);   
    for(Buku BUKU : buku)   
    {   
     System.out.println ("Kode buku : "+BUKU.getKodeBuku());   
     System.out.println ("Judul buku : "+BUKU.getJudulBuku());   
    }   
    for (Kelas KELAS : kelas)   
    {   
     System.out.println ("Mata kuliah : "+KELAS.getMatakuliah());   
     System.out.println ("kelas : "+KELAS.getKelas());   
     System.out.println ("Dosen : "+KELAS.getDosen());   
    }   
   }   
   public void displayMahasiswa()   
   {   
    super.display();   
    System.out.println("NRP : "+NRP);   
    System.out.println("Email : "+email);   
   }   
  }   




Selasa, 16 Oktober 2018

ETS PWeb C Prestasi Siswa



1. form_prestasi

 <!DOCTYPE html>  
 <html>  
 <head>  
   <title>Raport Prestasi Siswa SD Harapan Bangsa</title>  
 </head>  
 <body>  
   <header>  
     <h3>Rekap Prestasi Siswa 2017/2018</h3>  
   </header>  
   <form action="pendaftaran_prestasi.php" method="POST">  
     <fieldset>  
     <p>  
       <label for="nama">Nama: </label>  
       <textarea name="nama"></textarea>  
     </p>  
     <p>  
       <label for="kelas">Kelas: </label>  
       <textarea name="kelas"></textarea>  
     </p>  
     <p>  
       <label for="jenis_kelamin">Jenis Kelamin: </label>  
       <label><input type="radio" name="jenis_kelamin" value="laki-laki"> Laki-laki</label>  
       <label><input type="radio" name="jenis_kelamin" value="perempuan"> Perempuan</label>  
     </p>  
     <p>  
       <label for="jenis_prestasi">Jenis Prestasi: </label>  
       <select name="jenis_prestasi">  
         <option>Akademik</option>  
         <option>Non-Akademik</option>  
       </select>  
     </p>  
     <p>  
        <label for="keterangan_prestasi">Keterangan Prestasi: </label>  
       <textarea name= "keterangan_prestasi"></textarea>  
     </p>  
     <p>  
       <input type="submit" value="Daftar" name="daftar" />  
     </p>  
     </fieldset>  
   </form>  
   </body>  
 </html>  

2. pendaftaran_prestasi

 <?php  
 include("configs.php");  
 // cek apakah tombol daftar sudah diklik atau blum?  
 if(isset($_POST['daftar'])){  
   // ambil data dari formulir  
   $nama = $_POST['nama'];  
   $kelas = $_POST['kelas'];  
   $jk = $_POST['jenis_kelamin'];  
   $jp = $_POST['jenis_prestasi'];  
   $kp = $_POST['keterangan_prestasi'];  
   // buat query  
   $sql = "INSERT INTO prestasi_siswa (nama, kelas, jenis_kelamin, jenis_prestasi, keterangan_prestasi) VALUE ('$nama', '$kelas', '$jenis_kelamin', '$jenis_prestasi', '$keterangan_prestasi')";  
   $query = mysqli_query($db, $sql);  
   // apakah query simpan berhasil?  
   if( $query ) {  
     // kalau berhasil alihkan ke halaman index.php dengan status=sukses  
     header('Location: indekspres.php?status=sukses');  
   } else {  
     // kalau gagal alihkan ke halaman indek.php dengan status=gagal  
     header('Location: indekspres.php?status=gagal');  
   }  
 }  else {  
   die("Akses dilarang...");  
 }  
 ?>  

3. configs

 <?php  
 $server = "localhost";  
 $user = "root";  
 $password = "prestasi";  
 $nama_database = "prestasi_siswa";  
 $db = mysqli_connect($server, $user, $password="", $nama_database);  
 if( !$db ){  
   die("Gagal terhubung dengan database: " . mysqli_connect_error());  
 }  
 ?>  

4. lis-prestasi

 <?php include("configs.php"); ?>  
 <!DOCTYPE html>  
 <html>  
 <head>  
   <title>Rekap Prestasi Siswa | SMK Coding</title>  
 </head>  
 <body>  
   <header>  
     <h3>Siswa berprestasi</h3>  
   </header>  
   <nav>  
     <a href="form_prestasi.php">[+] Tambah Baru</a>  
   </nav>  
   <br>  
   <table border="1">  
   <thead>  
     <tr>  
       <th>No</th>  
       <th>Nama</th>  
       <th>Kelas</th>  
       <th>Jenis Kelamin</th>  
       <th>Jenis Prestasi</th>  
       <th>Keterangan Prestasi</th>  
       <th>Tindakan</th>  
     </tr>  
   </thead>  
   <tbody>  
     <?php  
     $sql = "SELECT * FROM prestasi";  
     $query = mysqli_query($db, $sql);  
     while($siswa = mysqli_fetch_array($query)){  
       echo "<tr>";  
       echo "<td>".$siswa['id']."</td>";  
       echo "<td>".$siswa['nama']."</td>";  
       echo "<td>".$siswa['kelas']."</td>";  
       echo "<td>".$siswa['jenis_kelamin']."</td>";  
       echo "<td>".$siswa['jenis_prestasi']."</td>";  
       echo "<td>".$siswa['keterangan_prestasi']."</td>";  
       echo "<td>";  
       echo "<a href='form-editt.php?id=".$siswa['id']."'>Edit</a> | ";  
       echo "<a href='hapuss.php?id=".$siswa['id']."'>Hapus</a>";  
       echo "</td>";  
       echo "</tr>";  
     }  
     ?>  
   </tbody>  
   </table>  
   <p>Total: <?php echo mysqli_num_rows($query) ?></p>  
   </body>  
 </html>  

5. index

 <!DOCTYPE html>  
 <html>  
 <head>  
   <title> Rekap Prestasi Siswa| SD Harapan Bangsa</title>  
 </head>  
 <body>  
   <header>  
     <h3>Prestasi siswa tahun ajaran 2017/2018</h3>  
     <h1>SD Harapan Bangsa</h1>  
   </header>  
   <h4>Menu</h4>  
   <nav>  
     <ul>  
       <li><a href="form_prestasi.php">Prestasi Baru</a></li>  
       <li><a href="lis-prestasi.php">Rekap Siswa</a></li>  
     </ul>  
   </nav>  
   </body>  
 </html>  

6. form edit

 <?php  
 include("configs.php");  
 // kalau tidak ada id di query string  
 if( !isset($_GET['id']) ){  
   header('Location: lis-prestasi.php');  
 }  
 //ambil id dari query string  
 $id = $_GET['id'];  
 // buat query untuk ambil data dari database  
 $sql = "SELECT * FROM prestasi WHERE id=$id";  
 $query = mysqli_query($db, $sql);  
 $siswa = mysqli_fetch_assoc($query);  
 // jika data yang di-edit tidak ditemukan  
 if( mysqli_num_rows($query) < 1 ){  
   die("data tidak ditemukan...");  
 }  
 ?>  
 <!DOCTYPE html>  
 <html>  
 <head>  
   <title>Formulir Edit Siswa | SMK Coding</title>  
 </head>  
 <body>  
   <header>  
     <h3>Formulir Edit Siswa</h3>  
   </header>  
   <form action="proses-editt.php" method="POST">  
     <fieldset>  
       <input type="hidden" name="id" value="<?php echo $siswa['id'] ?>" />  
     <p>  
       <label for="nama">Nama: </label>  
       <textarea name="nama"><?php echo $siswa['nama'] ?></textarea>  
     </p>  
     <p>  
       <label for="kelas">Kelas: </label>  
       <textarea name="kelas"><?php echo $siswa['kelas'] ?></textarea>  
     </p>  
     <p>  
       <label for="jenis_kelamin">Jenis Kelamin: </label>  
       <?php $jk = $siswa['Jenis_Kelamin']; ?>  
       <label><input type="radio" name="jenis_kelamin" value="laki-laki" <?php echo ($jk == 'laki-laki') ? "checked": "" ?>> Laki-laki</label>  
       <label><input type="radio" name="jenis_kelamin" value="perempuan" <?php echo ($jk == 'perempuan') ? "checked": "" ?>> Perempuan</label>  
     </p>  
     <p>  
       <label for="jenis_prestasi">Jenis Prestasi: </label>  
       <?php $jenis_prestasi = $siswa['jenis_prestasi']; ?>  
       <select name="agama">  
         <option <?php echo ($jenis_prestasi == 'Akademik') ? "selected": "" ?>>Akademik</option>  
         <option <?php echo ($jenis_prestasi == 'Non-Akademik') ? "selected": "" ?>>Non-Akademik</option>  
       </select>  
     </p>  
     <p>  
       <label for="keterangan_prestasi">Keterangan Prestasi: </label>  
       <textarea name="keterangan_prestasi"><?php echo $siswa['keterangan_prestasi'] ?></textarea>  
     </p>  
     <p>  
       <input type="submit" value="Simpan" name="simpan" />  
     </p>  
     </fieldset>  
   </form>  
   </body>  
 </html>  

7. hapus

 <?php  
 include("configs.php");  
 if( isset($_GET['id']) ){  
   // ambil id dari query string  
   $id = $_GET['id'];  
   // buat query hapus  
   $sql = "DELETE FROM prestasi WHERE id=$id";  
   $query = mysqli_query($db, $sql);  
   // apakah query hapus berhasil?  
   if( $query ){  
     header('Location: lis-prestasi.php');  
   } else {  
     die("gagal menghapus...");  
   }  
 } else {  
   die("akses dilarang...");  
 }  
 ?>  

8. proses_edit

 <?php  
 include("configs.php");  
 if( isset($_GET['id']) ){  
   // ambil id dari query string  
   $id = $_GET['id'];  
   // buat query hapus  
   $sql = "DELETE FROM prestasi WHERE id=$id";  
   $query = mysqli_query($db, $sql);  
   // apakah query hapus berhasil?  
   if( $query ){  
     header('Location: lis-prestasi.php');  
   } else {  
     die("gagal menghapus...");  
   }  
 } else {  
   die("akses dilarang...");  
 }  
 ?>  



Minggu, 14 Oktober 2018

ETS PBO A Parkir Elektronik


1. Main Class (GTO)

 public class GTO{  
   private boolean userAuthenticated;  
   private int currentAccountNumber;  
   private Screen screen;  
   private Keypad keypad;  
   private CashDispenser cashDispenser;  
   private BankDatabase bankDatabase;  
   private static final int BALANCE_INQUIRY = 1;  
   private static final int WITHDRAWAL = 2;  
   private static final int EXIT = 3;  
   public GTO(){  
     userAuthenticated = false;  
     currentAccountNumber = 0;  
     screen = new Screen();  
     keypad = new Keypad();  
     cashDispenser = new CashDispenser();  
     bankDatabase = new BankDatabase();  
   }  
   public void run(){  
     while(true){  
       while(!userAuthenticated){  
         screen.displayMessageLine("\nWelcome!");  
         authenticateUser();  
       }  
       performTransactions();  
       userAuthenticated = false;  
       currentAccountNumber = 0;  
       screen.displayMessageLine("\nThank You!\nGoodbye!");  
     }  
   }  
   private void authenticateUser(){  
     screen.displayMessage("\nPlease enter your account number : ");  
     int accountNumber = keypad.getInput();  
     userAuthenticated = bankDatabase.authenticateUser(accountNumber);  
     if(userAuthenticated){  
       currentAccountNumber = accountNumber;  
     }  
     else{  
       screen.displayMessageLine("Invalid ID.");  
       screen.displayMessageLine("Please Try Again.");  
     }  
   }  
   private void performTransactions(){  
     Transaction currentTransaction = null;  
     boolean userExited = false;  
     while(!userExited){  
       int mainMenuSelection = displayMainMenu();  
       switch(mainMenuSelection){  
         case BALANCE_INQUIRY :  
         case WITHDRAWAL :  
         //case DEPOSIT :  
           currentTransaction = createTransaction(mainMenuSelection);  
           currentTransaction.execute();  
           break;  
         case EXIT :  
           screen.displayMessageLine("\nExiting the system...");  
           userExited = true;  
           break;  
         default :  
           screen.displayMessageLine("\nYou did not enter a valid selection.");  
           screen.displayMessageLine("Please try again.");  
           break;  
       }  
     }  
   }  
   private int displayMainMenu(){  
     screen.displayMessageLine("\nChoose to continue :");  
     screen.displayMessageLine("1 - Saldo Kartu");  
     screen.displayMessageLine("2 - Durasi Parkir");  
     screen.displayMessageLine("3 - Exit\n");  
     screen.displayMessage("Enter a choice : ");  
     return keypad.getInput();  
   }  
   private Transaction createTransaction(int type){  
     Transaction temp = null;  
     switch(type){  
       case BALANCE_INQUIRY :  
         temp = new BalanceInquiry(currentAccountNumber, screen, bankDatabase);  
         break;  
       case WITHDRAWAL :  
         temp = new Withdrawal(currentAccountNumber, screen, bankDatabase, keypad, cashDispenser);  
         break;  
     }  
     return temp;  
   }  
 }  

2.  Screen
= menjalankan semua proses yang menampilkan output

 public class Screen{  
   public void displayMessage(String message){  
     System.out.print(message);  
   }  
   public void displayMessageLine(String message){  
     System.out.println(message);  
   }  
   public void displayDollarAmount(double amount){  
     System.out.printf("$%,.2f", amount);  
   }  
 }  

3. Keypad
= menerima inputan pengunjung

 import java.util.Scanner;  
 public class Keypad{  
   private Scanner input;  
   public Keypad(){  
     input = new Scanner(System.in);  
   }  
   public int getInput(){  
     return input.nextInt();  
   }  
 }  

4. CashDispenser
= mengecek saldo mencukupi atau tidak untuk membeli tiket

 public class CashDispenser{  
   private final static int INITIAL_COUNT = 500;  
   private int count;  
   public CashDispenser(){  
     count = INITIAL_COUNT;  
   }  
   public void dispenseCash(int amount){  
     int billsRequired = amount / 20;  
     count -= billsRequired;  
   }  
   public boolean isSufficientCashAvailable(int amount){  
     int billsRequired = amount / 20;  
     if(count >= billsRequired){  
       return true;  
     }  
     else{  
       return false;  
     }  
   }  
 }  

5. Transaction
= mengatur pembayaran dan sisa saldo

 public abstract class Transaction{  
   private int accountNumber;  
   private Screen screen;  
   private BankDatabase bankDatabase;  
   public Transaction(int userAccountNumber, Screen gtoScreen, BankDatabase gtoBankDatabase){  
     accountNumber = userAccountNumber;  
     screen = gtoScreen;  
     bankDatabase = gtoBankDatabase;  
   }  
   public int getAccountNumber(){  
     return accountNumber;  
   }  
   public Screen getScreen(){  
     return screen;  
   }  
   public BankDatabase getBankDatabase(){  
     return bankDatabase;  
   }  
   abstract public void execute();  
 }  

6. Withdrawal
= mengetur proses pembayaran dengan mengecek variabel

 import java.text.DateFormat;  
 import java.text.SimpleDateFormat;  
 import java.time.LocalDateTime;  
 import java.time.format.DateTimeFormatter;  
 import java.util.Calendar;  
 import java.util.Date;  
 public class Withdrawal extends Transaction{  
   private int amount;  
   private Keypad keypad;  
   int price;  
   int[] amounts = {0, 20, 40, 60, 100, 200};  
   private CashDispenser cashDispenser;  
   private final static int CANCELED = 6;  
   public Withdrawal(int userAccountNumber, Screen gtoScreen, BankDatabase gtoBankDatabase, Keypad gtoKeypad, CashDispenser gtoCashDispenser){  
     super(userAccountNumber, gtoScreen, gtoBankDatabase);  
     keypad = gtoKeypad;  
     cashDispenser = gtoCashDispenser;  
   }  
   @Override  
   public void execute(){  
     boolean cashDispensed = false;  
     double availableBalance;  
     BankDatabase bankDatabase = getBankDatabase();  
     Screen screen = getScreen();  
     do{  
       amount = displayMenuOfAmounts();  
       if(amount != CANCELED){  
         availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());  
         if(amount <= availableBalance){  
           if(cashDispenser.isSufficientCashAvailable(amount)){  
             bankDatabase.debit(getAccountNumber(), amount);  
             cashDispenser.dispenseCash(amount);  
             cashDispensed = true;  
             screen.displayMessageLine("\nYour cash has been dispensed. Please take your struct now.");  
             //BankDatabase bankDatabase = getBankDatabase();  
             availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());  
             screen.displayMessageLine("\nParkir Information : ");  
             screen.displayMessage(" - TAMAN BUNGKUL -\n");  
             screen.displayMessage(" - Tanggal Transaksi : " + dateFormat.format(date) + " \n");  
             screen.displayMessage(" - Harga Tiket : ");  
             screen.displayDollarAmount(amounts[price]);  
             screen.displayMessage("\n");  
             screen.displayMessage(" - Sisa Saldo Anda : ");  
             screen.displayDollarAmount(availableBalance);  
             screen.displayMessageLine("");  
           }  
         }  
         else{  
           screen.displayMessageLine("\nInsufficient funds in your account.");  
         }  
       }  
       else{  
         screen.displayMessageLine("\nCancelling transactions...");  
         return;  
       }  
     }  while(!cashDispensed);  
   }  
   private Date date;  
   private DateFormat dateFormat;  
   private int displayMenuOfAmounts(){  
     int userChoice = 0;  
     dateFormat = new SimpleDateFormat("dd/MM/yyyy");  
     date = new Date();  
     Screen screen = getScreen();  
     while(userChoice == 0){  
       screen.displayMessageLine("\nDurasi Parkir : ");  
       screen.displayMessageLine("1 - motor 1 jam $20");  
       screen.displayMessageLine("2 - motor 3 jam $40");  
       screen.displayMessageLine("3 - motor >3 jam $60");  
       screen.displayMessageLine("4 - mobil 1 jam $100");  
       screen.displayMessageLine("5 - mobil 3 jam $200");  
       screen.displayMessageLine("6 - mobil >3 jam $300");  
       screen.displayMessageLine("7 - Cancel Transaction");  
       screen.displayMessage("\nPilih durasi Anda : ");  
       int input = keypad.getInput();  
       price = input;  
       switch(input){  
         case 1 :  
         case 2 :  
         case 3 :  
         case 4 :  
         case 5 :  
           userChoice = amounts[input];  
           break;  
         case CANCELED :  
           userChoice = CANCELED;  
           break;  
         default :  
           screen.displayMessageLine("\nInvalid selection.");  
           screen.displayMessageLine("Try again.");  
       }  
     }  
     return userChoice;  
   }  
 }  

7. BalanceInquiry
= mengeluarkan output jumlah saldo

 public class BalanceInquiry extends Transaction{  
   public BalanceInquiry(int userAccountNumber, Screen gtoScreen, BankDatabase gtoBankDatabase){  
     super(userAccountNumber, gtoScreen, gtoBankDatabase);  
   }  
   @Override  
   public void execute(){  
     BankDatabase bankDatabase = getBankDatabase();  
     Screen screen = getScreen();  
     double availableBalance = bankDatabase.getAvailableBalance(getAccountNumber());  
     screen.displayMessageLine("\nBalance Information : \n");  
     screen.displayMessage(" - Available Balance : ");  
     screen.displayDollarAmount(availableBalance);  
     screen.displayMessageLine("");  
   }  
 }  

8. BankDatabase
= menyimpan id dan saldo

 public class BankDatabase{  
   private Account[] accounts;  
   public BankDatabase(){  
     accounts = new Account[1];  
     accounts[0] = new Account(79344, 200.0);  
   }  
   private Account getAccount(int accountNumber){  
     for(Account currentAccount : accounts){  
       if(currentAccount.getAccountNumber() == accountNumber) return currentAccount;  
     }  
     return null;  
   }  
   public boolean authenticateUser(int userAccountNumber){    
     Account userAccount = getAccount(userAccountNumber);     
     if(userAccount != null){  
       return true;  
     }  
     else{  
       return false;  
     }   
   }  
   public double getAvailableBalance(int userAccountNumber){  
     return getAccount(userAccountNumber).getAvailableBalance();  
   }  
   public void debit(int userAccountNumber, double amount){  
     getAccount(userAccountNumber).debit(amount);  
   }  
 }  

9. Account
=mengecek input yang masuk dan memanggil fungsi nilai saldo

 public class Account{  
   private int accountNumber;  
   private double availableBalance;  
   public Account(int theAccountNumber, double theAvailableBalance){  
     accountNumber = theAccountNumber;  
     availableBalance = theAvailableBalance;  
   }  
   public double getAvailableBalance(){  
     return availableBalance;  
   }  
   public void debit(double amount){  
     availableBalance -= amount;  
   }  
   public int getAccountNumber(){  
     return accountNumber;  
   }  
 }  

10. GTOCasestudy
= memanggil ulang fungsi main

 public class GTOCaseStudy{  
   public static void main(String[] args){  
     GTO theGTO = new GTO();  
     theGTO.run();  
   }  
 }  





Rabu, 10 Oktober 2018

TUGAS 6 PWEB C




1. HTML

 <!DOCTYPE html>  
 <html>  
 <head>  
      <title>Membuat Form Pembaca Berita Website dengan Javascript</title>  
      <link rel="stylesheet" type="text/css" href="weew.css">  
 </head>  
 <body>  
      <center><h2>REGISTRASI PEMBACA BERITA WEBSITE</h2></center>  
      <div class="login">  
           <form action="#" method="POST" onSubmit="validasi()">  
                <div>  
                     <label>Nama :</label>  
                     <input type="text" name="nama" id="nama" />  
                </div>  
                <div>  
                     <label>Email :</label>  
                     <input type="email" name="email" id="email" />  
                </div>  
                <div>  
                     <label>No HP :</label>  
                     <input type="integer" name="no_hp" id="no_hp" />  
                </div>  
                <div>  
                     <label>Jenis Kelamin :</label>  
                     <input type="text" name="jk" id="jk" />  
                </div>  
                <div>  
                     <label>Tanggal Lahir :</label>  
                     <input type="integer" name="tgl_lahir" id="tgl_lahir" />  
                </div>  
                <div>  
                     <label>Alamat :</label>  
                     <textarea cols="40" rows="5" name="alamat" id="alamat"></textarea>  
                </div>  
                <div>  
                     <label>Kolom Rubik :</label>  
                     <input type="text" name="rubik" id="rubik" />  
                </div>  
                <div>  
                     <input type="submit" value="Daftar" class="tombol">  
                </div>  
           </form>  
      </div>  
 </body>  
 <script type="text/javascript">  
      function validasi() {  
           var nama = document.getElementById("nama").value;  
           var email = document.getElementById("email").value;  
           var alamat = document.getElementById("alamat").value;  
           var no_hp = document.getElementById("no_hp").value;  
           var jk = document.getElementById("jk").value;  
           var tgl_lahir = document.getElementById("tgl_lahir").value;  
           var rubik = document.getElementById("rubik").value;  
           if (nama != "" && email!="" && alamat !="" && no_hp != "" && jk != "" && tgl_lahir != "" && rubik != "") {  
                return true;  
           }else{  
                alert('Anda harus mengisi data dengan lengkap !');  
           }  
      }  
 </script>  
 </html>  

2. CSS

 body {  
  background: #3498db;  
  font-family: sans-serif;  
 }  
 h2 {  
  color: #fff;  
 }  
 .login {  
  padding: 1em;  
  margin: 2em auto;  
  width: 17em;  
  background: #fff;  
  border-radius: 3px;  
 }  
 label {  
  font-size: 10pt;  
  color: #555;  
 }  
 input[type="text"],  
 input[type="email"],  
 input[type="integer"],  
 textarea {  
  padding: 8px;  
  width: 95%;  
  background: #efefef;  
  border: 0;  
  font-size: 10pt;  
  margin: 6px 0px;  
 }  
 .tombol {  
  background: #3498db;  
  color: #fff;  
  border: 0;  
  padding: 5px 8px;  
 }  

jadi jika form tersebut tidak diisi dengan lengkap maka akan muncul tulisan seperti ini




TUGAS 4 PWEB C

Nama : Nadia Hasna Luthfianita
NRP   : 05111740000077
Kelas  : PWeb C


1. Source Code HTML


 <!DOCTYPE html>   
  <html>   
  <head>   
    <title>Belajar Membuat Layout dengan HTML dan CSS</title>   
    <link rel="stylesheet" href="custom.css"/>   
  </head>   
  <body>   
    <div class="header">   
       <div class="jarak">   
         <h2>Belajar Membuat Layout dengan HTML dan CSS</h2>   
       </div>   
    </div>   
    <div class="menu">   
       <ul>   
         <li><a href="#">Home</a></li>   
         <li><a href="#">About</a></li>   
         <li><a href="#">Blog</a></li>   
         <li><a href="#">Contact</a></li>   
       </ul>   
    </div>   
    <div class="content">   
       <div class="jarak">   
         <!-- kiri -->   
         <div class="kiri">   
            <!-- blog -->   
            <div class="border">   
              <div class="jarak">   
                 <h3>Lorem Ipsum</h3>   
                 <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been <button class="btn">Read More...</button>   
              </div>   
            </div>   
            <!-- end blog -->   
            <!-- blog -->   
            <div class="border">   
              <div class="jarak">   
                 <h3>Lorem Ipsum</h3>   
                 <p>Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been <button class="btn">Read More...</button>   
              </div>   
            </div>   
            <!-- end blog -->   
         </div>   
         <!-- kiri -->   
         <!-- kanan -->   
         <div class="kanan">   
            <div class="jarak">   
              <h3>CATEGORY</h3>   
              <hr/>   
              <p><a href="#" class="undecor">HTML</a></p>   
              <p><a href="#" class="undecor">CSS</a></p>   
              <p><a href="#" class="undecor">BOOTSTRAP</a></p>   
              <p><a href="#" class="undecor">PHP</a></p>   
              <p><a href="#" class="undecor">MySQL</a></p>   
              <p><a href="#" class="undecor">JQuery</a></p>   
              <p><a href="#" class="undecor">Ajax</a></p>   
            </div>   
         </div>   
         <!-- kanan -->   
       </div>        
    </div>   
    <div class="footer">   
       <div class="jarak">   
         <p>copyright 2017 codebareng all reserved</p>   
       </div>   
    </div>   
  </body>   
  </html>   

2. Source Code CSS


 body{   
  background: #f3f3f3;   
  color: #333;   
  width: 100%   
  font-family :sans-serif;   
  margin: 0 auto;   
  }   
  .header{   
  width: 90%;   
  margin: auto;   
  height: 120px;   
  line-height: 120px;   
  background: #41A85F;   
  color: #fff;   
  }   
  .content{   
  width: 90%;   
  margin: auto;   
  height: 420px;   
  padding: 0.1px;   
  background: #fff;   
  color: #333;   
  }   
  .kiri{   
  width: 70%;   
  float: left;   
  margin: auto;   
  background: #fff;   
  height: 420px;   
  }   
  .kanan{   
  width: 30%;   
  float: left;   
  margin: auto;   
  background: #fff;   
  height: 420px;   
  }   
  .border{   
  border: 2px solid #74C599;   
  margin-top: 1pc;   
  padding-bottom: 1pc;   
  padding-left: 2pc;   
  padding-right: 2pc;   
  }   
  .undecor{   
  text-decoration: none;   
  }   
  .footer{   
  width: 90%;   
  margin: auto;   
  height: 40px;   
  line-height: 40px;   
  background: #41A85F;   
  color: #fff;   
  }   
  .menu{   
  background-color: #53bd84;   
  height: 50px;   
  line-height: 50px;   
  position: relative;   
  width: 90%;   
  margin: 0 auto;   
  padding:0 auto;   
  }   
  .jarak{   
  padding: 0 2pc;   
  }   
  .menu ul{   
  list-style: none;   
  }   
  .menu ul li a{   
  float: left;   
  width: 70px;   
  display: block;   
  text-align: center;   
  color: #fff;   
  text-decoration: none;   
  }   
  .menu ul li a:hover{   
  background-color: #74C599   
  display:block;   
  }   



Minggu, 07 Oktober 2018

Tugas 6 PBO A


1. Auction

 import java.util.ArrayList;   
 import java.util.Iterator;   
  /**   
  * Kelas yang menunjukkan model pelelangan (Auction).   
  *    
  * @author (Nadia Hasna).   
  * @version (10/8/2018).   
  */   
  public class Auction   
  {   
   // Daftar 'Lot' pada kelas Auction.   
   private ArrayList<Lot> items; //items = barang yg dilelang   
   //Nomor yg akan diberikan pada 'item' berikutnya   
   private int nextItemNum;   
   //Buat pelelangan baru   
   public Auction()   
   {   
    items = new ArrayList<Lot>();   
    nextItemNum = 1;   
   }   
   //Masukkan 'item' baru pada pelelangan   
   //@param description Pendeskripsian 'item'.   
   public void enterItem(String description)   
   {   
    items.add(new Lot(nextItemNum, description));   
    nextItemNum++;   
   }   
   //List keseluruhan dari item yg terdapat pada pelelangan   
   public void showItems(){   
    for(Lot item : items){   
     System.out.println(item.toString());   
    }   
   }   
   /**   
   * Buat penawaran pada item.   
   * Output berupa penandaan apakah item berhasil dilelang/tdk.   
   * @param itemNum Item yg akan dilelang.   
   * @param penawar Orang yg akan melakukan penawaran.   
   * @param jumlah Jumlah brg yg dilelang.   
   */   
   public void buatLelang(int itemNum, Person penawar, long jumlah)   
   {   
    Lot selectedItem = getItem(itemNum);   
    if(selectedItem != null){   
     Bid bid = new Bid(penawar, jumlah);   
     boolean successful = selectedItem.bidFor(bid);   
     if(successful){   
      System.out.println("Penawaran terhadap item bernomor " +   
      itemNum + " telah berhasil dilakukan.");   
     }   
     else{   
      //Ganti dengan penawaran yg lebih tinggi.   
      Bid highestBid = selectedItem.getHighestBid();   
      System.out.println("No Item: " + itemNum +   
      " telah dilelang sebesar: " +   
      highestBid.getJumlah());   
     }   
    }   
   }   
   //Nilai kembali dari 'item' yg telah diberi nomor   
   //Nilai kembali berupa null jika item tsb tidak ada.   
   //@param itemNum Nomor dari item yg dilelang.   
   public Lot getItem(int itemNum){   
    if((itemNum >= 1) && (itemNum < nextItemNum))   
    {   
     Lot selectedItem = items.get(itemNum - 1);   
     //Pemeriksaan   
     if(selectedItem.getNum() != itemNum) {   
      System.out.println("Terdapat kesalahan: Item dengan nomor " +   
      selectedItem.getNum() +   
      " telah dilelang senilai " + itemNum);   
      selectedItem = null;   
     }   
     return selectedItem;   
    }   
    else {   
     System.out.println("Item dengan nomor: " + itemNum +   
     " tidak valid/ tidak ada.");   
     return null;   
    }   
   }   
  }   

2. Lot

 /**   
  * Kelas untuk memodelkan serangkaian item dalam lelang.   
  *    
  * @author (Nadia Hasna).   
  * @version (10/8/2018).   
  */   
  public class Lot   
  {   
   private final int num; //Nomor   
   private String desc; //Deskripsi untuk item   
   private Bid highestBid; //Penawaran tertinggi untuk saat ini   
   /**   
   * @param num Nomor item.   
   * @param desc Deskripsi dari item yg dilelang.   
   */   
   public Lot(int num, String desc)   
   {   
    this.num = num;   
    this.desc = desc;   
   }   
   /**   
   * Proses penawaran untuk item ybs.   
   * Tawaran yang berhasil harus memiliki nilai yang lebih tinggi daripada tawaran sebelumnya.   
   * @param bid Pelelangan yang baru.   
   * @return true jika berhasil, false jika sebaliknya   
   */   
   public boolean bidFor(Bid bid)   
   {   
    if((highestBid == null) ||   
      (bid.getJumlah() > highestBid.getJumlah())) {   
     //Penawaran yg diterima.   
     highestBid = bid;   
     return true;   
    }   
    else {   
     return false;   
    }   
   }   
   //Detail dari item yg dilelang   
   public String toString()   
   {   
    String details = num + ": " + desc;   
    if(highestBid != null) {   
     details += " Dilelang sebesar: " +    
        highestBid.getJumlah();   
    }   
    else {   
     details += " (Belum terlelang)";   
    }   
    return details;   
   }   
   //Nilai kembali berupa nomor item   
   public int getNum()   
   {   
    return num;   
   }   
   //Nilai kembali berupa deskripsi item   
   public String getDesc()   
   {   
    return desc;   
   }   
   /**   
   * @return Penawaran tertinggi untuk item ybs.   
   *   Null apabila belum ada penawaran   
   */   
   public Bid getHighestBid()   
   {   
    return highestBid;   
   }   
  }   

3. Bit

  /**   
  * Kelas yang memodelkan tawaran lelang (bid).   
  * Berisi referensi tawaran (dari class Person) dan jumlah tawaran.   
  *   
  * @author (Nadia Hasna)   
  * @version (10/8/2018)   
  */   
  public class Bid   
  {   
   //'Person' membuat tawaran   
   private final Person penawar; //penawar = si penawar tertinggi   
   //Jumlah tawaran   
   private final long jumlah; //jumlah = jumlah tawaran   
   //Tawaran dibuat   
   public Bid(Person penawar, long jumlah)   
   {   
    this.penawar = penawar;   
    this.jumlah = jumlah;   
   }   
   //Nilai kembali dari 'penawar'   
   public Person getPenawar()   
   {   
    return penawar;   
   }   
   //Nilai kembali dari 'jumlah'   
   public long getJumlah()   
   {   
    return jumlah;   
   }   
  }    

4. Person

 /**   
  * Kelas yang menunjukkan partisipasi orang dalam pelelangan.   
  *   
  * @author (Nadia Hasna)   
  * @version (10/8/2018)   
  */   
  public class Person   
  {   
   //Nama orang   
   private final String nama;   
   //Buat nama baru   
   public Person(String nama)   
   { //Nama org baru yg ikut serta pelelangan   
    this.nama = nama;    
   }   
   //Nilai kembali dari 'nama'   
   public String getNama()   
   {   
    return nama;   
   }   
  }