Elektrotehnicki fakultet, Beograd  Ласло Краус ПЈМП
Други парцијални испит
11. 7. 2003.

Аутори: Игор Тартаља (задаци) и Ласло Краус (задаци и решења)

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

Поставка задатка 1 (55 поена) ( решење | почетак)

Пројектовати на језику Java пакет класа са следћим описом:

Саставити на језику Java класу са главним програмом који прочита низ квадара, испише тај низ, затим учита посебан квадар и испише позицију тог квадра у низу. На располагању стоји класа Citaj у безименом пакету која садржи заједничке методе за читање свих стандардних типова података.

Поставка задатка 2 (10 поена) ( почетак)

Концизно одговорити на следећа питања:

а) Да ли је за интерфејс INesto исправан израз INesto i=new Object();. Образложити.

б) Која је разлика у односима статичке угнеждене класе и нестатичке унутрашње (inner) класе према спољашњој класи?

в) У чему је разлика између појма ослушкивача (listener) и адаптера у пакету AWT?

Поставка задатка 3 (20 поена) (< A HREF="#R3">решење | почетак)

Саставити потпрограм на симболичком машинском језику за IBM-PC за убацивање новог елемента у уређени низ 16-битних целих бројева тако да низ и даље буде уређен.

Саставити главни програм на симболичком машинском језику за IBM-PC који позива претходни потпрограм за један комплет података. Читање података и приказивање резултата довољно је назначити само у облику коментара.

Поставка задатка 4 (15 поена) ( решење | почетак)

Саставити потпрограм на симболичком машинском језику за IBM-PC, који може да се позива из програма писаног на језику C, за цикличко померање елемената низа 16-битних целих бројева за једно место улево. Користити велики меморијски модел (далеки позиви и далеки показивачи).


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


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

// Predmet.java
package predmeti;
public abstract class Predmet {
  private static int ukId;
  private int id = ++ukId;
  public abstract boolean manji (Predmet p);
  public boolean jednak (Predmet p) { return !manji(p) && !p.manji(this); }
  public String toString () { return Integer.toString (id); }
}

// GNizPun.java
package predmeti;
public class GNizPun extends Exception {}

// Niz.java
package predmeti;
public class Niz {
  private Predmet[] niz;
  private int n;
  public Niz (int k) { niz = new Predmet [k];}
  public Niz () { this (10); }
  public Niz dodaj(Predmet p) throws GNizPun {
    if (n == niz.length) throw new GNizPun ();
    int i=n-1;
    while (i>=0 && p.manji(niz[i])) { niz[i+1] = niz[i]; i--; }
    niz[i+1] = p; n++;
    return this;
  }
  public int poz (Predmet p) {
    int i=0;
    while (i<n && niz[i].manji(p)) i++;
    return (i<n && p.jednak(niz[i])) ? i : -1;
  }
  public String toString () {
    StringBuffer s = new StringBuffer ('[');
    for (int i=0; i<n; i++)
      s.append (niz[i])
       .append ((i<n-1)?',':']');
    return s.toString ();
  }
}

// Kvadar.java
package predmeti;
public class Kvadar extends Predmet {
  private double a, b, c;
  public Kvadar (double aa, double bb, double cc)
    { a = aa; b = bb; c = cc; }
  public double V () { return a * b * c; }
  public boolean manji (Predmet k) { return V() < ((Kvadar)k).V(); }
  public String toString ()
    { return "K" + super.toString() + '(' + a + ',' + b + ',' + c + ')'; }
}

// Test.java
import predmeti.*;
public class Test {
  public static void main (String[] varg) {
    System.out.print ("n? ");
    int n = Citaj.Int ();
    Niz niz = new Niz (n);
    try {
      for (int i=0; i<n; i++) {
        System.out.print ("niz[" +i +"]? ");
        niz.dodaj (new Kvadar(Citaj.Double(), Citaj.Double(), Citaj.Double()));
      }
      System.out.println ("Uredjeni niz: " +  niz);
      System.out.print ("Trazi se? ");
      Kvadar k = new Kvadar (Citaj.Double(), Citaj.Double(), Citaj.Double());
      int p = niz.poz (k);
      if (p >=0) System.out.println("poz= " + p);
        else System.out.println("Nema tog kvadra");
    } catch (Exception g) {
      System.out.println (g);
    }
  }
}

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

; ubaci.asm
; bx==@niz      cx==n
; dx==k
prog  segment para public 'code'
      assume cs:prog
      public ubaci
ubaci proc near
      push ax
      push bx
      push cx
      jcxz dalje
      add  bx, cx
      add  bx, cx
opet: mov  ax, [bx]-2
      cmp  ax, dx
      ble  dalje
      mov  [bx], ax
      sub  bx, 2
      loop opet
dalje:mov  [bx], dx
      pop  cx
      pop  bx
      pop  ax
      inc  cx
      ret
ubaci endp
prog  ends
      end

; ubacit.asm
      extrn ubaci:near
      extrn exit_f:farpodat segment para public 'data'
niz   dw   30 dup (?)
n     dw   ?
k     dw   ?
podat ends
prog  segment para  public 'code'
      assume cs:prog, ds:podat
pocet:mov  ax, podat
      mov  ds, ax
;;;;  Citanje podataka.
      mov  bx,offset niz
      mov  cx, n
      mov  dx, k
      call ubaci
      mov  k, cx
;;;;  Prikaz rezultata.
      call exit_f
prog  ends
stek  segment para stack 'stack'
      dw   64 dup (?)
stek  ends
      end  pocet

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

; void pomeri
;  (short *a, short n) ;
pomeri_text segment para public 'code'
      assume cs:pomeri_text
      public _pomeri
a     equ  6
n     equ  10
_pomeri proc far
      push bp
      mov  bp, sp
      push ds
      lds  bx, [bp].a
      mov  cx, [bp].n
      jcxz kraj
      dec  cx
      jcxz kraj
      mov  dx, [bx]
opet: mov  ax, [bx]+2
      mov  [bx], ax
      add  bx, 2
      loop opet
      mov  [bx], dx
kraj: pop  ds
      pop  bp
      ret
_pomeri endp
pomeri_text ends
      end
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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