VISER, Beograd
Ласло Краус
Објекнто програмирање 2 - колоквијуми
Први колоквијум
26. 11. 2010

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

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

Написати на језику Java класу са функцијом за читање с главног улаза једног потрошача произвољног типа и главном функцијом која читајући податке с главног улаза направи један извор, додаје потрошаче док се не прочита "празан" потрошач и испише на главном излазу завршно стање извора. На располагању стоји класа Citaj у пакету usluge која садржи заједничке методе за читање свих стандардних типова података.


Напомене (садржај)


Решење задатка (поставка | садржај)

// Potrosac.java

package potrosaci;

public abstract class Potrosac implements Cloneable {
  public abstract double snaga();

  public Potrosac clone() {
    try { return (Potrosac)super.clone(); }
      catch (CloneNotSupportedException g) { return null; }
  }

  public abstract String toString();
}

// Uredjaj.java

package potrosaci;

public class Uredjaj extends Potrosac {
  private String naz;
  private double sna;

  public Uredjaj( String n, double s) { naz = n; sna = s; }

  public double snaga() { return sna; }

  public String toString() { return naz + "(" + sna + ")"; }
}

// Grupa.java

package potrosaci;

public class Grupa extends Potrosac {
  private Potrosac[] niz = new Potrosac [5];
  private int n = 0;
  private double sna = 0;

  public Grupa dodaj( Potrosac p) {
    if (n == niz.length) {
      Potrosac[] pom = new Potrosac [n + 5];
      for (int i=0; i<n; pom[i]=niz[i++]);
      niz = pom;
    }
    niz[n++] = p; sna += p.snaga(); return this;
  }

  public double snaga() { return sna; }

  public Grupa clone() {
    Grupa g = (Grupa)super.clone();
    g.niz = niz.clone();
    for (int i=0; i<n; g.niz[i]=niz[i++].clone());
    return g;
  }

  public String toString() {
    StringBuffer s = new StringBuffer( '[');
    for (int i=0; i<n; i++) {
      if (i>0) s.append(',');
      s.append(niz[i]);
    }
    return s.append( ']').toString();
  }
}

// GIndeks.java

package potrosaci;

public class GIndeks extends Exception {
  public String toString() { return "*** Nedozvoljen indeks!"; }
}

// GPreopt.java

package potrosaci;

public class GPreopt extends Exception {
  public String toString() {return "*** Preopterecen izvor!"; }
}

// Izvor.java

package potrosaci;

public class Izvor {
  private Potrosac[] niz;
  private double sna, opt;

  public Izvor( double s, int k) { niz = new Potrosac [k]; sna = s; }

  public double snaga() { return sna; }

  public double opterecenje() { return opt; }

  public int brMesta() { return niz.length; }

  public Izvor prikljuci( Potrosac p, int i) throws GIndeks, GPreopt {
    if (i<0 || i>=niz.length) throw new GIndeks();
    if (niz[i] != null) { opt -= niz[i].snaga(); niz[i] = null; }
    if (p != null) {
      double s = p.snaga();
      if (opt+s > sna) throw new GPreopt();
      niz[i] = p; opt += s;
    }
    return this;
  }

  public String toString() {
    StringBuffer s = new StringBuffer();
    s.append( opt).append( '/').append( sna).append( '\n');
    for (int i=0; i<niz.length; i++) {
      s.append( i).append( ": ");
      if (niz[i] != null) s.append( niz[i]);
        else s.append( "<< prazan >>");
      s.append( '\n');
    }
    return s.toString();
  }
}

// Program.java

import potrosaci.*;
import usluge.Citaj;

public class Program {
  private static Potrosac citaj() {
    System.out.print( "Tip (U,G,.)? ");
    switch (Citaj.Char()) {
      case 'u': case 'U': {
        System.out.print( "Vrsta? "); String v = Citaj.String();
        System.out.print( "Snaga? "); double s = Citaj.Double();
        return new Uredjaj( v, s);
      }
      case 'g': case 'G': {
        Grupa g = new Grupa();
        Potrosac p;
        while ((p = citaj()) != null) g.dodaj( p);
        return g;
      }
      default: return null;
    }
  }

  public static void main(String[] args) {
    System.out.print( "Snaga izvora? "); double s = Citaj.Double();
    System.out.print( "Broj prikljucaka? "); int k = Citaj.Int();
    Izvor izv = new Izvor(s,k);
    while (true) {
      try {
        Potrosac p = citaj();
        if (p == null) break;
        System.out.print( "Prikljucak? ");
        izv.prikljuci( p, Citaj.Int());
      } catch (Exception g) { System.out.println( g); }
    }
    System.out.print( izv);
  }
}

Snaga izvora? 1000 Broj prikljucaka? 5 Tip (U,G,.)? u Vrsta? sijalica Snaga? 100 Prikljucak? 3 Tip (U,G,.)? g Tip (U,G,.)? u Vrsta? tv Snaga? 300 Tip (U,G,.)? u Vrsta? radio Snaga? 150 Tip (U,G,.)? . Prikljucak? 1 Tip (U,G,.)? u Vrsta? reso Snaga? 1000 Prikljucak? 7 *** Nedozvoljen indeks! Tip (U,G,.)? u Vrsta? reso Snaga? 1000 Prikljucak? 0 *** Preopterecen izvor! Tip (U,G,.)? . 550.0/1000.0 0: << prazan >> 1: tv(300.0),radio(150.0)] 2: << prazan >> 3: sijalica(100.0) 4: << prazan >>
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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