Ласло Краус |
СИ2ОО2 Други колоквијум 24. 4. 2013. |
|---|
Одговорити концизно (по једна или две реченице, или "да"/"не" где се не тражи образложење) и прецизно на следећа питaња:
а) Да ли је дозвољено да класа проширује (наслеђује) више класа и да ли је дозвољено да класа имплементира више интерфејса? Зашто?
б) На који начин се из метода унутрашње класе (inner class) може приступати члановима спољашње класе и зашто?
в) У којој ситуацији наступа, како се мaнифестује и како се решава проблем неизвесности трке (race hazard)?
Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):
// Merljiv.java
package pljusak;
public interface Merljiv {
int zapr();
}
// Kap.java
package pljusak;
public class Kap implements Merljiv {
private int V = (int)(3 + Math.random()*7);
public int zapr() { return V; }
}
// Busen.java
package pljusak;
public class Busen implements Merljiv, Cloneable {
private int kolVode;
public int zapr() { return kolVode; }
void palaKap(Kap k) { kolVode += k.zapr(); }
public void ispari() { kolVode = 0; }
public Busen clone() {
try { return (Busen)super.clone(); }
catch (CloneNotSupportedException g) { return null; }
}
public String toString(){return ""+kolVode;}
}
// GIndeks.java
package pljusak;
public class GIndeks extends Exception {
public String toString() { return "*** Nedozvoljen indeks!"; }
}
// Livada.java
package pljusak;
public class Livada {
private Busen[][] liv;
public Livada(int m, int n, Busen b) {
liv = new Busen[m][n];
for (int i=0; i<m; i++)
for(int j=0; j<n; liv[i][j++]=b.clone());
}
public int brVrs() { return liv.length; }
public int brKol() { return liv[0].length; }
public synchronized void palaKap
(Kap k, int i, int j) throws GIndeks {
if (i<0 || i>=brVrs() || j<0 || j>=brKol()) throw new GIndeks();
liv[i][j].palaKap(k);
}
public synchronized void ispari() {
for (Busen[] vrs:liv)
for (Busen b: vrs) b.ispari();
}
public synchronized String toString() {
String s = "";
for (Busen[] vrs:liv) {
for (Busen b: vrs) s += String.format("%4s", b);
s += "\n";
}
return s;
}
}
// GPada.java
package pljusak;
public class GPada extends Exception {
public String toString() { return "*** Kiša već pada!"; }
}
// GNePada.java
package pljusak;
public class GNePada extends Exception {
public String toString() { return "*** Kiša ne pada!"; }
}
// Oblak.java
package pljusak;
public class Oblak extends Thread {
private Livada liv;
private boolean pada = false;
public Oblak(Livada li) { liv=li; start(); }
public void run() {
try {
while (!interrupted()) {
synchronized (this) { while (!pada) wait(); }
sleep((long)(10 + Math.random() * 41));
try {
liv.palaKap(new Kap(), (int)(Math.random() * liv.brVrs()),
(int)(Math.random() * liv.brKol()));
} catch(GIndeks g) {}
}
} catch (InterruptedException g) {}
}
public synchronized void pada()throws GPada{
if (pada) throw new GPada();
pada = true; notify();
}
public synchronized void nePada() throws GNePada {
if (!pada) throw new GNePada();
pada = false;
}
public void unisti() { interrupt(); }
}
// Program.java
import pljusak.*;
public class Program {
public static void main(String[] varg) {
Livada liv = new Livada(4,5,new Busen());
Oblak obl = new Oblak(liv);
try {
obl.pada();
Thread.sleep(5000);
System.out.println(liv);
Thread.sleep(3000);
System.out.println(liv);
obl.nePada();
liv.ispari();
System.out.println(liv);
obl.nePada();
} catch (Exception g) { System.out.println(g); }
obl.unisti();
}
}
48 63 40 52 56
35 74 58 58 46
64 32 63 60 38
34 43 64 24 49
78 92 96 56 71
57 102 102 113 67
86 46 106 112 67
41 55 95 55 88
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
*** Kiša ne pada!
(⇒ почетак)
Copyright © 2014, Laslo Kraus
Последња ревизија: 24.4.2014.