VISER, Beograd
Ласло Краус
Објектно програмирање 2 - колоквијуми
Други колоквијум
19. 1. 2014

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

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

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


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


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

// Gener.java

package slucajni;

public interface Gener {
  double slBroj();
}

// Unif.java

package slucajni;

public class Unif implements Gener {
  private double min, max;

  public Unif(double mn, double mx) { min = mn; max = mx; }

  public Unif() { this(0, 1); }

  public double slBroj() { return min + (max-min) * Math.random(); }
}

// Eksp.java

package slucajni;

public class Eksp implements Gener {
  private double sr;

  public Eksp(double s) { sr = s; }

  public Eksp() { this(1); }

  public double slBroj() { return -sr * Math.log(1 - Math.random()); }
}

// Gaus.java

package slucajni;

public class Gaus implements Gener {
  private double sr, dev;

  public Gaus(double s, double d) { sr = s; dev = d; }

  public Gaus() { this(0, 1); }

  public double slBroj() {
    double s = 0;
    for (int i=0; i<12; i++) s += Math.random();
    return (s - 6) * dev + sr;
  }
}

// Raspodela.java

package slucajni;
import java.awt.*;

public class Raspodela extends Canvas implements Runnable{
  private volatile int n = 50;
  private double min = 0, max = 1, dx=(max-min)/n;
  private double[] niz = new double [n];
  private Gener gen = new Unif();
  Thread nit = new Thread(this);
  private boolean radi = false;

  public Raspodela() { nit.start(); }
  
  public void postavi(Gener g, double mn, double mx, int nn) {
    gen = g;
    dx = ((max=mx) - (min=mn)) / (n = nn); 
    niz = new double [n];
  }

  public void run() {
    try {
      while (!Thread.interrupted()) {
        synchronized (this) { while (!radi) wait(); }
        int i = (int)((gen.slBroj()-min)/dx);
        if (i>=0 && i<n) niz[i]++;
        repaint();
        Thread.sleep(5);
      }
    } catch (InterruptedException g) {}
  }

  public synchronized void kreni() {
    radi = true; notifyAll();
    for (int i=0; i<n; niz[i++]=0);
  }

  public synchronized void stani() { radi = false; }

  public void zavrsi() { nit.interrupt(); }

  public void paint(Graphics g) {
    int sir = getWidth(), vis = getHeight();
    double dx = (double)sir / n;
    int idx = (int)dx;
    double ymax = 0;
    for (double y: niz) { if (y > ymax) ymax = y; }
    for (int i=0; i<n; i++) {
      int idy = (int)(vis * niz[i] / ymax);
      g.fillRect((int)(i*dx), vis-1-idy, idx, idy);
    }
  }
}

// Program.java

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

public class Program extends Frame {
  private Raspodela rasp = new Raspodela();
  private Checkbox rdgU, rdgE, rdgG;
  private TextField tksA   = new TextField("0", 3),
                    tksB   = new TextField("1", 3),
                    tksMin = new TextField("0", 3),
                    tksMax = new TextField("1", 3),
                    tksN   = new TextField("50", 3);
  private Button dgmKreni  = new Button("Kreni"),
                 dgmStani  = new Button("Stani");
  private void popuniProzor() {
    add(rasp, "Center");
    Panel plo = new Panel(new GridLayout(0, 1));
    plo.setBackground(Color.LIGHT_GRAY);
    add(plo, "West");
    CheckboxGroup grupa = new CheckboxGroup();
    rdgU = new Checkbox("Unif", grupa, true);
    rdgE = new Checkbox("Eksp", grupa, false);
    rdgG = new Checkbox("Gaus", grupa, false);
    plo.add(rdgU); plo.add(rdgE); plo.add(rdgG);
    plo.add(new Label("min/sr:"));  plo.add(tksA);
    plo.add(new Label("max/dev:")); plo.add(tksB);
    add(plo = new Panel(), "South");
    plo.setBackground(Color.LIGHT_GRAY);
    plo.add(new Label("x:", Label.RIGHT));
    plo.add(tksMin); plo.add(tksMax);
    plo.add(new Label("n:", Label.RIGHT));
    plo.add(tksN);
    plo.add(dgmKreni); plo.add(dgmStani);
    dgmKreni.addActionListener(new kreniAkcija());
    dgmStani.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent d) { rasp.stani(); }
    });
  }

  private class kreniAkcija implements ActionListener {
    public void actionPerformed(ActionEvent d) {
      double a = Double.parseDouble(tksA.getText()),
             b = Double.parseDouble(tksB.getText());
      Gener gen = null;
      if (rdgU.getState()) gen = new Unif(a, b);
      if (rdgE.getState()) gen = new Eksp(a);
      if (rdgG.getState()) gen = new Gaus(a, b);
      rasp.postavi(gen,
          Double.parseDouble(tksMin.getText()),
          Double.parseDouble(tksMax.getText()),
          Integer.parseInt(tksN.getText()));
      rasp.kreni();
    }
  }

  private Program() {
    super("Raspodele"); setSize(350, 200);
    popuniProzor(); setVisible(true);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent d)
        { rasp.zavrsi(); dispose(); }
    });
  }

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

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