Elektrotehnicki fakultet, Beograd  Ласло Краус СИ2ОО2
Други колоквијум
9. 5. 2009.

Аутори: Игор Тартаља и Ласло Краус

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

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

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

а) Да ли класа може да имплементира више интерфејса и зашто?

б) Шта је "секундарни this"?

в) Које је ограничење за методу из које се позивају wait() или notify(). Зашто?

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

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

(10 поена) Написати на језику Java програм који створи матрицу са 4 врсте и 6 колона, напуни је случајним једноцифреним децималним целобројним вредностима, испише матрицу на главном излазу, затражи обраду усредњавања елемената с њиховим суседима и испише измењену матрицу на главном излазу.


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


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

// GIndeks.java

package matrice;

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

// Matrica.java

package matrice;

public class Matrica implements Cloneable {
  private double[][] matr;
  private String form = "%6.2f";

  public Matrica( int vrs, int kol) { matr = new double [vrs][kol]; }

  public double vrs() { return matr.length; }

  public double kol() {return matr[0].length;}

  public Matrica postavi( int v, int k, double b) throws GIndeks {
    if (v<0 || v>=matr.length || k<0 || k>=matr[0].length)
      throw new GIndeks();
    matr[v][k] = b; return this;
  }

  public double dohvati( int v, int k) throws GIndeks {
    if (v<0 || v>=matr.length || k<0 || k≶=matr[0].length) throw new GIndeks();
    return matr[v][k];
  }

  public Matrica clone() {
    try {
      Matrica m = (Matrica)super.clone();
      m.matr = matr.clone();
      for (int v=0; v<matr.length; v++) m.matr[v] = matr[v].clone();
      return m;
    } catch (CloneNotSupportedException g) { return null; }
  }

  public String toString() {
    String s = "";
    for (int v=0; v<matr.length; v++) {
      for (int k=0; k<matr[0].length; k++)
        s += String.format( form, matr[v][k]);
      s += '\n';
    }
    return s;
  }
}

// Funkcija.java

package matrice;

public interface Funkcija {
  double fun( double[] niz) throws InterruptedException;
}

// SrVred.java
package matrice;

public class SrVred implements Funkcija {
  public double fun(double[] niz) throws InterruptedException {
    double s = 0;
    for (double b: niz) {
      s += b;
      if (Thread.interrupted()) throw new InterruptedException();
    }
    return s / niz.length;
  }
}

// Obrada.java

package matrice;

public class Obrada {
  private Matrica matr;

  public Obrada( Matrica m) { matr = m; }

  public void obradi( Funkcija fun) {
    try {
      Radi[][] r = new Radi [matr.vrs()][matr.kol()];
      for (int v=0; v<matr.vrs(); v++)
        for (int k=0; k<matr.kol(); k++)
          r[v][k] = new Radi(matr, v, k, fun);
      for (int v=0; v<matr.vrs(); v++)
        for (int k=0; k<matr.kol(); k++)
          try { r[v][k].join(); }
            catch (InterruptedException g) {}
      for (int v=0; v<matr.vrs(); v++)
        for (int k=0; k<matr.kol(); k++)
          matr.postavi(v, k, r[v][k].rez());
    } catch (GIndeks g) {}
  }

  private class Radi extends Thread {
    Matrica matr;
    int vrs, kol;
    Funkcija fun;
    double rez;

    Radi( Matrica m, int v, int k, Funkcija f)
      { matr = m; vrs = v; kol = k; fun = f; start(); }

    public void run() {
      try { int n = 4;
        if (vrs==0 || vrs==matr.vrs()-1) n--;
        if (kol==0 || kol==matr.kol()-1) n--;
        double[] niz = new double [n+1];
        int[] x = {0, 0,  0,  1, -1};
        int[] y = {0, 1, -1,  0,  0};
        int j = 0;
        for (int i=0; i<x.length; i++) {
          try {
            double b = matr.dohvati(vrs+x[i], kol+y[i]);
            niz[j++] = b;
          } catch (GIndeks g) {}
        }
        rez = fun.fun(niz);
      } catch (InterruptedException g) {}
    }

    public double rez() { return rez; }
  }
}

// Program.java

import matrice.*;

public class Program {
  public static void main( String[] vpar) {
    int vrs = 4, kol = 6;
    Matrica matr = new Matrica( vrs, kol);
    try {
      for (int v=0; v<vrs; v++)
        for (int k=0; k<kol; k++)
          matr.postavi( v, k, (int)(Math.random()*10));
    } catch (GIndeks g) {};
    System.out.println( matr);
    Obrada obr = new Obrada( matr);
    obr.obradi(new SrVred());
    System.out.println( matr);
  }
}

5,00 0,00 4,00 5,00 8,00 5,00 0,00 2,00 9,00 5,00 8,00 9,00 8,00 2,00 0,00 6,00 0,00 9,00 0,00 1,00 3,00 1,00 8,00 5,00 1,67 2,75 4,50 5,50 6,50 7,33 3,75 2,60 4,00 6,60 6,00 7,75 2,50 2,60 4,00 2,40 6,20 5,75 3,00 1,50 1,25 4,50 3,50 7,33
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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