Votre question

probleme en C le retour

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
6 Novembre 2005 13:38:01

j'ai un probleme avec mon appel de fonction du programme puissance(x^n) car elle me retourne "1" pour n'importe quelle valeur de "x" et de "n".voici mon programme:o u est l'erreur je trouve pas!

#include<stdio.h>
#include<stdlib.h>

int somme_diviseurs(int x);
int premier(int v);
float exponentiel(int n);
int binome (int a,int b);


int main()
{
int menu , n , m , a , b , p ;


do {
printf("Menu :\n1)Parfait\n2)Somme_diviseurs\n3)Premier\n4)Factoriel\n5)Puissance\n6)Exponentiel\n7)Binome\n\n");
printf("Entrez votre choix : ");
scanf("%d",&menu);
} while(menu>7 || menu<=0);

switch(menu)
{
case 1 : /*nb parfait*/
printf("Donner un entier :");
scanf("%d", &n);
if(n == parfait(n))
printf("%d est parfait\n",n);
else
printf("%d n'est pas parfait\n",n);
break;

case 2 : /*somme diviseur*/
break;
case 3 : /*nb premier*/
break;

case 4 :/ *factorielle*/
do
{
printf("Donnez une entier:");
scanf("%d",&m);
printf("%d!=%d",m,factoriel(m));
}
while(m<0);
break;

case 5 : /*puissance*/
do
{
printf("Donnez un entier:");
scanf("%d",&a);
printf("Donnez la valeur n de la puissance que vous voulez affecter a x:");
scanf("%d",&b);
}
while(a<0);
printf("%d puissance %d = %d",a,b,puissance(p));

case 6 : /*exponnentiel*/
break;
case 7 : /*binome*/
break;

}
}




int parfait(int n) /* renvoie la somme des diviseurs de a (sauf a lui-même) */
{int somme=0,a;

for(a=1; a<=n/2; a++)
{
if(n%a==0) somme += a;
}
return somme;
}


int factoriel(int m)/*renvoi le factoriel d'un nombres entier*/
{int a=m,i,fact;

if(a==0) fact=1;
fact=1;
for(i=1;i<=a;i=i+1)
fact=fact*i;
return fact;
}



int puissance(p)/*renvoi x^n de deux entier*/
{int x,i,res,n;
if(x==0) res=0;
if(n==0) printf("%d puissance %d = 1",x,n,1);
else {res=1;
for(i=1;i<=n;i++)
res=res*x;
}
return res;
}



Autres pages sur : probleme retour

7 Novembre 2005 11:29:52

bonjour,
moi je prog en C sur des micro (c pas la même chose) mais je veux bien essayer de t'aidé.

pour moi a la 1ére lecture je vois que la variable "n" a été déclaré 2 foix.

il y a 1 truc que je ne c pas c
Citation :

fasyr a écrit :

int main()
{
}



moi j'écris plutôt
void main()
{
}

et toi lorsque tu fais "for"
Citation :

fasyr a écrit :
for(i=1;i<=n;i++)

tu n'as pas mis de { }.

Assure-toi de tous ça, et moi de mon coté je regarde si je vois quelque chose.
On se tient au courant.
@+
a b L Programmation
7 Novembre 2005 13:08:04

Citation :
moi je prog en C sur des micro (c pas la même chose)

C'est quoi un micro ? :-o
Si c'est micro-ordinateur, je comprend pas ce que tu as mis entre parenthèses :-D

Citation :
moi j'écris plutôt
void main()
{
}

La norme C89 demande un int en retour de la fonction main. Donc pour rester dansd les normes, son main est mieux :-)

Citation :
tu n'as pas mis de { }.

Dans ce cas ça exécute en boucle l'instruction suivante (se terminant par un point-virgule comme toute instruction).

Pour le problème de base je répète ce que j'ai dit sur l'autre post: x et n sont des variables locales dans la fonction, elles ne sont même pas initialisées.
Contenus similaires
7 Novembre 2005 15:39:21

je bosse sur des microcontrôleur de Microchip les PIC.


par contre je suis d'accord avec toi pour:

"Dans ce cas ça exécute en boucle l'instruction suivante (se terminant par un point-virgule comme toute instruction)."

Mais alors pourquoi il fait cela

Citation :


for(i=1;i<=n;i++)
res=res*x;




il fait une boucle for ou la variable i est incrémenté et il ne s’en sert pas.

moi je ne comprend pas à ce niveau.

Pour la norme C89 je ne connais pas je vais voir si je trouve de la doc. Merci.
Anonyme
7 Novembre 2005 15:48:10

ce n'est pas grave si il n'utilise pas la variable i, elle sert juste à savoir le nombre de boucles.

moi je code en C sur du microcontroleur ATMEL, "Groovy Baby"
7 Novembre 2005 16:11:36

pour en revenir au programme :

case 5 : /*puissance*/
.....
while(a<0);
printf("%d puissance %d = %d",a,b,puissance(p));

- pourquoi un while ?
- comment la fonction puissance va-t-elle calculer a puissance b (si on ne lui fournit ni a ni b ?), et d'abord, c'est quoi ce p qu'on lui fournit ?
- le break à la fin c'est pas en option. sa fonctionne comme ça pour le moment, mais puisqu'il va servir apres, autant le mettre maintenant.
7 Novembre 2005 16:14:10

oui mais a quoi sa sert de faire exemple:
20 fois
res=res*x;

:-o je ne comprent toujours pas
7 Novembre 2005 16:24:24

Citation :

fasyr a écrit :

case 5 : /*puissance*/
do
{
printf("Donnez un entier:");
scanf("%d",&a);
printf("Donnez la valeur n de la puissance que vous voulez affecter a x:");
scanf("%d",&b);
}
while(a<0);
printf("%d puissance %d = %d",a,b,puissance(p));





si je ne me trompe pas il fait
printf("%d puissance %d = %d",a,b,puissance(p));
apres etre sortie de la boucle " do while"
si c'est bien cela je ne voir pas le Pb
7 Novembre 2005 17:28:36

effectivement, c'est un do while, ça m'avait échappé.
ceci etant dit, rien ne l'empeche de calculer a puissance b avec a négatif.

et dans tous les cas, ce n'est pas
printf("%d puissance %d = %d",a,b,puissance(p));
mais printf("%d puissance %d = %d",a,b,puissance(a,b));

pour la boucle
for(i=1;i<=n;i++)
res=res*x;

ça revient à faire (((res*x)*x)*x)....
c'est à dire (res*(x puissance n))
si res vaut 1 au début, on a bien (x puissance n)

res= 1;
20 fois res=res*x;
=> res= x puissance 20
a b L Programmation
7 Novembre 2005 19:17:41

Citation :

cat66 a écrit :
je bosse sur des microcontrôleur de Microchip les PIC.

Ok, là je comprend mieux ;-)

Citation :

il fait une boucle for ou la variable i est incrémenté et il ne s’en sert pas.

en fait ça fait res = 1 * x * x * x *x * ... * x, n fois soit res = x^n ;-)

Citation :
Pour la norme C89 je ne connais pas je vais voir si je trouve de la doc.

C89 = ANSI C
Il y a la norme C99 aussi, plus récente, mais bon ça sert plus si on veut faire un compilateur C que programmer en C ;-)
Je doute que tu trouve la norme gratuitement.
7 Novembre 2005 19:55:20

Déja, pour factorielle, la définition récursive est bien plus claire :
  1. int factorielle(int n)
  2. {
  3. assert(n >= 0);
  4. if (n == 1) return 1;
  5. return (n * factorielle(n-1));
  6. }


Pour la fonction puissance, tu peux faire exactement pareil :
  1. int puissance(int n, int exposant)
  2. {
  3. assert(puissance > 0);
  4. if (exposant == 0) return 1;
  5. return (n * puissance(n, exposant-1);
  6. }


Si tu tiens à l'itératif, une boucle for ou while suffit pour les deux :
  1. int factorielle(int n)
  2. {
  3. int resultat;
  4. for(resultat = 1; n > 0; n--)
  5. resultat *= n;
  6. }
  7.  
  8. int puissance(int n, int exposant)
  9. {
  10. int resultat
  11. for(resultat = 1; int exposant > 0; exposant--)
  12. resultat *= n;
  13. }
8 Novembre 2005 09:43:18

:-o G decroche.
@+
8 Novembre 2005 09:46:14

merci CRicky de mon explication, tu as raison.
8 Novembre 2005 10:14:58

Ca fait un moment que je n'ai plus touché au C, mais il me semble que :

appel de la fonction puissance :
do
{
printf("Donnez un entier:");
scanf("%d",&a);
printf("Donnez la valeur n de la puissance que vous voulez affecter a x:");
scanf("%d",&b);
}
while(a<0);
printf("%d puissance %d = %d",a,b,puissance(p));

fonction :
int puissance(p)/*renvoi x^n de deux entier*/
Dans l'appel tu passes le paramêtre p, paramêtre que tu n'utilises pas dans ta fonction d'ailleurs !

{int x,i,res,n;
Tu déclares x,i,res et n dans la fonction et non comme paramêtres.
Ces variables sont donc locales, et initialisées à 0 (ou void en C ?). Dans tous les cas, elles n'ont aucun rapport avec les a et b qui sont demandées à l'utilisateur lors de l'appel (dans ton do -- while)

if(x==0) res=0;
if(n==0) printf("%d puissance %d = 1",x,n,1);
else {res=1;
for(i=1;i<=n;i++)
//n étant non valide, ta boucle ne s'effectue pas (ou alors 1 seule fois, ce qui revient au même)
res=res*x;
}
return res;
}

Change ton appel par
printf("%d puissance %d = %d",a,b,puissance(a,b));

et ta fonction par
int puissance(x,n)/*renvoi x^n de deux entier*/
{int i,res;
if(x==0) res=0;
if(n==0) printf("%d puissance %d = 1",x,n,1);
else {res=1;
for(i=1;i<=n;i++)
res=res*x;
}
return res;
}

A vérifier pour la syntaxe, mais l'algorithmique me semble correcte
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS