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

 C++ Discussion :

Programme qui tombe en marche sans modification particulière


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Programme qui tombe en marche sans modification particulière
    Bonjour à tous,

    depuis peu, j'essaie de m'auto-initier au c++; je travaille avec le livre "Programmation, principes et pratiques avec c++" d'un certain Bjarne Stroustrup (pas très connu, n'est ce pas?).

    J'ai voulu m'amuser à faire un programme relativement simple pour me familiariser avec la syntaxe afin de trouver la solution d'une équation non linéaire...Et j'obtiens un comportement des plus étranges qui n'a rien à voir avec la nature du problème que je veux résoudre.

    Voici sans plus attendre le code (j'ai essayé de faire un pseudo exemple minimal)
    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
    83
    84
    85
    86
     
    #include <iostream>
    #include <math.h>
     
    using namespace std;
     
    double f(double x){
      return pow(x,3)-cos(x);
    }
     
    double deriv_f(double x){
      return 3*pow(x,2)+sin(x);
    }
     
    int main() {
     
      int n_iter=100;
      double epsilon=1e-6;
      double delta =1e-6;
     
      double a=0;
      double b=2;
      double c0;
      double c1;
     
      double x=1;
      double y;
      double x0=1;
      double x1=2;
     
      int method=3;
     
      if (method==1){
        for (int i;i<n_iter;i++){
          c0=(a+b)/2;
          if (f(a)*f(c0)<0){
        	b=c0;
          }
          else {
        	a=c0;
          }
          c1=(a+b)/2;
          cout<<"f(x) = "<<f(c1)<<endl;
          cout<<"  Relative Error = "<<abs(c1-c0)/abs(c1)<<endl;
          if (abs(c1-c0)<epsilon*abs(c1) && f(c1)<delta){
        	cout<<"The solution found in "<<i+1<<" iterations is x= "<<c1<<endl;
        	break;
          }
        }
      }
     
      else if (method==2){
        for (int i;i<n_iter;i++){
          y=x-f(x)/deriv_f(x);
          cout<<"f(x) = "<<f(y)<<endl;
          cout<<"  Relative Error = "<<abs(y-x)/abs(y)<<endl;
          if (abs(y-x)<epsilon*abs(y) && abs(f(y))<delta){
        	cout<<"The solution found in "<<i+1<<" iterations is x= "<<y<<endl;
        	break;
          }
          x=y;   
        }
      }
     
     
      else if (method==3){
        for (int i;i<n_iter;i++){
          y=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
          cout<<"f(x) = "<<f(y)<<endl;
          cout<<"  Relative Error = "<<abs(y-x1)/abs(y)<<endl;
          if (abs(y-x1)<epsilon*abs(y) && abs(f(y))<delta){
        	cout<<"The solution found in "<<i+1<<" iterations is x= "<<y<<endl;
        	break;
          }
          x0=x1;
          x1=y;     
        }
      }
     
      else {
        cout<<"Nothing to do"<<endl;
        exit(0);
      }
     
      return 0;
    }
    A ce stade, je n'utilise absolument pas les possibilités qu'offrent le language, j'en suis conscient (ça viendra plus tard, je l'espère).

    Voici le problème: je compile et exécute en ligne de commande avec
    g++ -o nonlinear nonlinear.cc && ./nonlinear

    Et il ne se passe...Rien du tout.
    Par contre, si je mets le contenu d'un des if/else if en commentaires...les deux autres méthodes fonctionnent et le résultat obtenu est correct.

    J'ai fini par corriger le problème en incluant les variables spécifiques à chacune des méthodes dans l'instruction if associée, de la manière suivante

    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
    83
    84
    #include <iostream>
    #include <math.h>
     
    using namespace std;
     
    double f(double x){
      return pow(x,3)-cos(x);
    }
     
    double deriv_f(double x){
      return 3*pow(x,2)+sin(x);
    }
     
    int main() {
     
      int n_iter=100;
      double epsilon=1e-6;
      double delta =1e-6;
     
      int method=3;
     
      if (method==1){
        double a=0;
        double b=2;
        double c0;
        double c1;
        for (int i;i<n_iter;i++){
          c0=(a+b)/2;
          if (f(a)*f(c0)<0){
        	b=c0;
          }
          else {
        	a=c0;
          }
          c1=(a+b)/2;
          cout<<"f(x) = "<<f(c1)<<endl;
          cout<<"  Relative Error = "<<abs(c1-c0)/abs(c1)<<endl;
          if (abs(c1-c0)<epsilon*abs(c1) && f(c1)<delta){
        	cout<<"The solution found in "<<i+1<<" iterations is x= "<<c1<<endl;
        	break;
          }
        }
      }
     
      else if (method==2){
        double x=1;
        double y;
        for (int i;i<n_iter;i++){
          y=x-f(x)/deriv_f(x);
          cout<<"f(x) = "<<f(y)<<endl;
          cout<<"  Relative Error = "<<abs(y-x)/abs(y)<<endl;
          if (abs(y-x)<epsilon*abs(y) && abs(f(y))<delta){
        	cout<<"The solution found in "<<i+1<<" iterations is x= "<<y<<endl;
        	break;
          }
          x=y;   
        }
      }
     
     
      else if (method==3){
        double x0=1;
        double x1=2;
        double y;
        for (int i;i<n_iter;i++){
          y=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
          cout<<"f(x) = "<<f(y)<<endl;
          cout<<"  Relative Error = "<<abs(y-x1)/abs(y)<<endl;
          if (abs(y-x1)<epsilon*abs(y) && abs(f(y))<delta){
        	cout<<"The solution found in "<<i+1<<" iterations is x= "<<y<<endl;
        	break;
          }
          x0=x1;
          x1=y;     
        }
      }
     
      else {
        cout<<"Nothing to do"<<endl;
        exit(0);
      }
     
      return 0;
    }
    Et ça marche...

    Je passe donc d'un
    "Mon code ne marche pas...Pourquoi?"
    à
    "Mon code marche...Pourquoi?"

    Qu'est ce qui m'échappe?

    D'avance merci pour votre aide.

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Un simple diff montre qu'il n'y a aucune différence significative entre les deux programmes.

    Citation Envoyé par David9021 Voir le message
    (j'ai essayé de faire un pseudo exemple minimal)
    Je me permets de spéculer que c'en peut être la cause. C'est bien de vouloir isoler le comportement erroné, encore faut-il le reproduire : qu'en est-il avec le premier programme ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Toutes mes excuses, je me suis particulièrement mal exprimé.

    J'ai constaté ce comportement dans mon programme d'origine, je l'ai copié et j'en ai soustrait juste assez pour pouvoir reproduire cette "erreur".

    J'ai ensuite compilé et exécuté le premier programme que je donne dans mon post (rien ne se passe), je l'ai modifié et là tout fonctionne. De mon point de vue, je n'ai quasiment rien fait (placer les déclarations de variable dans le bloc if où je les utilise)...Et pourtant, l'anomalie a disparu.

    Le programme d'origine contient juste un peu plus de méthodes également placé dans des instructions if, quelques commentaires et un test de non convergence en fin de boucle pour chaque méthode.

    Du coup, j'ai testé avec un autre ordinateur et là, la faute apparaît plus clairement: je n'ai jamais initialisé "i"...
    Je ne comprends pas pourquoi le programme réagit ainsi (et le comportement du deuxième programme dans mon précédent post diffère sur un autre ordinateur, rien ne se passe pour certaines valeurs) mais c'était ça le soucis.

    Problème résolu, merci et désolé pour le dérangement.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est vraiment une bonne habitude à prendre d'initialiser toutes tes variables au moment de la déclaration. C'est d'ailleurs une des choses que j'aime dans auto, puisqu'il te force à le faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    auto i; // error
    auto i = 0; // Ok, i est un int
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    J'en prends bonne note, merci pour le conseil.

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

Discussions similaires

  1. [XL-2007] Question de novice sur l'aide disponible
    Par ..ooooOö.. dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/12/2011, 18h48
  2. 2 petites questions de novice
    Par cdevl32 dans le forum Flash
    Réponses: 3
    Dernier message: 06/12/2009, 08h43
  3. question de novice - décompiler un fichier exe?
    Par ver_for dans le forum Runtime
    Réponses: 4
    Dernier message: 25/08/2008, 13h22
  4. 2 questions de novice
    Par doc funki dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 11/11/2006, 09h56
  5. Question de novice
    Par FGEEK dans le forum Oracle
    Réponses: 1
    Dernier message: 03/07/2006, 21h40

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