Ласло Краус |
СИ2ОО2 Други колоквијум 28. 4. 2012. |
|---|
Одговорити концизно (по једна или две реченице, или "да"/"не" где се не тражи образложење) и прецизно на следећа питaња:
а) Навести могуће декларације метода m() класе class X implements I1, I2 {…}, ако су: interface I1 { void m() throws E1,E2,E3; } и interface I2 { void m() throws E2,E3,E4; }?
б) Да ли је из методе спољашње класе дозвољен приступ приватним члановима унутрашње (inner) класе и да ли се може без квалификације (директним именовањем) приступити из методе спољашње класе методи унутрашње? Зашто?
в) Да ли метод нити start() позива метод run()? Образложити.
Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):
(наплаћенИзнос). Грешка је ако је категорија ван дозвољеног опсега или ако у тренутку наплате није дефинисан ценовник.
(наплаћено):станица,…,станица. При отварању се задаје нови ценовник који се прослеђује свим станицама. Кад је рампа отворена, возила случајних категорија, које су у дозвољеном интервалу према важећем ценовнику, пристижу у случајним верменским интервалима од (1±0,3)tsr, на случајну станицу рампе.
(5 поена) Написати на језику Java програм који направи једну наплатну рампу коју отвори, после извесног времена испише на главном излазу, после још нешто времена затвори, испише на главном излазу и уништи. Користити константне параметре (не треба ништа учитавати с главног улаза).
// Kategor.java
package putarina;
public interface Kategor {
int kategor();
}
// Vozilo.java
package putarina;
public class Vozilo implements Kategor {
private int kat;
public Vozilo(int k) { kat = k; }
public int kategor() { return kat; }
}
// GKat.java
package putarina;
public class GKat extends Exception {
public String toString() { return "*** Nepostojeca kategorija!"; }
}
// Cenovnik.java
package putarina;
public class Cenovnik {
private int[] putarine;
public Cenovnik(int[] put) { putarine = put; }
public int brKat() {return putarine.length;}
public int putarina(int kat) throws GKat {
if (kat<=0 || kat>putarine.length) throw new GKat();
return putarine[kat-1];
}
}
// Stanica.java
package putarina;
public class Stanica implements Cloneable {
private static int posId = 0;
private int id = ++posId;
private Cenovnik cen;
private int naplaceno = 0;
public Stanica novCen(Cenovnik c) { cen = c; naplaceno = 0; return this;}
public Stanica clone() {
try {
Stanica s = (Stanica) super.clone();
s.id = ++posId; s.naplaceno = 0; return s;
} catch (CloneNotSupportedException g) { return null; }
}
public Stanica naplati(Vozilo v) throws GKat {
naplaceno += cen.putarina(v.kategor());
return this;
}
public int naplaceno() { return naplaceno; }
public String toString() { return id + "(" + naplaceno + ")"; }
}
// Rampa.java
package putarina;
public class Rampa extends Thread {
private String naziv;
private Stanica[] stanice;
private long tSr;
private Cenovnik cen;
private boolean radi = false;
public Rampa(String naz, Stanica stan, int brStan, long tsr) {
naziv = naz; tSr = tsr;
stanice = new Stanica [brStan];
for (int i=0; i<brStan; i++) stanice[i] = stan.clone();
start();
}
public void run() {
try {
while (!interrupted()) {
synchronized (this) { if (!radi) wait(); }
sleep((long)(tSr*(0.7+0.6*Math.random())));
Vozilo v = new Vozilo ((int)(Math.random()*cen.brKat()+1));
try {
stanice[(int)(Math.random()*stanice.length)].naplati(v);
} catch (GKat g) {}
}
} catch (InterruptedException g) {}
}
public synchronized void otvori(Cenovnik c) {
cen = c;
for (Stanica s: stanice) s.novCen(c);
radi = true; notify();
}
public void zatvori() { radi = false; }
public void unisti() { interrupt(); }
public int naplaceno() {
int uk = 0;
for(Stanica s: stanice) uk += s.naplaceno();
return uk;
}
public String toString() {
String s = naziv + "(" + naplaceno()+"):";
for (int i=0; i<stanice.length; i++) {
if (i > 0) s += ",";
s += stanice[i];
}
return s;
}
}
// Program.java
import putarina.*;
public class Program {
public static void main(String[] varg) {
try {
Rampa rampa = new Rampa("Jagodina", new Stanica(), 3, 300);
rampa.otvori(new Cenovnik(new int[] {100, 200, 500}));
Thread.sleep(10000);
System.out.println(rampa);
Thread.sleep(5000);
rampa.zatvori();
System.out.println(rampa);
rampa.unisti();
} catch (InterruptedException g) {}
}
}
Jagodina(8400):2(3000),3(2300),4(3100)
Jagodina(12700):2(3900),3(5100),4(3700)
(⇒ почетак)
Copyright © 2013, Laslo Kraus
Последња ревизија: 19.3.2013.