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

Contribuez Delphi Discussion :

Sources : Calculatrice "améliorée"


Sujet :

Contribuez Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Sources : Calculatrice "améliorée"
    Bonjour à tous,
    j'ai programmé une petite calculatrice en delphi (2006), qui interprète une chaine de caractères pour en calculer le résultat.
    Elle manipule des chaines de caractères, du coup elle n'est pas limitée en nombre de décimales
    exemple pour 1000 décimales :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    171/1379  = 0.1240029006526468455402465554749818709209572153734590282813633067440174039158810732414793328498912255257432922407541696881798404641044234952864394488759970993473531544597534445250181290790427846265409717186366932559825960841189267585206671501087744742567077592458303118201595358955765047135605511240029006526468455402465554749818709209572153734590282813633067440174039158810732414793328498912255257432922407541696881798404641044234952864394488759970993473531544597534445250181290790427846265409717186366932559825960841189267585206671501087744742567077592458303118201595358955765047135605511240029006526468455402465554749818709209572153734590282813633067440174039158810732414793328498912255257432922407541696881798404641044234952864394488759970993473531544597534445250181290790427846265409717186366932559825960841189267585206671501087744742567077592458303118201595358955765047135605511240029006526468455402465554749818709209572153734590282813633067440174039158810732414793328498912255257432922407541697
    Elle gère les parenthèses, les puissances ( signe ^) et l'ordre des opérations
    exemple 2*3+4*5 = 26

    Elle permet aussi d'afficher le détail des opérations (+ - et x)
    exemple :
    -----------------------
    Détail des opérations :
    37
    x 81
    ----
    __37 (normalement sans les _ )
    2960
    ----
    2997
    -----------------------
    Résultat final :
    2997

    Je met le source à disposition, pour en faire profiter la communauté

    Vous pouvez la télécharger ici :
    sources (6ko)
    executable (250ko)

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    c'est amusant

    par contre c'est un peu bizarrement fait...

    2*(5+5)*2+5

    -----------------------
    Détail des opérations :
    5 + 5 = 10
    2 + 5 = 7
    10 * 7 = 70
    2 * 70 = 140
    -----------------------
    Résultat final :
    140

    pour ce genre de calcul tu dois passer par un analyseur de syntaxe dont voici le principe général (note qu'au plus bas niveau GetTerme invoque la fonction de haut niveau Expression) :
    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
     
     
    function Expression:string; forward;
     
    function GetTerme: string;
    begin
      if ParentheseOuvrante then
      begin
        Result := Expression;
        ParentheseFermante;
      end
      else
       Result := Nombre;
    end;
     
    function  GetFacteur: string;
    begin
      Result := GetTerme;
      while Operation in ['+','-'] do
      begin
        Result := Caculer(Operation, Result, GetTerme);
      end;
    end;
     
    function Expression: string;
    begin
      Result := GetFacteur;
      while Operation in ['*','/'] do
      begin
       Result := Calculer(Operation, Result, GetFacteur);
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Caramba !!!
    Je vais devoir corriger ma copie et revoir mon "parser" de formule


    Merci pour le retour

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Corrigé
    Cette fois je sors la grosse artillerie, voici ma solution :

    Dans un premier temps, je vais décomposer la formule à évaluer en pleins de petites opérations unitaires, du style :

    formule = Gauche Opération Droite

    Gauche et Droite peuvent être soit une formule soit un nombre.
    Opération = + - * ou /


    par exemple : 2*3+4 peut se décomposer en
    A = B + 4
    et
    B = 2 * 3

    Nous pouvons représenter ces petites opérations sous forme d'un "arbre"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        +
       / \
      *   4
     / \
    2   3
    l'évaluation d'un tel arbre se fait "en descendant", les opérations les plus basses seront calculées les premières, simplement par récursivité.

    Passons au pb de Mr Toth : 2*(5+5)*2+5

    1ere passe : construction de notre arbre de calcul par lecture brute de la formule

    on ajoute une petite opération à l'arbre au fil de la lecture de la formule

    voila ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
             *
            / \
           2   +
              / \
             *   5
            / \
           ()  2
          /
         +
        / \
       5   5
    ici, voici l'ordre des opérations :
    5 + 5
    (5+5) * 2
    ((5+5)*2) + 5
    2 * (((5+5)*2)+5)

    Bon, c'est pas terrible ça, il faut gérer les priorités des opérations (faire les x et / avant les + et les -)


    2nde passe : Equilibrage de l'arbre de calcul

    pour effectuer les * et / avant les + et les - on permute simplement les éléments de l'arbre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       *                 +
      / \               / \
     A   +    donne    *   C
        / \           / \
       B   C         A   B

    revoici notre arbre "équilibré" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          +
         / \
        *   5
       / \
      2   *
         / \
        ()  2
       / 
      +
     / \
    5   5
    ici, voici l'ordre des opérations :
    5 + 5
    (5+5) * 2
    2 * ((5+5)*2)
    (2*((5+5)*2) + 5
    ce qui est correct :o)

    CQFC (ce qu'il fallait coder)

    j'ai corrigé rapidos, et dans la foulée j'ai retiré l'évaluation des puissances

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 679
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 679
    Points : 13 082
    Points
    13 082
    Par défaut Well...
    C'est un exercice de style, mais la contribution au forum n'est pas flagrante

    j'ai corrigé rapidos, et dans la foulée j'ai retiré l'évaluation des puissances
    Pourtant la gestion d'une puissance paraît beaucoup plus simple qu'une parenthèse .

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    ... la contribution au forum n'est pas flagrante
    Comment ça ? je ne comprend pas ta remarque Andnotor, je suis nouveau ici et je pensais que ce forum servait justement à proposer des sources delphi, pour en faire profiter toute la communauté...merci de me dire ce qui ne va pas pour que j'évite de le re-faire

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par NotreCause Voir le message
    Comment ça ? je ne comprend pas ta remarque Andnotor, je suis nouveau ici et je pensais que ce forum servait justement à proposer des sources delphi, pour en faire profiter toute la communauté...merci de me dire ce qui ne va pas pour que j'évite de le re-faire
    alors, le forum n'est pas un lieu de publication de sources en effet.

    c'est plus un lieu de question/réponse sur une problématique donnée.

    Ceci dit, j'ai moi même posté il y a peu une démo d'un effet de scrolling à la iPhone

    mais si je peux me permettre une critiques sur tes deux projets, le premier utilise un composant payant qui rend ton source inexploitable dans l'état...à moins d'acquérir le composant.

    ta calculatrice n'est pas très évoluée et son algorithme est inaboutie...du coup là encore la démarche est intéressante mais l'intérêt discutable

    Maintenant je ne parle qu'en mon nom propre, je ne fais pas parti de l'équipe Developpez.com, et pour mes projets je passe plutôt par mon site perso (bien que mes obligations familiales aient fortement ralenti son activité ^^).
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    alors, le forum n'est pas un lieu de publication de sources en effet.
    Alors, a quoi sert la partie du forum Contribuez ? Je pensais sincerement qu'elle servait a ca ... Mais bon, expliquez vous !

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Alors, a quoi sert la partie du forum Contribuez ? Je pensais sincerement qu'elle servait a ca ... Mais bon, expliquez vous !
    ouais remarque c'est pas faux

    "Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources et autres ressources pour la rubrique Delphi."
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 679
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 679
    Points : 13 082
    Points
    13 082
    Par défaut
    A mon sens, la section Contribuez sert à fournir une information. Une sorte de FAQ simplifiée.

    On ne rentre pas dans les détails du pourquoi et du comment, mais on amène une nouvelle façon de faire (plus rapide, moins gourmande). Une adaptation pour une nouvelle plateforme (Portage de XP sous Vista-7). Accès à un API particulié, etc.

    Dans le cas présent, il existe pléthore de parsers mathématiques performants et en open source sur le net. Le sujet n'est donc pas nouveau et est déjà largement documenté .

  11. #11
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Boooof, moi je pense que c'est pas génant de donner des sources sur cette section. En plus, elle n'est pas tres active, donc ca permet d'avoir des projets récents, et ca renouvelle un peu le forum !

    Enfin, vous faites ce que vous voulez ... Ce n'est que mon humble avis

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Initialement je pensais que mettre à disposition des sources permettait d'avoir une sorte de grosse "boite à outils de source" dans laquelle on peut piocher des morceaux de code au besoin. Heu, une petit explication s’impose : généralement je regarde les projets dont les sources sont dispo et je note dans un coin de ma tête ce que le projet fait, et, plus tard, lorsque j’ai besoin de faire à peut près la même chose, je me dis "ah oui, j’avais vu ça quelque part déjà" et je retourne voir comment c’était fait, ça fait un bon point de départ.

    Bon, n'étant pas chez moi je respecte les "règles" (que j'avais mal interprétées), et vous présente mes excuses pour le dérangement occasionné. Vous pouvez supprimer mes posts au besoin.

    Je vais farfouiller dans mon bazar voir si je n'ai pas d'autres sources qui rentrent plus dans le cadre de ce forum.

    Je suis désolé et navré d'avoir "pollué" inutilement ce forum.

  13. #13
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    mais la contribution au forum n'est pas flagrante
    Non je ne pense pas: cette source pourra ainsi (lors de la prochaine mise à jour) être incluse dans la page sources Nous acceptons toutes les contributions!
    Tu as bien fait de proposer ces sources ici! Ce sous-forum est là pour ça
    Citation Envoyé par mick605
    En plus, elle n'est pas tres active, donc ca permet d'avoir des projets récents, et ca renouvelle un peu le forum !
    Pas mieux sauf le début
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 679
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 679
    Points : 13 082
    Points
    13 082
    Par défaut
    C'est toi le boss

  15. #15
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    C'est toi le boss
    Sans viser personne mais les rédacteurs toujours prétextent d'être bénévoles et si tu demande pour faire bouger les choses ils te rependent propose nous des idées.., l’équipe est bénévole..., si ca ne te suffit pas il faut une formation payante.
    Récemment un défi a été lancé par un nouveau membre ca ranime un peu le forum espérant que ce membre soit épargné de tout ca

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 679
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 679
    Points : 13 082
    Points
    13 082
    Par défaut
    Désolé, mais j'ai rien compris

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