Return ne renvoie rien [Fermé]

Signaler
Messages postés
747
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
5 août 2020
-
Messages postés
1778
Date d'inscription
dimanche 14 octobre 2007
Statut
Contributeur
Dernière intervention
15 octobre 2019
-
Bonjour, j'essaye de calculer une puissance, je pense que mon code est bon, mais pourtant il ne renvoie rien !

Voici le dit code :

int ft_iterative_power(int nb, int power)
{
int p;
p = 0;
if (power == 0)
return(1);
else if (power < 0)
return(0);
else
{
while (p != power)
{
nb *= nb;
p++;
}
return(nb);
}
}

int main(void)
{
ft_iterative_power(5, 2);
return(0);
}

Je compile avec "gcc -Wall -Wextra -Werror -o" si ca joue un role, et je n'ai pas l'option de changer de maniere pour compiler.

Un gros merci d'avance pour votre aide!



c:\>

2 réponses

Messages postés
1778
Date d'inscription
dimanche 14 octobre 2007
Statut
Contributeur
Dernière intervention
15 octobre 2019
308
Bonsoir,

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.
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932
et
nb *= nb;
est faux également.


Dal
Messages postés
1778
Date d'inscription
dimanche 14 octobre 2007
Statut
Contributeur
Dernière intervention
15 octobre 2019
308
Non, c'est correct. Ca équivaut à nb = nb * nb;
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 752
@Revan26914,
Syntaxiquement, oui c'est juste. Mais fonctionnellement c'est faux.
Il faudrait plutôt : nb *= power;
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932
@fiddy : je ne pense pas que
nb *= power
fasse l'affaire, cela fait autre chose : multiplier à chaque itération le résultat par ce qui est sensé être l'exposant, ainsi pour 5 ^3, on aurait :

5
5 * 3 = 15
15 * 3 = 45

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
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 752
Erf... A vouloir répondre trop vite...
Tu as bien évidemment raison :-).
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
42
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
 0^0 = 1 et non 0
enfin de ce qui est resté de mes mathématiques de plus
@Dal l'instruction
 nb*= nb 
est 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
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932
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 :

5
5 * 5 = 25
25 * 25 = 625
ce qui n'est pas l'effet recherché

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
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
42
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.


@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
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932
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
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
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
42
@Dal Mon deuxième poste était la réponse au poste de @Revan26914 mais je suis d'accord avec toi sur le fait que c'est son algorithme qui est foireux
Messages postés
1778
Date d'inscription
dimanche 14 octobre 2007
Statut
Contributeur
Dernière intervention
15 octobre 2019
308
Oui tout à fait. Je pensais que tu voulais dire que le nb*=nb; était syntaxiquement faux :)