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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 Expert 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
    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 confirmé
    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
    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 éprouvé 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
    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 Expert 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
    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 éprouvé 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
    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...

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