Ласло Краус |
СИ2ОО2 Други колоквијум 16. 5. 2008. |
|---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) Да ли је у Јави дозвољено (1) да се интерфејс изведе из (да прошири) више интерфејса и (2) да класа имплементира више интерфејса и зашто?
б) Која је основна разлика између статичке угнежђене класе и унутрашње класе?
в) Које методе класе Object и на који начин се користе за комуникацију између нити?
Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):
(10 поена) Написати на језику Java класу која садржи функцију за стварање матрице задатих димензија чији су елементи случајни једноцифрени цели бројеви и главну функцију која направи две матрице и на главном излазу испише производ те две матрице. Димензије матрица треба да буду константе (не треба ништа учитавати).
// GNumericka.java
package aritmetika;
public class GNumericka extends Exception {
public String toString() { return "*** Numericka greska!"; }
}
// Numericko.java
package aritmetika;
public interface Numericko extends Cloneable {
Object clone();
Numericko dodaj( Numericko b) throws GNumericka;
Numericko proizvod( Numericko b) throws GNumericka;
String toString();
}
// Ceo.java
package aritmetika;
public class Ceo implements Numericko {
private int i;
public Ceo( int ii) { i = ii; }
public Object clone() {
try { return super.clone(); }
catch( CloneNotSupportedException g) { return null; }
}
public Numericko dodaj( Numericko b) { i += ((Ceo)b).i; return this; }
public Numericko proizvod( Numericko b) { return new Ceo( i * ((Ceo)b).i); }
public String toString() { return Integer.toString( i); }
}
// Matrica.java
package aritmetika;
public class Matrica implements Numericko {
private Numericko[][] matr; private int m, n;
public Matrica( int mm, int nn) { matr = new Numericko [m=mm][n=nn]; }
public Matrica postavi( int i, int j, Numericko a)
{ matr[i][j] = a; return this; }
public Object clone() {
try {
Matrica rez = (Matrica)super.clone();
rez.matr = new Numericko [m][n];
for (int i=0; i<m; i++)
for (int j=0; j<n; j++)
rez.matr[i][j] = (Numericko)matr[i][j].clone();
return rez;
} catch( CloneNotSupportedException g) { return null; }
}
public Numericko dodaj(Numericko bb) throws GNumericka {
Matrica b = (Matrica)bb;
if (m!=b.m && n!=b.n) throw new GNumericka();
for (int i=0; i<m; i++)
for (int j=0; j<n; j++)
matr[i][j].dodaj( b.matr[i][j]);
return this;
}
private static class Mnozac extends Thread {
Matrica a, b; int i, k; Numericko cik;
Mnozac( Matrica aa, Matrica bb, int ii, int kk)
{ a = aa; b = bb; i = ii; k = kk; start(); }
public void run () {
try {
cik = a.matr[i][0] .proizvod( b.matr[0][k]);
for (int j=1; j<a.n; j++)
cik.dodaj( a.matr[i][j] .proizvod( b.matr[j][k]));
} catch (GNumericka g) {}
}
Numericko cik() { return cik; }
}
public Numericko proizvod (Numericko bb) throws GNumericka {
Matrica b = (Matrica)bb;
if (n != b.m) throw new GNumericka();
Matrica c = new Matrica (m, b.n);
Mnozac[][] mno = new Mnozac[c.m][c.n];
for (int i=0; i<c.m; i++)
for (int k=0; k<c.n; k++)
mno[i][k] = new Mnozac (this, b, i, k);
for (int i=0; i<c.m; i++)
for (int k=0; k<c.n; k++) {
try { mno[i][k].join(); } catch (InterruptedException g) {}
c.matr[i][k] = mno[i][k].cik();
}
return c;
}
public String toString() {
StringBuffer s = new StringBuffer();
for (int i=0; i<m; i++)
for (int j=0; j<n; j++) {
s.append( j>0 ? ' ' : '\n');
s.append( matr[i][j]);
}
return s.toString();
}
}
// Program.java
import aritmetika.*;
public class Program {
public static Matrica napravi( int m, int n) {
Matrica matr = new Matrica( m, n);
for (int i=0; i<m; i++)
for(int j=0; j<n; j++)
matr.postavi( i, j, new Ceo((int)(10*Math.random())));
return matr;
}
public static void main( String[] varg) {
try {
Matrica a = napravi( 2, 3);
Matrica b = napravi( 3, 4);
Matrica c = (Matrica)a.proizvod( b);
System.out.println( a);
System.out.println( b);
System.out.println( c);
} catch( GNumericka g) {
System.out.println( g);
}
}
}
2 7 0
1 2 7
6 6 7 4
9 3 2 5
8 2 4 2
75 33 28 43
80 26 39 28
(⇒ почетак)
Copyright © 2010, Laslo Kraus
Последња ревизија: 30.8.2010.