Ласло Краус |
ИР2ОО2/СИ2ОО2 Испит 16. 6. 2014. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) (Java) Да ли конструктор може бити синхронизован и зашто?
б) (C#) Навести врсте .NET склопова које могу да се извршавају самостално. Која опција преводиоца csc се користи за коју врсту и која је екстензија имена (тип) фајла који се добија као резултат превођења?
в) (C#) Шта исписује следећи програм?
class X{ delegate int D(ref int i); private int i=10; int m1(ref int i){return i++;} int m2(ref int i){return i*=2;} int m3(ref int i){return i--;} static void Main(string[] args){ X x=new X(); D d1=new D(x.m1), d2=new D(x.m2), d3=new D(x.m3); D d=d1+d2; d+=d1; d+=d3–d1; System.Console.WriteLine("d="+d(ref x.i)+" x.i="+x.i); } }
Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):
Canvas
) које служи за графички приказ напредовања одговарајућег посла задатом бојом.
// PrevisePratilaca.java package napredovanje; public class PrevisePratilaca extends Exception{ public String toString() { return "*** Previse pratilaca!" } }(⇒ почетак)
//Obavestiv.java package napredovanje; public interface Obavestiv{ void obavesti(int procenat); }
// Posao.java package napredovanje; public abstract class Posao extends Thread{ private int N, K; private Obavestiv pratilac; private boolean radi; public Posao(int N, int K) { this.N=N; this.K=K; } public void prijavi(Obavestiv o) throws PrevisePratilaca{ if (pratilac != null) throw new PrevisePratilaca(); pratilac = o; } public void zaustavi(){radi=false; } public synchronized void nastavi(){ radi = true; notify(); } public void prekini() { interrupt(); } public boolean radi() { return radi; } protected abstract void radnja() throws InterruptedException; public void run() { try { for (int i=1; i<=N && !inetrrupted(); i++) { synchronized(this) { while(! radi ) wait(); } radnja(); if ((pratilac!=null) && ((i%K)==0)) pratilac.obavesti(i*100/N); } } catch(InterruptedException e) {} } }
// SimPosao.java package napredovanje; public class SimPosao extends Posao { private int minT, maxT; public SimPosao(int N, int K, int minT,int maxT) { super(N,K); this.minT=minT; this.maxT=maxT; } protected void radnja() throws InterruptedException { sleep(minT + (int)(Math.random()*(maxT-minT+1))); } }
// Indikator.java package napredovanje; import java.awt.*; public abstract class Indikator extends Canvas implements Obavestiv{ private Color boja; protected int procenat; protected int sirina; protected int visina; public Indikator(Color boja) { this.boja=boja;} public void obavesti(int procenat){ this.procenat=procenat; repaint(); } public void paint(Graphics g){ sirina = this.getWidth(); visina = this.getHeight(); g.setColor(boja); } }
// PravougaoniIndikator.java package napredovanje; import java.awt.*; public class PravougaoniIndikator extends Indikator{ public PravougaoniIndikator( Color boja) { super(boja); } public void paint(Graphics g){ super.paint(g); g.drawRect(0,0,sirina-1,visina-1); if (sirina >= visina) g.fillRect(0,0,sirina*procenat/100-1,visina-1); else g.fillRect(0,0,sirina-1,visina*procenat/100-1 ); } }
// KruzniIndikator.java package napredovanje; import java.awt.*; public class KruzniIndikator extends Indikator{ public KruzniIndikator(Color boja) { super(boja); } public void paint(Graphics g){ super.paint(g); g.drawOval(0,0,sirina-1,visina-1); g.fillArc(0,0, sirina-1, visina-1,0,360*procenat/100); } }
// Napredak.java package napredovanje; import java.awt.*; public class Napredak implements Obavestiv{ private Indikator ind; public Napredak(Indikator ind){ this.ind = ind; } public void prati(Posao p){ try{ p.prijavi(this); } catch(PrevisePratilaca i){} } public synchronized void obavesti( int procenat){ ind.obavesti(procenat); } }
//Program.java import napredovanje.*; import java.awt.*; import java.awt.event.*; public class Program extends Frame { private Button dugPrav, dugKrug; private SimPosao sp1, sp2; private Napredak pravNap, krugNap; private Indikator pravInd, krugInd; public Program() { super("Napredak"); setSize(200, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ sp1.prekini(); sp2.prekini(); dispose(); }}); sp1 = new SimPosao(1000,50,10,15); sp1.start(); sp2 = new SimPosao(1000,10,10,15); sp2.start(); pravInd = new PravougaoniIndikator(Color.GREEN); krugInd = new KruzniIndikator(Color.RED); pravNap = new Napredak(pravInd); pravNap.prati(sp1); krugNap = new Napredak(krugInd); krugNap.prati(sp2); dodajKomponente(); setVisible(true); } private void dodajKomponente() { Panel indikatori = new Panel(); indikatori.setLayout(new GridLayout(1,2)); indikatori.add(pravInd); indikatori.add(krugInd); add(indikatori, "Center"); dugPrav = new Button("Kreni"); defDugme(dugPrav, sp1); dugKrug = new Button("Kreni"); defDugme(dugKrug, sp2); Panel dugmad = new Panel(); dugmad.add(dugPrav); dugmad.add(dugKrug); add(dugmad, "South"); } private void defDugme(final Button dugme, final Posao posao){ dugme.addActionListener(new ActionListener() { public void actionPerformed( ActionEvent e){ if (!posao.isAlive()){ dugme.setEnabled(false); return; } else if (posao.radi()) { posao.zaustavi(); dugme.setLabel("Kreni"); } else { posao.nastavi(); dugme.setLabel("Stani"); } }); } public static void main(String[] args){new Program();} }
Copyright © 2014, Laslo Kraus
Последња ревизија: 10.7.2014.