Ласло Краус |
СИ2ОО2 Други колоквијум 19. 4. 2011. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Ако интерфејс садржи податке (поља), који модификатори су подразумевани и зашто?
б) Како се прослеђују параметри конструктору наткласе дате анонимне класе?
в) Да ли позивалац метода start()
чека да метод run()
објекта чија је метода start()
позвана заврши извршење, пре него што настави са сопственим извршењем? Образложити.
Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):
oC
.
mbar
.
Kreni
, Ocitaj
, Stani
и Zavrsi
. При очитавању на главном излазу се исписују текстуални описи оба мерача. За параметре мерача користити константне вредности (не треба ништа учитавати с главног улаза). На располагању стоји класа Citaj
у пакету usluge
која садржи метоте за читање стандардних типова података.
// Vel.java package merenje; public interface Vel { double vrednost(); String jedinica(); }(⇒ почетак)
// PromVel package merenje; public abstract class PromVel extends Thread implements Vel { private long tmin, tmax; private volatile double vr, min, max; double delta; public PromVel(long mint, long maxt, double vr0, double del, double minVr, double maxVr) { tmin = mint; tmax = maxt; vr = vr0; delta = del; min = minVr; max = maxVr; start(); } public double vrednost() { return vr; } public void run() { try { while (!interrupted()) { long t = tmin + (int)(Math.random()*(tmax-tmin)); sleep(t); synchronized (this) { vr += (Math.random()*2 - 1) * delta; if (vr < min) vr = min; if (vr > max) vr = max; } } } catch (InterruptedException g) {} } public void prekini() { interrupt(); } }
// Temp.java package merenje; public class Temp extends PromVel { public Temp(long mint, long maxt) { super(mint, maxt, 20, 1, -40, 40); } public String jedinica() { return "oC"; } }
// Prit.java package merenje; public class Prit extends PromVel { public Prit(long mint, long maxt) { super(mint, maxt, 1000, 5, 900, 1100); } public String jedinica() { return "mbar"; } }
// GNemaSrVr.java package merenje; public class GNemaSrVr extends Exception { public String toString() { return "*** Nema srednje vrednosti"; } }
// Merac.java package merenje; public class Merac extends Thread { private Vel vel; private long dt = 10; private double s = 0; private int n = 0; private volatile boolean radi = false; public Merac(Vel mv, long d) { vel = mv; dt = d; start(); } public void run() { try { while (!interrupted()) { while (!radi) synchronized (this) { wait(); } sleep(dt); synchronized (this) { s += vel.vrednost(); n++; } } } catch (InterruptedException g) {} } public double vr() {return vel.vrednost();} public synchronized double srVr() throws GNemaSrVr { if (n == 0) throw new GNemaSrVr(); return s / n; } public synchronized void kreni() { s = n = 0; radi = true; notify(); } public synchronized void stani() { radi = false; } public void zavrsi() { if (vel instanceof PromVel) ((PromVel)vel).prekini(); interrupt(); } public synchronized String toString () { String s = String.format("%.1f %s", vel.vrednost(), vel.jedinica()); try { s += String.format(" (%.1f %s)", srVr(), vel.jedinica()); } catch (GNemaSrVr g) {} return s; } }
// Program.java import merenje.*; import usluge.Citaj; public class Program { public static void main(String[] args) { Merac mTemp = new Merac (new Temp( 10, 50), 20), mPrit = new Merac (new Prit(100, 200), 20); radi: while (true) { System.out.print("Izbor (Kreni, Ocitaj, Stani, Zavrsi)? "); switch (Citaj.Char()) { case 'k': case 'K': mTemp.kreni(); mPrit.kreni(); break; case 'o': case 'O': System.out.println("T=" + mTemp + "\np=" + mPrit); break; case 's': case 'S': mTemp.stani(); mPrit.stani(); break; case 'z': case 'Z': break radi; } } mTemp.zavrsi(); mPrit.zavrsi(); } }
Izbor (Kreni, Ocitaj, Stani, Zavrsi)? k Izbor (Kreni, Ocitaj, Stani, Zavrsi)? o T=24,8 oC (26,0 oC) p=1007,7 mbar (1007,6 mbar) Izbor (Kreni, Ocitaj, Stani, Zavrsi)? o T=32,1 oC (28,1 oC) p=995,7 mbar (1008,0 mbar) Izbor (Kreni, Ocitaj, Stani, Zavrsi)? s Izbor (Kreni, Ocitaj, Stani, Zavrsi)? o T=31,1 oC (28,6 oC) p=1040,2 mbar (1011,8 mbar) Izbor (Kreni, Ocitaj, Stani, Zavrsi)? z
Copyright © 2012, Laslo Kraus
Последња ревизија: 20.3.2012.