Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО2
Испит
28. 6. 2008.

Аутори: Игор Тартаља и Ласло Краус

Задаци: 1 2 3 4 5 6 | Напоменe | Решења: 2 4 6

I део (први колоквијум)

Поставка задатка 1 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња везана за језик Java:

а) О чему треба водити рачуна приликом именовања пакета и каква је практична препорука за именовање пакета?

б) Да ли се из једног конструктора класе може позвати и други конструктор те класе this() и конструктор наткласе super() и зашто?

Поставка задатка 2 (укупно 70 поена) ( решење | почетак)

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


II део (други колоквијум)

Поставка задатка 3 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња везана за језик Java:

а) Навести разлоге за дефинисање новог корисничког типа изузетака.

б) Ако постојећа класа дефинише несинхронизоване методе, на које начине се она може безбедно користити у окружењу са више нити и који начин је робуснији?

Поставка задатка 4 (укупно 70 поена) ( решење | почетак)

Коришћењем типова из првог дела, написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):


III део (трећи колоквијум)

Поставка задатка 5 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња везана за језик C#:

а) Коју операцију обавља оператор as и шта се догађа ако је операција неуспешна? Навести пример.

б) Шта означава модификатор sealed примењен на класу? Са којим модификатором заједно се примењује модификатор sealed на методе и шта означава?

Поставка задатка 6 (укупно 70 поена) ( решење | почетак)

Коришћењем класа из првог и другог дела, написати на језику Java следећи пакет типова:


Напоменe ( почетак)


Решење задатка 2 ( поставка | почетак)

// Vektor.java

package vasiona;

public class Vektor {
  private double x, y;

  public Vektor ( double a, double b) { x = a; y = b; }

  public Vektor () {}

  public double x() { return x; }

  public double y() { return y; }

  public static Vektor zbir( Vektor v1, Vektor v2)
    { return new Vektor( v1.x+v2.x, v1.y+v2.y); }

  public String toSTring() { return "(" + x + "," + y + ")"; }
}

// Telo.java

package vasiona;

public abstract class Telo {
  private double m;

  public Telo( double masa) { m = masa; }

  public double masa() { return m; }

  public abstract char vrsta();

  public abstract Vektor polozaj();

  public abstract void prikazi();

  public abstract void zaustavi();

  public String toString() {
    return vrsta() + "/" + m + "/" + polozaj();
  }
}

// Zvezda.java

package vasiona;

public class Zvezda extends Telo {
  private Vektor polozaj;

  public Zvezda(double masa) {
    super( masa);
    polozaj = new Vektor( 0, 0);
  }

  public char vrsta() { return 'Z'; }

  public Vektor polozaj() { return polozaj; }

  public void prikazi() { System.out.println( this); }

  public void zaustavi() {}

  public Zvezda premesti( Vektor pol) {
    polozaj = pol;
    return this;
  }
}

// Sistem.java

package vasiona;

public class Sistem {
  private class Elem {
    Telo t;
    Elem sled;
    Elem( Telo telo) {
      t = telo;
      if (prvi == null) prvi = this; else posl.sled = this;
      posl = this;
    }
  }

  private Elem prvi, posl;

  public Sistem dodaj( Telo telo) { new Elem( telo); return this; }

  public double masa() {
    double m = 0;
    for (Elem tek=prvi; tek!=null; tek=tek.sled) m += tek.t.masa();
    return m;
  }

  public void prikazi() {
    for (Elem tek=prvi; tek!=null; tek=tek.sled) tek.t.prikazi();
  }

  public void zaustavi() {
    for (Elem tek=prvi; tek!=null; tek=tek.sled) tek.t.zaustavi();
  }
}

Решење задатка 4 ( поставка | почетак)

// Satelit.java

package vasiona;

public class Satelit extends Telo implements Runnable {
  protected Telo centar;
  protected double R, omega;
  private long t0;
  private double x, y;
  private Thread nit;

  public Satelit( double masa, Telo tt, double rr, double oo) {
    super( masa);
    centar = tt; R = rr; omega=oo;
    (nit = new Thread( this)).start();
  }

  public char vrsta() { return 'S'; }

  public synchronized Vektor polozaj() {
    return Vektor.zbir( centar.polozaj(), new Vektor(x,y));
  }

  public void prikazi() { System.out.println( this); }

  public void zaustavi() {
    if (nit != null) { nit.interrupt(); nit = null; }
  }

  public void run () {
    try {
      while (! Thread.interrupted()) {
        synchronized (this) {
          double fi = omega * (System.currentTimeMillis() - t0) / 1000.;
          x = R * Math.cos( fi);
          y = R * Math.sin( fi);
        }
        Thread.sleep( 5);
      }
    } catch (InterruptedException g) {}
  }
}

// GPuna.java

package vasiona;

public class GPuna extends Exception {
  public String toString() { return "*** Vasiona je puna!"; }
}

// GIndeks.java

package vasiona;

public class GIndeks extends Exception {
  public String toString() { return "*** Indeks izvan opsega!"; }
}

// Vasiona.java

package vasiona;

public class Vasiona {
  private Sistem[] niz;
  private int duz;

  public Vasiona ( int kap) { niz = new Sistem [kap]; }

  public Vasiona() { this( 10); }

  public Vasiona dodaj( Sistem sis) throws GPuna {
    if (duz == niz.length) throw new GPuna();
    niz[duz++] = sis;
    return this;
  }

  public int duz() { return duz; }

  public Sistem dohvati(int i) throws GIndeks{
    if (i<0 || i>=duz) throw new GIndeks();
    return niz[i];
  }

  private static class Radi extends Thread {
    Sistem sis;
    double masa;

    Radi( Sistem s) { sis = s; start(); }

    public void run() { masa = sis.masa(); }

    double masa() { return masa; }
  }

  public double masa() {
    Radi[] rad = new Radi [duz];
    for (int i=0; i<duz; i++) rad[i++] = new Radi( niz[i]);
    double m = 0;
    for (Radi r: rad) {
      try { r.join(); } catch (InterruptedException g) {}
      m += r.masa();
    }
    return m;
  }
}

Решење задатка 6 ( поставка | почетак)

// GraZvezda.java

package vasiona;
import java.awt.*;

public class GraZvezda extends Zvezda {
  private Canvas platno;
  private Color boja;
  private int r;

  public GraZvezda( double masa, Canvas pp, int rr, Color bb)
    { super( masa); r = rr; boja = bb; platno = pp; }

  public void prikazi() {
    Graphics g = platno.getGraphics();
    int vis = platno.getHeight();
    g.setColor( boja);
    Vektor v = polozaj();
    int x = (int)v.x();
    int y = vis - (int)v.y();
    g.fillOval( x-r, y-r, 2*r, 2*r);
  }
}

// GraSatelit.java

package vasiona;
import java.awt.*;

public class GraSatelit extends Satelit {
  private Canvas platno;
  private Color boja1, boja2;
  private int r;

  public GraSatelit( double masa, Telo centar, double R, double omega,
                     Canvas pp, int rr, Color bb1, Color bb2) {
    super( masa, centar, R, omega);
    platno = pp; r = rr;
    boja1 = bb1; boja2 = bb2;
  }

  public void prikazi() {
    Graphics g = platno.getGraphics();
    int vis = platno.getHeight();
    Vektor v = centar.polozaj();
    g.setColor( boja2);
    int x = (int)v.x();
    int y = vis - (int)v.y();
    int ro = (int)R;
    g.drawOval( x-ro, y-ro, 2*ro, 2*ro);
    v = polozaj();
    g.setColor( boja1);
    x = (int)v.x();
    y = vis - (int)v.y();
    g.fillOval( x-r, y-r, 2*r, 2*r);
  }
}

// Program.java

package vasiona;
import java.awt.*;
import java.awt.event.*;

public class Program extends Frame implements Runnable {
  private Sistem sistem = new Sistem();
  private Canvas platno;
  private Zvezda zvezda;
  private Thread nit;

  private void sastavi() throws GPuna {
    zvezda = new GraZvezda( 100, platno, 10, Color.RED);
    sistem.dodaj ( zvezda);
    Satelit sat1 = new GraSatelit( 30, zvezda, 90, 1, platno, 6,
      Color.BLUE, Color.GREEN);
    sistem.dodaj ( sat1);
    Satelit sat2 = new GraSatelit( 8, sat1, 20, 5, platno, 4,
                                   Color.GRAY, Color.GREEN);
    sistem.dodaj ( sat2);
  }

  private void popuniProzor() {
    platno = new Canvas() {
      public void paint( Graphics g) { sistem.prikazi(); }
    };
    add( platno);
    platno.addComponentListener( new ComponentAdapter () {
      public void componentResized( ComponentEvent d) {
        zvezda.premesti(
          new Vektor (platno.getWidth()/2, platno.getHeight()/2)
        );
      }
    });
    (nit = new Thread( this)).start();
  }

  public void run () {
    try {
      while (! Thread.interrupted()) {
        platno.repaint();
        Thread.sleep(20);
      }
    } catch (InterruptedException g) {}
    nit = null;
  }

  private Program() {
    super( "Vasiona");
    setSize( 250, 200);
    popuniProzor();
    try { sastavi(); } catch( GPuna g) {}
    setVisible( true);
    addWindowListener( new WindowAdapter () {
      public void windowClosing( WindowEvent d) {
        nit.interrupt(); sistem.zaustavi(); dispose();
      }
    });
  }

  public static void main( String[] varg) { new Program(); }
}
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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