Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО2/СИ2ОО2
Испит
17. 6. 2009.

Аутори: Игор Тартаља, Ласло Краус и Ђурђевић Ђорђе

Задаци: 1 2 | Напоменe | Решења: 2

Поставка задатка 1 (укупно 30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:

а) (Java) Који начин обраде догађаја се користи од Jave 1.1 и која је предност у односу на начин обраде догађаја у Javi 1.0?

б) (C#) Да ли се вредносни податак може пренети по референци у функцију? Зашто?

в) (C#) Шта је делегат и која му је основна намена?

Поставка задатка 2 (70 поена) ( решење | почетак)

Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):


Напоменe ( почетак)


Решење задатка 2 ( поставка | почетак)

// 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(); } }
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 1.9.2010.