VISER, Beograd
Ласло Краус
Објекнто програмирање 2 - колоквијуми
Први колоквијум
28. 11. 2009

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

Написати на језику Java следећи пакет типова:

Написати на језику Java програм који направи једну кутију и једну таблу, напуни кутију за фиксно одабрани параметар n (не треба га учитавати с главног улаза), испише кутију на главном излазу, узима домине из кутије и ставља их на таблу све док може и испише на главном излазу завршни садржај табле, узету домину која није могла да се стави на таблу и завршни садржај кутије.


Напомене (садржај)


Решење задатка (поставка | садржај)

// Domina.java

package igra;

public class Domina {
  private int a, b;

  public Domina( int p, int q) { a = p; b = q; }

  public int a () { return a; }

  public int b () { return b; }

  public boolean ista( Domina d) { return a==d.a && b==d.b || b==d.a && a==d.b; }

  public Domina okreni() { int c = a; a = b; b = c; return this; }

  public String toString() { return "(" + a + "," + b + ")"; }
}

// GNeMoze.java

package igra;

public class GNeMoze extends Exception {
  public String toString() { return "*** Ne moze da se doda!"; }
}

// Skup.java

package igra;

public abstract class Skup {

  protected  Elem prvi, posl;

  protected static class Elem {
    Domina dom;
    Elem sled;
    Elem (Domina d, Elem s) { dom = d; sled = s; }
  }

  public abstract Skup dodaj (Domina d) throws GNeMoze;

  public boolean ima( Domina d) {
    for (Elem tek=prvi; tek!=null; tek=tek.sled)
      if (d.ista (tek.dom)) return true;
    return false;
  }

  public String toString() {
    String s = "";
    for (Elem tek=prvi; tek!=null; tek=tek.sled) s += tek.dom;
    return s;
  }
}

// Kutija.java

package igra;

public class Kutija extends Skup {

  public Kutija dodaj( Domina d) throws GNeMoze {
    if (ima (d)) throw new GNeMoze();
    Elem novi = new Elem( d, null);
    if (prvi == null) prvi = novi; else posl.sled = novi;
    posl = novi;
    return this;
  }

  public Kutija napuni( int n) {
    prvi = posl = null;
    int m = n * (n+1) / 2;
    for (int i=0; i<m;)
      try {
        dodaj( new Domina((int)(Math.random()*n), (int)(Math.random()*n)));
        i++;
      } catch (GNeMoze g) {}
    return this;
  }

  public Domina uzmi() throws GNeMoze {
    if (prvi == null) throw new GNeMoze();;
    Domina d = prvi.dom;
    if ((prvi = prvi.sled) == null) posl = null;
    return d;
  }
}

// Tabla.java

package igra;

public class Tabla extends Skup {

  public Tabla dodaj( Domina d) throws GNeMoze {
    if (ima (d)) throw new GNeMoze();
    if      (prvi==null || d.b()==prvi.dom.a()) naPocetak (d);
    else if (d.a() == posl.dom.b()) naKraj (d);
    else {
      d.okreni ();
      if      (d.b() == prvi.dom.a()) naPocetak (d);
      else if (d.a() == posl.dom.b()) naKraj (d);
      else throw new GNeMoze();
    }
    return this;
  }

  private void naPocetak (Domina d) {
    prvi = new Elem (d, prvi);
    if (posl == null) posl = prvi;
  }

  private void naKraj (Domina d) {
    Elem novi = new Elem (d, null);
    if (prvi == null) prvi = novi; else posl.sled = novi;
    posl = novi;
  }
}

// Test.java

import igra.*;

public class Test {
  public static void main (String[] varg) {
    int n = 4;
    Kutija k = new Kutija ();
    k.napuni (n);
    System.out.println ("Kutija: " + k);
    Tabla t = new Tabla ();
    Domina d = null;
    try {
      while (true) t.dodaj( d=k.uzmi());
    } catch (GNeMoze g) {}
    System.out.println ("Tabla:  " + t);
    System.out.println ("Domina: " + d);
    System.out.println ("Kutija: " + k);
  }
}

Kutija: (2,3)(2,1)(0,3)(2,0)(1,1)(1,3)(3,3)(1,0)(2,2)(0,0) Tabla: (3,3)(3,1)(1,1)(1,2)(2,3)(3,0)(0,2) Domina: (0,1) Kutija: (2,2)(0,0)
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 8.9.2010.