edutecnica

Esercizio 8       

Scrivi un programma che istanziata una classe T permetta ad un oggetto di tale classe di comportarsi indifferentemente come una coda (il primo entrante è il primo uscente) oppure come una pila (il primo entrante è l'ultimo uscente).
La classe T può essere derivata dalla classe V dove viene allocato un vettore di n posti.
La classe V, genitrice, sarà dotata di un costruttore che inizializza il vettore e l'indice delle posizioni occupate, di un metodo print() per stampare il vettore e di un metodo set() per inserire un elemento nel vettore. La classe derivata T, può essere dotata soltanto di due metodi getpila() e getcoda(); che permettono di estrarre i dati secondo la modalità della pila oppure quello della coda .


#include<iostream>
using namespace std;
class V{
     static const int n=5;
protected:
     int q[n];
     int j;
public:
     V();
     void set(int a);
     void print();
};
//_______implementazione dei metodi classe V
V::V(){
     for(int i=0;i < n;i++)q[i]=0;
     j=0;
     cout << "oggetto costruito\n";
}
void V::print(){
     for(int i=0;i < n;i++)cout << q[i] << " ";
     cout << "[" << j << "]"; cout << "\n"; }
void V::set(int a){
if(j < n){
     q[j]=a;
     j++;
     print();
}//fine if
} //______________________fine classe V
class T: public V {
public:
     void getpila();
     void getcoda();
};
void T::getpila(){
if(j > 0){
      q[j-1]=0;
      j--;
      print();
}//fine if
}
void T::getcoda(){
if(j > 0){
     for(int i=0;i < j;i++)q[i]=q[i+1];
     q[j-1]=0;
     j--;
     print();
}//fine if
} //______________fine classe T
main(){
     T q;
     q.print();
     q.set(2);
     q.set(3);
     q.set(5);
     q.getcoda();
     q.getpila();
}//__________fine main

C'è la classe base V che memorizza il vettore di interi, al suo interno sono definiti i metodi print() che serve per stampare il vettore fino alla posizione j (cioè, fin dove il vettore è stato usato) e il metodo set(int a).
Questa scelta è resa possibile dal fatto che sia per la pila he per la coda, l'inserimento avviene nello stesso modo, cioè dalla prima posizione libera a partire da sinistra nel vettore. Nella classe derivata T ci sono solo i due metodi getcoda() e getpila() che vengono usati a secondo se la struttura deve comportarsi come coda o come pila.