Pages : 1
#1 Le 19/12/2007, à 17:43
- synthia36
programme en c
bonjour a tous; je suis débutante en c et j'essaie de faire mon premier programme en c qui est le "FACTORIELLE" :
#include <stdio.h>
long fact ( short valeur )
{
short indice
long factorielle = 1;
if ( nombre ==0)
return 1;
for ( indice = valeur; indice>0; indice-- )
factorielle = factorielle * indice ;
return factorielle ;
}
int main (void)
{
short i=1;
int n;
printf (" Entrer le nombre que vous voulez calculer:\n ");
scanf (" %d ",&n);
while ( i <= n )
{
printf (" le factorielle de %d = %ld\n ",i,fact(i) );
i++;
}
return 0;
}
le probleme que j'ai c'est a partir du nombre 13 ;le factorielle de 12 s'affiche juste: 479001600 mais quand je fait le factorille il affiche: 1932053504 au lieu de 6227020800.
je ne comprend pas ? est ce que vous pouvez m'aider svp?
merci.
#2 Le 19/12/2007, à 17:55
- Martopioche
Re : programme en c
Ca fait des siècles que j'ai pas fait du C, mais tu a essayé de mettre des long à la place des short ? Si alors le résultat est bon, c'est que ca vient du transtypage.
Hors ligne
#3 Le 19/12/2007, à 20:04
- telliam
Re : programme en c
oui un int est sur 32 bit donc il ne peut pas t'afficher plus un nombre non signé supérieur à 2^32-1 donc pour factoriel de 13 tu obtiens 13!-(2^32)
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#4 Le 19/12/2007, à 21:12
- Link31
Re : programme en c
Pour la factorielle, il vaut mieux faire du récursif
unsigned long long fact(unsigned long long valeur)
{
if (valeur)
return valeur * fact(valeur-1);
else
return 1;
}
Et si tu veux calculer des valeurs astronomiques (et que tu n'as pas peur d'éventuelles erreurs d'arrondi et des bugs du processeur), utilise des long double, avec comme format "%.0Lf".
Hors ligne
#5 Le 19/12/2007, à 21:18
- rniamo
Re : programme en c
la factorielle en récursif ?
je pense qu'en itératif c'est mieux ;
pour ton problème de taille, fais le calcul avec des double, t'auras plus de chance de trouver un résultat correct, aprés si tu veux vraiment un long tu pourras caster.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#6 Le 19/12/2007, à 21:38
- best_friend_fr
Re : programme en c
Salut,
Puisque le programme de link est en recursif terminal, il est optimise comme un iteratif...
Donc apres, les gouts et les couleurs...
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#7 Le 19/12/2007, à 22:23
- telliam
Re : programme en c
l'iteratif a l'avantage de bouffer moins de place en pile
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#8 Le 19/12/2007, à 23:09
- best_friend_fr
Re : programme en c
Pas si c'est du recursif terminal...
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#9 Le 19/12/2007, à 23:49
- Kandide
Re : programme en c
bonjour a tous; je suis débutante en c et j'essaie de faire mon premier programme en c qui est le "FACTORIELLE" :
Place ton code entre les balises de Code :
#include <stdio.h>
long fact ( short valeur )
{
short indice
long factorielle = 1;
if ( nombre ==0)
return 1;
for ( indice = valeur; indice>0; indice-- )
factorielle = factorielle * indice ;
return factorielle ;
}
int main (void)
{
short i=1;
int n;
printf (" Entrer le nombre que vous voulez calculer:\n ");
scanf (" %d ",&n);
while ( i <= n )
{
printf (" le factorielle de %d = %ld\n ",i,fact(i) );
i++;
}
return 0;
}
Ce code est plein d'erreurs, il ne compile pas, voici ce que m'affiche une console :
candide@candide-desktop:~$ gcc -W -Wall -pedantic -o x ubuntu.c
ubuntu.c: In function «fact":
ubuntu.c:5: attention : ISO C interdit les fonctions imbriquées
ubuntu.c:5: erreur: expected «=", «,", «;", «asm" or «__attribute__" before «long"
ubuntu.c:6: erreur: «nombre" undeclared (first use in this function)
ubuntu.c:6: erreur: (Each undeclared identifier is reported only once
ubuntu.c:6: erreur: for each function it appears in.)
ubuntu.c:8: erreur: «indice" undeclared (first use in this function)
le probleme que j'ai c'est a partir du nombre 13 ;le factorielle de 12 s'affiche juste: 479001600 mais quand je fait le factorille il affiche: 1932053504 au lieu de 6227020800.
je ne comprend pas ? est ce que vous pouvez m'aider svp?
merci.
Oui, c'est normal, comme quelqu'un l'a dit, tes long sont sur 32 bits, donc tu peux traiter des entrées positives jusqu'à environ 2 milliards. Si tu compiles en C99, en utilisant des entiers de type unsigned long long, tu iras beaucoup plus loin, en principe tu pourras calculer sans erreur factorielle(20) :
candide@candide-desktop:~$ gcc -std=c99 -W -Wall -pedantic -o x factorielle.c
candide@candide-desktop:~$ ./x
2432902008176640000
avec le code suivant :
#include <stdio.h>
int main(void)
{
unsigned long long int resultat = 1;
int i, n=20;
for (i = 1; i <= n; i++)
resultat *= i;
printf("%llu\n", resultat);
return 0;
}
Si tu veux aller plus loin, deux solutions :
*) ou bien il te faut une bibliothèque qui soit capable de traiter des grands entiers (en C, une telle bibliothèque serait par exemple GMP),
*)ou bien tu codes toi même ta propre multiplication d'entiers (se rappeller l'algo appris à l'école en CE2 ). J'avais posté ici :
forum sdz : grandes factorielles un code assez simple qui permettait de calculer factorielle(1000) en quelques centièmes de seconde et jusqu'à factorielle(20000) en quelques dizaines de secondes (ce qui est long, GMP fait ça en quelques ms).
EDIT : coquilles
Dernière modification par Kandide (Le 19/12/2007, à 23:50)
Hors ligne
#10 Le 20/12/2007, à 09:20
- synthia36
Re : programme en c
bonjour; je voulais vous remercier tous m'avoir répondu;
Kandide je voulais te dire que j'ai essayé le code que tu m'a donné mais il m'affiche le message d'erreur suivant: undefined symbol 'resultat' in function main()
et mon compilateur n'accepte pas le type: unsigned long long int ; donc j'ai enlevé un long et il compile.
tu m'a dis que mon programme avais plein d'erreurs quand tu l'a compilé sous console donc tu travail sous "linux" car moi j'ai windows xp et j'aimerai installé linux mandriva mais je ne sais pas comment m'y prendre est ce que tu peux me guider stp ?
merci.
#11 Le 20/12/2007, à 09:25
- HymnToLife
Re : programme en c
Tu n'es pas vraiment au bon endroit. Ici, on parle d'Ubuntu, pas de Mandriva.
http://forum.mandriva.com/index.php?op=Fr
- Rodrigue, as-tu du cœur ?
- Non, mais j'ai du pique !
Hors ligne
#12 Le 20/12/2007, à 09:28
- best_friend_fr
Re : programme en c
Salut,
Tu n'as pas du remarquer, mais tu es ici sur un forum Ubuntu qui est une distribution GNU/Linux. Nous avons tous un ordi avec ce systeme. Nous te conseillerons donc plutot d'installer Ubuntu plutot que Mandriva.
Si tu veux installer Mandriva, tu auras plus d'aide sur un forum qui lui est dedie.
Si tu veux installer Ubuntu (distribution tres facile), je te conseille d'aller voir vers cette page:
http://doc.ubuntu-fr.org/installation
Bon courage
Dernière modification par best_friend_fr (Le 20/12/2007, à 09:28)
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#13 Le 20/12/2007, à 10:00
- Kandide
Re : programme en c
Kandide je voulais te dire que j'ai essayé le code que tu m'a donné mais il m'affiche le message d'erreur suivant: undefined symbol 'resultat' in function main()
et mon compilateur n'accepte pas le type: unsigned long long int
Oui, le message d'erreur concernant la variable resultat doit être lié au fait que ton compilateur ne reconnait pas les long long. Il y a sans doute une option à passer au compilateur.
donc j'ai enlevé un long et il compile.
Oui mais ça n'a plus d'intérêt vue la question que tu posais au départ.
tu m'a dis que mon programme avais plein d'erreurs quand tu l'a compilé sous console donc tu travail sous "linux" car moi j'ai windows xp
Au passage, les erreurs en questions n'ont rien à voir avec l'OS ici.
j'aimerai installé linux mandriva mais je ne sais pas comment m'y prendre est ce que tu peux me guider stp ?
Tu n'es pas au bon endroit. Mais, en passant, je te conseille sans la moindre hésitation Ubuntu par rapport à Mandriva que j'avais testée il y a quelques années (la communauté Ubuntu est beaucoup plus une réalité que la communauté Mandriva et Ubuntu est plus simple d'utilisation et mieux documenté -- c'est juste un avis perso).
Hors ligne
Pages : 1