Página principal   Lista de namespaces   Hierarquia de classes   Lista de componentes   Lista de ficheiros   Componentes   Declarações  

formula.H

Ir para a documentação deste ficheiro.
00001 #ifndef CALCULO_FORMULA_H
00002 #define CALCULO_FORMULA_H
00003 
00004 #include <string>
00005 #include <vector>
00006 #include <map>
00007 
00008 #include "simbolo.H"
00009 
00010 namespace Calculo {
00011 
00099     class Formula {
00100     public:
00104         Formula(std::string const& formula);
00105 
00109         double valor() const;
00110         
00114         void troca(Formula& outra);
00115 
00116     private:
00118         typedef std::vector<Simbolo> Simbolos;
00119         typedef Simbolos::const_iterator Iterador;
00120             
00126         Simbolos simbolos;
00127 
00129         double valorDeFormula() const;
00130 
00131         /* Rotinas de análise (e, por enquanto, também de cálculo):
00132 
00133         a) A maior parte destas rotinas são dois-em-um, pois além de
00134         calcularem um valor, analisam a fórmula e, por isso, afectam o
00135         iterador de símbolos que recebem.
00136 
00137         b) Isto decorre do tipo de resolução adoptado, em que a análise é
00138         feita de uma forma recursiva, e do facto de as funções em C++ não
00139         devolverem dois valores (idealmente devolveriam o valor das expressões
00140         e o iterador para a parte restante dos símbolos).  Uma vez
00141         compreendida a necessidade, e uma vez que as rotinas problemáticas são
00142         privadas, há apenas que ter o cuidado de, ao analizar o código, ter em
00143         conta que a invocação destas rotinas tem efeitos laterais!  A ideia é
00144         que cada rotina analiza um troço da sequência de símbolos e deixa o
00145         iterador no início da parte restante desssa sequência.
00146 
00147         c) É fundamental, quando dominar o conceito de herança, reimplementar
00148         esta classe de modo que o construtor não se limite a fazer a análise
00149         lexical da cadeia de caracteres contendo a fórmula: deve fazer também
00150         a sua análise gramatical, guardando a fórmula de modo a que os
00151         cálculos dos valores possam ser feitos sem ter de refazer a análise
00152         gramatical. */
00153 
00159         double valorDeExpressao(Iterador& i) const;
00160 
00165         double valorDeExpressaoCondicional(Iterador& i) const;
00166 
00171         double valorDeExpressaoOu(Iterador& i) const;
00172 
00177         double valorDeExpressaoE(Iterador& i) const;
00178 
00183         double valorDeExpressaoIgualdade(Iterador& i) const;
00184 
00189         double valorDeExpressaoRelacional(Iterador& i) const;
00190 
00195         double valorDeExpressaoAditiva(Iterador& i) const;
00196 
00201         double valorDeExpressaoMultiplicativa(Iterador& i) const;
00202 
00207         double valorDeExpressaoPotencial(Iterador& i) const;
00208 
00213         double valorDeExpressaoUnaria(Iterador& i) const;
00214 
00219         double valorDeExpressaoFuncional(Iterador& i) const;
00220 
00226         std::vector<double> valoresDeListaDeExpressoes(Iterador& i) const;
00227 
00232         double valorDeExpressaoPrimaria(Iterador& i) const;
00233 
00236         double valorDeConstante(std::string const& nome) const;
00237 
00240         double valorDeFuncao(std::string const& nome, 
00241                              std::vector<double> const& argumentos) const;
00242 
00244         bool cumpreInvariante() const;
00245     };
00246 
00247 }
00248 
00249 #include "formula_impl.H"
00250 
00251 #endif // CALCULO_ANALISE_FORMULA_H

Gerado em Sun Apr 21 23:29:51 2002 para Calculo por doxygen1.2.6 escrito por Dimitri van Heesch, © 1997-2001