Ласло Краус |
СИ2ОО2 Други колоквијум 9. 5. 2009. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Да ли класа може да имплементира више интерфејса и зашто?
б) Шта је "секундарни this"?
в) Које је ограничење за методу из које се позивају wait() или notify(). Зашто?
Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):
"%6.2f".
(10 поена) Написати на језику Java програм који створи матрицу са 4 врсте и 6 колона, напуни је случајним једноцифреним децималним целобројним вредностима, испише матрицу на главном излазу, затражи обраду усредњавања елемената с њиховим суседима и испише измењену матрицу на главном излазу.
// 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
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.