Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО2
Други колоквијум
8. 7. 2005.

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

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

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

У пакету statistika постоје класе за рад са случајним бројевима које су приказане на слици. Ове класе није потребно реализовати.

(55 поена) Реализовати на језику Java програм са графичком корисничком површи, према приложеној слици, којим може да се одређује одабрани статистички показатељ задатог броја случајних бројева генерисаних по одабраној расподели са задатим параметрима. Поруке о грешкама приказивати у ознаци за приказ резултата.

(15 поена) Обраду у претходном програму остварити унутар засебне нити. Дугме Radi треба да је онемогућено за време рада нити.

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

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

а) Која је функција методе start() активног објекта и да ли се из програма позива методa run()?

б) Како извор догађаја у језику Javа зна које ослушкиваче треба да позове да обраде догађај?

в) Која је принципијелна разлика између типова int у језицима Javа и C#?


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


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

///////////////// Не припада решењу колоквијума ///////////////////////
                                                                    ///
// GParam.java                                                      ///
package statistika;                                                 ///
public class GParam extends Exception {                             ///
  public String toString () { return "Neispravan parametar!"; }     ///
}                                                                   ///
                                                                    ///
// Slucajni.java                                                    ///
package statistika;                                                 ///
public interface Slucajni {                                         ///
  double slBroj ();                                                 ///
  String toString ();                                               ///
}                                                                   ///
                                                                    ///
// Unif.java                                                        ///
package statistika;                                                 ///
public class Unif implements Slucajni {                             ///
  private double min, max;                                          ///
  public Unif (double mi, double ma) throws GParam {                ///
    if (mi > ma) throw new GParam ();                               ///
    min = mi; max = ma;                                             ///
  }                                                                 ///
  public double slBroj ()                                           ///
    { return min + Math.random () * (max - min); }                  ///
  public String toString () { return "Uniformna"; }                 ///
}                                                                   ///
                                                                    ///
// Eksp.java                                                        ///
package statistika;                                                 ///
public class Eksp implements Slucajni {                             ///
  private double sr;                                                ///
  public Eksp (double s) throws GParam {                            ///
    if (s <= 0) throw new GParam ();                                ///
    sr = s;                                                         ///
  }                                                                 ///
  public double slBroj ()                                           ///
    { return - sr * Math.log (1 - Math.random ()); }                ///
  public String toString(){ return "Eksponencijalna"; }             ///
}                                                                   ///
                                                                    ///
// Gaus.java                                                        ///
package statistika;                                                 ///
public class Gaus implements Slucajni {                             ///
  private double sr, dev;                                           ///
  public Gaus (double s, double d) throws GParam {                  ///
    if (d <= 0) throw new GParam ();                                ///
    sr = s; dev = d;                                                ///
  }                                                                 ///
  public double slBroj () {                                         ///
    double z = 0;                                                   ///
    for (int i=0; i<12; i++) z+=Math.random();                      ///
    return sr + dev * (z - 6);                                      ///
  }                                                                 ///
  public String toString () { return "Gausova"; }                   ///
}                                                                   ///
                                                                    ///
// Analizator.java                                                  ///
package statistika;                                                 ///
public interface Analizator {                                       ///
  void dodaj (double slBr);                                         ///
  double vrednost ();                                               ///
  String toString ();                                               ///
}                                                                   ///
                                                                    ///
// Min.java                                                         ///
package statistika;                                                 ///
public class Min implements Analizator {                            ///
  double min; boolean prvi = true;                                  ///
  public void dodaj (double slBr) {                                 ///
    if (prvi) { min = slBr; prvi = false; }                         ///
    else if (slBr < min) min = slBr;                                ///
  }                                                                 ///
  public double vrednost () { return min; }                         ///
  public String toString () { return "Minimum"; }                   ///
}                                                                   ///
                                                                    ///
// SrVr.java                                                        ///
package statistika;                                                 ///
public class SrVr implements Analizator {                           ///
  double zbir; int n;                                               ///
  public void dodaj (double slBr) { zbir += slBr; n++; }            ///
  public double vrednost () { return n>0 ? zbir/n : 0; }            ///
  public String toString () { return "Srednja vrednost"; }          ///
}                                                                   ///
                                                                    ///
///////////////// Не припада решењу колоквијума ///////////////////////

// Statistika.java
import statistika.*;
import java.awt.*;
import java.awt.event.*;

public class Statistika extends Frame {
  private Label rez = new Label ("???", Label.CENTER);
  private List rasp = new List (),
               analiz = new List ();
  private TextField brUzor = new TextField ("1000"),
                    par1 = new TextField ("-5"),
                    par2 = new TextField ("5");
  private Button radi = new Button ("Radi");

  private Statistika () {
    super ("Statistika");
    setBounds (100, 100, 320, 150);
    setResizable (false);
    addWindowListener (new WindowAdapter () {
      public void windowClosing (WindowEvent d) { dispose (); }
    });

    add (rez, "North");

    try {
      rasp.add (new Unif(0,1).toString());
      rasp.add (new Eksp(1).toString());
      rasp.add (new Gaus(0,1).toString());
    } catch (GParam g) {}
    rasp.select (0);
    rasp.addItemListener (new ItemListener () {
      public void itemStateChanged (ItemEvent d) {
        par2.setEnabled (rasp.getSelectedIndex() != 1);
      }
    });
    add (rasp, "West");

    analiz.add (new Min().toString());
    analiz.add (new SrVr().toString());
    analiz.select (1);
    add (analiz, "East");

    Panel plo = new Panel (new GridLayout (3,1,4,4));
    add (plo, "Center");
    plo.add (brUzor); plo.add (par1); plo.add (par2);

    radi.addActionListener (new RadiAkcija ());
    add (plo = new Panel(), "South"); plo.add (radi);
  } // konstruktor

  private void prikazi (double vr) {
    rez.setText (Double.toString(vr));
    radi.setEnabled (true);
  }

  private class RadiAkcija implements ActionListener {
    public void actionPerformed (ActionEvent d) {
      try {
        Slucajni gen = null;
        switch (rasp.getSelectedIndex()) {
          case 0: gen = new Unif (Double.parseDouble (par1.getText()),
                                  Double.parseDouble (par2.getText()));
                  break;
          case 1: gen = new Eksp (Double.parseDouble (par1.getText()));
                  break;
          case 2: gen = new Gaus (Double.parseDouble (par1.getText()),
                                  Double.parseDouble (par2.getText()));
                  break;
        }
        Analizator anl = null;
        switch (analiz.getSelectedIndex()) {
          case 0: anl = new Min  (); break;
          case 1: anl = new SrVr (); break;
        }
        int n = Integer.parseInt (brUzor.getText());
        if (n <= 0) throw new GParam ();
        radi.setEnabled (false);
        new Radnik (gen, anl, n).start ();
      } catch (GParam g) {
        rez.setText (g.toString());
      } catch (NumberFormatException g) {
        rez.setText ("Neispravan broj!");
      }
    }
  } // class RadiAkcija

  private class Radnik extends Thread {
    private Slucajni sluc;
    private Analizator analiz;
    private int n;
    public Radnik (Slucajni s, Analizator a, int k) {
      sluc = s; analiz = a; n = k;
    }
    public void run () {
      for (int i=0; i<n; i++)
        analiz.dodaj (sluc.slBroj());
      prikazi (analiz.vrednost ());
    }
  } // class Radnik

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

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