ramy Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 voila je debute la lecture d'un livre d'aprentisasge du c mais les 100 premiere pages se concentrent plutot sur les procedure de debogage et tout ça... ce que je voudrais, c'est programmer le meme algorythme que sur ma TI... un programme assez simple: input "choisissez un rang de depart",n input "definisser un rang de fin",m lbl -balise- n+1->n (n+1)!/n->p if p-E[p]=0 then print p if p<m then goto -balise- end seulement la c'est du code facon texas instrument ; et j'ai pour projet de lancer ce petit prog sur l'ordi... mais je n'est encore aucune idée de la facon de le faire... De plus, l'utilisation du code ne devrait pas depasser l'utilisation actuelle (algorythme de calcul simple) - si une bonne ame voulait bien m'orienter vers ce que serait un tel code en c, je lui en serait a jamais reconnaissant et ça me permettrais de passer de la theorie a la practique avant les 500 pages restantes Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 un truc du genre (sans les includes, etc...) int n,m,; float p; printf("rang de depart?\n"); scanf("%d", n); printf("rang de fin?\n"); scanf("%d", m); do { n++; p= factoriel(n+1)/n; if( (p - floor(p)) == 0) printf("%f\n", p); } while(p<m); reste plus qu'a faire une definition récursive de factoriel Lien vers le commentaire Partager sur d’autres sites More sharing options...
ramy Posté(e) le 3 février 2005 Auteur Partager Posté(e) le 3 février 2005 super tu m'as deja apri plus de truc en 5 min que mon bouquin en 2h voila ce que ça donne #include <iostream> #include <stdlib.h> using namespace std; int main(int argc, char *argv[]) { int n,m; float p; printf("rang de depart?\n"); scanf("%d", n); printf("rang de fin?\n"); scanf("%d", m); do { n++; p = factoriel(n+1)/n; if( (p - floor(p)) == 0) printf("%f\n", p); } while(p<m); system("PAUSE"); return 0; } et j'abuse mais comment tu fait une definition recursive je crois que je vais lui donner ton nom a ce prog parce que j'aurais vraiment rien fait Lien vers le commentaire Partager sur d’autres sites More sharing options...
mogwai93 Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 une fonction récursive, c'est une fonction qui s'appelle elle-même il te faut creer un arret, sinon ton programma va planter exemple : void fonction_recursive (<parametres>) { ... if (<condition d'arret vraie>) then { ... } else { // modifier les parametres // en decrementant ou incrementants un des parametres fonction_recursive (<parametres>) } ... } Lien vers le commentaire Partager sur d’autres sites More sharing options...
ramy Posté(e) le 3 février 2005 Auteur Partager Posté(e) le 3 février 2005 j'avais deja une idée de ce qu'etait une fonction recursive, seulement sous TI, je fonctionne avec un systeme de balise : tant que le programme n'a pas rempli une certaine condition, il retourne au debut et une fois cette condition rempli il se termine... ma question portée surtout sur la maniere d'introduire une fonction recursive dans ce programme... RQ : le compilateur m'informe d'un probleme avec la ligne de la factoriel ; c'est a cause de cette fonction recursive ??? je vais tatonner avec un if...then en attendant vos conseil ce que je comprend pas c'est a quoi sert la ligne while(p<m) si j'introduit une fonctionn recursive... Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 Pas besoin d'un while, c'est remplacé par la récursion. Et évite les goto/Label en C, utilise plutôt des boucles (while/for) Lien vers le commentaire Partager sur d’autres sites More sharing options...
ramy Posté(e) le 3 février 2005 Auteur Partager Posté(e) le 3 février 2005 oué non j'ai pas compir ce qui fallait - ça ressemble pllus a rien mon prog #include <iostream> #include <stdlib.h> using namespace std; int main(int argc, char *argv[]) { int n,m; float p; printf("rang de depart?\n"); scanf("%d", n); printf("rang de fin?\n"); scanf("%d", m); void recurrance ((factoriel(n+1) )/n) { if (p<m) do { n++; p = recurrance(n) if( (p - floor(p)) == 0) printf("%f\n", p); } } else {system("PAUSE"); return 0; } } } le parametre de la fonction de void y faut mettre quoi : n ou la fonction en elle-meme??? Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 Bon, c'est un facto que tu veux ? int facto (int n) { if (n==0) return 1; (else) //<= Pas nécessaire return facto(n-1)*n; } Lien vers le commentaire Partager sur d’autres sites More sharing options...
mogwai93 Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 Bon, c'est un facto que tu veux ? int facto (int n) { if (n==0) return 1; (else) //<= Pas nécessaire return facto(n-1)*n; } il manque un truc : il faut rajouter un test sur N car ca risque de planter si on rentre un chiffre négatif Lien vers le commentaire Partager sur d’autres sites More sharing options...
ramy Posté(e) le 3 février 2005 Auteur Partager Posté(e) le 3 février 2005 dsl je vois bien que je vous saoul Label balise do { n++; p = factoriel(n+1)/n; if( (p - floor(p)) == 0) printf("%f\n", p); } Goto balise ça s'est faisable meme si c'est pas tres catho...? Lien vers le commentaire Partager sur d’autres sites More sharing options...
mogwai93 Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 dsl je vois bien que je vous saoul Label balise do { n++; p = factoriel(n+1)/n; if( (p - floor(p)) == 0) printf("%f\n", p); } Goto balise ça s'est faisable meme si c'est pas tres catho...? reprend ton code du post de 03-02-2005 15:40:47 ensuite il faut coder la fonction factorielle elle doit etre au-dessus de ta fonction main pour le code de la fonction factorielle , prend le code de theocrite // déclaration des variables globales .... int factorielle (int N) { ... } void main (int argc, char *argv[]) { ... } en programmation C/C++/Pascal, évite les goto et les label !! seuls dans quelques cas très isolés ils te seront nécessaires Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 Et évite les goto/Label en C, utilise plutôt des boucles (while/for) http://www.acm.org/classics/oct95/ Si tu as une petite notion d'info, tu as du entendre parler de Dijkstra, c'est pas un avis anodin Oublie ces labels/goto (d'ailleurs ça ne s'écrit pas comme ça) Tu remplace par un while(1) ou while (condition), for, contuinue break, return etc. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 il manque un truc :il faut rajouter un test sur N car ca risque de planter si on rentre un chiffre négatif if( n<0) { printf("%c∞\n", ((n%2)?'-':'+')); exit(1); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
ramy Posté(e) le 3 février 2005 Auteur Partager Posté(e) le 3 février 2005 dans ce genre? #include <iostream> #include <stdlib.h> using namespace std; int factoriel (int N) { if (n==0) return 1; else return factoriel (n-1)*n } int main(int argc, char *argv[]) { int n,m; float p; printf("rang de depart?\n"); scanf("%d", n); printf("rang de fin?\n"); scanf("%d", m); do { n++; p = factoriel(n+1)/n; if( (p - floor(p)) == 0) printf("%f\n", p); } while(p<m); system("PAUSE"); return 0; } Lien vers le commentaire Partager sur d’autres sites More sharing options...
fafaro Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 dans ce genre? #include <iostream> #include <stdlib.h> using namespace std; int factoriel (int N) { if (n==0) return 1; else return factoriel (n-1)*n } Attention aux N et n, c'est pas pareil pour ton compilateur. Lien vers le commentaire Partager sur d’autres sites More sharing options...
ramy Posté(e) le 3 février 2005 Auteur Partager Posté(e) le 3 février 2005 oui pardon mais sinon le code, c'est bon? Lien vers le commentaire Partager sur d’autres sites More sharing options...
ramy Posté(e) le 3 février 2005 Auteur Partager Posté(e) le 3 février 2005 #include <iostream> #include <stdlib.h> using namespace std; int factoriel (int N) { if (N<1) return 1; else return (factoriel (N-1))*N; } int main(int argc, char *argv[]) { int n,m; float p; printf("rang de depart?\n"); scanf("%d", n); printf("rang de fin?\m"); scanf("%d", m); do { n++; p = ( factoriel (n+1) )/n; if( (p - floor(p)) == 0) printf("%f\n", p); } while(p<m); system("PAUSE"); return 0; } compiler... executer... y me demande le rand de depart ; bien le programme s'arrete...y me demande meme po le rang de fin! Lien vers le commentaire Partager sur d’autres sites More sharing options...
njoyard Posté(e) le 3 février 2005 Partager Posté(e) le 3 février 2005 c'est dans le scanf le problème scanf doit pouvoir écrire la valeur entrée dans ta variable or dans ce que tu as écrit tu passes à la fonction scanf la VALEUR de ta variable. Il faut lui donner l'ADRESSE de la variable pour qu'elle sache où écrire... (syntaxe: &variable) scanf("%d", n); devient scanf("%d", &n); et pareil deux lignes en dessous... ton programme s'arrête car scanf pense que tu lui as donné une adresse mémoire valide, or c'est la valeur de "n" que tu lui donnes, qui ne correspond dans la plupart des cas pas à une zone mémoire "allouée" (= zone ou ton prog a le droit d'écrire) donc scanf essaye d'écrire dans une zone non allouée > "erreur de segmentation" Lien vers le commentaire Partager sur d’autres sites More sharing options...
ramy Posté(e) le 3 février 2005 Auteur Partager Posté(e) le 3 février 2005 ok ça marche... mais ça marche pas! bah oui les nombres qui sortes sont pas premiers ! la j'ai des 0.0000 a n'en plus finir Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 4 février 2005 Partager Posté(e) le 4 février 2005 C'est quoi le rapport entre factoriel et premier ? do { n++; p = ( factoriel (n+1) )/n; if( (p - floor(p)) == 0) printf("%f\n", p); } while(p<m); Tu essaye de faire quoi là ? Notamment cette ligne là => "p = ( factoriel (n+1) )/n;" et la suivante. Juste pour factoriel, c'est ça : Tu peux le remplacer par un printf("%d\n",factoriel(n)); Lien vers le commentaire Partager sur d’autres sites More sharing options...
njoyard Posté(e) le 4 février 2005 Partager Posté(e) le 4 février 2005 la j'ai des 0.0000 a n'en plus finir ça doit venir de là: p = ( factoriel (n+1) )/n; comme factoriel (n+1) et n sont des entiers le compilo prend le "/" pour une division entière je pense comme si tu avais écrit p = (float) (((int) factoriel(n+1)) / ((int) n)); (y'a beaucoup de parenthèses mais je suis pas sur de moi sur ce coup lol) du coup p = floor(p) puisque p est entier... a mon avis pour qu'il fasse une division flottante il faut mettre p = ((float) factoriel(n+1)) / ((float) n); sachant que la syntaxe (Type) Machin dit au compilo d'interpréter Machin comme un truc du type Type j'me trompe ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 4 février 2005 Partager Posté(e) le 4 février 2005 Je ne suis pas d'accord. Je ne vois pas l'intérêt de ce calcul, mais pour tout n>0, on a : factoriel (n+1) = (n+1)(n)(factoriel(n-1)) Donc : ( factoriel (n+1) )/n = (n+1)(factoriel(n-1)) Donc ( factoriel (n+1) )/n est entier et il n'y a pas de problème de virgule flottante. Lien vers le commentaire Partager sur d’autres sites More sharing options...
njoyard Posté(e) le 4 février 2005 Partager Posté(e) le 4 février 2005 effectivement ben alors son if (p-floor(p)==0) sert a rien Lien vers le commentaire Partager sur d’autres sites More sharing options...
mogwai93 Posté(e) le 4 février 2005 Partager Posté(e) le 4 février 2005 il te faut remplacer printf("rang de fin?\m"); par printf("rang de fin?\n"); et comme le dit Theo p est tjs entier ( (n+1)! / n == n! ) donc ton test if( (p - floor(p)) == 0) ne sert à rien, car toujours vrai donc ton code est équivalent à : for (int i = n; i < m; i++) printf ("%d\n", factorielle (i)); Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 4 février 2005 Partager Posté(e) le 4 février 2005 whoups... je tiens à m'excuser pour toutes les petites bourdes que j'ai glissé dans mon bout de code fait à l'arrache au fait, le but du prog, c'est quoi, pour de vrai??? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.