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

Turbo Pascal Discussion :

[TPW] Méthode de Wallis


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut [TPW] Méthode de Wallis
    Salut les gars ;
    Bon voila j'ai un petit probléme dans mon code source !!de l'aide sera la bienvenue surtout que ma tete me fait trés mal et je vous remercie d'avance pour vos réponses !!
    voila l'enoncé
    On se propose de determiner une valeur approchée de pi par la methode de Wallis definie par la formule suivante pi/2=(2/1)*(2/3)*(4/3)*(4/5)*(6/5)*(6/7)*(8/7)*(8/9)etc Ecrire un programme pascal qui permet de determiner et d'afficher une valeur approchée de pi .Le calcul s'arrete lorsque la difference entre 2 valeurs consecutifs de cette formule devient strictement < 10 puissance -6
    Voila ce que j'ai pu faire en utilisant l'algorithme de récurrence
    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
     
    program exercice ;
    uses wincrt ;
    var
       x,s :real ;
     
    function calcul : real ;
    var
    a,b,c : integer ;
    s1 : real ;
    begin
     
    a:=2 ;
    b:=1 ;
    s:=0 ;
    c:=0 ;
     repeat
      c:=c+1 ;
      s1:=s ;   
      s:=s+(a/b) ;
      if c mod 2 <> 0 then
       begin
     
        b:=b+2 ; 
       end
      else if c mod 2 = 0 then
       begin    
        a:=a+2 ;
       end; 
     until abs(s-s1) < 0.000001 ;
     
    calcul:=s*2 ;
     
    end;
     
    begin
    x:=calcul ;
    writeln(x);
    end.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Ton code ne suit pas l'algorithme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
      s:=s+(a/b) ;
    ...
    devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
      s:=s*(a/b) ;
    ...
    Ce qui interdit d'initialiser s = 0.

    Pour échapper à ça, tu peux initialiser s avec la valeur du 1er terme (=2/1 = 2),
    et donc aussi changer la valeur d'origine de ton c, qui contrôle la manière d'incrémenter les variables a et b:
    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
    program exercice ;
    uses wincrt ;
    var
       x :real ;
     
    function calcul : real ;
    var
      a,b,c : integer;
      s,s1 : real ;
    begin
      a:=2 ;
      b:=3 ;
      s:= 2;
      c:=1 ;
      repeat
        c:=c+1 ;
        s1:=s ;
        s:=s*(a/b) ;
        if c mod 2 <> 0 then
        begin
          b:=b+2 ;
        end
        else if c mod 2 = 0 then
        begin
          a:=a+2 ;
        end;
      until (abs(s-s1) < 0.000001);
     
      calcul:=s*2 ;
    end;
     
    begin
      x:=calcul ;
      writeln(x);
      readln;
    end.
    Tu auras noté au passage que j'ai supprimé la variable globale s, pas du tout justifiée, et que j'ai ajouté "readln;" en dernière ligne, pour éviter que la console se ferme sans que tu aies le temps de lire l'affichage.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    salut ,
    ça marche pas !! il n'affiche pas le Pi lol
    Merci quand même

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut ça marche
    Bon ça marche il faut modifier la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (abs(s-s1) < 0.000001 en  (abs(s-s1) < 0.0001 {10 a la puissance -4 et non -6}
    peut etre il s'agit d'un probléme dans l'enoncé de l'exercice

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Chez moi, ça marche avec (abs(s-s1) < 0.000001)

    Mais ça peut venir du compilateur, en particulier de la précision qu'il utilise pour le type real.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Par défaut
    Citation Envoyé par thewho
    Bonjour,

    Chez moi, ça marche avec (abs(s-s1) < 0.000001)

    Mais ça peut venir du compilateur, en particulier de la précision qu'il utilise pour le type real.
    j'utilise TP for Windows mais il m'affiche 0.00000000 quand je modifie la difference a 10 puissance -6 !!
    qu'est ce que je dois faire pour modifier la précision du type réel ??

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/06/2013, 08h24
  2. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10
  3. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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