Ласло Краус |
СИ2ОО2 Други колоквијум 23. 4. 2014. |
---|
Одговорити концизно (по једна или две реченице, или "да"/"не" где се не тражи образложење) и прецизно на следећа питaња:
а) Ако је I
интерфејс, да ли је дозвољено (1) дефинисати референцу типа интерфејса I
i
; (2) проследити референцу на интерфејс I
као аргумент некој методи (3) створити објекат типа интерфејса помоћу new
I()
?
б) Да ли се и зашто нека класа на Јави може дефинисати у неком изразу?
в) Навести начине на које се нит блокира тако што сама себе суспендује и одговарајуће начине како се деблокира.
Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):
[
идКам:
време]
регБр.
null
ако је ред празан). Приликом узимања возила из траке возило се сними камером траке и снимак се памти до следећег снимања. Ако је ред при покушају узимања возила празан, снимак је празан. Може да се дохвати последњи снимак.
(10 поена) Написати на језику Java програм (класу с главном функцијом) који направи једну улицу и једну раскрсницу, покрене их, после неког врмена их заустави, а затим трајно обустави рад улице и раскрснице. Улица и раскрсница имају: minT=0.1s и maxT=0.3s.
// Registrovano.java package saobracaj; interface Registrovano { String regOzn(); }(⇒ почетак)
// Vozilo.java package saobracaj; public class Vozilo implements Registrovano { private static final String[] mesta = {"BG", "NS", "NI"}; private String reg; public Vozilo() { reg = mesta[(int)(Math.random()*mesta.length)]+ (int)(Math.random()*10) + (int)(Math.random()*10) + (int)(Math.random()*10); } public String regOzn() { return reg; } }
// Kamera.java package saobracaj; public class Kamera { private static int posId = 0; private int id = ++posId; private Vozilo vozilo; private static long t0 = System.currentTimeMillis(); private long t; public Kamera snimi(Vozilo v) { vozilo = v; t = System.currentTimeMillis() - t0; return this; } public String snimak() { return "[" + id + "," + t + "]" + vozilo.regOzn(); } }
// Traka.java package saobracaj; public class Traka { private Kamera kam; private String snimak; private Elem prvi = null, posl = null; private class Elem { Vozilo voz; Elem sled = null; Elem(Vozilo v) { voz = v; if (prvi == null) prvi = this; else posl.sled = this; posl = this; } } public Traka() { kam = new Kamera(); } public synchronized void stavi(Vozilo v) { new Elem(v); } public synchronized Vozilo uzmi() { snimak = null; if (prvi == null) return null; Vozilo v = prvi.voz; if ((prvi = prvi.sled) == null) posl = null; kam.snimi(v); snimak = kam.snimak(); return v; } public String snimak() { return snimak; } }
// NegBr.java package saobracaj; public class NegBr extends Exception { public String toString() { return "Negativan broj!"; } }
// Saobracajnica.java package saobracaj; public abstract class Saobracajnica extends Thread{ protected Traka[] trake; private long tMin, tMax; private boolean radi = false; protected abstract void radnja(); public Saobracajnica(int brTr, long t1, long t2) throws NegBr { if (brTr<0) throw new NegBr(); tMin=t1; tMax=t2; trake = new Traka [brTr]; for (int i=0; i<brTr; trake[i++]=new Traka()); } public void run() { try { while (!interrupted()) { synchronized (this) { if (!radi) wait(); } sleep((long)(tMin + Math.random()*(tMax-tMin))); if (radi) radnja(); } } catch (InterruptedException g) {} } public synchronized void kreni() { radi = true; notify(); } public void stani() { radi = false; } public void zavrsi() { interrupt(); } }
// Ulica package saobracaj; public class Ulica extends Saobracajnica { public Ulica(int brTr, long t1, long t2) throws NegBr { super(brTr, t1, t2); start(); } protected void radnja() { trake[(int)(Math.random()*trake.length)]. stavi(new Vozilo()); } public String snimak(){ Traka traka = trake[(int)(Math.random()*trake.length)]; traka.uzmi(); return traka.snimak(); } }
// Raskrsnica package saobracaj; public class Raskrsnica extends Saobracajnica{ private Ulica ulica; public Raskrsnica(Ulica u, long t1, long t2) throws NegBr { super(0, t1, t2); ulica = u; start(); } protected void radnja() { String snimak = ulica.izaslo(); if (snimak != null) System.out.println(snimak); } }
// Program.java import saobracaj.*; public class Program { public static void main(String[] varg) { try { Ulica ul = new Ulica(3, 100, 300); Raskrsnica ras = new Raskrsnica(ul, 100,300); ul.kreni(); ras.kreni(); Thread.sleep(3000); ul.stani(); ras.stani(); ul.zavrsi(); ras.zavrsi(); ul = new Ulica(-1, 100, 300); } catch (Exception g) { System.out.println(g); } } }
[3,390]NS271 [1,1265]NS218 [3,1453]NI018 [2,1797]BG509 [1,2500]NI033 [1,2703]NI623 [1,2968]BG425 Negativan broj!
Copyright © 2014, Laslo Kraus
Последња ревизија: 25.4.2014.