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 //#include "funcao.H"
00010 
00011 namespace Calculo {
00012 
00013     class Funcao;
00014 
00094     class Formula {
00095     public:
00098         typedef std::map<std::string, double> MapaDeConstantes;
00099 
00104         typedef std::map<std::string, Funcao> MapaDeFuncoes;
00105 
00109         Formula(std::string const& formula);
00110 
00118         double valor(MapaDeConstantes const& constantes,
00119                      MapaDeFuncoes const& funcoes) const;
00120         
00121     private:
00123         typedef std::vector<Simbolo> Simbolos;
00124         typedef Simbolos::const_iterator Iterador;
00125             
00131         Simbolos simbolos;
00132 
00136         struct Contexto {
00137             Contexto(MapaDeConstantes const& constantes,
00138                      MapaDeFuncoes const& funcoes);
00139 
00140             MapaDeConstantes const& constantes;
00141             MapaDeFuncoes const& funcoes;
00142         };
00143 
00145         double valorDeFormula(Contexto& contexto) const;
00146 
00147         /* Rotinas de análise (e, por enquanto, também de cálculo):
00148 
00149         a) A maior parte destas rotinas são dois-em-um, pois além de
00150         calcularem um valor, analisam a fórmula e, por isso, afectam o
00151         iterador de símbolos que recebem.
00152 
00153         b) Isto decorre do tipo de resolução adoptado, em que a análise é
00154         feita de uma forma recursiva, e do facto de as funções em C++ não
00155         devolverem dois valores (idealmente devolveriam o valor das expressões
00156         e o iterador para a parte restante dos símbolos).  Uma vez
00157         compreendida a necessidade, e uma vez que as rotinas problemáticas são
00158         privadas, há apenas que ter o cuidado de, ao analizar o código, ter em
00159         conta que a invocação destas rotinas tem efeitos laterais!  A ideia é
00160         que cada rotina analiza um troço da sequência de símbolos e deixa o
00161         iterador no início da parte restante desssa sequência.
00162 
00163         c) As constantes e funções são passadas de rotina em rotina (dentro de
00164         um contexto).  Isso é feito porque as constantes e funções logicamente
00165         não pertencem à classe: usam-se apenas enquanto o valor da fórmula
00166         está a ser calculada.
00167 
00168         d) É fundamental, quando dominar o conceito de herança, reimplementar
00169         esta classe de modo que o construtor não se limite a fazer a análise
00170         lexical da cadeia de caracteres contendo a fórmula: deve fazer também
00171         a sua análise gramatical, guardando a fórmula de modo a que os
00172         cálculos dos valores possam ser feitos sem ter de refazer a análise
00173         gramatical. */
00174 
00180         double valorDeExpressao(Contexto& contexto, Iterador& i) const;
00181 
00186         double valorDeExpressaoCondicional(Contexto& contexto,Iterador& i) const;
00187 
00192         double valorDeExpressaoOu(Contexto& contexto, Iterador& i) const;
00193 
00198         double valorDeExpressaoE(Contexto& contexto, Iterador& i) const;
00199 
00204         double valorDeExpressaoIgualdade(Contexto& contexto, Iterador& i) const;
00205 
00210         double valorDeExpressaoRelacional(Contexto& contexto, Iterador& i) const;
00211 
00216         double valorDeExpressaoAditiva(Contexto& contexto, Iterador& i) const;
00217 
00222         double valorDeExpressaoMultiplicativa(Contexto& contexto,
00223                                               Iterador& i) const;
00224 
00229         double valorDeExpressaoPotencial(Contexto& contexto, Iterador& i) const;
00230 
00235         double valorDeExpressaoUnaria(Contexto& contexto, Iterador& i) const;
00236 
00241         double valorDeExpressaoFuncional(Contexto& contexto,
00242                                          Iterador& i) const;
00243 
00249         std::vector<double> valoresDeListaDeExpressoes(Contexto& contexto,
00250                                                        Iterador& i) const;
00251 
00256         double valorDeExpressaoPrimaria(Contexto& contexto,
00257                                         Iterador& i) const;
00258 
00261         double valorDeFuncao(Contexto& contexto, std::string const& nome, 
00262                              std::vector<double> const& argumentos) const;
00263 
00265         bool cumpreInvariante() const;
00266     };
00267 
00268 }
00269 
00270 #include "formula_impl.H"
00271 
00272 #endif // CALCULO_ANALISE_FORMULA_H

Gerado em Mon Apr 15 15:57:08 2002 para Calculo por doxygen1.2.6 escrito por Dimitri van Heesch, © 1997-2001