Elektrotehnicki fakultet, Beograd  Ласло Краус ПЈМП
Први парцијални испит
9. 3. 2000.

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

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

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

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

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

Дискретна случајна променљива r узима вредности из скупа {A,B,C,D} са следећим вероватноћама: PA=0.55, PB=0.23, PC=0.14, PD=0.08. Расположиви генератор псеудослучајних бројева генерише равномерну (униформну) расподелу бројева у опсегу [0,1].

а) Графички представити генераторску функцију g(u) такву да се за задату вредност u генерише псеудослучајан број r према задатој расподели.

б) Одредити вредност r за генерисани број u = 0.8.

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

Симболи A, B, C и D кодирају се са по два бита 00, 01, 10 и 11. Извршити компресију низа симбола ABCB CABC BDBC ADBC применом LZW поступка.

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

Одговорити концизно (углавном по једна реченица) на следећа питања:

а) Да ли безбедност криптосистема треба да се заснива на тајности алгоритма кодирања и зашто?

б) Шта су супституциони кодери? Навести пример супституционог кодирања поруке: "Положио".

в) Да ли је шифровање тајним кључем погодно за чување тајних података и зашто?

г) Да ли се JPEG компресија може успешно применити више пута на податке који су већ компримовани JPEG методом? Какве су последице?

д) Зашто се при JPEG компресији вредности пиксела не представљају у RGB формату?


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


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

// p1999_00_1a.h

#include <iostream.h>

class Podat {
public:
  virtual ~Podat () {}
  virtual Podat *kopija () const = 0;
private:
  virtual void pisi (ostream &dd) const = 0;
  friend ostream & operator<< (ostream &dd, const Podat &pp)
    { pp.pisi (dd); return dd; }
};

class Skal: public Podat {
  double vredn;
public:
  Skal (double vv=0) { vredn = vv; }
  Podat *kopija () const { return new Skal (*this); }
  double operator+ () const { return vredn; }
private:
  void pisi (ostream &dd) const { dd << vredn; }
};

class Niz: public Podat {
  Podat **niz; int kap;
  void kopiraj (const Niz &nn);
  void brisi () { ~*this; delete [] niz; }
public:
  Niz (double kk=10);
  Niz (const Niz &nn) { kopiraj (nn); }
  ~Niz () { brisi (); }
  Podat *kopija () const { return new Niz (*this); }
  Niz & operator= (const Niz &nn) {
    if (this != &nn) { brisi (); kopiraj (nn); }
    return *this;
  }
  int operator+ () const { return kap; }
  Podat & operator[] (int ind) {
    if (ind < 0 || ind >= kap) throw 1;
    if (niz[ind] == 0) throw 2;
    return *niz[ind];
  }
  Niz & operator+= (const Podat &pp);
  Niz & operator-= (int ind) {
    if (ind < 0 || ind >= kap) throw 1;
    delete niz[ind]; niz[ind = 0;
    return *this;
  }
  void operator~ ();
private:
  void pisi  (ostream &dd) const ;
};


// p1999_00_1a.cpp

#include "p1999_00_1a.h"

Niz::Niz (double kk) {
  niz = new Podat* [kap = kk];
  for (int i=0; i<kap; niz[i++]=0);
}

void Niz::kopiraj (const Niz &nn) {
  niz = new Podat* [kap = nn.kap];
  for (int i=0; i<kap; i++)
    niz[i] = nn.niz[i] ? nn.niz[i]->kopija() : 0;
}

Niz & Niz::operator+= (const Podat &pp) {
  for (int i=0; i<kap && niz[i]; i++);
  if (i == kap) throw 3;
  niz[i] = pp.kopija ();
  return *this;
}

void Niz::operator~ () {
  for (int i=0; i<kap; i++) { delete niz[i]; niz[i] = 0; }
}

void Niz::pisi  (ostream &dd) const {
  dd << '[';
  for (int i=0; i<kap; i++) {
    if (niz[i]) dd << *niz[i];
    if (i < kap-1) dd << ',';
  }
  dd << ']';
}


// p1999_00_1at.cpp

#include "klase.h"
#include <iostream.h>

void main () {
  while (1) {
    try {
      cout << "\nBroj podataka? "; int n; cin >> n;
  if (n < 0) break;
      Niz a (n);
      for (int i=0; i<n; i++) {
        cout << "Vrsta i vrednost podatka (Skalar, Niz)? ";
        char vrs; cin >> vrs;
        switch (vrs) {
          case 's': case 'S': {
            double s; cin >> s;
            a += Skal (s); break;
          }
          case 'n': case 'N': {
            int n; cin >> n; Niz b (n);
            for (int i=0; i<n; i++) {
              double s; cin >> s;
              b += Skal (s);
            }
            a += b; break;
          }
        }
      }
      cout << "Niz podataka: " << a << endl;
    } catch (int g) { cout << "\n*** " << g << " ***\n"; }
  }
}

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

Добијени код: 0000 0101 0101 1001 1000 1101 1110 1000 10 (34 бита).

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

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