1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
| #include <iostream>
using namespace std;
class Par { // classe Par
private:
double left;
double right;
public:
Par() {left = 0; right = 0;}
Par(double l, double r) {left = l; right = r;}
void set_left(double n) {left = n;}
void set_right(double n) {right = n;}
double get_left() const {return left;}
double get_right() const {return right;}
virtual void print() const {
cout << "(" << get_left() << "," << get_right() << ")" << endl;}
};
class Ponto: public Par { // subclasse Ponto
public:
Ponto():Par() {};
Ponto(double x, double y):Par(x,y) {};
void set_abc(int x) {set_left(x);}
void set_ord(int y) {set_right(y);}
double get_abc() {return get_left();}
double get_ord() {return get_right();}
virtual void print() const {
cout << "(" << get_left() << "," << get_right() << ")" << endl;}
};
class Materro {
public:
virtual void printerro() const
{cerr << "Erro matemático." << endl;}
};
class Overflow: public Materro {
public:
Overflow();
virtual void printerro() const
{cerr << "Erro de overflow." << endl;}
};
class Pilha_cheia: public Materro {
public:
Pilha_cheia();
virtual void printerro() const
{cerr << " Pilha cheia. " << endl;}
};
template <class C, int I>
class Pilha // classe Pilha
{
private:
typedef struct pilha_node
{
C elem;
struct pilha_node * next;
} Pilha_node, * Pilha_node_ptr;
Pilha_node_ptr pilha;
public:
Pilha() {pilha = NULL; count = 0;}
int count;
void push(C &i){ // Método que insere um objecto da classe C na pilha
if (count == I) throw Pilha_cheia();
else {
Pilha_node_ptr aux = new Pilha_node;
aux -> elem = i;
aux -> next = pilha;
pilha = aux;
count++;
}
};
virtual C pop() { // Método que devolve o objecto no topo e remove-o da lista
if (pilha == NULL) {cout << " Pilha vazia " << endl;}
else {Pilha_node_ptr aux = pilha;
pilha = pilha -> next;
delete aux;
count--;
pilha;
if (pilha == NULL) {cout << " A pilha ficou vazia. " << endl;}
}
};
virtual void printpilha() const
{
Pilha_node_ptr aux = pilha;
while (aux != NULL)
{aux -> elem.print();
aux = aux -> next;}
};
};
int main()
{
int j = 1;
int k = 1;
int l = 1;
double a, b;
double x, y;
const int I = 3;
Pilha<Par, I> pp;
while (j != 0) {
cout << " Escolha se pretende inserir ou retirar um objecto da pilha: " << endl;
cout << " 1. Inserir " << endl;
cout << " 2. Retirar " << endl;
cout << " 0. Saída " << endl;
cin >> j;
if (j == 1)
{cout << " Escolha o tipo de objecto que pretende inserir: " << endl;
cout << " 1. Objecto da classe Par " << endl;
cout << " 2. Objecto da classe Ponto " << endl;
cout << " 0. Saída " << endl;
cin >> k;
switch(k) {
case 1: {cout << " Introduza o elemento da esquerda do par: ";
cin >> a;
cout << " Introduza o elemento da direita do par: ";
cin >> b;
Par p(a,b);
pp.push(p);
pp.printpilha();
cout << " Para continuar carregue numa tecla numérica. ";
cin >> l;
cout << endl;
break;}
case 2: {cout << " Introduza a abcissa do ponto: ";
cin >> x;
cout << " Introduza a ordenada do ponto: ";
cin >> y;
Ponto p(x,y);
pp.push(p);
pp.printpilha();
cout << " Para continuar carregue numa tecla numérica. ";
cin >> l;
cout << endl;
break;}
j = 0;}
}
if (j == 2) {
pp.pop();
pp.printpilha();
cout << " Para continuar carregue numa tecla numérica. ";
cin >> l;
cout << endl;}
if (j == 0) {cout << "------------------------------FIM------------------------------" << endl;}
};
}; |
Partager