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

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

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

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

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

а) Да ли је у Јави дозвољено (1) да се интерфејс изведе из (да прошири) више интерфејса и (2) да класа имплементира више интерфејса и зашто?

б) Која је основна разлика између статичке угнежђене класе и унутрашње класе?

в) Које методе класе Object и на који начин се користе за комуникацију између нити?

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

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

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


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


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

// 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
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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