IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Fonction d'évaluation mathématique


Sujet :

Delphi

  1. #21
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154

  2. #22
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Re Bonjour

    J'ai fait une fonction qui transforme une expression tel que 2*3+5*6 en un tableau contenant chacun des différents élements qui sont renseignés par leur type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      // Le type d'un élément
      VItemType = (itNone, itNumber, itIdentifier, itUnaryOp, itBinaryOp);
      // L'élément, structure qui regroupe un descripteur de type et un variant.
      VItem = record
        ItemType: VItemType;
        ItemData: Variant;
      end;
      // Tableau dynamique d'élément.
      VItemArray = array of VItem;
    Le résultat escompté est :

    2*3+5*6 -->

    bon là je vous montre les tableaux que j'aurai aimé obtenir

    Id : Type : Valeur
    [1] : itNumber : 2
    [2] : itBinaryOp: "*"
    [3] : itNumber : 3
    [4] : itBinaryOp: "+"
    [5] : itNumber : 5
    [6] : itBinaryOp: "*"
    [7] : itNumber : 6

    Avec mon programme contenant ma fonction (qui s'appelle SplitExpresson) j'ai ceci
    [1] itNumber : 2
    [2] itBinaryOp : "*"
    [3] itNumber : 3
    [4] itBinaryOp : "+"
    [5] itNumber : 5
    [6] itBinaryOp : "*"

    bon maintenant avec 24+33*6

    j'attends

    Id : Type : Valeur
    [1] : itNumber : 24
    [2] : itBinaryOp: "+"
    [3] : itNumber : 33
    [4] : itBinaryOp: "*"
    [5] : itNumber : 6

    mais j'ai

    [1] itNone : "
    [2] itNumber : "24
    [3] itBinaryOp : "+
    [4] itNone : "
    [5] itNumber : "33
    [6] itBinaryOp : "*

    gloabalement elle fonctionne bien, mise à part les itNone qui n'ont rien n'a foutre là (itNone est juste un état pour préciser qu'on en est rendu au premier caractère dans la bucle, je vous laisse regarder la suite):

    je voulais savoir si vous aviez des corrections à faire sur la fonction qui n'est pas encore tout à fait au point

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    function SplitExpression(Expression: String): VItemArray;
    var
      // Le tableau des éléments de notre expression
      SplitedExpression: VItemArray;
      // Les index de boucle et le compteur de notre tableau dynamique
      ItemCount, StrLen, I: Integer;
     
      // Type du caractère courant, du caractère précédent
      CurrentType, PreviousType: VItemType;
      // ChaîneTemporaire de l'élément en cours
      CurrentItem: Variant;
     
      // Fonction qui détermine le type d'un caractère
      // de 0 à 9, itNumber
      // de A à Z, itIdentifier
      // pour | (racine) et ° (absolu), itUnaryOp (opérateurs Unaires)
      // pour +, -, *, /, %, \, ^ , itBinaryOp (opérateurs Binaires)
      function GetCharType(ExpressionChar: Char): VItemType;
      begin
        if (ExpressionChar in ['0'..'9']) then
          Result:=itNumber;
        if (ExpressionChar in ['A'..'Z','a'..'z']) then
          Result:=itIdentifier;
        if (ExpressionChar in ['|','°']) then
          Result:=itUnaryOp;
        if (ExpressionChar in ['+','-','*','/','%','\','^']) then
          Result:=itBinaryOp;
      end;
    begin
      // On rensigne la longueurs de l'expression pour la boucle
      StrLen:=Length(Expression);
     
      // On initialise le compteur de notre tableau à un
      ItemCount:=1;
     
      // On met le type du caractère précédent sur itNone, logique puisque le caractère précédent le premier caractère d'une chaîne n'existe pas
      PreviousType:=itNone;
     
      // On met notre chaîne temporaire à vide
      CurrentItem:='';
     
      // On scanne la chaîne caracère après caractère
      for I:=1 to StrLen do
      begin
        // On redimensionne le tableau par rapoort au compteur
        SetLength(SplitedExpression, ItemCount);
        // On extrait le type du caractère courant
        CurrentType:=GetCharType(Expression[I]);
        // S'il n'est pas nul (itNone), (et donc si on en est plus au début de la chaîne)
        if (PreviousType <> itNone) then
          // .. si le type du caractère courant est différent du précédent
          if (CurrentType <> PreviousType) then
          begin
            // alors c'est qu'il faut qu'on créé une nouvel case du tableau dans lequel on stocke tous
            // les caractères du même type qu'on a accumulé jusqu'à présent (variable CurrentItem).
            with SplitedExpression[ItemCount-1] do
            begin
              // On caractérise notre fragment de l'expression par un type
              ItemType:=PreviousType;
              // Et on stocke la donnée dans un variant.
              ItemData:=CurrentItem;
            end;
            // Enfin, on purge notre chaîne temporaire et on y stocke notre nouveau caractère
            CurrentItem:=''+Expression[I];
     
          end
          else
            // si le type courant est du même type que le précédent
            // alors on connue à stocker dans notre chaîne temporaire
            CurrentItem:=CurrentItem+Expression[I]
        else
            //si c'est le début de la chaîne, on stocke le premier caractère dans notre chaîne temporaire.
            CurrentItem:=Expression[I];
     
        // Le type du caractère courant va devenir celui du précédent car on passe à un nouveau caractère.
        PreviousType:=CurrentType;
        // Et on incrémente notre compteur.
        Inc(ItemCount);
      end;
      // On stocke notre tableau dans le résultat de la fonction.
      Result:=SplitedExpression;
    end;

  3. #23
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Quel intérêt d'utiliser les variants ? C'est plus lent que les types de base, et tu caractérise déjà son type par un ItemType. Tu devrais plutôt faire un record comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TItem = record
      ItemType : TItemType;
      case TItemType of
        itNone : ();
        itNumber : (Value : integer); // ou tout autre type de ton choix
        itIdentifier : (Name : String[15]);
          // une chaîne longue n'est pas autorisée dans un case de record
        itUnaryOp : (UnaryOp : TUnaryOp);
        itBinaryOp : (BinaryOp : TBinaryOp);
    end;
    Sinon, ton code n'est pas mal

  4. #24
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    il me semblait bien que l'on pouvait des case...of dans des structures mais j'étais plus sûr.

    Bon je met ça et je teste.

  5. #25
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Bon j'admet, j'ai eu une crise de flem,

    bon faut que je m'y mette. Allez, on se motive !

  6. #26
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Mais par contre je les définit comment mes types TUnaryOp et TBinaryOp ?

  7. #27
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    En types énumérés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type
      TUnaryOp = (uoPipe, upCircle); // le | et le °
      TBinaryOp = (boPlus, boMinus, boTimes, boDivide); // et d'autres
    Ou en caractères si tu préfères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type
      TUnaryOp = type Char;
      TBinaryOp = type Char;

  8. #28
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    ok je vais essayé

  9. #29
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    bon là faut vraiment que je m'y mette. Là y a eu plein de contrôles avant les vacances. En plus j'ai mon nouveau PC qui arrive dans pas longtemps mais bon je vais essayé de vous sortir un code dans pas longtemps.

  10. #30
    Membre du Club
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Points : 63
    Points
    63
    Par défaut
    Non vraiment je n'arrive pas. Je suis désolé mais je préférai les Variants. Là je nage, avec un case..of dans un record l'identificateur qui vari n'a jamais le même nom, donc c'est contraignant.

Discussions similaires

  1. Fonction d'évaluation pour algo génétique.
    Par Trap D dans le forum Intelligence artificielle
    Réponses: 16
    Dernier message: 14/04/2008, 10h34
  2. algorithme génétique:fonct°fitness et fonction d'évaluation
    Par rihanna dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 20/01/2008, 21h03
  3. Fonction d'évaluation d'un jeu de dames utilisant l'algorithme du min/max
    Par elron8 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 31/01/2007, 11h04
  4. [Jeu]Fonction d'évaluation
    Par le Daoud dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 11/06/2005, 09h45
  5. [MinMax] Fonction d'évaluation
    Par le Daoud dans le forum Intelligence artificielle
    Réponses: 5
    Dernier message: 09/06/2005, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo