Tableur C++  1.0
API de tableur + interprète bison en ligne de commande
Somme.h
1 /*
2  * Somme.h
3  *
4  * Created on: 9 avr. 2015
5  * Author: michel
6  */
7 
8 #ifndef SOMME_H_
9 #define SOMME_H_
10 #include <list>
11 #include "Fonction.h"
12 #include "ValVide.h"
13 #include "ValChaine.h"
14 #include "ValErreur.h"
15 #include "ValDouble.h"
16 #include "Plage.h"
17 
18 namespace modele {
19 class Argument;
20 class Expression;
21 
22 
23 class Somme: public Fonction {
24 protected:
28  static std::string nom;
29 
35  static int nbParam; // par défaut illimité
36 
37 public:
38  Somme(std::list<Argument *> larg): Fonction(larg) {}
39 
41  double d=0;
42  for(Argument *pa : listeParam){ // pour chaque argument
43  if(Expression* e=dynamic_cast<Expression*>(pa)){ // traitement d'une expression
44  Valeur *v=e->calculer();
45  if(dynamic_cast<ValErreur*>(v)){ // si erreur
46  //cout<<"DEBUG:ERREUR:v:"<<v<<endl;
47  return v; // propagation
48  } else if(dynamic_cast<ValChaine*>(v)){ // si chaîne à gauche !
49  delete v; // désalocation et d=d+0 chaine==0
50  } else if(dynamic_cast<ValVide*>(v)){ // si vide à gauche !
51  delete v; // d est déjà égal à 0;
52  } else if(ValDouble* vd=dynamic_cast<ValDouble*>(v)){ // si double à gauche !
53  //cout<<"DEBUG:vdg:"<<vdg<<endl;
54  d+=vd->getDouble();
55  delete v;
56  } //else cout<<"DEBUG:Aucun dynamic cast!"<<endl;
57  } else if(Plage* p=dynamic_cast<Plage*>(pa)){ // traitement d'une plage
58  for(Plage::Iterator it=p->begin();it!=p->end();it++){
59  // std::cout<<"DEBUG:courante: "<<(*it).toString()<<std::endl;
60  Valeur *v=(*it).calculer();
61  if(dynamic_cast<ValErreur*>(v)){ // si erreur
62  //cout<<"DEBUG:ERREUR:v:"<<v<<endl;
63  return v; // propagation
64  } else if(dynamic_cast<ValChaine*>(v)){ // si chaîne à gauche !
65  delete v; // désalocation et d=d+0 chaine==0
66  } else if(dynamic_cast<ValVide*>(v)){ // si vide à gauche !
67  delete v; // d est déjà égal à 0;
68  } else if(ValDouble* vd=dynamic_cast<ValDouble*>(v)){ // si double à gauche !
69  //cout<<"DEBUG:vdg:"<<vdg<<endl;
70  d+=vd->getDouble();
71  delete v;
72  } //else cout<<"DEBUG:Aucun dynamic cast!"<<endl;
73  } // fin for
74  } // fin if plage
75  } // fin du for param
76  return new ValDouble(d);
77  }
78 
82  std::string toString(){
83  std::string r=Somme::nom+"(";
84  bool premiereFois=true; // pour les ;
85  for (Argument *e: listeParam){
86  if (premiereFois) {
87  premiereFois=false; // ce n'est plus la premiere fois !
88  } else {
89  r+="; ";
90  }
91  r+=e->toString();
92  }
93  return r+")";
94  }
95 
97  return new Somme(std::list<Argument *>(listeParam));
98  }
99 
100  ~Somme() {
101  // TODO Auto-generated destructor stub
102  }
103 };
104 
105 } /* namespace modele */
106 
107 #endif /* SOMME_H_ */
La classe abstraite Valeur représente une valeur parmi : ValErreur, ValDouble, ValChaine, ValVide.
Definition: Valeur.h:19
static int nbParam
Nombre de paramètres de la fonction : -1 : illimité 0 : aucun 1..n : n paramètres.
Definition: Somme.h:35
Itérateur de plage permettant de parcourir l'ensemble des références absolues désignées par une Plage...
Definition: Plage.h:96
Definition: Argument.cpp:10
Definition: Fonction.h:16
std::list< Argument * > listeParam
Liste des paramètres de la fonction.
Definition: Fonction.h:21
Definition: Argument.h:16
Definition: Somme.h:23
static std::string nom
nom de la fonction : SOMME
Definition: Somme.h:28
Expression * clone()
Clonage arborescent d'une expression.
Definition: Somme.h:96
La classe Expression représente la classe ABSTRAITE racine de la hiérachie des noeuds calculables de ...
Definition: Expression.h:25
Valeur * calculer()
Méthode virtuelle pure calculant la valeur de l'expression (arbre)
Definition: Somme.h:40
std::string toString()
Fonction retournant une chaîne représentant la fonction.
Definition: Somme.h:82
La classe ValDouble représente une Valeur double.
Definition: ValDouble.h:20
virtual Valeur * calculer()=0
Méthode virtuelle pure calculant la valeur de l'expression (arbre)
Definition: Plage.h:23