Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО2
Други колоквијум
19. 4. 2011.

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

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

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

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

а) Ако интерфејс садржи податке (поља), који модификатори су подразумевани и зашто?

б) Како се прослеђују параметри конструктору наткласе дате анонимне класе?

в) Да ли позивалац метода start() чека да метод run() објекта чија је метода start() позвана заврши извршење, пре него што настави са сопственим извршењем? Образложити.

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

Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):

(10 поена) Написати на језику Java програм који направи по један мерач температуре и притиска и после у циклусу извршава команде Kreni, Ocitaj, Stani и Zavrsi. При очитавању на главном излазу се исписују текстуални описи оба мерача. За параметре мерача користити константне вредности (не треба ништа учитавати с главног улаза). На располагању стоји класа Citaj у пакету usluge која садржи метоте за читање стандардних типова података.

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


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

// 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
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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