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

  • View
    105

  • Download
    0

Embed Size (px)

Text of Aula 14 Programação Baseada em Objectos Desenho de TAD

  • Slide 1
  • Aula 14 Programao Baseada em Objectos Desenho de TAD
  • Slide 2
  • 2003/2004 Introduo Programao 2 Desenvolver uma calculadora Operaes: + adio - subtraco / diviso * multiplicao ^ potenciao Suporte para double (incluindo negativos) Parnteses proibidos Expresses de cin Resultados em cout Expresses terminam em ; ou. Smbolo. termina execuo da calculadora
  • Slide 3
  • 2003/2004 Introduo Programao 3 Exemplo Entrada: 2 + 2 ; 2 * 2.5. Sada: 4 5
  • Slide 4
  • 2003/2004 Introduo Programao 4 Exerccio Qual o resultado de 2 * 3 + 3 * 5 ^ 2 ; ? E se os smbolos forem lidos um de cada vez? (Smbolos so valores ou operadores, incluindo terminadores)
  • Slide 5
  • 2003/2004 Introduo Programao 5 Clculo de expresso Smbolo lido: 1
  • Slide 6
  • 2003/2004 Introduo Programao 6 Clculo de expresso Que fazer aos smbolos lidos? Ao 1 e ao +? necessrio guard-los algures! Smbolo lido: +
  • Slide 7
  • 2003/2004 Introduo Programao 7 Clculo de expresso Podemos calcular j 1 + 4? No! Depende do que se segue! Smbolo lido: 4
  • Slide 8
  • 2003/2004 Introduo Programao 8 Clculo de expresso Calcular j 1 + 4 teria sido asneira! A no ser que se tivesse lido 1 * 4, ou se o smbolo lido fosse + Nesse caso podamos fazer j o clculo, e escusvamos de memorizar tantos smbolos Smbolo lido: * Memorizar No nosso programa teremos de guardar os smbolos algures!
  • Slide 9
  • 2003/2004 Introduo Programao 9 Clculo de expresso E a saga continua Smbolo lido: 3
  • Slide 10
  • 2003/2004 Introduo Programao 10 Clculo de expresso 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 precedncia maior ou igual Smbolo lido: / Por ordem inversa da leitura! Podem-se empilhar os operadores!
  • Slide 11
  • 2003/2004 Introduo Programao 11 Clculo de expresso Mais uma vez necessrio guardar o valor Se a prxima operao for, por exemplo, +, a diviso calculada entre 12 e 2, que foram os ltimos valores considerados Smbolo lido: 2 Tambm se podem empilhar os valores!
  • Slide 12
  • 2003/2004 Introduo Programao 12 Regressemos ao incio Vamos recomear o clculo, mas equipando- nos com duas pilhas: Pilha dos operadores Pilha dos valores
  • Slide 13
  • 2003/2004 Introduo Programao 13 valoresoperadores Clculo de expresso Lido um valor, h que coloc-lo na respectiva pilha Smbolo lido: 1
  • Slide 14
  • 2003/2004 Introduo Programao 14 valoresoperadores Clculo de expresso Lido um operador, h que verificar se h algum outro de maior ou igual precedncia na pilha Como no h, h que o colocar na pilha apropriada Smbolo lido: + 1
  • Slide 15
  • 2003/2004 Introduo Programao 15 valoresoperadores Clculo de expresso Valores vo sempre para a pilha Smbolo lido: 4 1+
  • Slide 16
  • 2003/2004 Introduo Programao 16 valoresoperadores Clculo de expresso Como a multiplicao tem maior precedncia que a soma, que est no topo da pilha, no se pode ainda realizar a soma necessrio, de qualquer forma, colocar a multiplicao no topo da pilha Smbolo lido: * 1+ 4
  • Slide 17
  • 2003/2004 Introduo Programao 17 valoresoperadores Clculo de expresso um valor Smbolo lido: 3 1+ 4*
  • Slide 18
  • 2003/2004 Introduo Programao 18 valoresoperadores Clculo de expresso No topo da pilha h um operador com igual precedncia Antes de guardar a nova operao na pilha, efectua-se a do topo e guarda-se o resultado Smbolo lido: / 1+ 4* 3 = 12
  • Slide 19
  • 2003/2004 Introduo Programao 19 valoresoperadores Clculo de expresso Valores vo directos para a pilha, como sempre Smbolo lido: 2 1+ 12/
  • Slide 20
  • 2003/2004 Introduo Programao 20 valoresoperadores Clculo de expresso Como a potenciao tem maior precedncia que a diviso, que est no topo da pilha, no se pode ainda realizar a diviso necessrio, de qualquer forma, colocar a potenciao no topo da pilha Smbolo lido: ^ 1+ 12/ 2
  • Slide 21
  • 2003/2004 Introduo Programao 21 valoresoperadores Clculo de expresso Pilha com ele! Smbolo lido: 3 1+ 12/ 2^
  • Slide 22
  • 2003/2004 Introduo Programao 22 valoresoperadores Clculo de expresso Tm de se realizar todas as operaes com precedncia maior ou igual! Smbolo lido: - 1+ 12/ 2^ 3 = 8
  • Slide 23
  • 2003/2004 Introduo Programao 23 valoresoperadores Clculo de expresso Tm de se realizar todas as operaes com precedncia maior ou igual! Smbolo lido: - 1+ 12/ 8 = 1,5
  • Slide 24
  • 2003/2004 Introduo Programao 24 valoresoperadores Clculo de expresso Tm de se realizar todas as operaes com precedncia maior ou igual! Depois, guarda-se a operao na pilha Smbolo lido: - 1+ 1,5 = 2,5
  • Slide 25
  • 2003/2004 Introduo Programao 25 valoresoperadores Clculo de expresso Mais um Smbolo lido: 2 2,5-
  • Slide 26
  • 2003/2004 Introduo Programao 26 valoresoperadores Clculo de expresso Ao atingir o smbolo. (ponto), efectuam-se todas as operaes que restam na pilha Smbolo lido:. 2,5- 2 = 0,5
  • Slide 27
  • 2003/2004 Introduo Programao 27 valoresoperadores Clculo de expresso Ao atingir o smbolo. (ponto), efectuam-se todas as operaes que restam na pilha O resultado retira-se da pilha dos valores: Smbolo lido: 0,5
  • Slide 28
  • 2003/2004 Introduo Programao 28 E agora? necessrio escrever o programa Mas j se sabe que ferramentas esto em falta: Um TAD para representar operadores Um TAD para representar uma calculadora E
  • Slide 29
  • 2003/2004 Introduo Programao 29 TAD Operador Representa operadores (binrios) que podem ser +, -, *, / ou ^ Construtor deve receber smbolo indicando operao a realizar Deve possuir operao para calcular resultado da sua aplicao a dois operandos double
  • Slide 30
  • 2003/2004 Introduo Programao 30 TAD Operador /** Representa um operador aritmtico, com o qual se podem realizar operaes. @invariant ?. */ class Operador { public: };
  • Slide 31
  • 2003/2004 Introduo Programao 31 Construtor Operador::Operador() /** */ class Operador { public: /** Constri um novo operador correspondente ao smbolo dado. @pre smbolo pertence a { '+', '-', '*', '/', '^' }. @post Operador o operador representado por smbolo. */ explicit Operador(char const smbolo); }; Cdigo possvel: Operador multiplicao(*); A utilizao de explicit impede a converso implcita de char em Operador.
  • Slide 32
  • 2003/2004 Introduo Programao 32 Operao 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 parnteses usado na invocao de rotinas. um operador n-rio, que pode ser sobrecarregado! Cdigo possvel: Operador multiplicao(*); cout = a no implica que a == b, mas sim que a e b tm a mesma precedncia. @pre V. @post operador== = ( *this representa o mesmo operador que outro_operador ). */ bool operator==(Operador const& outro_operador) const; }; Cdigo possvel: Operador multiplicao(*); Operador adio(+); if(adio == multiplicao)
  • Slide 35
  • 2003/2004 Introduo Programao 35 Operao Operador::smboloVlido() /** */ class Operador { public: /** Verifica se um smbolo representao de algum dos operadores suportados. @pre V. @post smbolo pertence a { '+', '-', '*', '/', '^' }. */ static bool smboloVlido(char const smbolo); }; Cdigo possvel: char smbolo; cin >> smbolo; if(not Operador::smboloVlido(smbolo)) cout
  • 2003/2004 Introduo Programao 51 Mtodo Calculadora::executa() if(Operador::simboloVlido(caractere)) { efectuaOperaesDePrecednciaMaiorOuIgualA(Operador(caractere)); pilha_de_operadores.pe(Operador(caractere)); } else if(caractere == ';' or caractere == '.') { efectuaTodasAsOperaes(); cout valor; pilha_de_valores.pe(valor); }
  • Slide 52
  • 2003/2004 Introduo Programao 52 Mtodo Calculadora:: efectuaOperaoNoTopo() void Calculadora::efectuaOperaoNoTopo() { assert(1 = operador) efectuaOperaoNoTopo(); }
  • Slide 54
  • 2003/2004 Introduo Programao 54 Mtodo Calculadora:: efectuaTodasAsOperaes() void Calculadora::efectuaTodasAsOperaes() { while(not pilha_de_operadores.estVazia()) efectuaOperaoNoTopo(); assert(pilha_de_operadores.estVazia()); }
  • Slide 55
  • 2003/2004 Introduo Programao 55 Mtodo Calculadora:: cumpreInvariante() bool Calculadora::cumpreInvariante() const { return pilha_de_valores.estVazia() and pilha_de_operadores.estVazia(); }
  • Slide 56
  • 2003/2004 Introduo Programao 56 E as pilhas? Programa escrito usa-as Necessrio desenvolv-las Desenho de TAD ser demonstrado com as pilhas
  • Slide 57
  • 2003/2004 Introduo Programao 57 Desenho de TAD Recomendvel comear por escrever restante cdigo assumindo que existem Recomendvel tambm escrever programa de teste Ambos clarificam operaes e comportamentos desejveis, bem como a interface desejvel
  • Slide 58
  • 2003/2004 In