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

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

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

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

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

а) Ако је I интерфејс, да ли је дозвољено (1) дефинисати референцу типа интерфејса I i; (2) проследити референцу на интерфејс I као аргумент некој методи (3) створити објекат типа интерфејса помоћу new I()?

б) Да ли се и зашто нека класа на Јави може дефинисати у неком изразу?

в) Навести начине на које се нит блокира тако што сама себе суспендује и одговарајуће начине како се деблокира.

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

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

(10 поена) Написати на језику Java програм (класу с главном функцијом) који направи једну улицу и једну раскрсницу, покрене их, после неког врмена их заустави, а затим трајно обустави рад улице и раскрснице. Улица и раскрсница имају: minT=0.1s и maxT=0.3s.


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


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

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

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