Ласло Краус |
ИР2ОО2 Други колоквијум 6. 7. 2007. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) (Java) Шта се догађа када се за нит у блокираном стању позове метод interrupt()?
б) (C#) Која су основне разлике наредбе switch у односу на исту у језику Јава?
в) (C#) Који све типови спадају у вредносне, а који у указане типове?
У пакету logika постоје следећи типови за рад са логичким елементима (ове типове није потребно реализовати):
(вр)
Реализовати на језику Java следеће типове:
Label кад год се затражи израчунавање вредности излаза. Име, врста и вредност графичког елемента се добија од садржаног елемента. Приказује се текстуални опис и врста садржаног елемента као и текстуални описи елемената који представљају улазе садржаног елемента.
Kreni треба да је онемогућено.
///////////////// Не припада решењу колоквијума ///////////////////////
// Elem.java ///
///
package logika; ///
///
public abstract class Elem { ///
private char ime; ///
///
protected Elem[] ulazi; ///
///
public Elem (char iime, int brUl) ///
{ ime=iime; if (brUl != 0) ulazi = new Elem[brUl]; } ///
///
public char ime () { return ime; } ///
///
public abstract String vrsta (); ///
///
public abstract boolean vrednost (); ///
///
public String toString () ///
{ return ime + " (" + (vrednost()?"T":"F") + ")"; } ///
} ///
///
// Izvor.java ///
///
package logika; ///
///
public class Izvor extends Elem { ///
private boolean vr; ///
///
public Izvor (char ime) { super (ime, 0); } ///
///
public void postavi (boolean v) { vr = v; } ///
///
public boolean vrednost () { return vr; } ///
///
public String vrsta () { return "izvor"; } ///
} ///
///
// Ne.java ///
///
package logika; ///
///
public class Ne extends Elem { ///
public Ne (char ime, Elem a) { super (ime, 1); ulazi[0] = a; } ///
///
public boolean vrednost () { return ! ulazi[0].vrednost (); } ///
///
public String vrsta () { return "ne"; } ///
} ///
///
// I.java ///
///
package logika; ///
///
public class I extends Elem { ///
public I (char ime, Elem a, Elem b) ///
{ super(ime,2); ulazi[0]=a; ulazi[1]=b; } ///
///
public boolean vrednost () ///
{ return ulazi[0].vrednost() && ulazi[1].vrednost(); } ///
///
public String vrsta () { return "i"; } ///
} ///
///
// GIndeks.java ///
///
package logika; ///
///
public class GIndeks extends Exception { ///
public String toString () ///
{ return "*** Indeks izvan opsega!"; } ///
} ///
///
// GPocetak.java ///
///
package logika; ///
///
public class GPocetak extends Exception { ///
public String toString () ///
{ return "*** Nedoszoljena pocetna vrednost!"; } ///
} ///
///
// Brojac.java ///
///
package logika; ///
///
public class Brojac { ///
private Izvor[] izlazi; ///
private int ciklus, vrednost; ///
///
public Brojac (int brIzl) { ///
izlazi = new Izvor [brIzl]; ///
ciklus = 1 << brIzl; ///
} ///
///
public Brojac povezi (int ind, Izvor izv) throws GIndeks { ///
if (ind<0 || ind>=izlazi.length) throw new GIndeks (); ///
izlazi[ind] = izv; return this; ///
} ///
///
private void postaviIzlaze () { ///
int k = vrednost; ///
for (int i=izlazi.length-1; i>=0; i--) { ///
if (izlazi[i] != null) izlazi[i].postavi ((k&1)==1); ///
k >>= 1; ///
} ///
} ///
///
public Brojac postavi (int k) throws GPocetak { ///
if (k<0 || k>=ciklus) throw new GPocetak (); ///
vrednost = k; postaviIzlaze (); ///
return this; ///
} ///
///
public Brojac povecaj () { ///
vrednost = (vrednost == ciklus-1) ? 0 : vrednost+1; ///
postaviIzlaze (); return this; ///
} ///
///
public Brojac smanji () { ///
vrednost = (vrednost == 0) ? ciklus-1 : vrednost-1; ///
postaviIzlaze (); return this; ///
} ///
} ///
///
///////////////// Не припада решењу колоквијума ///////////////////////
// Analizator.java
package logika;
public class Analizator extends Thread {
private Brojac brojac;
private Elem elem;
private boolean radi = false;
private int dt = 300;
public Analizator (Brojac br, Elem el) { brojac = br; elem = el; start (); }
public Analizator postaviDt (int d) { dt = d; return this; }
public void run () {
try {
while (! interrupted ()) {
if(!radi) synchronized(this) {wait();}
sleep (dt); brojac.povecaj ();
elem.vrednost ();
}
} catch (InterruptedException g) {}
}
public synchronized void kreni () {
try {
brojac.postavi (0); elem.vrednost ();
radi = true; notify ();
} catch (GPocetak g) {}
}
public synchronized void stani () { radi = false; }
public void zavrsi () { interrupt (); }
}
// GraElem.java
package logika;
import java.awt.Label;
public class GraElem extends Elem {
private Elem elem;
private Label natpis;
private void prikazi () {
if (natpis != null) {
String s = elem + " [ " + vrsta();
if (elem.ulazi != null) {
s += " : ";
for (int i=0; i<elem.ulazi.length; i++) {
if (i>0) s += ", ";
s += elem.ulazi[i];
}
}
natpis.setText (s + " ]");
}
}
public GraElem (Elem el, Label ntp) {
super (el.ime(), 0); elem = el;
natpis = ntp; prikazi ();
}
public boolean vrednost () {
boolean vr = elem.vrednost ();
prikazi (); return vr;
}
public String vrsta () { return elem.vrsta (); }
public String toString () { return elem.toString (); }
}
// Program.java
package logika;
import java.awt.*;
import java.awt.event.*;
public class Program extends Frame {
private Label[] natpisi;
private Analizator analiz;
private Button dgmKreni=new Button("Kreni"),
dgmStani=new Button("Stani");
private void napraviMrezu () {
Brojac bro = new Brojac (3);
Izvor p = new Izvor ('a');
Izvor q = new Izvor ('b');
Izvor r = new Izvor ('c');
try {
bro.povezi(0,p).povezi(1,q).povezi(2,r);
} catch (GIndeks g) {}
natpisi = new Label [6];
for (int i=0; i<natpisi.length; natpisi[i++]=new Label());
Elem a = new GraElem (p, natpisi[0]);
Elem b = new GraElem (q, natpisi[1]);
Elem c = new GraElem (r, natpisi[2]);
Elem d = new GraElem (new I ('d',a,b), natpisi[3]);
Elem e = new GraElem (new Ne('e',c), natpisi[4]);
Elem f = new GraElem (new I ('f',d,e), natpisi[5]);
analiz = new Analizator (bro, f);
}
private void omoguci (boolean da) {
dgmKreni.setEnabled (da);
dgmStani.setEnabled (! da);
dgmKorak.setEnabled (da);
}
private void popuniProzor () {
Panel plo = new Panel (new GridLayout (0,1));
add (plo, "Center");
for (int i=0; i<natpisi.length; plo.add(natpisi[i++]));
add (plo = new Panel (), "South");
plo.add (new Label ("dt", Label.CENTER));
final TextField tksDt = new TextField ("300", 4);
plo.add (tksDt);
tksDt.addTextListener (new TextListener(){
public void textValueChanged (TextEvent d) {
try {
analiz.postaviDt
(Integer.parseInt(tksDt.getText()));
} catch (NumberFormatException g) {}
}
});
plo.add (dgmKreni);
dgmKreni.addActionListener (new ActionListener () {
public void actionPerformed (ActionEvent d)
{ omoguci (false); analiz.kreni (); }
});
plo.add (dgmStani);
dgmStani.setEnabled (false);
dgmStani.addActionListener (new ActionListener () {
public void actionPerformed (ActionEvent d)
{ omoguci (true); analiz.stani (); }
});
}
public Program () {
super ("Kombinaciona mreza");
setSize (240, 170);
napraviMrezu ();
popuniProzor();
setVisible (true);
addWindowListener (new WindowAdapter () {
public void windowClosing(WindowEvent d)
{ analiz.zavrsi (); dispose (); }
});
}
public static void main (String[] varg)
{ new Program (); }
}
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.