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 :

Fonction élevation à la puissance n


Sujet :

C

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2021
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Fonction élevation à la puissance n
    Bonjour,

    J'ai un exercie dont la consigne est :

    Écrire une fonction qui attend en entrée deux entiers x et n (avec n≥0) et retourne x^n. Si n<0, retourner n.


    J'ai réussi à faire un programme mais en utilisant la fonction "pow", mais le message de retour m'interdit de l'utiliser. Je pensais qu'hormis la fonction Pow il n'est pas possible d'élever à la puissance, sauf dans les cas précis (x^3=x*x*x).

    Si vous pouviez m'éclairer sur ce point

    Merci

    C'est le code que j'ai réussi à faire en utilisant la fonction POW.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int puissance(int x, int n)
    {
        printf("Veuillez saisir un entier x:");
        scanf("%d,&x");
        printf("Veuillez saisir un entier n:");
        scanf("%d,&n");
        pow(x,n);
    }

  2. #2
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    3 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 3 860
    Points : 8 633
    Points
    8 633
    Par défaut
    J'ai donné l'équivalent sur 1 autre fil

    x^y = exp(y * ln(x))

  3. #3
    Expert confirmé

    Inscrit en
    août 2006
    Messages
    3 844
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 844
    Points : 5 418
    Points
    5 418
    Par défaut
    Bonjour,
    Citation Envoyé par inconnue-789 Voir le message
    J'ai réussi à faire un programme mais en utilisant la fonction "pow", mais le message de retour m'interdit de l'utiliser. Je pensais qu'hormis la fonction Pow il n'est pas possible d'élever à la puissance, sauf dans les cas précis (x^3=x*x*x).
    Étant donné que x et n sont des entiers, je ne vois pas ce qui te gêne.
    "Mon pied droit est jaloux de mon pied gauche.
    Quand l'un avance, l'autre veut le dépasser.
    Et moi, comme un imbécile, je marche !"
    [Raymond Devos]

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    4 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 4 370
    Points : 13 184
    Points
    13 184
    Billets dans le blog
    1
    Par défaut
    mais le message de retour m'interdit de l'utiliser.
    Quel message ?

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 910
    Points : 24 445
    Points
    24 445
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par inconnue-789 Voir le message
    C'est le code que j'ai réussi à faire en utilisant la fonction POW.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int puissance(int x, int n)
    {
        printf("Veuillez saisir un entier x:");
        scanf("%d,&x");
        printf("Veuillez saisir un entier n:");
        scanf("%d,&n");
        pow(x,n);
    }
    Oui, mais tu appelles "pow()" dans le vide.
    Et généralement on aime bien dissocier "travail" et "saisie". Autrement dit, ta fonction puissance n'a pas besoin de faire saisir "x" et "n" vu qu'ils lui arrivent en paramètre (donc sous-entendu ils ont été saisis en amont de l'appel). Ca permet de faire une fonction plus généraliste (elle pourra élever des nombres venus d'un fichier, d'une bdd, bref de n'importe quel média).

    Citation Envoyé par inconnue-789 Voir le message
    Je pensais qu'hormis la fonction Pow il n'est pas possible d'élever à la puissance, sauf dans les cas précis (x^3=x*x*x)
    Déjà si la fonction pow() y arrive, cela veut dire que mathématiquement c'est possible (la fonction pow() n'invente rien). C'est effectivement possible, comme l'a dit foetus, par l'utilisation du logarithme népérien (fonction "ln") où ln(a^b)=b*ln(a) et où ln(x) étant une primitive de la fonction 1/x, peut alors se calculer de façon empirique par différentes méthodes (moindre carrés, monte-carlo, etc).

    Mais ici, vu que "n" est int, ça correspond pile poil à ce cas précis que tu cites. Donc pas besoin de passer par pow(), ni ln() ni exp(). Suffit d'une bête boucle (ce qui est, je pense, le but initial de cet exercice sinon je ne vois pas pourquoi on te ferait écrire une fonction "puissance" qui se contente juste d'appeler "pow" sans plus-value).
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  6. #6
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2021
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Oui, mais tu appelles "pow()" dans le vide.
    Et généralement on aime bien dissocier "travail" et "saisie". Autrement dit, ta fonction puissance n'a pas besoin de faire saisir "x" et "n" vu qu'ils lui arrivent en paramètre (donc sous-entendu ils ont été saisis en amont de l'appel). Ca permet de faire une fonction plus généraliste (elle pourra élever des nombres venus d'un fichier, d'une bdd, bref de n'importe quel média).


    Déjà si la fonction pow() y arrive, cela veut dire que mathématiquement c'est possible (la fonction pow() n'invente rien). C'est effectivement possible, comme l'a dit foetus, par l'utilisation du logarithme népérien (fonction "ln") où ln(a^b)=b*ln(a) et où ln(x) étant une primitive de la fonction 1/x, peut alors se calculer de façon empirique par différentes méthodes (moindre carrés, monte-carlo, etc).

    Mais ici, vu que "n" est int, ça correspond pile poil à ce cas précis que tu cites. Donc pas besoin de passer par pow(), ni ln() ni exp(). Suffit d'une bête boucle (ce qui est, je pense, le but initial de cet exercice sinon je ne vois pas pourquoi on te ferait écrire une fonction "puissance" qui se contente juste d'appeler "pow" sans plus-value).
    Bonjour,

    Merci pour ton aide, j'ai commencé le langage C il y a quelques semaines à peine, je ne maîtrise pas tout à fait la syntaxe du langage. J'ai écrit une boucle for, mais il faudrait que le x soit différent de 0, or je ne sais pas comment introduire une exception dans une boucle.

    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
    int puissance(int x, int n);
    int x,res,n,i;
    int puissance(int ,int);
    int Puissance(int ,int);
     
    int main(void) {
     
        printf("Entrez une valeur x: \n");
        scanf("%d",&x);
        printf("Entrez votre puissance n: \n");
        scanf("%d",&n);
     
        printf("Votre nouveau nombre >= 0 est: %d\n",puissance(x,n));
        printf("Votre nouveau nombre est:%d\n",Puissance(x,n));
     
        return 0;
     
    }
     
    int puissance(int x, int n)
    {
     
        for(i=1;i<=n;i++)
        {
            res=res*x;
        }
        return res;
    }
     
    int Puissance(int x,int n)
    {
        if(n==0)
        {
            return 1;
        }
            else
             return x*Puissance(x,n-1);
        }
    Voilà ce que j'ai, mais lorsque je le lance un message d'erreur m'affiche "Une erreur est survenue lors de l'exécution de votre fonction puissance. Elle ne retourne pas la bonne valeur pour les paramètres suivants : (0,0) "

    Merci

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    février 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2021
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Quel message ?
    Ce message, "Une erreur est survenue lors de l'exécution de votre fonction puissance. Elle ne retourne pas la bonne valeur pour les paramètres suivants : (0,0) "

    :/

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    4 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 4 370
    Points : 13 184
    Points
    13 184
    Billets dans le blog
    1
    Par défaut
    Marrant ce message. Tu utilises quoi comme logiciel pour faire ton code ? Quel compilateur ? Tu intègres ta fonction dans un code de vérification ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int puissance(int x, int n)
    {
        printf("Veuillez saisir un entier x:");
        scanf("%d,&x");
        printf("Veuillez saisir un entier n:");
        scanf("%d,&n");
        pow(x,n);
    }
    --> tu ne mets pas de à la fin de ta fonction. Pourquoi ? Que penses-tu qu'il va se passer quand ton programme atteint la fin de la fonction ?

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 910
    Points : 24 445
    Points
    24 445
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par inconnue-789 Voir le message
    Merci pour ton aide, j'ai commencé le langage C il y a quelques semaines à peine, je ne maîtrise pas tout à fait la syntaxe du langage.
    C'est normal. Ca viendra avec l'habitude (c'est justement le but des exercices)

    Citation Envoyé par inconnue-789 Voir le message
    J'ai écrit une boucle for, mais il faudrait que le x soit différent de 0
    Ce n'est pas ton code qui te dirige, c'est toi qui dirige ton code. Tu veux x différent de 0? Pas de souci. Si c'est ton x tu lui mets la valeur que tu veux, et si c'est un x reçu en paramètre alors tu as le droit de le tester et programmer une alternative s'il n'a pas la valeur que tu voudrais qu'il ait.

    Citation Envoyé par inconnue-789 Voir le message
    , or je ne sais pas comment introduire une exception dans une boucle.
    Attention à la syntaxe, le terme "exception" concerne une techologie spécifique qui n'existe pas en C. Si tu parles d'alternative, il te suffit de la programmer. Elle peut parfaitement se faire aussi dans une boucle
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (...) {
    	if (...) {
    		... (action si vrai) ...
    	}
    	else {
    		... (action si faux) ...
    	}
    }
    Ce sont les accolades qui permettent d'englober une action. Ainsi une action peut parfaitement elle-aussi devenir complexe telle une autre boucle imbriquée, une autre alternative, etc.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (...) {
    	if (...) {
    		for (...) {
    			... (sous-action à répéter) ...
    			if (...) {
    				... (sous-sous-action si vrai) ...
    			}
    		}
    	}
    	else {
    		... (action si faux) ...
    	}
    }
    et etc etc à l'infini selon ton but à atteindre et ta façon d'enseigner ce but à ton code. Et les tabulations permettent de mieux voir/revoir le déroulement du code quand on le lit/relit

    Citation Envoyé par inconnue-789 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int puissance(int x, int n) {
    	for(i=1;i<=n;i++) {
    		res=res*x;
    	}
    	return res;
    }
    Deux erreurs
    • tu n'as pas initialisé "res"
    • la variable "i" n'est pas utilisée dans la boucle (ce n'est pas nécessaire que ce soit le cas mais dans 95% des cas ça dénote un souci de conception)

    Et il vaut mieux essayer de ne pas tomber dans le piège de la facilité des variables globales car cette facilité n'est que factice et tu le payes tôt ou tard (et plus c'est tard plus c'est cher).

    Citation Envoyé par inconnue-789 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     int Puissance(int x,int n) {
    	if(n==0)  {
    		return 1;
    	}
    	else
    		return x*Puissance(x,n-1);
    }
    Ca c'est pas mal. Juste que le "else" est inutile vu que le return a quitté la fonction (tu gagnes une indentation). Et puis t'es pas obligée de tout coller non plus. Apprends à aérer un peu ton code. Par exemple un espace après la virgule (comme en français) c'est pas mal...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int Puissance(int x, int n) {
    	if (n==0)  return 1;
    	return x * Puissance(x, n-1);
    }

    Ensuite il y a des raccourcis de syntaxe possible, comme l'opérateur ternaire expr ?x :y qui donne "x" si "expr" est vrai et "y" sinon. Ce qui donnerait ici
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int Puissance(int x, int n) {
    	return n != 0 ?x * Puissance(x, n-1) :1;
    }
    Méfies-toi tout de même de la récursivité car ça semble facile à programmer mais derrière, c'est le processeur qui encaisse (quand ton code mettra 15 secondes à calculer 5^42 là où une fonction itérative en mettra 1.5 tu comprendras).
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 677
    Points : 30 470
    Points
    30 470
    Billets dans le blog
    4
    Par défaut
    Ton programme est un ramassis de variables globales non initialisées, tous les résultats seront donc aléatoires.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 910
    Points : 24 445
    Points
    24 445
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bousk Voir le message
    tous les résultats seront donc aléatoires.
    Pas exactement
    Ce sont les variables locales qui sont initialisées aléatoirement. Une variable globale non initialisée est alors initialisée à 0 par défaut. Les résultats seront donc prévisibles. Pas forcément nécessairement du tout exacts... mais prévisibles
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 677
    Points : 30 470
    Points
    30 470
    Billets dans le blog
    4
    Par défaut

    Je l'ignorais, faut dire qu'utiliser des globales c'est un peu dépassé... mais ça pourrait presque sauver certains débutants, malheureusement
    Bon, reste à fixer les return et le fait que puissance(x, 0) retournera la puissance du précédent appel. Ce qui est généralement pas une bonne chose.
    Aucune des ces globales n'a lieu d'être et toutes devraient être supprimées de toutes façons.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #13
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    3 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 3 860
    Points : 8 633
    Points
    8 633
    Par défaut
    Je trouve tes noms de fonctions pas terrible Comme le nombre de paramètres ne changent pas (l'une n'appelle pas l'autre "privée" ayant + de paramètres), je propose pow_recu/ pow_recursive et pow_iter/ pow_iterative

    sinon comme ta puissance est signée, il faut gérer les puissances négatives.

    et de +, on peut optimiser la boucle. Si
    • n est pair, alors a^n = a^((n/2) + (n/2)) = [1 *] a^(n/2) * a^(n/2)
    • n est impair, alors a^n = a^((n/2) + (n/2) + 1) = a * a^(n/2) * a^(n/2)

    Donc on peut calculer que la moitié


    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    float pow_iter(int x, int n) {
        float res;
        unsigned char is_negative;
     
        if (n >= 0) {
            is_negative = 0;
        } else {
            is_negative = 1;
            n = (-n);
        }
     
        switch(n) {
        case 0: res=1; break;
        case 1: res=x; break;
        default:
            {
                int step, rest;
     
                if ((n % 2) == 0) {
                    rest = 1;
                } else {
                    rest = x;
                    --n;
                }
     
                n /= 2;
     
                for(step=0, res=1; step < n; ++step, res*=x) {}
     
                res = (rest * res * res);
            }
            break;
        }
     
        if (is_negative) { res = ((res != 0)? (1.0f / res): 0.0f); }
     
        return res;
    }
     
     
    int main(int argc, char argv[])
    {
        int x, n;
     
        for(x=-5; x <= 5; ++x) {
            for(n=-5; n <= 5; ++n) {
                printf("%d ^ %d = %f\n", x, n, pow_iter(x, n));
            }
        }
     
     
        return EXIT_SUCCESS;
    }

Discussions similaires

  1. Opérateur d'élevation à la puissance
    Par arthy dans le forum Fortran
    Réponses: 2
    Dernier message: 02/11/2007, 15h41
  2. fonction sur les puissances
    Par sandball22 dans le forum C
    Réponses: 12
    Dernier message: 11/06/2007, 21h00
  3. Problème avec la fonction pow(les puissance)
    Par Clément76 dans le forum C
    Réponses: 10
    Dernier message: 04/10/2006, 12h44
  4. 8x11=0 !! problème fonction puissance
    Par Renesis57 dans le forum C
    Réponses: 18
    Dernier message: 26/11/2005, 14h54
  5. [LG]fonction puissance en pascal
    Par le 27 dans le forum Langage
    Réponses: 8
    Dernier message: 13/12/2003, 23h21

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