Maths et autres

Résolu
jeanphilippe37 Messages postés 73 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 21 octobre 2010 - 2 mai 2008 à 00:19
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 4 mai 2008 à 12:21
Slt,



j'ai fais un prgm de maths pour savoir les nbrs premiers mais, quand je mets system("pause"), j'ai une erreur, pouvez vous me corriger ?

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


int estPremier (int nbr)
{
  /*Les nombres premiers < 100*/
  static int prems[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,
                        43,47,53,59,61,67,71,73,79,83,89,97};
  int i, n;
  double d;




  /* On suppose que 1 est premier */
  if (nbr == 1)
  {
    return 1;
  }
 
  n = sizeof (prems) / sizeof (*prems);


  /* D'abord on regarde si n est divisible par les nombres premiers dans le tableau */
  for (i = 0; i < n; i++)
  {
    if (nbr == prems[i])
    {
      return 1;
    }
    if (nbr % prems[i] == 0)
    {
      return 0;
    }
  }
 
  /* Ensuite, on doit regarder a partir du dernier element du tableau+2 jusqu'a sqrt(nbr)... */
  d = sqrt (nbr) + 0.5; /* Le 0.5 permet de tester si c'est un carre parfait... */
  i = prems[i-1] + 2;


  while (i < d)
  {
    if (nbr % i == 0)
    {
      return 0;
    }
    i += 2;
  }
  return 1;
}


int main(void)
{
  int i;


  for (i = 101; i < 500; i++)
  {
    if (estPremier (i))
    {
      printf ("%d\n",i);
    }
  }
system("pause");
  return 0;
}

Et également, j'aimerai faire un truc sur l'annimation en c++ sur "console" en c++, comment on fais ça ? et aussi, quelles sont les dimentions de l'écran console ? Pour un jeux ds ce mode, est-ce facile ou pas ?
egalement, pour un jeux en 2d avec scriptes, comment on fait, j'aimerai trouver la bibliothéque scripte, ou je peux la choper ?

merci bcp
jph

J-Ph

12 réponses

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
2 mai 2008 à 01:38
Bonsoir,

Ce calcul est incorrect :  n = sizeof(prems) / sizeof(*prems);
C'est  n = sizeof(prems) / sizeof(int); (c'est un tableau de "int")
Ce n'est qu'un hazard si le résultat est juste parce que sizeof(pointeur) = sizeof(int) !!!

Jean-François
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 mai 2008 à 02:06
Ce calcule est parfaitement correct. Ce n'est pas la taille d'un pointeur que l'on calcule mais la taille de la valeur pointée par le pointeur.

char c[] = "Bonjour";
printf("%d\n", sizeof(*c));

Affiche bien 1

C++ (@++)<!--
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 mai 2008 à 02:07
Au passage, c'est quoi l'erreur que provoque system("pause") ?

C++ (@++)<!--
3
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
2 mai 2008 à 09:44
Ce n'est pas la taille d'un pointeur qui est calculée mais tout simplement le nombre de valeurs dans le tableau prems (tableau d'entiers et non tableau de pointeurs) et je n'ai rien rigoureusement à changer à ce que j'ai écris !

Jean-François
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2008 à 10:28
sizeof() devrait donner la taille totale du tableau dans le cas de l'exemple car le tableau est connu de la fonction.
On devrait donc avoir le nombre d'éléments dans n.
Si c'était un param, ce serait bien sizeof(int) à en retour.


Faut absolument se méfier de ce genre de syntaxe et ne pas en prendre l'habitude, source de bugs difficile à retrouver.

ciao...
BruNews, MVP VC++
3
jeanphilippe37 Messages postés 73 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 21 octobre 2010
2 mai 2008 à 13:34
re,



merci, mais l'erreur quand je le compile avec sytem("pause") j'ai une erreur de compilation, comment dois-je faire ?
Et également, j'aimerai faire un truc sur l'annimation en c++ sur "console" en c++, comment on fais ça ? et aussi, quelles sont les dimentions de l'écran console ? Pour un jeux ds ce mode, est-ce facile ou pas ?
egalement, pour un jeux en 2d avec scriptes, comment on fait, j'aimerai trouver la bibliothéque scripte, ou je peux la choper ?

merci les gars

ps : Connaissait vous l'école d'ingénieur IMERIR (l'école d'ingénieur en informatique et robotique de perpignan.) ?
J-Ph
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
2 mai 2008 à 13:48
Pour system() il faut l'include de stdlib.h ou de process.h donc ça devrait passer !

C'est quel compilateur ?
C'est quel libellé d'erreur précisemment ?

Jean-François
0
jeanphilippe37 Messages postés 73 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 21 octobre 2010
2 mai 2008 à 15:53
re,

j'ai corrige, ms cela merde encore: cette fois, c une erreur d'incolade!!!!!!!!!
60 C:\Documents and Settings\jean-philippe\Mes documents\maths.cpp expected `}' at end of input

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


int estPremier (int nbr)
{
  /*Les nombres premiers < 100*/
  static int prems[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,
                        43,47,53,59,61,67,71,73,79,83,89,97};
  int i, n;
  double d;




  /* On suppose que 1 est premier */
  if (nbr == 1)
  {
    return 1;
  }
 
  n = sizeof (prems) / sizeof (*prems);


  /* D'abord on regarde si n est divisible par les nombres premiers dans le tableau */
  for (i = 0; i < n; i++)
  {
    if (nbr == prems[i])
    {
      return 1;
    }
    if (nbr % prems[i] == 0)
    {
      return 0;
    }
  }
 
  /* Ensuite, on doit regarder a partir du dernier element du tableau+2 jusqu'a sqrt(nbr)... */
  d = sqrt (nbr) + 0.5; /* Le 0.5 permet de tester si c'est un carre parfait... */
  i = prems[i-1] + 2;


  while (i < d)
  {
    if (nbr % i == 0)
    {
      return 0;
    }
    i += 2;
  }
  return 1;
}


int main(void)
{
  int i;


  for (i = 101; i < 500; i++)
  {
    if (estPremier (i))
    {
      printf ("%d\n",i);
      system("pause");    }
}








J-Ph
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
2 mai 2008 à 16:02
Les accolades ne sont pas appairées dans main() (3 ouvertes, 2 fermées)


int main(void)
{
   int i;

   for (i = 101; i < 500; i++)
   {
      if (estPremier(i))
      {
         printf ("%d\n",i);
      }
   }
   system("pause");
}








Jean-François
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 mai 2008 à 21:37
jfrancois >>
"Ce n'est pas la taille d'un pointeur que l'on calcule mais la taille de la valeur pointée par le pointeur."
Je parlais du sizeof (*prems)

C++ (@++)<!--
0
jeanphilippe37 Messages postés 73 Date d'inscription mercredi 25 juillet 2007 Statut Membre Dernière intervention 21 octobre 2010
3 mai 2008 à 23:36
ok, merci, c gentil mais, je voudrais tous les afficher ( 2;3;5;7;et... jusqu'a 499, commenty dois je procéder ?

MERCI

J-Ph
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
4 mai 2008 à 12:21
Bonjour,

1) en supprimant l'aberation du 1 premier (mettre à la place : if (nbr < 2) return 0;)
2) en faisant commencer la boucle à 0 (ou 1 ou 2) et non à 101
3) en corrigeant l'erreur d'accolades déjà signalée

Jean-François
0
Rejoignez-nous