Ласло Краус |
СИ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.