Ласло Краус |
СИ2ОО2 Други колоквијум 16. 5. 2007. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Да ли је и зашто дозвољено написати:
interface I1{int m(int i);}
interface I2{float m(int i);}
class X implements I1,I2{/*…*/}
б) Да ли је из методе спољашње класе дозвољен приступ приватним члановима унутрашње (inner) класе и да ли се може без квалификације приступити из методе спољашње класе методи унутрашње? Зашто?
в) Који начин синхронизације је најприроднији уколико се жели да N активних објеката конкурентно изврше неку операцију, а затим се резултати извршених операција прикупљају секвенцијално.
Написати на језику Java следећи пакет типова:
(15 поена) Написати на језику Java интерактиван програм за извлачење бројева с највише шест цифара. Предвидети покретање задатог броја точкова, заустављање точкова с исписивањем њиховог стања и завршетак рада.
// Generator.java
package lutrija;
public interface Generator { public int slBroj (); }
// Tocak.java
package lutrija;
class Tocak extends Thread implements Generator {
private int cifra;
private int dt;
private int korak;
private boolean radi = false;
Tocak (int ddt, boolean raste) {
dt = ddt;
korak = raste ? 1 : -1;
start ();
}
public void run () {
try {
while (! interrupted ()) {
if (! radi) synchronized (this) { wait (); }
sleep (dt);
cifra = (cifra + korak + 10) % 10;
}
} catch (InterruptedException g) {}
}
synchronized void kreni () { radi = true; notify (); }
public int slBroj () { radi = false; return cifra; }
void zavrsi () { interrupt (); }
}
// GRadi.java
package lutrija;
public class GRadi extends Exception {
public String toString () { return "*** Vec radi!"; }
}
// GStoji.java
package lutrija;
public class GStoji extends Exception {
public String toString () { return "*** Ne radi!"; }
}
// GDuz.java
package lutrija;
public class GDuz extends Exception {
public String toString () { return "*** Neispravna duzina!"; }
}
// Masina.java
package lutrija;
public class Masina {
private Tocak[] niz;
private int n;
private boolean radi = false;
public Masina (int kap) {
niz = new Tocak [kap];
for (int i=0; i<kap; i++)
niz[i] = new Tocak( (int)(10+Math.random()*10), i%2==0 );
}
public void kreni (int n) throws GRadi, GDuz {
if (radi) throw new GRadi ();
if (n<=0 || n>niz.length) throw new GDuz ();
radi = true;
this.n = n;
for (int i=0; i<n; niz[i++].kreni());
}
public String stani () throws GStoji {
if (! radi) throw new GStoji ();
radi = false;
String s = "";
for (int i=0; i<n; s=niz[i++].slBroj()+s);
return s;
}
public void unisti () { for (Tocak t: niz) t.zavrsi (); }
}
// Izvlacenje.java
import lutrija.*;
import usluge.Citaj;
public class Izvlacenje {
public static void main (String[] varg) {
Masina mas = new Masina (6);
radi: while (true) {
try {
System.out.print
("Izbor (Kreni, Stani, Zavrsi)? ");
switch (Citaj.Char ()) {
case 'k':
System.out.print ("Broj tockova? ");
mas.kreni (Citaj.Int());
break;
case 's':
System.out.println ("Dobitni broj: " + mas.stani());
break;
case 'z':
break radi;
}
} catch (Exception g) { System.out.println (g); }
}
mas.unisti ();
}
}
Izbor (Kreni, Stani, Zavrsi)? k
Broj tockova? 5
Izbor (Kreni, Stani, Zavrsi)? s
Dobitni broj: 15689
Izbor (Kreni, Stani, Zavrsi)? s
*** Ne radi!
Izbor (Kreni, Stani, Zavrsi)? k
Broj tockova? 8
*** Neispravna duzina!
Izbor (Kreni, Stani, Zavrsi)? k
Broj tockova? 6
Izbor (Kreni, Stani, Zavrsi)? k
Broj tockova? 3
*** Vec radi!
Izbor (Kreni, Stani, Zavrsi)? s
Dobitni broj: 724033
Izbor (Kreni, Stani, Zavrsi)? z
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.