Ласло Краус |
ИР2ОО2/СИ2ОО2 Испит 17. 6. 2009. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) (Java) Који начин обраде догађаја се користи од Jave 1.1 и која је предност у односу на начин обраде догађаја у Javi 1.0?
б) (C#) Да ли се вредносни податак може пренети по референци у функцију? Зашто?
в) (C#) Шта је делегат и која му је основна намена?
Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):
null
. Спрат садржи графичку компоненту типа Label
(која може да се дохвати) на којој се при свакој промени стања на спрату приказује текстуални опис спрата (који садржи текстуалне описе особа на спрату). Нит спрата може да се заустави, настави даље и да се дефинитивно прекине.
Label
колико спратова има зграда и сваког момента само на компоненти која одговара спрату на којем се налази лифт приказује свој текстуални опис (који је састављен од текстуалних описа особа у лифту). Може да се дохвати компонента са задатим редним бројем. Лифт може да се обавести о појављивању нове особе негде у згради и да се његова нит дефинитивно прекине.
// Osoba.java package zgrada; public class Osoba { private int sprat; public Osoba( Zgrada z) { sprat = (int)(Math.random() * z.brSprat()); } public int sprat() { return sprat; } public String toString() { return Integer.toString( sprat); } }(⇒ почетак)
// Sprat.java package zgrada; import java.awt.Label; public class Sprat extends Thread { private Zgrada zgrada; private int sprat, tMin, tMax; private boolean radi; private Osoba[] osobe; private int prvi, posl, duz; private Label prikaz; public Sprat( Zgrada z, int spr, int kap, int min, int max) { zgrada = z; sprat = spr; tMin = min; tMax = max; osobe = new Osoba [kap]; prikaz = new Label( "", Label.RIGHT); start(); } public Label dohvPrikaz() { return prikaz; } public void stani() { radi = false; } public synchronized void kreni() { radi = true; notify(); } public void zavrsi() { interrupt(); } public void run() { try { while (! interrupted()) { while (! radi) synchronized(this) { wait(); } sleep ( (int)(tMin + Math.random() * (tMax - tMin))); staviOsobu(); } } catch (InterruptedException g) {} } private synchronized void staviOsobu() throws InterruptedException { while (duz == osobe.length) wait(); Osoba oso = null; do { oso = new Osoba( zgrada); } while (oso.sprat() == sprat); osobe[posl++] = oso; posl %= osobe.length; duz++; zgrada.dohvLift().stizeOsoba(); prikaz.setText( toString()); } public synchronized Osoba uzmiOsobu(){ if (duz == 0) return null; Osoba oso = osobe[prvi++]; prvi %= osobe.length; duz--; prikaz.setText( toString()); notifyAll(); return oso; } public synchronized String toString(){ String s = ""; for (int i=duz-1; i>=0; i--) s += " " + osobe[(prvi+i)%osobe.length]; return s; } }
// Lift.java package zgrada; import java.awt.Label; import java.awt.Color; public class Lift extends Thread { private Zgrada zgrada; private int dt, cekaju=0, uLiftu=0; private int sprat=0, smer=-1; Osoba[] osobe; Label[] prikazi; public Lift( int kap, Zgrada z, int ddt) { osobe = new Osoba [kap]; zgrada = z; dt = ddt; prikazi = new Label [z.brSprat()]; for (int i=0; i<prikazi.length; prikazi[i++]=new Label("")); prikazi[0].setBackground( Color.LIGHT_GRAY); start(); } public Label dohvPrikaz( int spr) { return prikazi[spr]; } public void run() { try { while (! interrupted()) { while (cekaju+uLiftu == 0) synchronized (this) { wait(); } for (int i=0; i<osobe.length; i++) if (osobe[i]!=null && osobe[i].sprat()==sprat) { osobe[i] = null; uLiftu--;; } for (int i=0; i<osobe.length; i++) if (osobe[i] == null) { Osoba oso = zgrada. dohvSprat( sprat). uzmiOsobu(); if (oso == null) break; osobe[i] = oso; cekaju--; uLiftu++; } prikazi[sprat].setText( toString()); sleep( dt); prikazi[sprat].setText( ""); prikazi[sprat]. setBackground(Color.WHITE); if (sprat==0 || sprat==zgrada.brSprat()-1) smer = -smer; sprat += smer; prikazi[sprat].setText( toString()); prikazi[sprat].setBackground(Color.LIGHT_GRAY); } } catch (InterruptedException g) {} } public synchronized void stizeOsoba() { cekaju++; notifyAll(); } public void zavrsi() { interrupt(); } public String toString() { String s = ""; for (int i=0; i<osobe.length; i++) s += ((osobe[i] != null) ? osobe[i] : "-") + " "; return s; } }
// Zgrada.java package zgrada; public class Zgrada { int brSprat; Sprat[] sprati; Lift lift; public Zgrada( int brSpr) { brSprat = brSpr; sprati = new Sprat [brSpr]; for (int i=0; i<brSpr; i++) sprati[i] = new Sprat( this, i, 12, 2000, 4000); lift = new Lift( 8, this, 2000); } public int brSprat() {return brSprat;} public void kreni() { for (Sprat s: sprati) s.kreni(); } public void stani() { for (Sprat s: sprati) s.stani(); } public void zavrsi() { for (Sprat s: sprati) s.zavrsi(); lift.zavrsi(); } public Sprat dohvSprat (int spr) { return sprati[spr]; } public Lift dohvLift() {return lift;} }
// Program.java package zgrada; import java.awt.*; import java.awt.event.*; public class Program extends Frame { private Zgrada zgrada; public Program() { super( "Zgrada"); setBounds (100, 100, 250, 150); zgrada = new Zgrada( 5); popuniProzor(); setVisible( true); addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent d) { zgrada.zavrsi(); dispose(); } }); } private void popuniProzor () { Panel plo = new Panel( new GridLayout(0,2)); add(plo, "Center"); for (int i=zgrada.brSprat()-1; i>=0; i--) { plo.add( zgrada.dohvSprat(i).dohvPrikaz()); plo.add( zgrada.dohvLift().dohvPrikaz(i)); } add( plo = new Panel(), "South"); plo.setBackground(Color.GRAY); Button dgm = new Button( "Kreni"); plo.add(dgm); dgm.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent d) { zgrada.kreni(); } }); plo.add(dgm = new Button( "Stani")); dgm.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent d) { zgrada.stani(); } }); } public static void main( String[] vpar) { new Program(); } }
Copyright © 2010, Laslo Kraus
Последња ревизија: 1.9.2010.