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

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

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

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

Податке о студентима чине име и презиме (знаковни низ променљиве дужине), број индекса (велики цео број), број оцена на испитима и низ оцена задатог капацитета. Пројектовати класу на језику C++ за студенте. Предвидети иницијализацију парзног објекта (параметар је капацитет низа оцена), уништавање објекта, смештање и дохватање имена и презимена, смештање и дохватање броја индекса, додавање нове оцене (оператор +=), дохватање броја оцена (унарни оператор +), дохватање оцене са задатим редним бројем (оператор []) и израчунавање средње оцене (унарни оператор ~).

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

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

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

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

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

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

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


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


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

// 980712.h

class Student {
  char *iime; long iind; int kap, br, *oc;
public:
  Student (int kk);
  ~Student ();
  void ime (const char *ii);
  const char *ime () const { return iime; )
  void ind (long ii) { iind = ii; );
  long ind () const { return iind; }
  Student & operator+= (int oo);
  int operator+ () const { return br; }
  int & operator[] (int i) const { return (i>=0 && i<br) ? oc[i] : 0; );
  double operator~ () const;
};


// 980712.C

#include "980712.h"
#include <string.h>
#include <stdlib.h>

Student::Student (int kk) {
  iime = 0; iind = br = 0;
  if ((oc = new int[kap=kk]) == 0) exit(1);
}

Student::~Student () { delete [] iime; delete [] oc; }

void Student::ime (const char *ii) {
  delete [] iime;
  if ((iime = new char [strlen(ii)+1]) == 0) exit(2);
  strcpy (iime, ii);
}

Student & Student::operator+= (int oo) {
  if (br == kap) exit (3);
  oc[br++] = oo; return *this;
}

double Student::operator~ () const {
  double sr = 0;
  if (br > 0) {
    for (int i=0; i<br; sr+=oc[i++]);
    sr /= br;
  }
  return br;
}


// 970814t.C

#include "980712.h"
#include <iostream.h>;

void main () {
  Student *s[100]; int n; cin >> n;
  for (int i=0; i<n; i++) {
    Student *t = new Student (30);
    char ime[50]; long ind; cin >> ime, ind;
    t->ime (ime); t->ind (ind);
    int br, oc; cin >> br;
    for (int j=0; j<br; j++) { cin >> oc; *t += oc; }
    for (j=i; j>0 && ~(*s[j-1])<~(*t); j--) s[j] = s[j-1];
    s[j] = t;
  }
  for (i=0; i<n; i++) cout << s[i]->ime() << endl;
}

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

; si == &A
; di == &B
; cx == n

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

radi  proc near
      push ax
      push cx
      push dx
      push si
      push di
      jcxz kraj
      cld
opet  lodsw
      mov  dx, ax
      add  al, dh
      sub  ah, dl
      neg  ah
      stosw
      loop opet
kraj: pop  di
      pop  si
      pop  dx
      pop  cx
      pop  ax
      ret
radi  endp
prog  ends
      end


      extrn radi:near,exit_f:far

podat segment para public 'data'
a     db   100 dup (?)
b     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  di, offset b
      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 razvrst (short k, short *a, short  na,
      short *b, short *nb, short *c, short *nc);

pp_text segment para public 'code'
      assume cs:pp_text
      public _razvrst

k     equ  6
a     equ  8
na    equ  10
b     equ  12
nb    equ  14
c     equ  16
nc    equ  18

_razvrst proc far
      push bp
      mov  bp, sp
      push si
      push di
      mov  dx, [bp].k
      mov  bx, [bp].a
      mov  cx, [bp].na
      mov  si, [bp].b
      mov  di, [bp].c
      jcxz kraj
opet: mov  ax, [bx]
      add  bx, 2
      cmp  ax, dx
      bgt  veci
      mov  [si], ax
      add  si, 2
      jmp  dalje
veci: mov  [di], ax
      add  di, 2
dalje:loop opet
kraj: sub  si, [bp].b
      shr  si, 1
      mov  [bp].nb, si
      sub  di, [bp].c
      shr  di, 1
      mov  [bp].nc, di
      pop  di
      pop  si
      pop  bp
      ret
_razvrts endp
pp_text ends
      end


#include <iostream.h>
extern "C" void razvrst (short k, short *a, short  na,
             short *b, short &nb, short *c, short &nc);

main () { short k, a[100], na, b[100], nb, c[100], nc;
  while(1) {
    cout << "na? "; cin >> na;
  if (na < 0) break;
    cout << "A? "; for (int i=0; i<na; cin >> a[i++]);
    cout << "k? "; cin >> k;
    razvrst (k, a, na, b, nb, c, nc);
    cout << "B= "; for (i=0; i<nb; cout << b[i++] << ' ');
    cout << endl;
    cout << "C= "; for (i=0; i<nc; cout << c[i++] << ' ');
    cout << endl << endl;
  }
}

( почетак)


         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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