Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО2
Kолоквијум
13. 4. 2013.

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

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

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

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

а) Која је практична препорука за именовање пакета? Зашто?

б) Да ли дозвољeне следеће конструкције и ако јесу, шта оне означавају:
(1) super.super.m()   (2) BaznaKlasa b=super;   (3) super(super.m());

в) Шта су добре, а шта лоше стране проверених изузетака?

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

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

(15 поена) Написати на језику Java програм (класу с главном функцијом) који направи један тврди диск, један CD са неколико датотека и један рачунар, а затим најпре рачунаром копира садржај CD-а на диск, па обратно. Након сваког копирања испише резултат рачунара. Користити константне параметре (не треба ништа учитавати с главног улаза).

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


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

// GUredj.java

package uredjaji;

public abstract class GUredj extends Exception { }

// GKap.java package uredjaji; public class GKap extends GUredj { public String toString() { return "*** Prekoracen kapacitet uredjaja"; } }
// Datoteka.java package uredjaji; public class Datoteka implements Cloneable { private String ime; private byte[] sadrzaj; public Datoteka(String i, byte[] s) { ime = i; sadrzaj = s; } public int kapacitet() { return sadrzaj.length; } public int velicina() { return sadrzaj.length + ime.length(); } public String ime() { return ime; } public byte dohvati(int lok) throws GOpseg { if( lok < 0 || lok >= sadrzaj.length ) throw new GOpseg(); return sadrzaj[lok]; } public Datoteka upisi(int lok, byte b) GOpseg { if( lok < 0 || lok >= sadrzaj.length ) throw new GOpseg(); sadrzaj[lok] = b; return this; } public Datoteka clone() { try { Datoteka d = (Datoteka)super.clone(); d.sadrzaj = sadrzaj.clone(); return d; } catch(CloneNotSupportedException e) { return null; } } public String toString() { return ime + "(" + sadrzaj.length + ")"; } }
// Upisiv.java package uredjaji; public interface Upisiv {}
// GOpseg.java package uredjaji; public class GOpseg extends GUredj { public String toString() { return "*** Nedozvoljen pristup uredjaju"; } }
// GNijeUpisiv package uredjaji; public class GNijeUpisiv extends GUredj { public String toString() { return "*** Nedozvoljen upis u uredjaj"; } }
// GNemaDat.java package uredjaji; public class GNemaDat extends GUredj { public String toString() { return "*** Datoteka ne postoji"; } }
// Uredjaj.java package uredjaji; public abstract class Uredjaj { private static int ukID; private int id = ++ukID; private String proizvodjac; private int kap, pop, brDat; private Datoteka[] datot = new Datoteka [10]; private void dod(Datoteka d) throws GKap { if (pop+d.velicina()>kap) throw new GKap(); if (brDat == datot.length) { Datoteka[] tmp = new Datoteka[brDat*2]; for (int i = 0; i < datot.length; i++) tmp[i] = datot[i]; datot = tmp; } datot[brDat++] = d; pop += d.velicina(); } public Uredjaj(String pro, int k) { proizvodjac = pro; kap = k; } public Uredjaj(String pro, int k, Datoteka[] d) throws GKap { proizvodjac = pro; kap = k; for(Datoteka dd: d) { dod(dd); } } public int kapacitet() { return kap; } public int id() { return id; } public boolean mozeDodavanje() { return this instanceof Upisiv; } public void dodaj(Datoteka d) throws GNijeUpisiv, GKap{ if (!mozeDodavanje()) throw new GNijeUpisiv(); dod(d); } public Datoteka dohvati(String ime) throws GNemaDat { for (Datoteka d: datot) if (d!=null && d.ime().equals(ime)) return d; throw new GNemaDat(); } public String[] spisak() { String[] spisak = new String [brDat]; for (int i = 0; i < brDat; i++) spisak[i] = datot[i].ime(); return spisak; } public String toString() { return proizvodjac + "(" + id + "/" + kap + "/" + pop + ")"; } }
// Disk.java package uredjaji; public class Disk extends Uredjaj implements Upisiv{ public Disk(String pro, int kap) { super(pro,kap); } public Disk(String pro, int kap, Datoteka[] dat) throws GKap { super(pro, kap, dat); } }
// CD.java package uredjaji; public class CD extends Uredjaj { public CD(String pro, Datoteka[] dat) throws GKap { super(pro, 700000000, dat); } }
// Racunar.java package uredjaji; public class Racunar { private int usp; private StringBuilder neusp; public void kopiraj(Uredjaj sa, Uredjaj na) { String[] datoteke = sa.spisak(); neusp = new StringBuilder(); usp = 0; for (String dat: datoteke) { try { na.dodaj(sa.dohvati(dat).clone()); usp++; } catch(GUredj e) { if (neusp.length() > 0) neusp.append(","); neusp.append(dat); } } } public String toString() { return usp + "/[" + neusp + "]"; } }
// Program.java import uredjaji.*; public class Program { public static void main(String[] args) { try { Datoteka[] dat = new Datoteka [5]; for (int i = 0; i<5; i++) { byte[] sadrzaj = new byte [100]; dat[i] = new Datoteka("dat"+(i+1), sadrzaj); } CD cd = new CD("BASF", dat ); Disk hdd = new Disk("Seagate", 1000 ); Racunar r = new Racunar(); r.kopiraj(cd, hdd); System.out.println(r); r.kopiraj(hdd, cd); System.out.println(r); } catch(GKap g) { System.out.println(g); } } }
5/[] 0/[dat1,dat2,dat3,dat4,dat5]
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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