Transcript
Page 1: Aula 14 Programação Baseada em Objectos Desenho de TAD

Aula 14

Programação Baseada em Objectos

Desenho de TAD

Page 2: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação2

Desenvolver uma calculadora

Operações:+ – adição- – subtracção/ – divisão* – multiplicação^ – potenciação

Suporte para double (incluindo negativos) Parênteses proibidos Expressões de cin Resultados em cout Expressões terminam em ; ou . Símbolo . termina execução da calculadora

Page 3: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação3

Exemplo

Entrada:

2 + 2 ;2 * 2.5 .

Saída:

45

Page 4: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação4

Exercício

Qual o resultado de 2 * 3 + 3 * 5 ^ 2 ; ?

E se os símbolos forem lidos um de cada vez?

(Símbolos são valores ou operadores, incluindo terminadores)

Page 5: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação5

Cálculo de expressão

Símbololido:

1

Page 6: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação6

Cálculo de expressão

Que fazer aos símbolos lidos? Ao 1 e ao +?

É necessário guardá-los algures!

Símbololido:

+

Page 7: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação7

Cálculo de expressão

Podemos calcular já 1 + 4?

Não! Depende do que se segue!

Símbololido:

4

Page 8: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação8

Cálculo de expressão

Calcular já 1 + 4 teria sido asneira!

A não ser que se tivesse lido 1 * 4, ou se o símbolo lido fosse +

Nesse caso podíamos fazer já o cálculo, e escusávamos de memorizar tantos símbolos

Símbololido:

*

Memorizar… No nosso programa teremos de guardar os símbolos algures!

Page 9: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação9

Cálculo de expressão

E a saga continuaSímbololido:

3

Page 10: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação10

Cálculo de expressão

Podemos calcular o produto anterior, ou seja, 4 * 3!

O resultado do produto tem de ser guardado

O produto é o dos dois últimos valores lidos

Regra:

Ao ler um operador, podemos calcular os operadores em espera enquanto forem de precedência maior ou igual

Símbololido:

/

Por ordem inversa à da leitura!

Podem-se empilhar os operadores!

Page 11: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação11

Cálculo de expressão

Mais uma vez é necessário guardar o valor

Se a próxima operação for, por exemplo, +, a divisão é calculada entre 12 e 2, que foram os últimos valores considerados

Símbololido:

2

Também se podem empilhar os valores!

Page 12: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação12

Regressemos ao início

Vamos recomeçar o cálculo, mas equipando-nos com duas pilhas:

Pilha dos operadores

Pilha dos valores

Page 13: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação13

valoresoperadores

Cálculo de expressão

Lido um valor, há que colocá-lo na respectiva pilha

Símbololido: 1

Page 14: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação14

valoresoperadores

Cálculo de expressão

Lido um operador, há que verificar se há algum outro de maior ou igual precedência na pilha

Como não há, há que o colocar na pilha apropriada

Símbololido: +

1

Page 15: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação15

valoresoperadores

Cálculo de expressão

Valores vão sempre para a pilha

Símbololido: 4

1+

Page 16: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação16

valoresoperadores

Cálculo de expressão

Como a multiplicação tem maior precedência que a soma, que está no topo da pilha, não se pode ainda realizar a soma

É necessário, de qualquer forma, colocar a multiplicação no topo da pilha

Símbololido: *

1+

4

Page 17: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação17

valoresoperadores

Cálculo de expressão

É um valor…Símbololido: 3

1+

4*

Page 18: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação18

valoresoperadores

Cálculo de expressão

No topo da pilha há um operador com igual precedência

Antes de guardar a nova operação na pilha, efectua-se a do topo e guarda-se o resultado

Símbololido: /

1+

4*

3

= 12

Page 19: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação19

valoresoperadores

Cálculo de expressão

Valores vão directos para a pilha, como sempre

Símbololido: 2

1+

12/

Page 20: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação20

valoresoperadores

Cálculo de expressão

Como a potenciação tem maior precedência que a divisão, que está no topo da pilha, não se pode ainda realizar a divisão

É necessário, de qualquer forma, colocar a potenciação no topo da pilha

Símbololido: ^

1+

12/

2

Page 21: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação21

valoresoperadores

Cálculo de expressão

Pilha com ele!Símbololido: 3

1+

12/

2^

Page 22: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação22

valoresoperadores

Cálculo de expressão

Têm de se realizar todas as operações com precedência maior ou igual!

Símbololido: -

1+

12/

2^

3

= 8

Page 23: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação23

valoresoperadores

Cálculo de expressão

Têm de se realizar todas as operações com precedência maior ou igual!

Símbololido: -

1+

12/

8

= 1,5

Page 24: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação24

valoresoperadores

Cálculo de expressão

Têm de se realizar todas as operações com precedência maior ou igual!

Depois, guarda-se a operação na pilha

Símbololido: -

1+

1,5 = 2,5

Page 25: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação25

valoresoperadores

Cálculo de expressão

Mais um…Símbololido: 2

2,5-

Page 26: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação26

valoresoperadores

Cálculo de expressão

Ao atingir o símbolo . (ponto), efectuam-se todas as operações que restam na pilha

Símbololido: .

2,5-

2 = 0,5

Page 27: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação27

valoresoperadores

Cálculo de expressão

Ao atingir o símbolo . (ponto), efectuam-se todas as operações que restam na pilha

O resultado retira-se da pilha dos valores:

Símbololido:

0,5

Page 28: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação28

E agora?

É necessário escrever o programa…

Mas já se sabe que ferramentas estão em falta: Um TAD para representar operadores Um TAD para representar uma calculadora E…

Page 29: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação29

TAD Operador

Representa operadores (binários) que podem ser +, -, *, / ou ^

Construtor deve receber símbolo indicando operação a realizar

Deve possuir operação para calcular resultado da sua aplicação a dois operandos double

Page 30: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação30

TAD Operador

/** Representa um operador aritmético, com o qual se podem realizar operações. @invariant ?. */ class Operador { public: …

};

Page 31: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação31

Construtor Operador::Operador()/** … */ class Operador { public: /** Constrói um novo operador correspondente ao símbolo dado. @pre símbolo pertence a {'+', '-', '*', '/', '^'}. @post Operador é o operador representado por símbolo. */ explicit Operador(char const símbolo);

};

Código possível:

Operador multiplicação(‘*’);

A utilização de explicit impede a conversão implícita de char em Operador.

Page 32: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação32

Operação Operador::operator()()/** … */ class Operador { public:

/** Devolve o resultado do operador quando aplicado aos operandos dados. @pre *this ≠ Operador(‘/’) operando_direito ≠ 0. @post operator() = operando_esquerdo *this operando_direito. */ double operator()(double const operando_esquerdo, double const operando_direito) const;

};

O operador parênteses é usado na invocação de rotinas. É um operador n-ário, que pode ser sobrecarregado!

Código possível:

Operador multiplicação(‘*’);cout << multiplicação(2.0, 3.0) << endl;

Chiça!

Page 33: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação33

Operação Operador::operator<()/** … */ class Operador { public:

/** Verifica se o operador tem menor precedência que o operador dado. @pre V. @post operador< = (precedência de *this é menor que a de outro_operador). */ bool operator<(Operador const& outro_operador) const;

}; Código possível:

Operador multiplicação(‘*’);Operador adição(‘+’);if(adição < multiplicação) …

Page 34: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação34

Operação Operador::operator==()/** … */ class Operador { public:

/** Verifica se o operador é igual ao operador dado. Note-se que a >= b e b >= a não implica que a == b, mas sim que a e b têm a mesma precedência. @pre V. @post operador== = (*this representa o mesmo operador que outro_operador). */ bool operator==(Operador const& outro_operador) const;

};

Código possível:

Operador multiplicação(‘*’);Operador adição(‘+’);if(adição == multiplicação) …

Page 35: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação35

Operação Operador::símboloÉVálido()

/** … */ class Operador { public:

/** Verifica se um símbolo é representação de algum dos operadores suportados. @pre V. @post símbolo pertence a {'+', '-', '*', '/', '^'}. */ static bool símboloÉVálido(char const símbolo);

};Código possível:

char símbolo;cin >> símbolo;if(not Operador::símboloÉVálido(símbolo)) cout << “…” << endl;else { Operador operador(símbolo); …}

Um membro qualificado com static diz-se de classe. Se for uma operação, não tem instância implícita. As únicas diferenças para uma rotina não-membro são os privilégios de acesso a membros privados e o nome qualificado com o nome da classe.

Page 36: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação36

TAD Operador: Implementação

/** Representa um operador aritmético, com o qual se podem realizar operações. @invariant símbolo pertence a {'+', '-', '*', '/', '^'}. */ class Operador {

private: /** Indica se o invariante da classe é cumprido. @pre V. @post símbolo pertence a {'+', '-', '*', '/', '^'}. */ bool cumpreInvariante() const;

char símbolo;};

Page 37: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação37

Construtor Operador::Operador()inline Operador::Operador(char const símbolo) : símbolo(símbolo) { assert(símboloÉVálido(símbolo));

assert(cumpreInvariante()); }

Page 38: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação38

Método Operador::operator()()double Operador::operator()(double const operando_esquerdo, double const operando_direito) const { assert(cumpreInvariante()); assert(símbolo != '/' or operando_direito != 0); switch(símbolo) { case '+': return operando_esquerdo + operando_direito; case '-': return operando_esquerdo - operando_direito; case '*': return operando_esquerdo * operando_direito; case '/': return operando_esquerdo / operando_direito; case '^': return pow(operando_esquerdo, operando_direito); } }

Page 39: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação39

Método Operador::operator<()inline bool Operador::operator<(Operador const& outro_operador) const { assert(cumpreInvariante());

switch(símbolo) { case '+': case '-': return outro_operador.símbolo == '*' or outro_operador.símbolo == '/' or outro_operador.símbolo == '^'; case '*': case '/': return outro_operador.símbolo == '^'; case '^': return false; } }

Page 40: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação40

Método Operador::operator==()inline bool Operador::operator==(Operador const& outro_operador) const { assert(cumpreInvariante());

return símbolo == outro_operador.símbolo;}

Page 41: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação41

Método Operador::símboloÉVálido()

inline bool Operador::símboloÉVálido(char const símbolo) { return símbolo == '+' or símbolo == '-' or símbolo == '*' or símbolo == '/' or símbolo == '^'; }

Page 42: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação42

Método Operador::cumpreInvariante()

inline bool Operador::cumpreInvariante() const { return símboloÉVálido(símbolo); }

Page 43: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação43

TAD Calculadora

Representa uma calculadora

Para ser mais curto e legível, o código não verifica nenhum possível erro do utilizador!

Page 44: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação44

TAD Calculadora

/** Representa uma calculadora que opera sobre expressões lidas do canal cin, escrevendo o resultado em cout. As expressões podem envolver os operadores binários +, -, *, / e ^ (potenciação). Não podem incluir parênteses. As expressões são separadas por ; (ponto-e-vírgula) e terminadas por . (ponto). @invariant ?. */ class Calculadora { public: …

};

Page 45: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação45

Operação Calculadora::executa()/** … */ class Calculadora { public: /** Executa a calculadora sobre expressões presentes no canal cin. @pre As expressões no canal cin têm de estar sintacticamente correctas, estar separadas por ; (ponto-e-vírgula) e a sua sequência deve ser terminada por . (ponto). @post O canal cout contém os resultados de todas as expressões, um em cada linha. */ void executa();

};

Page 46: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação46

TAD Calculadora: Implementação/** Representa uma calculadora que opera sobre expressões lidas do canal cin, escrevendo o resultado em cout. As expressões podem envolver os operadores binários +, -, *, / e ^ (potenciação). Não podem incluir parênteses. As expressões são separadas por ; (ponto-e-vírgula) e terminadas por . (ponto). @invariant pilha_de_valores.empty() pilha_de_operadores.empty(). */ class Calculadora {

private:

/** Indica se o invariante da classe é cumprido. @pre V. @post pilha_de_valores.estáVazia() pilha_de_operadores. estáVazia(). */ bool cumpreInvariante() const;

PilhaDeDouble pilha_de_valores; PilhaDeOperador pilha_de_operadores; };

Page 47: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação47

Operação Calculadora::efectuaOperaçãoNoTopo()/** … */ class Calculadora { … private:

/** Efectua operação correspondente ao operador que se encontra no topo da pilha de operadores usando como operandos os dois valores no topo da pilha de valores. O valor que se encontra no topo da pilha de valores é o operando direito, sendo o valor imediatamente abaixo o operando esquerdo. @pre 1 ≤ pilha_de_operadores.altura() 2 ≤ pilha_de_valores.altura(). @post Pilha de valores deixou de conter os dois valores do topo, tendo sido colocado no lugar deles o resultado do operador do topo da pilha de operadores (que entretanto foi retirado) quando aplicado aos dois valores retirados (o primeiro valor retirado da pilha de valores é o operando direito). */ void efectuaOperaçãoNoTopo();

…};

Page 48: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação48

Operação Calculadora::efectuaOperacoesDePrecedenciaMaiorOuIgualA()

/** … */ class Calculadora {

private:

/** Efectua os cálculos de todos os operadores de precedência superior ou igual ao operador passado como argumento. @pre n = pilha_de_operadores.altura() k = número de operadores na pilha de operadores com precedência superior ou igual a operador m = pilha_de_valores.altura() k + 1 ≤ m. @post pilha_de_operadores.altura() = n – k pilha_de_valores.altura() = m – k – 1. */ void efectuaOperaçõesDePrecedênciaMaiorOuIgualA( Operador const& operador);

…};

Page 49: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação49

Operação Calculadora::efectuaTodasAsOperações()/** … */ class Calculadora {

private:

/** Efectua os cálculos de todos os operadores que estão na pilha. @pre n = pilha_de_operadores.altura() m = pilha_de_valores.altura() n + 1 <= m. @post pilha_de_operadores.estáVazia() pilha_de_valores.altura() = m – n – 1. */ void efectuaTodasAsOperações();

};

Page 50: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação50

Método Calculadora::executa()void Calculadora::executa() { assert(cumpreInvariante()); char caractere; do { cin >> caractere; if(not cin.fail()) if(Operador::simboloÉVálido(caractere)) { // Processamento de operador. } else if(caractere == ';' or caractere == '.') { // Processamento de terminador. } else if(isdigit(caractere)) { // Processamento de valor. } } while(not cin.fail() and caractere != '.'); assert(cumpreInvariante()); }

Page 51: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação51

Método Calculadora::executa()…

if(Operador::simboloÉVálido(caractere)) { efectuaOperaçõesDePrecedênciaMaiorOuIgualA(Operador(caractere));

pilha_de_operadores.põe(Operador(caractere)); } else if(caractere == ';' or caractere == '.') { efectuaTodasAsOperações(); cout << pilha_de_valores.itemNoTopo() << endl; pilha_de_valores.tiraItem(); } else if(isdigit(caractere)) { cin.putback(caractere); double valor; cin >> valor; pilha_de_valores.põe(valor); }

Page 52: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação52

Método Calculadora::efectuaOperaçãoNoTopo()void Calculadora::efectuaOperaçãoNoTopo() { assert(1 <= pilha_de_operadores.altura()); assert(2 <= pilha_de_valores.altura());

double operando_direito = pilha_de_valores.itemNoTopo();

pilha_de_valores.tiraItem();

double operando_esquerdo = pilha_de_valores.itemNoTopo();

pilha_de_valores.tiraItem();

Operador operador = pilha_de_operadores.itemNoTopo();

pilha_de_operadores.tiraItem();

pilha_de_valores.põe(operador(operando_esquerdo, operando_direito)); }

Page 53: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação53

Método Calculadora::efectuaOperacoesDeMaiorPrecedenciaQue()

void Calculadora::efectuaOperaçõesDePrecedênciaMaiorOuIgualA( Operador const& operador){ while(not pilha_de_operadores.estáVazia() and pilha_de_operadores.itemNoTopo() >= operador) efectuaOperaçãoNoTopo();}

Page 54: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação54

Método Calculadora::efectuaTodasAsOperações()void Calculadora::efectuaTodasAsOperações(){ while(not pilha_de_operadores.estáVazia()) efectuaOperaçãoNoTopo(); assert(pilha_de_operadores.estáVazia());}

Page 55: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação55

Método Calculadora::cumpreInvariante()bool Calculadora::cumpreInvariante() const { return pilha_de_valores.estáVazia() and pilha_de_operadores.estáVazia(); }

Page 56: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação56

E as pilhas?

Programa escrito usa-as

Necessário desenvolvê-las

Desenho de TAD será demonstrado com as pilhas

Page 57: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação57

Desenho de TAD

Recomendável começar por escrever restante código assumindo que existem

Recomendável também escrever programa de teste

Ambos clarificam operações e comportamentos desejáveis, bem como a interface desejável

Page 58: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação58

Operações das pilhas

Construir pilha vazia Verificar se está vazia Obter o item do topo Saber altura da pilha Pôr item na pilha Tirar o item do topo

construtores

predicados (inspectores)

inspectores

modificadores

Começaremos por PilhaDeDouble

Page 59: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação59

TAD PilhaDeDouble: Teste de unidadeint main(){ PilhaDeDouble pilha;

assert(pilha.estáVazia()); assert(pilha.altura() == 0);

for(int i = 0; i != 10; ++i) { assert(pilha.altura() == i);

pilha.poe(i);

assert(pilha.itemNoTopo() == i); assert(not pilha.estáVazia()); assert(pilha.altura() == i + 1); }

(continua)

Page 60: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação60

TAD PilhaDeDouble: Teste de unidade(continuação)

assert(pilha.itemNoTopo() == 9); assert(not pilha.estáVazia()); assert(pilha.altura() == 10);

for(int i = 9; i != -1; --i) { assert(pilha.itemNoTopo() == i); assert(not pilha.estáVazia()); assert(pilha.altura() == i + 1);

pilha.tiraItem();

assert(pilha.altura() == i); }

assert(pilha.estáVazia()); assert(pilha.altura() == 0);}

Page 61: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação61

TAD PilhaDeDouble

/** Representa pilhas de double.

@invariant [o invariante é um problema de implementação]. */class PilhaDeDouble { public: typedef double Item;

};

Permite alterar o tipo dos itens com muita facilidade.

Definir PilhaDeOperador torna-se trivial:a) Copiar classe PilhaDeDouble completa.b) Substituir PilhaDeDouble por

PilhaDeOperador.c) Alterar definição de Item de double para

Operador.

Page 62: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação62

TAD PilhaDeDouble: Construtores/** … */ class PilhaDeDouble { public:

/** Constrói pilha vazia.

@pre V.

@post estáVazia(). */ PilhaDeDouble();

};

Page 63: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação63

TAD PilhaDeDouble: Predicados/** … */ class PilhaDeDouble { public:

/** Indica se a pilha está vazia.

@pre V.

@post estáVazia = *this está vazia. */

bool estáVazia() const;

};

Page 64: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação64

TAD PilhaDeDouble: Inspectores/** … */ class PilhaDeDouble { public:

/** Devolve o item que está no topo da pilha. @pre ¬estáVazia(). @post itemNoTopo idêntico ao item no topo de *this. */ Item const& itemNoTopo() const;

/** Devolve altura da pilha. @pre V. @post altura = altura de *this (número de itens). */ int altura() const; …

};

Page 65: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação65

TAD PilhaDeDouble: Modificadores/** … */ class PilhaDeDouble { public:

/** Põe um novo item na pilha (no topo). @pre V. @post *this contém um item adicional no topo igual a novo_item. */ void põe(Item const& novo_item);

/** Tira o item que está no topo da pilha. @pre ¬estáVazia(). @post *this contém os itens originais menos o do topo. */ void tiraItem();  private: …};

Page 66: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação66

TAD PilhaDeDouble: Implementação

Fica como exercício

Page 67: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação67

Estrutura global do programa

#include <iostream>#include <utility> // define <=, >, >= e != à custa de < e de ==. #include <cassert> #include <cctype> // para isdigit(). #include <cmath> // para pow(). #include … // outras inclusões necessárias para as pilhas.

using namespace std;using namespace std::rel_ops; // para definições de <= etc. terem efeito.

class Operador {…} // e respectivos métodos. class PilhaDeDouble {…} // e respectivos métodos.

class PilhaDeOperador {…} // e respectivos métodos.

class Calculadora {…} // e respectivos métodos.

(continua)

Page 68: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação68

Estrutura global do programa

(continuação)

#ifdef TESTE

int main(){ // Testes das várias classes!}

#else // TESTE

int main() { Calculadora calculadora;

calculadora.executa(); }

#endif // TESTE

Para compilar os testes usa-se um comando de compilação semelhante a:

c++ -DTESTE …

Page 69: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação69

Programação procedimental

Primeiro pensa-se nos algoritmos

Depois pensa-se nos dados

Page 70: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação70

Programação baseada em objectos

Primeiro pensa-se nos dados (TAD)

Depois pensa-se nos algoritmos

Frequentemente são os substantivos mais importantes que surgem na descrição do problema.

Page 71: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação71

Desenho de TAD

TAD são módulos

Designers e departamento marketing definem interface

Engenharia desenvolve o mecanismo

Page 72: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação72

Desenho de TAD

Surgem para auxiliar resolução de problema Resolução usada para sugerir operações necessárias

no TAD Começa-se pelo teste de unidade Teste de unidade testa todas as operações do TAD Depois desenha-se a interface do TAD Finalmente implementa-se:

Passo a passo, testando a cada passo Se necessário fazer implementação embrionária de

métodos e rotinas (apenas instruções asserção e nas funções uma instrução de retorno).

Page 73: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação73

Alerta!

Há pilhas na biblioteca do C++:

#include <stack>#include <iostream>

using namespace std;

int main(){ stack<int> pilha;

pilha.push(1); pilha.push(2);

while(not pilha.empty()) { cout << pilha.top() << endl; pilha.pop(); }}

Page 74: Aula 14 Programação Baseada em Objectos Desenho de TAD

2003/2004Introdução à Programação74

Aula 14: Sumário

Desenho de TAD: programação baseada em objectos Fases:

Escrita de testes Declaração das operações suportadas, suas

consequências, e forma de utilização: interface Definição dos atributos (representação) e dos métodos

(mecanismo): implementação. Exemplo com pilhas. Definição de sinónimos de tipos com typedef Classe genérica stack Noções elementares de eXtreme Programming:

Testes primeiro Desenvolvimento incremental