Forum Programmation.c++ Y a-t-il... un expert dans le coin ? ;-)

Posté par  .
Étiquettes : aucune
0
14
mar.
2007
Bonjour,

Je suis relativement novice en C++ et j'ai un problème vraiment compliqué à résoudre...

Je cherche à construire un modèle d'abstraction pour une analyse statistique. La base est : j'ai des données statistiques conservées dans une struct que je lis de la plus ancienne à la plus nouvelle.
Je souhaite pouvoir appliquer un nombre x de méthodes sur ces données pour pouvoir les traiter. Par exemple une moyenne, un test statistique, etc.
Chacune de ces méthodes prend un nombre variable de parametres ; ex: moyenne(x, y) ; methode_stat(x, y, z, k).

La difficulté est que je souhaite tester un nombre x methodes, avec des parametres differents à chaque fois.
Par exemple je souhaite tester mes stats avec la fonction moyenne ; on fait des passe avec moyenne(1) jusqu'a moyenne(1000).
Ensuite on recommence avec moyenne(1) et stat(1) ; on teste chacune des methodes de 1 à 1000 ; etc.

la base du code devrait ressembler à ca :



struct data {
int nb;
float k;
};
struct data data[100];

# quelles fonctions on utilise ?
int utilise_moyenne = 0;
int utilise_strat = 0;

# quels parametres pour les fonctions
int param_moyenne_start = 123;
int param_moyenne_end = 456;



void base() {

int i;

# i correspond a data[i]
for( i= 0; i<100 ; i++) {

if( test(i) )
printf("test positif");
}
}


float moyenne(int i) {

return moyenne ;
}

float stat(int i) {

return stat ;
}


int test(int i) {

???

}


int main () {

# definit les fonctions qu'on utilise
int utilise_moyenne = 1;

# definit les parametres pour chaque fonction


# lance base() avec toutes les fonctions qu'on va utiliser
# ce qui donnerait

on lit base() avec moyenne(1) ; puis on refait une passe avec moyenne(2), puis moyenne(3), etc.



Dans test() je ne sais pas comment gerer le truc de dire "utilise telle fonction avec tels parametres
Dans main() je ne sais pas comment lancer base avec la fonction 1, avec les parametres x et y, puis la fonction 2, puis la fonction 3, etc.

Je pressent qu'a un moment il y a une fonction recursive que je dois utiliser, mais j'ai pas plus de billes pour le moment;
S'il y a un gourou dans la salle...

Merci,
Z.
  • # euh déjà

    Posté par  . Évalué à 3.

    ça ressemble beaucoup plus à du C, qu'à du C++
    (il existe un type bool en C++ et le printf est déconseillé en général)

    sinon, peut être qu'il y a moyen de te sortir de ton problème avec des pointeurs sur des fonctions. Je pensais à un tableau de pointeurs sur des fonctions créé dynamiquement. Je te laisse chercher de la doc là dessus, parce que j'ai faim et je dois faire à manger



    Peut-être que des langages comme le C/C++ ne se prêtent pas particulièrement à ce type de tests. Des langages fonctionnels fonctionnels pourraient être mieux adaptés (bon, niveau perfs, c'est sûrement beaucoup moins bien), mais par exemple en Caml, il me semble que tu peux créer un tableau de fonctions et les appliquer à une valeur (tant que les fonctions ont la même signature).

    un gourou du caml te renseignera mieux que moi.

    bonne soirée
    • [^] # Re: euh déjà

      Posté par  (site web personnel) . Évalué à 1.

      J'ai pas très bien compris ce que tu veux faire, mais si c'est créer des cellules et appliquer des méthodes sur la cellule en question tu a plutôt intérêt a faire ça :

      class cellule {
      private valeur1 = 0;
      private valeur2 = 0;
      ...
      function stat()
      {
      }
      function moyenne()
      {
      }
      }

      Puis dans ton main :
      #define MAX 1000
      int main ()
      {
      for (int i=0; i < 1000; i++)
      {
      void* current = new cellule(paramètres);
      current->stat();
      current->moyenne();
      }
      }

      Enfin un truc du style...

      J'ai pas touché au c++ depuis un moment et seulement au modèle objet php, donc pardon pour la syntaxe c++ incorrecte, j'ai essayé de te montrer comment j'aurais conçu tes méthodes a appliquer a des données.
      • [^] # Re: euh déjà

        Posté par  . Évalué à 1.

        arh, mon problème est pas simple a expliquer. L'idée est pas mauvaise mais cela ne correspond pas à mon problème.

        Ce que je souhaite c'est :


        for (i=0 ; i<10000 ; i++) {

        moyenne(1, i);
        moyenne(2, i);
        moyenne(...);
        moyenne(100000, i);

        et ensuite
        stat(1, i);
        stat(...);

        ... et tout ca DANS la boucle for

        }

        Le truc c'est que par la suite je suis potentiellement amené à définir 50 autres fonctions ; donc plutot que de tout me taper à la main, j'aimerai faire qqch de générique.
        du genre :
        - utilise la fonction moyenne(int k, int i) avec k de 0 à 10000;
        - utilise la fonction x() ..., y(), z(), etc.

        A la limite meme en php je vois pas comment faire.
        Z.
        • [^] # Re: euh déjà

          Posté par  (site web personnel) . Évalué à 2.

          for (i=0 ; i<10000 ; i++) {
          for (j=0; j<10000; j++) {
          moyenne(j,i);
          stat(j,i);
          }
          }

          Pour une moyenne sur l'ensemble tu fait :
          moyenne = 0;
          for (i=0; i<10000; i++) {
          moyenne += i;
          }
          moyenne = moyenne/(i+1);

          Etc...

          En fait je vois pas vraiment comment tu veux jouer ton coup, mais de toute façon tu va devoir te traîner des variables en dehors des boucles si tu a besoin de somme cumulées.

          Bref, c'est relativement complexe...

          ps : note qu'il serait peut-être plus avantageux pour faire ce genre de traitement de mettre tes données en base sql et te forger quelques requêtes sur ta table...
          Parce que bon moyenne et autre, ça dois être dispo de base dans les fonctions sql j'imagine...
          (Max et min y sont, donc le reste dois suivre même si j'en ai pas pour le moment besoin)
    • [^] # Re: euh déjà

      Posté par  . Évalué à 1.

      Merci pour ta réponse.

      C'est effectivement une bonne idée le tableau de pointeurs de fonctions, ca me permettrait de demander d'executer ou non telle fonction ; je vais essayer de voir ce que je peux faire avec (cela dit si t'as un ex je prend bien volontiers ;-).

      Par contre, le C/C++ est une contrainte que je me suis imposé, donc je ne px pas me retourner vers d'autres langages pour l'instant.
  • # approche objet

    Posté par  . Évalué à 2.

    l'avantage du c++, c'est son approche objet... essaye donc de penser objet pour envisager les stats à effectuer...

    un tableau de pointeur sur des fonctions, c'est mal, (en c++ en tout cas), car tu n'as aucun contrôle sur le typage de tes fonctions à la compilation.
    un tableau de functor est bien plus objet comme approche...

    exemple :

    class functor {
    public:
    operator () (int param1);
    };

    en fait dans un functor on surgarge l'opérateur parenthèese ouvrante/fermante pour émuler une fonction...

    ensuite, tu as un autre problème, celui des paramètres....
    c'est là encore la puissance du c++, tu peux faire des templates de functor...
    ce qui te permettra de fabriquer des functor génériques à paramètres variables et differents... (et tout ça vérifié et généré à la compilation)
    ta boucle de traitement pourra faire appel for_each(), qui prend en paramètre un functor... ou bien programmer ton propre for_each() qui acceptera tes functors en paramètres.

    je te conseille pour ça de regarder la bibliothèque STL et Boost qui te donneront tous les prototypes pour implémenter quelque chose de cohérent et de génerique.

    Boost : http://www.boost.org

    si t'as besoin de plus de précisions, je suis dans le coin...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.