FIIFO 5 - Examen de C++ - Décembre 96

Durée: 2 heures Documents autorisés: tous

Problème

Barème indicatif: 12 points

Etant donnée la classe "séquence bornée" suivante:

#define PURE_VIRTUAL (0)

class boundedSequence {
    public:
      boundedSequence(unsigned size);                  // A sequence of at most size elements
      ~boundedSequence();
      virtual void put(int)      = PURE_VIRTUAL;       // Precondition: !full()
      virtual bool full() const  = PURE_VIRTUAL;
      virtual bool empty() const = PURE_VIRTUAL;
      virtual int get()          = PURE_VIRTUAL;       // Precondition: !empty()
      
    protected:
      void display(unsigned from, unsigned to);        // Precondition: from <= to && to < _size

    protected:
      int *_data;
      unsigned _size;
};

boundedSequence::boundedSequence(unsigned size)
{
      _data = new int[size];
      _size = size;
}

boundedSequence::~boundedSequence()
{
      delete [] _data;
}
Cette classe implémente par un tableau une séquence d'au plus size éléments. Vous allez écrire en vous appuyant sur cette classe les classes boundedStack et boundedQueue, qui implémentent les séquences bornées munies d'une discipline d'accès de pile (LIFO) et d'une discipline d'accès de file (FIFO) respectivement. Vous testerez les préconditions, par exemple avec des asserts.

Question 1

Ecrivez les déclaration et toutes les méthodes de boundedStack et boundedQueue. Les classes doivent être telles que le fragment de code suivant est légal:
      boundedStack s(10);
      boundedQueue q(10);

      boundedSequence *set[2];
      set[0] = &s;
      set[1] = &q;
Note: dans une file de longueur 3, on doit pouvoir stocker deux éléments, puis en retirer un et en stocker deux de plus...

Question 2

Modifiez vos déclarations de façon à ce que le fragment de code suivant soit légal, compte-tenu des déclarations précédentes.
      cout << "Les elements qui sortiront de la file sont: " << q << " et de la pile: " << s << endl;

NB: Vous ne devez pas modifier la classe boundedSequence, ce qui est de toute façon inutile.

Exercice 1

Barème indicatif: 5 points

Dans le code suivant indiquez quelle est la sortie du programme en justifiant d'une ou deux phrases à chaque fois.

#include <iostream.h>

struct c {
      int i;

      c(int)               { i = 5;  }
      c(float)             { cout << 17 << ' '; }
      ~c()                 { cout << 43 << ' '; }
      void operator=(int)  { i = 7;  }
      int m()              { return 11; }

};

struct d: public c {
      d(): c('a')     { }
      d(int): c(1.0f) { cout << 19 << ' '; }
      ~d()            { cout << 41 << ' '; }
      int m()         { return 13; }

      int n() const   { return 31; }
      int n()         { return 37; }

};

ostream &operator<<(ostream &s, const d&)
{
      s << 23 << ' ';
}

main()
{
      c x(1);                       
      cout << "a: " << x.i << endl;
      c y = 2;                      
      cout << "b: " << y.i << endl;
      d z;
      c &r = z;
      cout << "c: " << r.m() << endl;
      cout << "d: " << d(1) << endl;
      cout << "e: " << z.n() << endl;
      
}

Exercice 2

Barème indicatif: 3 points

Indiquez pour chacune des lignes suivantes quelles sont celles qui sont correctes:
1. char *p;
2. const char *q;
3. char &r;
4. char t[10];
5. q = p;
6. r = p;
7. char &s = *p;
8. p = &s;
9. s = p;
10. p = s;
11. s = *p;
12. *p = s;
13. t = p;
14. p = t;
15. *t = *p;