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 :

Devoir de programmation


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut Devoir de programmation
    Bonsoir à tous,

    Je suis actuellement une formation à distance de programmeur. J'apprends le C-C++. Dans le cadre de cette formation, je dois rendre des devoirs. Me voila bloqué à ce 1er devoir qui nous demande :
    Écrire une fonction « float puissance(float x, int n) » qui renvoie x^n. La mettre en œuvre en utilisant les conversions de type.
    J'ai écrit ce programme mais sans suivre les pistes données par mon prof'. Mon programme fonctionne et pas celui évoqué par mon prof'.
    Comment faire ?

    Code Mon script : 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
     
    #include <iostream>
    #include <cmath>
    using namespace std;
     
     
    float puissance(float x, int n) {
    if (n == 0) {
    return 1;
    } else {
    if (n > 0) {
    return x * puissance(x,n-1);
    } else {
    return 1 / puissance(x,-n);
    }
    }
    }
     
    int main()
    {
     
        float x;
        int n;
        cout<< "Elévation à une puissance entière positive.\n";
        cout<< "Donnez un nombre réel : ";
        cin>> x;
        cout<< "Donnez la puissance (entier positif) : ";
        cin>> n;
     
        if (n<0)
            cout << "La puissance doit être un entier positif.\n";
        else
            cout << x << " puissance " << n << " = " << puissance(x,n) << endl;
    }

    Code Pistes donnée par le prof : 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
     
    #include <iostream>
    using namespace std;
    float puissance(float x, int n) {
    float resultat=1;
     
    for(int i=1;i<=n;i++)
    resultat = resultat * x;
    return resultat;
    }
     
    void main()
    {
      char c=5;
      int i=10;
      int j=6;
      float r=2.456;
      float r1;
      float r2;
      float r3;
      float r4;
      float r5;
      r1=1,r2=1,r3=1,r4=1,r5=1;
      r1 = puissance(r,1);
      r2 = puissance(r,c);
      r3 = puissance(j,i);
      r4 = puissance(j,r);
      r5 = puissance(0,4);
     
      cout <<"r1 = "<<r1<<"\n";
      cout <<"r2 = "<<r2<<"\n";
      cout <<"r3 = "<<r3<<"\n";
      cout <<"r4 = "<<r4<<"\n";
      cout <<"r5 = "<<r5<<"\n";
        getch();
    }

    Voila ce que le terminal me répond lorsque je veux compiler cette source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    user@K73E:~/Dropbox/EDUCATEL/PROGRAMMATION ET DEVELOPPEMENT D'APPLICATION EN C++$ g++ puissance3.cpp -o ex1bis
    puissance3.cpp:12:11: erreur: ‘::main’ must returnint’
    puissance3.cpp: In function ‘int main()’:
    puissance3.cpp:35:11: erreur: ‘getch’ was not declared in this scope
    puissance3.cpp:35:12: erreur: expected ‘}’ at end of input
    Merci de votre aide.

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    Tu as juste fait la version récursive et lui l'itérative, donc les deux sont correctes.

    Le programme de ton prof ne compile pas car il l'a fait pour Windows et je pense, avec un vieux compilateur. Donc enlève simplement le getch(), et remplate le void main par int main.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    So nice ça marche, compilé et exécuté.

    Par contre je ne comprend pas trop la forme itérative: Le terminal affiche le résultat de r, r1, r2, r3, R4, r5, mais a aucun moment il ne demande à l'utilisateur de saisir x et n. Comprends pas?
    Je suis relativement embêté de trouver que la version du prof est NUL, c'est pour ça je pense qu'il y a un truc que je n'ai pas dû percuté.
    Je vous remercie des quelques explication que vous pourrez m'apporter.

  4. #4
    Membre habitué Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Points : 154
    Points
    154
    Par défaut
    Je crois qu'il y a une mauvaise compréhension.
    Forme itérative ou récursive n'a rien à voir avec le fait qu'on demande à l'utilisateur d'entrer des valeurs sur l'entrée standard (ici le clavier) pour tester le programme. Cela, c'est juste un choix de conception, tu as décidé de faire un programme un peu plus interactif, c'est tout à ton honneur.

    Quand on te dit que tu as employé une forme récursive, c'est que ta fonction s'appelle elle-même dans son corps (et du coup empile ses retours successifs sur la stack(pile) mais cela pour le moment tu n'as pas à t'y intéresser).
    En gros une fonction récursive c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int fonction(someVariables)
    {
     ...[someCode]
     return fonction(someVariablesModified);
    }
    Une fonction itérative, c'est qu'elle utilise une boucle de type for, while, ...

    En ce qui concerne la version de ton prof, déjà il n'a pas pris en compte les puissances négatives, donc ta version est plus complète.
    Pour améliorer ses performances, tu pourrais "l'inliner" et au lieu d'utiliser des flux de contrôle de type if, else if, else... tu pourrais utiliser l'opérateur conditionnel (condition C)?(expression si C est true:expression si C est false
    Exemple d'équivalence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    bool isGraduated(); // Une fonction qui renvoie un booléen
    void offerDrivingLicence();
    void haveToWorkHarder();
     
    // Avec les flux de contôle :
    if(isGraduated())
       offerDrivingLicence();
    else
       haveToWorkHarder();
     
    // Avec l'opérateur ?:
    isGraduated()?offerDrivingLicence():haveToWorkHarder;
    Sachant que tu as une imbrication de contôle avec if, else if et else, il te faudra mixer 2 opérateurs conditionnels pour parvenir au résultat.

  5. #5
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Citation Envoyé par Xtrem_Voyageur Voir le message
    Pour améliorer ses performances, tu pourrais "l'inliner" et au lieu d'utiliser des flux de contrôle de type if, else if, else... tu pourrais utiliser l'opérateur conditionnel (condition C)?(expression si C est true:expression si C est false

    Sachant que tu as une imbrication de contôle avec if, else if et else, il te faudra mixer 2 opérateurs conditionnels pour parvenir au résultat.
    Je ne suis pas d'accord, ça n'améliore pas les performances et en plus ça peut vite contribuer à l'illisibilité du code (surtout en les imbriquant). Même l'inline n'améliore pas les performances, le compilateur n'est pas obligé d'inliner et il le fait souvent bien tout seul quand il le juge nécessaire.

    Sinon, ton prof ne demande pas à l'utilisateur d'entrer la puissance et le nombre car il les marque en dur dans le programme et les test après.

  6. #6
    Membre habitué Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Points : 154
    Points
    154
    Par défaut
    Alors pour te répondre, en effet, tous les compilateurs ne gèreront pas l'inlining de la même façon. Certains compilateurs optimiseront d'ailleurs très correctement l'inlining sur ce genre de fonctions. Maintenant, entre inliner et ne pas inliner, qu'est ce cela te coûte d'ajouter le modifier "inline" (6 lettres à taper), rien n'est à perdre, cela est certain (au pire le compilateur est mauvais et n'apporte rien en terme d'optimisation)

    Pour l'opérateur conditionnel, saches que les flux de contrôles de type if, else if côutent très cher en terme de performance, je n'ai pas été voir l'implémentation de l'opérateur conditionnel ( ?: ) mais je suis quasiment sûr qu'un bon compilateur optimisera le code et que les performances seront améliorées.
    Quant au programme illisible, l'imbrication des deux reste largement compréhensible...

  7. #7
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Alors là il faudra que tu m'expliques ce qu'il peut optimiser parce que, à première vue, c'est dur à croire.

    De toute façon ce n'est pas le sujet de ce topic

  8. #8
    Membre habitué Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Points : 154
    Points
    154
    Par défaut
    Oui, j'ai jeté un coup d'oeil rapide, il semblerait que sans optimisation aucune, le code machine généré pour les structures de contrôle et l'opérateur ternaire ne soit pas identique et que les instructions processeur (x86) pour l'opérateur ternaire soient plus rapides que celles des branchements. Mais qu'au final, après optimisation par le compilateur, si optimisation il y a, les deux fournissent le même code. Et là, il n'y a donc plus aucune différence.
    Donc, la dessus, tu marques tout de même 1 point.
    Pour l'inlining, je crois bien l'avoir lu un jour pour une implémentation du factoriel, mais je ne peux être sûr de rien.
    Mais ce n'est pas le sujet du topic et l'auteur a déserté.

  9. #9
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Pourquoi vous avez inclut la bibliothèque <cmath> ??

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2011
    Messages : 90
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par nourhene4 Voir le message
    Pourquoi vous avez inclut la bibliothèque <cmath> ??
    Merci de cette remarque.

    Je sais pas pourquoi j'ai ajouté cette bibliothèque. Peut-être parce-que je demandais au programme de faire un calcul de puissance.

    Du coup avant de me lancer dans le c++ je vais retourner bosser le C tout court. Je mets ce devoir en stand by.

  11. #11
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    @Trademark,Xtrem_Voyageur: L'implémentation des if et des ternaires n'est pas nécessairement identique. Emmanuel Deloget l'évoque dans son dernier billet (sur son blog) à propos des prédictions des branchements. Par contre choisir l'un ou l'autre pour des raisons d'optimisation c'est vraiment de la micro-optimisation, c'est loin d'être essentiel, AMA (et comme tout optimisation, c'est à bencher avant de tirer des conclusions).

Discussions similaires

  1. automate programmable industriel : Devoir
    Par numberiio dans le forum Etudes
    Réponses: 0
    Dernier message: 07/09/2013, 13h33
  2. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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