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 :

Conversion C++ en C


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut Conversion C++ en C
    Bonjour,
    j'ai le programme suivant qui représente la méthode de Newton, et comme je l'utilise pour programmer un bras robotisé, il me le faudrait en C.
    Je n'y connais hélas rien en C est-ce qu'une bonne âme peut m'aider voire me le convertir ?

    Merci beaucoup
    Aurélie

    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
    #include <cmath>
    #include <iostream>
    using namespace std;
     
    double lmain=10.0;
    double monabs;
    double ord;
    double haut;
    double lbras=14.7 ;
    double lavbras=18.7 ;
    // la fonction dont on cherche un zero
    inline double f(double x) 
    {      
    return (lmain-sqrt(ord*ord+monabs*monabs)+x*lbras*(sqrt(1-((haut-x*lbras)/lavbras)*((haut-x*lbras)/lavbras))+sqrt(1-x*x)));
    }
    // la derivee de f
    inline double fderiv(double x)
    {
    return lbras*(sqrt(1-((haut-x*lbras)/lavbras)*((haut-x*lbras)/lavbras))+sqrt(1-x*x))+x*lbras*(-x/(sqrt(1-x*x))+lbras*(haut-x*lbras)/(lavbras*sqrt(1-((haut-x*lbras)/lavbras)*((haut-x*lbras)/lavbras))));
     
           };
     
    double Newton(double (*f)(double), double (*fderiv)(double))
    {
         double epsilon;
         double itermax;
         double x0;  
         cout << "Quelle est la precision souhaitee?";
         cin >> epsilon;                                              
         cout << "Quelle est la valeur initiale?";
         cin >> x0;
         cout << "Quelle est le nombre d'iterations maximal?"; 
         cin >> itermax; 
     
         double x = x0;
         double xnew;
         int i = 0;
     
     while(i<itermax && abs(f(x)/fderiv(x))>=epsilon)
     {
            xnew = x - f(x) / fderiv(x);
            x=xnew;
            i++;
     
     
     }
        if(i==itermax)
        {cout << "la methode ne converge pas" << endl;}
        else
        {cout << "la methode converge en " << i <<" iterations"<< endl;};
        return xnew;
    }
     
    int main()
    {
           cout<<"abscisse= ?"<<endl; 
           cin>>monabs;
           cout<<"ordonnee= ?"<<endl;
           cin>>ord;
           cout<<"hauteur= ?"<<endl;
           cin>>haut;
           cout << "les racines du polynome sont " << Newton(f, fderiv)<<endl;
           system ("pause"); 
           return 0;
    }

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Salut,

    C et C++ sont très proche

    Après une lecture rapide de ton programme, il n'y a que cin/cout qui seront embêtant ils doivent être remplacés respectivement par des scanf/printf

    les directives d'includes sont a remplacer par leurs équivalent en C

    le namespace est a supprimer.

    c'est a peu près tout

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    merci beaucoup !
    j'avais un doute aussi sur les inline pour les définitions de fonctions... ils restent identiques ?

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    j'ai désormais converti mon programme en C :
    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
     
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    double lmain=10.0;
    double monabs;
    double ord;
    double haut;
    double lbras=14.7 ;
    double lavbras=18.7 ;
    // la fonction dont on cherche un zero
    _inline double f(double y)
    {             
    return lmain-sqrt(ord*ord+monabs*monabs)+y*lbras*(sqrt(1.0-((haut-y*lbras)/lavbras)*((haut-y*lbras)/lavbras))+sqrt(1.0-y*y));
    };
    // la derivee de f
    _inline double fderiv(double y)
    {
    return lbras*(sqrt(1.0-((haut-y*lbras)/lavbras)*((haut-y*lbras)/lavbras))+sqrt(1.0-y*y))+y*lbras*(-y/(sqrt(1.0-y*y))+lbras*(haut-y*lbras)/(lavbras*sqrt(1.0-((haut-y*lbras)/lavbras)*((haut-y*lbras)/lavbras))));
     
    };
     
    double Newton(double (*f)(double), double (*fderiv)(double))
    {
         double epsilon;
         double itermax;
         double x0;  
         printf("Quelle est la precision souhaitee? \n");
         scanf("%f", &epsilon);     
         printf("la valeur de epsilon %f \n", epsilon, epsilon);                                          
         printf("Quelle est la valeur initiale? \n");
         scanf("%f", &x0);
         printf("Quelle est le nombre d'iterations maximal? \n"); 
         scanf("%f", &itermax); 
         double x=x0;
         double xnew;
         int i= 0;
         double test=fabs(f(x0)/fderiv(x0));
         printf("%f %f\n" ,f(x0),f(x0));
        getchar();
     
         printf("%f", fderiv(x0));
         printf("\n"); 
      while(i<itermax && test>=epsilon)
     {
            xnew = x - (f(x)/fderiv(x));
            x=xnew;
            i++;
            test=fabs(f(x)/fderiv(x));
     }
     
     
        if(i==itermax)
        {printf("la methode ne converge pas \n");}
        else
        {printf("la methode converge en ");printf("%f",i);printf("iterations \n");};
        printf("les racines du polynome sont ");
        printf("%f",xnew);
        return xnew;
    }
     
    int main()
    {
           printf("abscisse= ? \n"); 
           scanf("%f", &monabs);
           printf("ordonnee= ? \n");
           scanf("%f", &ord);
           printf("hauteur= ? \n");
           scanf("%f", &haut);
           printf("%f",Newton(f, fderiv));printf("\n");
     
           system ("pause"); 
           return 0;
    }
    il y a hélas de nombreuses erreurs !
    sur visual studio, il m'indique 20 erreurs :
    - 4 erreurs C2143 qui indiquent qu'il manque un ; avant double x=x0 et les trois lignes suivantes
    - la suite des erreurs proviennent d'identificateurs non déclarés dans la fonction Newton, je comprends vraiment pas j'ai pourtant bien tout déclaré..
    - de meme il m'annonce que les deux opérations utilisant les fonctions f et fderiv pour calculer xnew et test dans la boucle while transforment des double en int, et donc possible perte de données....pourtant des deux cotés ce sont des double !
    au secours! (ce programme marche bien en C++ =))
    merci de votre aide
    Aurélie

  6. #6
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    En C, il faut déclarer impérativement toutes ses variables en début de fonction.

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Arzar Voir le message
    En C, il faut déclarer impérativement toutes ses variables en début de fonction.
    Pas forcément en début de fonction mais en début de bloc. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    int main() {
        printf("On va ouvrir un bloc.\n");
     
        {
            int n = 10;
            printf("Bloc ouvert, n = %d.\n", n);
        }
     
        return 0;
    }
    De plus, cela n'est vrai qu'en C90, la version la plus répandue. En C99, on a déjà les mêmes règles qu'en C++.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    merci ca marche !

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    ... je me suis avancée trop vite il semblerait que j'ai un problème avec les scanf et printf : en effet après des résultats vraiment non cohérents je teste ce programme très simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    double epsilon;
    int main()
    {
    printf("Quelle est la precision souhaitee? \n");
         scanf("%f", &epsilon);     
         printf("la valeur de epsilon %f \n", epsilon);   
    	 return 0;
    }
    mais voila je ne comprends pas le programme me renvoie "la valeur de epsilon 0.000000" quelque soit le epsilon rentré...

  10. #10
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Le formateur approprié pour le 'double' et scanf est %lf. De plus, tu peux mettre ta variable dans la fonction c'est plus propre.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    en effet ca marche merci !
    j'ai hélas encore un souci dans cette partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while((i<itermax)&&(test-epsilon>=0))
     {
            xnew = x - (f(x)/fderiv(x));
            x=xnew;
            i=i+1;
            test=fabs(f(x)/fderiv(x));
    		printf("%d\n",i);
    		printf("%d\n",itermax);
    		printf("%d\n",itermax-i);
     }
    en fait il ne fait la boucle while qu'une fois et en sort j'ai voulu voir pourquoi : quand je demande itermax=100 et du coup que i=1 lors du premier passage, il m'affiche que itermax-i=0 !! je comprends pas pourquoi il m'affiche pas 99...

  12. #12
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par aurelie95 Voir le message
    en effet ca marche merci !
    j'ai hélas encore un souci dans cette partie du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while((i<itermax)&&(test-epsilon>=0))
     {
            xnew = x - (f(x)/fderiv(x));
            x=xnew;
            i=i+1;
            test=fabs(f(x)/fderiv(x));
    		printf("%d\n",i);
    		printf("%d\n",itermax);
    		printf("%d\n",itermax-i);
     }
    en fait il ne fait la boucle while qu'une fois et en sort j'ai voulu voir pourquoi : quand je demande itermax=100 et du coup que i=1 lors du premier passage, il m'affiche que itermax-i=0 !! je comprends pas pourquoi il m'affiche pas 99...
    comment sont déclarés i et itermax, sont-ils correctement initialisé (avant la boucle)

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 9
    Par défaut
    pardon j'avais pas vu j'ai mis double pour itermax....
    ca marche très bien merci de vos réponses
    aurélie

Discussions similaires

  1. Conversion Assembleur Motorola 68xxx en Intel 80xxx
    Par markham dans le forum Autres architectures
    Réponses: 3
    Dernier message: 22/11/2002, 20h09
  2. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14
  3. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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