Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink

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

synthia36 a écrit :

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)
synthia36 a écrit :

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 wink ). 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

synthia36 a écrit :

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.

synthia36 a écrit :

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.


synthia36 a écrit :

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.


synthia36 a écrit :

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