Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО2
Испит
7. 10. 2005.

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

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

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

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

Реализовати на језику Java програм који направи једну збирку од неколико мерних тачака и потом је приказује у једном прозору.

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

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

а) Која је основна разлика између начина креирања објеката на језицима C++ и Java?

б) Да ли интерфејс може имати конструктор и зашто?

в) Зашто је понекад за реализацију програмских нити погоднија имплементација интерфејса Runable од извођења из класе Thread?

г) Шта је компонента (објекат класе Component) на језику Java?

д) Упоредити JVM и .NET по појмовима платформске независности.

Поставка задатка 3 (25 поена – допуна уместо лабораторијских вежби) ( почетак)

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


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


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

// Tacka.java
package merenje;
public class Tacka {
  private double x, y, z;

  public Tacka () {}

  public Tacka (double xx, double yy, double zz) { x = xx; y = yy; z = zz; }

  public double rast (Tacka t) {
    return Math.sqrt (Math.pow(x-t.x,2) + Math.pow(y-t.y,2) + Math.pow(z-t.z,2));
  }

  public Tacka premesti (double xx, double yy, double zz) { x=xx; y=yy; z=zz; return this; }

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

// MernaTacka.java
package merenje;
import java.text.*;
public class MernaTacka extends Tacka implements Runnable {
  private boolean kraj;
  private double T, suma_Tdt;
  private long t, suma_dt;
  private Thread nit;

  public MernaTacka (double x, double y, double z, double T0) {
    super (x, y, z); T = T0;
    (nit = new Thread (this)).start ();
  }

  public void run () {
  	 ispocetka ();
    while (! kraj) {
      try { Thread.sleep (3000 + (int)(Math.random()*5000)); }
        catch (InterruptedException g) {}
      long sad = System.currentTimeMillis ();
      long dt = sad - t;
      suma_Tdt += T * dt; suma_dt += dt; t = sad;
      T += Math.random() - 0.5;
    }
  }

  public double temp () { return T; }

  public synchronized double srTemp () {
    long dt = System.currentTimeMillis () - t;
    return (suma_Tdt + T * dt) / (suma_dt + dt);
  }

  public synchronized void ispocetka () {
    t = System.currentTimeMillis();
    suma_Tdt = suma_dt = 0;
  }

  public void zavrsi () { kraj=true; nit.interrupt(); }

  public String toString ()
    {return super.toString()+"\t"+T+"\t"+srTemp();}
}

// GZbirkaPuna.java
package merenje;
public class GZbirkaPuna extends Exception {}

// GNemaTacaka.java
package merenje;
public class GNemaTacaka extends Exception {}

// Zbirka.java
package merenje;
public class Zbirka {
  private MernaTacka[] niz;
  private int n;

  public Zbirka (int kap) { niz = new MernaTacka [kap]; }

  public Zbirka dodaj(MernaTacka m)throws GZbirkaPuna{
    if (n == niz.length) throw new GZbirkaPuna ();
    niz[n++] = m; return this;
  }

  public void ispocetka () { for (int i=0; i<n; niz[i++].ispocetka()); }

  public void zavrsi () { for (int i=0; i<n; niz[i++].zavrsi()); }

  public double srTemp (Tacka C, double r)
    throws GNemaTacaka {
    double sr = 0; int k = 0;
    for (int i=0; i<n; i++)
      if (niz[i].rast(C) <= r) { sr += niz[i].srTemp(); k++; }
    if (k == 0) throw new GNemaTacaka ();
    return sr / k;
  }

  public String toString (Tacka C, double r) {
    StringBuffer s = new StringBuffer ();
    for (int i=0; i<n; i++)
      if (niz[i].rast(C) <= r) s.append (niz[i]).append ('\n');
    return s.toString ();
  }
}

// Prozor.java
package merenje;
import java.awt.*;
import java.awt.event.*;
public class Prozor extends Frame implements Runnable {
  private Zbirka zbr; private boolean kraj;
  long t0; private Thread nit;
  private TextField tksX = new TextField ("0", 4),
                    tksY = new TextField ("0", 4),
                    tksZ = new TextField ("0", 4),
                    tksR = new TextField ("9", 4);
  private Label oznVreme   = new Label ("?"),
                oznSrTemp  = new Label ("?");
  private TextArea tksTacke = new TextArea ();

  public Prozor (Zbirka z) {
    super ("Merenje"); zbr = z;
    setBounds (100, 100, 500, 200);
    addWindowListener (new WindowAdapter () {
      public void windowClosing (WindowEvent d)
        { kraj = true; nit.interrupt (); dispose (); }
    });
    Panel plo = new Panel ();
    plo.add (new Label("C:",Label.RIGHT));
    plo.add (tksX); plo.add (tksY); plo.add (tksZ);
    plo.add (new Label ("     r:", Label.RIGHT));
    plo.add (tksR); add (plo, "South");
    plo = new Panel ();
    plo.add (new Label ("t:", Label.RIGHT)); plo.add (oznVreme);
    plo.add (new Label ("     Tsr:", Label.RIGHT)); plo.add (oznSrTemp);
    add (plo, "North"); add (tksTacke, "Center");
    Button dgmIspocetka = new Button ("Ispocetka");
    dgmIspocetka.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent d) {
        zbr.ispocetka ();
        t0 = System.currentTimeMillis ();
      }
    });
    add (dgmIspocetka, "West");
    ( nit = new Thread (this)).start ();
  }

  public void run () {
    t0 = System.currentTimeMillis ();
    Tacka C = new Tacka ();
    while (! kraj) {
      try { Thread.sleep (1000); } catch (InterruptedException g) {}
      C.premesti (Double.parseDouble(tksX.getText()),
                  Double.parseDouble(tksY.getText()),
                  Double.parseDouble(tksZ.getText()));
      double r = Double.parseDouble (tksR.getText());
      tksTacke.setText (zbr.toString(C, r));
      oznVreme.setText (Long.toString ((System.currentTimeMillis() - t0)/1000));
      try { oznSrTemp.setText (Double.toString (zbr.srTemp (C, r)));
      } catch (GNemaTacaka g) {
        oznSrTemp.setText  ("???");
      }
      validate ();
    }
    zbr.zavrsi ();
  }
}

// MerenjeT
import merenje.*;
public class MerenjeT {
  public static void main (String[] varg) {
    Zbirka zbr = new Zbirka (10);
    double[] x  = { 1,  3, -2,  0,  3,  2, -4, -1},
             y  = { 0, -2,  2,  0, -1,  2,  1,  1},
             z  = { 2,  1, -3,  4, -1,  3, -1,  0},
             T0 = {20, 15, 22,  0, 10,  8, 12,  7};
    try {
      for (int i= 0; i<x.length; i++)
        zbr.dodaj (new MernaTacka (x[i], y[i], z[i], T0[i]));
    } catch (GZbirkaPuna g) {}
    new Prozor (zbr).setVisible (true);
  }
}
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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