Return ne renvoie rien
Fermé
DARsKater
Messages postés
749
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
5 août 2020
-
Modifié par DARsKater le 9/07/2014 à 23:12
Revan26914 Messages postés 1778 Date d'inscription dimanche 14 octobre 2007 Statut Contributeur Dernière intervention 15 octobre 2019 - 10 juil. 2014 à 13:26
Revan26914 Messages postés 1778 Date d'inscription dimanche 14 octobre 2007 Statut Contributeur Dernière intervention 15 octobre 2019 - 10 juil. 2014 à 13:26
2 réponses
Revan26914
Messages postés
1778
Date d'inscription
dimanche 14 octobre 2007
Statut
Contributeur
Dernière intervention
15 octobre 2019
320
10 juil. 2014 à 00:07
10 juil. 2014 à 00:07
Bonsoir,
Ta fonction retourne bien un résultat. Si tu ne le vois, c'est parce que tu ne l'affiches nulle part ;)
Par ailleurs, il y a une petite erreur dans ton code: il faut faire commencer p à 1.
Ta fonction retourne bien un résultat. Si tu ne le vois, c'est parce que tu ne l'affiches nulle part ;)
#include <stdio.h>
int ft_iterative_power(int nb, int power)
{
int p = 1;
if (power == 0)
return(1);
else if (power < 0)
return(0);
else
{
while (p != power)
{
nb *= nb;
p++;
}
return(nb);
}
}
int main(void)
{
printf("%d\n", ft_iterative_power(5, 2));
return(0);
}
Par ailleurs, il y a une petite erreur dans ton code: il faut faire commencer p à 1.
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
10 juil. 2014 à 01:54
10 juil. 2014 à 01:54
Bonsoir
Juste une remarque corrigé moi si je me trompe, sa fonction est bien une fonction de puissance ? si oui elle ne peut pas marcher pourquoi parce que
@Dal l'instruction
Pour mieux comprendre voici un exemple
à bientôt
Juste une remarque corrigé moi si je me trompe, sa fonction est bien une fonction de puissance ? si oui elle ne peut pas marcher pourquoi parce que
0^0 = 1 et non 0enfin de ce qui est resté de mes mathématiques de plus
@Dal l'instruction
nb*= nbest correcte sauf que c'est l'ensemble de son algorithme qui est fausse .
Pour mieux comprendre voici un exemple
#include <stdio.h> /*** * fonction puissance en itérative * écrit par @DARsKater ***/ int ft_iterative_power(int nb, int power){ int p; /*** * & même en remplaçant p = 0 * par p = 1 ne change rien * algorithme est fausse ***/ p = 1; if( power == 0 ) return ( 1 ); else if( power <= 0) return( 1 ); else{ while( (p != power) ){ nb *=nb; p++; } return( nb ); } } /*** * fonction puissance en itérative ***/ unsigned int f_PowerIter(int iNb,int const pw){ int i = 0; int r = 1; if( pw <= (0) ) return ( r ); else{ /* boucle */ for( ; i < pw; i++) r *= iNb; } return ( r ); } /*** * fonction récursive puissance ***/ unsigned int f_PowerRecur(int iNb,int const pw){ return ( (pw<=0) ? 1 : ( iNb *f_PowerRecur( iNb, pw-1 ) ) ); } /*** * fonction principale ***/ int main( void ){ printf("@DARsKater\t= %d\n",ft_iterative_power(2, 10) ); printf("@Sambia39 (1)\t= %d\n",f_PowerIter(2, 10) ); printf("@Sambia39 (2)\t= %d\n",f_PowerRecur(2, 10) ); return ( 0 ); }
à bientôt
Revan26914
Messages postés
1778
Date d'inscription
dimanche 14 octobre 2007
Statut
Contributeur
Dernière intervention
15 octobre 2019
320
10 juil. 2014 à 02:22
10 juil. 2014 à 02:22
Le premier test de sa fonction:
Si la puissance est zéro, alors la fonction retourne 1.
Donc si tu veux évaluer ft_iterative_power(0, 0) il va rentrer dans la condition et retourner 1, ce qui est tout à fait correct puisque 0^0 = 1.
Bien que 0^0 = 1 soit controversé (certains le considère en effet comme non-défini), tous les langages de programmation ainsi que les calculettes le considèrent comme étant égal à 1.
if( power == 0 )
return ( 1 );
Si la puissance est zéro, alors la fonction retourne 1.
Donc si tu veux évaluer ft_iterative_power(0, 0) il va rentrer dans la condition et retourner 1, ce qui est tout à fait correct puisque 0^0 = 1.
Bien que 0^0 = 1 soit controversé (certains le considère en effet comme non-défini), tous les langages de programmation ainsi que les calculettes le considèrent comme étant égal à 1.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 843
10 juil. 2014 à 09:32
10 juil. 2014 à 09:32
Disons plutôt que 0^0 est indéterminé et que par convention on on attribue 0^0 à 1. Mais dans certains cas, 0^0 est plus juste...
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 095
10 juil. 2014 à 10:11
10 juil. 2014 à 10:11
sambia39 :
@Dal l'instruction nb*= nb est correcte
ce que je veux dire, c'est que c'est là que se situe l'erreur produisant des résultats faux, car elle aboutit, à chaque itération, à mettre au carré la valeur de nb et c'est là précisément que l'algorithme est inexact. Ainsi, pour 5 ^ 3, même en mettant p à 1, on aura avec ce code :
Ton code fonctionne bien.
Son code peut être corrigé avec quelques aménagements.
Sur la base de son code, moi, je ferai cela :
Dal
@Dal l'instruction nb*= nb est correcte
ce que je veux dire, c'est que c'est là que se situe l'erreur produisant des résultats faux, car elle aboutit, à chaque itération, à mettre au carré la valeur de nb et c'est là précisément que l'algorithme est inexact. Ainsi, pour 5 ^ 3, même en mettant p à 1, on aura avec ce code :
5ce qui n'est pas l'effet recherché
5 * 5 = 25
25 * 25 = 625
Ton code fonctionne bien.
Son code peut être corrigé avec quelques aménagements.
Sur la base de son code, moi, je ferai cela :
int ft_iterative_power(int nb, int power) { int p; int result; p = 1; if (power == 0) return 1; if (power < 0) { fprintf(stderr, "Erreur : ft_iterative_power ne gère pas " "les exposants négatifs\n"); exit(EXIT_FAILURE); } result = nb; while (p != power) { result *= nb; p++; } return result; }
Dal
sambia39
Messages postés
610
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
9 février 2023
49
Modifié par sambia39 le 10/07/2014 à 11:17
Modifié par sambia39 le 10/07/2014 à 11:17
Bonjour
tu parles d'un cas dans le quelle la condition est véritablement égale à zéro et la seconde instruction ? elle ne sert pas à grand-chose
mais encore une fois, cela dépend du contexte mathématique.
Ce qui est sûr tout l'ensemble de son algorithme est mal conçu, si du coup 0^0 = 1 dans son programme, c'est normal qui nous donne la bonne réponse pareil si on met 10^2 = 100
mais dans plusieurs cas dont par exemple 2^10 = 1024 voir même 10^4 =10000 ça fonction nous renverra une valeur erroné exemple 2^4 = 255 dans certain cas c'est zéro directe qu'il nous envoie.
/!\ (de plus j'ai remarquer dans mon dernier poste à la ligne du code 20-21 j'ai oublier de mettre son 0)
à bientôt
tu parles d'un cas dans le quelle la condition est véritablement égale à zéro et la seconde instruction ? elle ne sert pas à grand-chose
mais encore une fois, cela dépend du contexte mathématique.
Ce qui est sûr tout l'ensemble de son algorithme est mal conçu, si du coup 0^0 = 1 dans son programme, c'est normal qui nous donne la bonne réponse pareil si on met 10^2 = 100
mais dans plusieurs cas dont par exemple 2^10 = 1024 voir même 10^4 =10000 ça fonction nous renverra une valeur erroné exemple 2^4 = 255 dans certain cas c'est zéro directe qu'il nous envoie.
@DARsKater = 256
@Sambia39 (1) = 16
@Sambia39 (2) = 16
/!\ (de plus j'ai remarquer dans mon dernier poste à la ligne du code 20-21 j'ai oublier de mettre son 0)
à bientôt
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 095
Modifié par [Dal] le 10/07/2014 à 10:44
Modifié par [Dal] le 10/07/2014 à 10:44
sur la 2ème condition.. si on passe un nombre négatif :
https://fr.wikipedia.org/wiki/Puissance_d%27un_nombre#Puissance_.C3.A0_exposant_n.C3.A9gatif
il faudrait du code pour calculer cela et pouvoir renvoyer un nombre réel.
son code corrigé avec
Dal
https://fr.wikipedia.org/wiki/Puissance_d%27un_nombre#Puissance_.C3.A0_exposant_n.C3.A9gatif
il faudrait du code pour calculer cela et pouvoir renvoyer un nombre réel.
son code corrigé avec
p = 1;mais en gardant
nb*= nb;fonctionne avec les puissances de 2 et de 0 seulement. Si cela fonctionne avec les puissances de 2, c'est seulement parce que x ^ 2 ne comporte qu'une seule itération de mise au carré.
Dal
10 juil. 2014 à 00:27
Dal
10 juil. 2014 à 00:55
10 juil. 2014 à 09:34
Syntaxiquement, oui c'est juste. Mais fonctionnellement c'est faux.
Il faudrait plutôt : nb *= power;
10 juil. 2014 à 10:18
ce qui n'est pas non plus la fonction exponentielle.
je passerai plutôt par une variable additionnelle contenant le résultat, sachant qu'on a besoin de conserver la valeur de nb, pour effectuer les multiplications successives, et qu'il ne faut donc pas l'écraser.
du code plus bas, là : https://forums.commentcamarche.net/forum/affich-30482877-return-ne-renvoie-rien#9
Dal
10 juil. 2014 à 10:39
Tu as bien évidemment raison :-).