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

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

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

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

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

Саставити на језику Java класу са главним програмом који ствара објекат променљиве x и објекат за израз x3-2x, испише текстуални облик тог израза као заглавље и после врши табелирање вредности тог израза за све вредности xminxxmax са кораком Δx. Параметри табелирања се достављају као параметри главног програма.

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

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

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

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

Код неког 16-битног генератора псеудослучајних бројева наредни број се формира од претходног броја тако да се комплемент водећа три бита ставља иза осталих битова почетног броја. На пример: од броја 0101111000011100 даје нови број 1111000011100101. Саставити потпрограм на симболичком машинском језику за IBM-PC, који може да се позива из програма писаног на језику C, за остваривање описаног генератора псеудослучајних бројева у облику void slbr(short *k). Користити компактни меморијски модел (блиски позиви и далеки показивачи, сегмент за код је _text).


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


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

// Izraz.java
package izrazi;
public interface Izraz {
  double vrednost ();
}

// Konst.java
package izrazi;
public class Konst implements Izraz {
  private final double vrednost;
  public Konst (double v) { vrednost = v; }
  public double vrednost () { return vrednost; }
  public String toString () { return Double.toString(vrednost); }
}

// GImePostoji.java
package izrazi;
public class GImePostoji extends Exception {}

// Prom.java
package izrazi;
public class Prom implements Izraz {
  private String ime;
  private double vrednost;
  private static class Elem {
    Prom prom; Elem sled;
    Elem (Prom p) {prom = p; }
  }
  private static Elem prvi, posl;
  public static Prom nadji (String i) {
    for (Elem tek=prvi; tek!=null; tek=tek.sled)
      if (tek.prom.ime.equals(i)) return tek.prom;
    return null;
  }
  public Prom (String i, double v)
    throws GImePostoji {
    if (nadji (i) != null) throw new GImePostoji ();
    ime = i; vrednost = v;
    Elem novi = new Elem (this);
    if (prvi == null) prvi = novi;
      else            posl.sled = novi;
    posl = novi;
  }
  public Prom (String i) throws GImePostoji { this (i, 0); }
  public double vrednost () { return vrednost; }
  public void postavi (double v) { vrednost = v; }
  public String toString () { return ime; }
}


// Zbir.java
package izrazi;
public class Zbir implements Izraz {
  private Izraz a, b;
  public Zbir (Izraz aa, Izraz bb) { a=aa; b=bb; }
  public double vrednost () { return a.vrednost () + b.vrednost (); }
  public String toString () { return "(" + a + '+' + b + ')'; }
}

// Proizv.java
package izrazi;
public class Proizv implements Izraz {
  private Izraz a, b;
  public Proizv (Izraz aa, Izraz bb) { a=aa; b=bb; }
  public double vrednost () { return a.vrednost () * b.vrednost (); }
  public String toString () { return "(" + a + '*' + b + ')'; }
}

// Stepen.java
package izrazi;
public class Stepen implements Izraz {
  private Izraz a, b;
  public Stepen (Izraz aa, Izraz bb) { a=aa; b=bb; }
  public double vrednost () { return Math.pow(a.vrednost(),b.vrednost()); }
  public String toString () { return "(" + a + '^' + b + ')'; }
}

// Test.java
import izrazi.*;
public class Test {
  public static void main (String[] vpar) {
    double xmin = Double.parseDouble(vpar[0]),
           xmax = Double.parseDouble(vpar[1]),
           dx   = Double.parseDouble(vpar[2]);
    Prom x = null;
    try { x = new Prom ("x"); } catch (GImePostoji g) {}
    Izraz poli = new Zbir (
                   new Stepen (x, new Konst (3)),
                   new Proizv (new Konst (-2), x)
                 );
    System.out.println ("x\t " + poli);
    for (double xx=xmin; xx<=xmax; xx+=dx) {
      x.postavi (xx);
      System.out.println (xx+"\t"+poli.vrednost());
    }
  }
}

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

; minmax.asm
; bx==&niz      ax==min
; cx==n         dx==max
prog  segment para public 'code'
      assume cs:prog
      public minmax
minmax proc near
      push bx
      push cx
      jcxz kraj
      mov  ax, [bx]
      mov  dx, ax
      dec  cx
      jcxz kraj
opet: add  bx, 2
      cmp  ax, [bx]
      lge  max
      mov  ax, [bx]
      jmp  dalje
max:  cmp  dx, [bx]
      jge  dalje
      mov  dx, [bx]
dalje:loop opet
kraj: pop  cx
      pop  bx
      ret
minmax endp
prog  ends
      end

; minmaxt.asm
      extrn minmax:near
      extrn exit_f:far
podat segment para public 'data'
niz   dw   30 dup (?)
n     dw   ?
min   dw   ?
max   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
      call minmax
      mov  min, ax
      mov  max, dx
;;;;  Prikaz rezultata.
      call exit_f
prog  ends
stek  segment para
           stack 'stack'
      dw   64 dup (?)
stek  ends
      end  pocet

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

; void slbr (short *k) ;
_text segment para public 'code'
      assume cs:_text
      public _slbr
k     equ  4
_slbr proc near
      push bp
      mov  bp, sp
      push ds
      lds  bx, [bp].k
      mov  ax, [bx]
      rol  ax, 3
      xor  ax, 7
      mov  [bx], ax
      pop  ds
      pop  bp
      ret
_slbr endp
_text ends
      end
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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