Visa elektrotehnicka skola, Beograd
Ласло Краус
Програмирање на језику Java - испити
Практични испит
27. 4. 2006.

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

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

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

Саставити на језику Java програм с графичком корисничком површи који према слици приказује рад графичке мерне области од 5×8 графичких мерних тачака с почетним температурама од 20 °C.


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


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

// MernaTacka.java

package merenje;

public class MernaTacka extends Thread {
  protected double T, suma_Tdt;
  protected long t, suma_dt;

  public MernaTacka (double T0) { T=T0; start(); }

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

  public void run () {
    ispocetka ();
    try {
      while (! interrupted ()) {
        sleep (100 + (int)(Math.random()*100));
        long sad = System.currentTimeMillis ();
        long dt = sad - t;
        suma_Tdt += T*dt; suma_dt += dt; t = sad;
        T += Math.random () * 2 - 1;
      }
    } catch (InterruptedException g) {}
  }

  public double temp () { return T; }

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

  public void zavrsi () { interrupt (); }

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

// GrafickaMernaTacka.java

package merenje;
import java.awt.*;

public class GrafickaMernaTacka extends MernaTacka {
  private Button dugme;
  private boolean birajSrTemp = false;

  public GrafickaMernaTacka (double T0, Button dgm) { super (T0); dugme = dgm; }

  public void postaviDugme (Button dgm) { dugme = dgm; }

  public void birajSrTemp (boolean b) { birajSrTemp = b; }

  public Button dohvatiDugme () { return dugme; }

  public void ispocetka () { super.ispocetka (); prikazi (); }

  public void prikazi () {
    if (dugme != null) {
      double TT = birajSrTemp ? srTemp() : T;
      dugme.setLabel (String.format("%.1f",TT));
      float boja = (float)(0.7*(50-TT)/80);
      dugme.setBackground (new Color(Color.HSBtoRGB(boja,1,1)));
    }
  }
}

// GMerenje.java

package merenje;

public class GMerenje extends Exception {
  String por;

  public GMerenje (String p) { por = p; }

  public String toString () { return por; }
}

// Gindeks.java

package merenje;

public class GIndeks extends GMerenje {
  public GIndeks (int v, int k) {
    super ("Neisparvni indeksi [" + v + "][" + k + "]!");
  }
}

// Gprazno.java

package merenje;

public class GPrazno extends GMerenje {
  public GPrazno (int v, int k) {
    super ("Polje [" + v + "][" + k + "] je parno!");
  }
}

// GNema.java

package merenje;

public class GNema extends GMerenje {
  public GNema () {
    super ("Ne postoji neijedna merna tacka!");
  }
}

// Karta.java

package merenje;
import java.awt.*;

public class MernaOblast {
  protected MernaTacka[][] obl;

  public MernaOblast (int vrs, int kol) { obl = new MernaTacka[vrs][kol]; }

  void postavi (int v, int k, MernaTacka mt) throws GIndeks {
    if (v<0 || v>=obl.length || k<0 || k>=obl[0].length) throw new GIndeks (v, k);
    obl[v][k] = mt;
  }

  double temp (int v, int k) throws GIndeks, GPrazno {
    if (v<0 || v>=obl.length || k<0 || k>=obl[0].length) throw new GIndeks (v, k);
    if (obl[v][k] == null)                               throw new GPrazno (v, k);
    return obl[v][k].temp ();
  }

  double srTemp (int v, int k) throws GIndeks, GPrazno {
    if (v<0 || v>=obl.length || k<0 || k>=obl[0].length) throw new GIndeks (v, k);
    if (obl[v][k] == null)                               throw new GPrazno (v, k);
    return obl[v][k].srTemp ();
  }

  double srTemp () throws GNema {
    double s = 0; int n = 0;
    for (int v=0; v<obl.length; v++)
      for (int k=0; k<obl[0].length; k++)
        if (obl[v][k] != null) { s += obl[v][k].temp (); n++; }
    if (n == 0) throw new GNema ();
    return s / n;
  }

  public void ispocetka () {
    for (int v=0; v<obl.length; v++)
      for (int k=0; k<obl[0].length; k++)
        if (obl[v][k] != null) obl[v][k].ispocetka ();
  }

  public void zavrsi () {
    for (int v=0; v<obl.length; v++)
      for (int k=0; k<obl[0].length; k++)
        if (obl[v][k] != null) obl[v][k].zavrsi ();
  }
}

// GrafickaMernaOblast.java

package merenje;
import java.awt.*;

public class GrafickaMernaOblast extends MernaOblast implements Runnable {
  private boolean radi = false;
  private Thread nit = null;
  private Panel ploca;
  private Label oznSrTemp = new Label (null, Label.CENTER);
  private int kol;

  public GrafickaMernaOblast (int vrs, int kol, Panel plo) {
    super (vrs, kol); ploca = plo; this.kol = kol;
    plo.setLayout (new BorderLayout ());
    plo.add (oznSrTemp, "North");
    oznSrTemp.setBackground (new Color (240, 240,  240));
    ploca = new Panel (new GridLayout (vrs, kol));
    for (int i=0; i<vrs*kol; i++) ploca.add (new Button());
    plo.add (ploca, "Center");
  }

  public void postavi (int v, int k,
    GrafickaMernaTacka gmt) throws GIndeks {
    super.postavi (v, k, gmt);
    gmt.postaviDugme ((Button)ploca.getComponents()[v*kol+k]);
  }

  public void birajSrTemp (boolean da) {
    for (int v=0; v<obl.length; v++)
      for (int k=0; k<obl[0].length; k++)
        if (obl[v][k] != null)
          ((GrafickaMernaTacka)obl[v][k]).birajSrTemp (da);
  }

  public void run () {
    try {
      while (! nit.interrupted ()) {
        if (! radi) synchronized(this) { wait(); }
        for (int v=0; v<obl.length; v++)
          for (int k=0; k<obl[0].length; k++)
            if (obl[v][k] != null)
              ((GrafickaMernaTacka)obl[v][k]).prikazi ();
        try {
          oznSrTemp.setText (String.format ("Tsr=%.1f", srTemp ()));
        } catch (GNema g) {}
        nit.sleep (100);
      }
    } catch (InterruptedException g) {}
    nit = null;
  }

  public synchronized void kreni () {
    if (nit == null) (nit = new Thread (this)).start ();
    radi = true; notify ();
  }

  public void stani () { radi = false; }

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

}

// Merenje.java

import merenje.*;
import java.awt.*;
import java.awt.event.*;

public class Merenje extends Frame {
  private int vrs = 5, kol = 8;
  private GrafickaMernaOblast gmo;

  private Merenje () {
    super ("Merenje"); setSize (300, 200);
    addWindowListener (new WindowAdapter () {
      public void windowClosing (WindowEvent d) {
        gmo.zavrsi(); dispose ();
      }
    });

    Panel plo = new Panel (); add (plo, "South");
    final Checkbox pot = new Checkbox ("Tsr");
    plo.add (pot);
    pot.addItemListener (new ItemListener () {
      public void itemStateChanged (ItemEvent d) {
        gmo.birajSrTemp (pot.getState ());
      }
    });

    Button dgm=new Button("Kreni"); plo.add(dgm);
    dgm.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent d)
        { gmo.kreni (); }
    });

    plo.add (dgm = new Button("Stani"));
    dgm.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent d)
        { gmo.stani (); }
    });

    plo.add (dgm = new Button("Ispocetka"));
    dgm.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent d)
        { gmo.ispocetka (); }
    });

    add (plo=new Panel(), "Center");
    gmo = new GrafickaMernaOblast (vrs, kol, plo);
    try {
      for (int v=0; v<vrs; v++)
        for (int k=0; k<kol; k++)
          gmo.postavi (v, k, new GrafickaMernaTacka(20, null));
    } catch (GIndeks g) {}
  }

  public static void main (String[] varg) {
    new Merenje ().setVisible (true);
  }
}
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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