Tableur C++  1.0
API de tableur + interprète bison en ligne de commande
Sinus.h
1 /*
2  * Sinus.h
3  *
4  * Created on: 8 avr. 2015
5  * Author: michel
6  */
7 
8 #ifndef SINUS_H_
9 #define SINUS_H_
10 
11 #include <cmath> // sin
12 #include "ValChaine.h"
13 #include "ValErreur.h"
14 #include "ValDouble.h"
15 #include "ValVide.h"
16 
17 #include "Fonction.h"
18 
19 namespace modele {
24 class Sinus: public Fonction {
25 protected:
29  static const std::string nom; //="SIN"; PAS INLINE
30 
36  static const int nbParam=1; // comme c'est const, on peut inline
37 
38 public:
39 
44  listeParam.push_back(e); // construit la liste des paramètres
45  }
50 // double dg=0;
51 // Argument *a=listeParam.front();
52 // if(!a->estCalculable()){
53 // return new ValErreur("#PLAGE");
54 // }
55  Expression* pe;
56  if((pe=dynamic_cast<Expression*>(listeParam.front()))){
57  Valeur * vg=pe->calculer(); // nouvelle valeur calculée sur l'expression
58  if(dynamic_cast<ValErreur*>(vg)){ // si erreur à gauche !
59  //cout<<"DEBUG:ERREUR:vg:"<<vg<<endl;
60  return vg; // propagation
61  } else if(dynamic_cast<ValChaine*>(vg)||dynamic_cast<ValVide*>(vg)){ // si chaîne ou vide
62  delete vg; // désalocation
63  return new ValErreur("#VALEUR"); // nouvelle
64  } else if(ValDouble* vdg=dynamic_cast<ValDouble*>(vg)){ // si double
65  //cout<<"DEBUG:vdg:"<<vdg<<endl;
66  double dg=vdg->getDouble();
67  delete vg;
68  return new ValDouble(std::sin(dg));
69  } //else cout<<"DEBUG:Aucun dynamic cast!"<<endl;
70  } else {
71  return new ValErreur("#ARGUMENT");
72  }
73  }
74 
78  std::string toString(){
79  std::string r=Sinus::nom+"(";
80  bool premiereFois=true; // pour les ;
81  for (Argument *e: listeParam){
82  if (premiereFois) {
83  premiereFois=false; // ce n'est plus la premiere fois !
84  } else {
85  r+="; ";
86  }
87  r+=e->toString();
88  }
89  return r+")";
90  }
95  return new Sinus(dynamic_cast<Expression *>(listeParam.front())->clone()); // pas de sinus de Plage
96  }
97  ~Sinus() {
98  // TODO Auto-generated destructor stub
99  }
100 };
101 
102 } /* namespace modele */
103 
104 #endif /* SINUS_H_ */
La classe abstraite Valeur représente une valeur parmi : ValErreur, ValDouble, ValChaine, ValVide.
Definition: Valeur.h:19
static const std::string nom
nom de la fonction : SIN
Definition: Sinus.h:29
Definition: Argument.cpp:10
La classe ValErreur représente une Valeur d'Erreur sous forme de chaîne.
Definition: ValErreur.h:19
Definition: Fonction.h:16
std::list< Argument * > listeParam
Liste des paramètres de la fonction.
Definition: Fonction.h:21
Definition: Argument.h:16
modele::Valeur * calculer()
calcule la valeur de l'expression sinus(e)
Definition: Sinus.h:49
Sinus(Expression *e)
constructeur d'une instance de fonction sinus sur une expression
Definition: Sinus.h:43
La classe Expression représente la classe ABSTRAITE racine de la hiérachie des noeuds calculables de ...
Definition: Expression.h:25
Expression * clone()
Clonage arborescent d'une expression sinus.
Definition: Sinus.h:94
std::string toString()
Fonction retournant une chaîne représentant la fonction.
Definition: Sinus.h:78
La classe Sinus permet d'instancier des expressions fonctionnelles telles que : sin(3.14), sin(A1+2), ...
Definition: Sinus.h:24
La classe ValDouble représente une Valeur double.
Definition: ValDouble.h:20
static const int nbParam
Nombre de paramètres de la fonction : -1 : illimité 0 : aucun 1..n : n paramètres.
Definition: Sinus.h:36
virtual modele::Valeur * calculer()=0
Méthode virtuelle pure calculant la valeur de l'expression (arbre)