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

Аутори: Владан Девеџић (задаци) и Ласло Краус (задаци и решења)

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

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

Предмети имају специфичну тежину, сфере су предмети задати са полупречником, а квадрови су предмети са задатим дужинама ивица. Пројектовати систем класа на језику C++ за унифицирану обраду набројаних врста премета. Предвидети иницијализацију са јединичним подразумеваним вредностима параметара, израчунавање запремине, израчунавање тежине, читање из неког улазног тока (оператор >>) и писање у неки излазни ток (оператор <<).

Саставити главни програм на језику C++ који преко главног улаза прочита податке о одређеном броју предмета и после тога на главном излазу испише податке о предметима чије су тежине изнад просечне.

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

Саставити потпрограм на симболичком машинском језику за IBM-PC којим се за низ A од 2n 8-битних целих бројева обезбеђује да важи a2ia2i+1 за i=0,1,2,...,n-1.

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

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

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

Саставити главни програм на језику C++ који исписује табелу k! за 1≤kkmax.


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


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

// 990916.h

#include <iostream.h>

class Predmet {
  double ro;
public:
  Predmet (double aro=1) { ro = aro; }
  virtual double v () const =0;
  double q () const { return v () * ro; }
protected:
  void citaj (istream &ad)       { ad >> ro; }
  void pisi  (ostream &ad) const { ad << ro; }
  friend istream & operator>> (istream &ad, Predmet &ap)
    { ap.citaj (ad); return ad; }
  friend ostream & operator<< (ostream &ad, const Predmet &ap)
    { ap.pisi (ad); return ad ;}
};

class Sfera: public Predmet {
  double r;
public:
  Sfera (double aro=1, double ar=1): Predmet (ro) { r = ar; }
  double v() const { return 4./3 * r*r*r * 3.14159; }
private:
  void citaj (istream &ad) { Predmet::citaj (ad); ad >> r; }
  void pisi  (ostream &ad) const
    { ad << "sfera["; Predmet::pisi (ad); ad << ',' << r << ']'; }
};

class Kvadar: public Predmet {
  double a, b, c;
public:
  Kvadar (double aro=1, double aa=1, double ab=1, double ac=1)
    : Predmet (aro) { a = aa; b = ab; c = ac; }
  double v () const { return a * b * c; }
private:
  void citaj (istream &ad ){ Predmet::citaj (ad); ad >> a >> b >> c; }
  void pisi  (ostream &ad) const {
    ad << "sfera["; Predmet::pisi (ad);
    ad << ',' << a << ',' << b << ',' << c << ']';
  }
};


// 990916t.C

#include "990916.h"
#include <iostream.h>
#include <stdlib.h>

void main () {
  Predmet *p[100]; double q=0; int i, n=0;
  for ( ; ; ) {
    char tip; cin >> tip;
  if (tip == '.') break;
    switch (tip) {
      case 's': case 'S': p[n++] = new Sfera;  break;
      case 'k': case 'K': p[n++] = new Kvadar; break;
    }
    cin >> *p[n]; q += p[n]->q ();
  }
  q /= n;
  for (int i=0; i<n; i++) if (p[i]->q () > q) cout << *p[i] << endl;
}

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

; si == &A
; cx == n

prog  segmant para public 'code'
      assume cs:prog
      public radi

radi  proc near;
      jcxz kraj
      push ax
      push cx
      push dx
      push si
      push di
      mov  di, si
      cld
opet: lodsw
      cmp  al, ah
      jle  dalje
      mov  dl, al
      mov  al, ah
      mov  ah, dl
dalje:stosw
      loop opet
      pop  di
      pop  si
      pop  dx
      pop  cx
      pop  ax
kraj: ret
radi  endp
prog  ends
      end


      extrn radi:near, exit_f:far

podat segment para public 'data'
a     db    100 dup (?)
n     dw    ?
podat ends

prog  segment para public 'code'
      assume cs:prog, ds:podat
pocet:mov  ax, podat;
      mov  ds, ax
      mov  es, ax
;;;;  Citanje podataka.
      mov  si, offset a
      mov  cx, n
      call radi
;;;;  Prikaz rezultata.
      call exit_f
prog  ends

stek  segment para stack 'stack'
      dw   64 dup (?)
stek  ends
      end  pocet

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

; void mnozi (char *a, short n, unsigned char k);

_text segment para public 'code'
      assume cs:_text
      public _mnozi

a     equ  4
n     equ  8
k     equ  10

_mnozi proc near
      push bp
      mov  bp, sp
      push si
      push di
      lds  si, [bp].a
      les  di, [bp].a
      mov  cx, [bp].n
      mov  dh, [bp].k
      xor  dl, dl ; prenos
      mov  bl, 10
opet: lodsb
      mul  dh
      add  al, dl
      adc  ah, 0
      div  bl
      mov  dl, al
      mov  al, ah
      stosb
      loop opet
      pop  di
      pop  si
      pop  bp
      ret
_mnozi endp
_text ends
      end


#include <iostream.h>

const short N = 60;

extern "C" void mnozi (char *a, short n, unsigned char k);

void main () {
  char a[N]; short kmax;
  cout << "kmax? "; cin >> kmax;
  a[0] = 1;
  for (int i=1; i<N; a[i++]=0);
  for (unsigned char k=1; k<kmax; k++) {
    mnozi (a, N, k);
    cout << (int)k << ' ';
    for (i=N-1; i>=0; cout << (int)a[i--]); cout << endl;
  }
}
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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