![]() Ласло Краус |
Објектно програмирање 2 - колоквијуми Други колоквијум 19. 1. 2014 |
|---|
Написати на језику Java следећи пакет типовa:
Math.random(), min – најмања вредност, max – највећа вредност, sr – средња вредност, а dev – стандардна девијација генерисаних бројева.
Canvas. Сваких 5 ms генерише по један псеудослучајан број по некој расподели (подразумевано униформној), броји колико бројева припада појединим од задатог броја (подразумевано n=50) подинтервала унутар опсега између задате најмање (подразумевано xmin=0) и највеће (подразумевано xmax) вредности. Сви параметри расподеле (генератор, n, xmin и xmax) могу да се промене одједном и промене имају тренутно дејство. После сваког изгенерисаног броја исцртава хистограм расподеле (низ попуњених правоугаоника који по ширини попуњавају сав расположив простор а чије висине су пропорционалне броју узорака у поједним подинтервалима; висина највишег правоугаоника увек се поклапа са висином приказне површи). Целобројне координате (a,b) у пикселима за задате реалне координате (x,y) израчунавају се формулама a=(sir−1)(x−xmin)/(xmax−xmin) и b=(vis−1)(ymax−y)/(ymax−ymin), где су sir и vis – ширина и висина компоненте у целобројним пикселима. Нит расподеле може да се покрене, заустви и да се прекине.

ispitx (x је број радне станице за којим се ради). Лозинка на свакој радној станици је student.I:
// 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(); }
}
(садржај)
Copyright © 2014, Laslo Kraus
Последња ревизија: 19.1.2014.