Aller au contenu

[fini...]algorthme de calcul


ramy

Messages recommandés

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 :francais: et ça me permettrais de passer de la theorie a la practique avant les 500 pages restantes :incline:

Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 51
  • Créé
  • Dernière réponse

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

super tu m'as deja apri plus de truc en 5 min que mon bouquin en 2h :incline:

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 :-D

je crois que je vais lui donner ton nom a ce prog parce que j'aurais vraiment rien fait :francais:

Lien vers le commentaire
Partager sur d’autres sites

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

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 :francais:

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

oué non j'ai pas compir ce qui fallait - ça ressemble pllus a rien mon prog :francais:

#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

dsl je vois bien que je vous saoul :francais:

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

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 :francais:

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

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

#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! :francais:

Lien vers le commentaire
Partager sur d’autres sites

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

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

la j'ai des 0.0000 a n'en plus finir  :transpi:

ç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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.


×
×
  • Créer...