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

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

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

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

Пројектовати на језику Java пакет класа са следћим описом: Саставити на језику Java класу са потпрограмом за учитавање једне линије преко главног улаза и главним програмом који преко главног улаза прочита низ разноврсних линија, испише све прочитане податке (укључујући и дужине појединих линија), проналази линију са највећом дужином и испише податке о пронађеној линији. Дужина низа линија задаје се као параметар главног програма. На располагању стоји класа Citaj у безименом пакету која садржи заједничке методе за читање свих стандардних типова података.

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

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

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

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

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

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


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

// Tacka.java
package Linije;
public class Tacka {
  private double x, y;
  public Tacka () {}
  public Tacka (double xx, double yy) { x = xx; y = yy; }
  public double uzmiX () { return x; }
  public double uzmiY () { return y; }
  public String toString () { return "("+x+","+y+")"; }
  public static String toString (Tacka[] niz) {
    String s = "(";
    for (int i=0; i<niz.length; i++)
      { s += niz[i]; if (i < niz.length-1) s +=","; }
    return s + ")";
  }
}

// Linija.java
package Linije;
public abstract class Linija {
  private static int ukId = 0;
  protected int id = ++ukId;
  public abstract double duzina ();
  public String toString() {return Integer.toString(id);}
}

// Duz.java
package Linije;
public class Duz extends Linija {
  private Tacka A, B;
  public Duz (Tacka P, Tacka Q) { A = P; B = Q; }
  public Duz () {this(new Tacka(-1,-1), new Tacka(1,1));}
  public double duzina () {
    return Math.sqrt (Math.pow(A.uzmiX()-B.uzmiX(),2) +
                      Math.pow(A.uzmiY()-B.uzmiY(),2));
  }
  public String toString () { return super.toString()+"[duz: A"+A+", B"+B+"]"; }
}

// EIzlomljena.java
package Linije;
public class EIzlomljena extends Exception {
  EIzlomljena (String poruka) { super (poruka); }
}

// Izlomljena.java
package Linije;
public class Izlomljena extends Linija {
  protected Tacka[] temena;
  public Izlomljena (Tacka[] tt) throws EIzlomljena {
    if (tt == null)    throw new EIzlomljena("Nema niza temena!");
    if (tt.length < 3) throw new EIzlomljena ("Premalo temena!");
    temena = tt;
  }
  public double duzina () {
    double d = 0;
    for (int i=0; i<temena.length-1; i++)
      d += new Duz (temena[i], temena[i+1]).duzina();
    return d;
  }

  public String toString () {
    return super.toString() + "[izlomljena: " +
            Tacka.toString(temena) + "]";
  }
}

// Poligon.java
package Linije;
public class Poligon extends Izlomljena {
  public Poligon(Tacka[]tt)throws EIzlomljena {super(tt);}
  public double duzina () { return super.duzina() +
    new Duz(temena[0],temena[temena.length-1]).duzina();
  }
  public String toString () { return id + "[poligon: " +
                                     Tacka.toString(temena) + "]";
  }
}

// Test.java
import Linije.*;
public class Test {
  public static Linija citaj () throws EIzlomljena {
    System.out.print ("Vrsta linije (D, I, P, *)? ");
    char izb = Citaj.Char ();
    switch (izb) {
      case 'D': case 'd': {
        System.out.print ("Prva  tacka? ");
        Tacka A=new Tacka(Citaj.Double(),Citaj.Double());
        System.out.print ("Druga tacka? ");
        Tacka B=new Tacka(Citaj.Double(),Citaj.Double());
        return new Duz (A, B);
      } case 'I': case 'i': case 'P': case 'p': {
        System.out.print ("Broj temena? ");
        int n = Citaj.Int ();
        Tacka[] temena = new Tacka [n];
        for (int i=0; i<n; i++) {
          System.out.print ((i+1) + ". teme? ");
          temena[i] = new Tacka (Citaj.Double(), Citaj.Double());
        }
        return(izb=='I'||izb=='i')? new Izlomljena(temena)
                                  : new Poligon(temena);
      } default: return null;
    }
  }
  public static void main (String[] vpar) {
    Linija[] linije = new Linija [Integer.parseInt(vpar[0])];
    try {
      for (int i=0; i<linije.length; linije[i++]=citaj());
      System.out.println ("===================");
      for (int i=0; i<linije.length; i++)
        System.out.println (linije[i] + "  d = " + linije[i].duzina());
      System.out.println ("===================");
      double maxDuz = linije[0].duzina();
      int    maxInd = 0;
      for (int i=1; i<linije.length; i++) {
        double d =linije[i].duzina();
        if (d > maxDuz) { maxDuz = d; maxInd = i; }
      }
      System.out.println ("Najduza linija: " +
                          linije[maxInd]);
    } catch (EIzlomljena g) { System.out.println (g); }
  }
}

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

; zbir.asm
; di == adresa prvog sabirka i rezultata.
; si == drugog sabirka.
prog  segment para public 'code'
      assume cs:prog
      public zbir
zbir  proc near
      push ax
      push si
      push di
      mov  ax, [si]
      add  [di], ax
      mov  ax, [si]+2
      adc  [di]+2, ax
      mov  ax, [si]+4
      adc  [di]+4, ax
      mov  ax, [si]+6
      adc  [di]+6, ax
      pop  di
      pop  si
      pop  ax
      ret
zbir  endp
prog  ends
      end

; zbirt.asm
      extrn zbir:near, exit_f:far
podat segment para public 'data'
a     dw   4 dup (?)
b     dw   4 dup (?)
podat ends
prog  segment para public 'code'
assume cs:prog, ds:podat
pocet:mov  ax, podat
      mov  ds, ax
;;;;  Citanje podataka.
      mov  di, offset a
      mov  si, offset b
      call zbir  ; a += b
;;;;  Prikaz rezultata.
      call exit_f
prog  ends
stek  segment para stack 'stack'
      dw   64 dup (?)
stek  ends
      end  pocet

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

; void bitovi (char *niz, short k, short v) ;
prog  segment para public 'code'
      assume cs:prog
      public _bitovi
niz   equ  6
k     equ  10
v     equ  12
_bitovi proc far
      push bp
      mov  bp, sp
      push ds
      lds  bx, [bp].niz
      mov  ax, [bp].k
      mov  cx, ax
      shr  ax, 3
      add  bx, ax
      and  cx, 7
      mov  al, 1
      shl  al, cl
      test word ptr[bp].v,1
      jz   nula
jedan:or   [bx], al
      jmp  dalje
nula: xor  al, 0ffh
      and  [bx], al
dalje:pop  ds
      pop  bp
      ret
_bitovi endp
prog  ends
      end
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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