[C-JAVA]Vérifier qu'un nombre est un entier

Résolu
Onde2Choc -  
Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   -
Comment faire, en C/C++ ou Java, pour vérifier si un nombre est un entier ou décimal ? Peut on le faire ?

18 réponses

  1. grofwa Messages postés 440 Statut Membre 479
     
    Salut,

    En java, je ferais comme ceci :
    int i;
    double d = 16.7;
    i = (int)d;
    if (i == d)
      // entier
    else
      // décimal

    Michael.

    Ne vous souciez pas de n'être pas remarqué ; cherchez 
    plutôt à faire quelque chose de remarquable [Confucius]
    4
  2. Onde2Choc
     
    Donc dans ton exemple, on compare une variable à tester avec une variable donc on sait que c'est un entier (car c'est la part entière du nobre à tester), et si ils sont égaux c'est que le 2nd aussi est entier ? Astucieux j'y avais pas pensé... faut dire que je connaissait pas l'instruction int(variable)... Merci beaucoup.
    1
    1. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
       
      "faut dire que je connaissait pas l'instruction int(variable)... "
      C'est pas une instruction sa s'appel un cast en fait tu force une variable à etre ce que tu cast, ici en int
      COIN!
      0
  3. muppet
     
    Mouais, au détail près que si d > MAX_INT ça marche plus. Enfin en C c'est sûr, et je suppose que c'est pareil en java.
    A mon avis vaut mieux utiliser, par exemple, la fonction floor dans math.h (toujours pour le C. java je connais pas bien)
    double d = 16.8;
    if (d == floor(d))
        //entier
    else
        //décimal
    

    Ceci dit il existe peut-être une fonction qui teste directement, dans le style "IsInterger(d)" qui renvoie vrai ou faux, mais là je me rappelle plus.
    1
  4. Onde2Choc
     
    Un cast, hein ? Je retiendrais. Mais peut on forcer une variable de type char à devenir une variable de type int ?
    0
    1. Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   499
       
      Oui tu cast un peu comme tu veux... mais attention aux resultats que tu obtiens...

      Proverbe Thaïlandais:Pingouins dans les champs,
                                               hiver très méchant.
      0
    2. marvinrouge
       
      oui

      char* s = "123";
      int i = atoi(s);

      inversement
      char[30] s2; // 30 ou une taille quelcnque SUFFISANTE
      // si i vaut 123 la taille doit etre 4 ("123" + le '\0' terminal)

      itoa(i, s2);
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ./
     
    On pourrait imaginer aussi :
    try{
    //Opérations sur les nombres entiers
    }catch(NumberFormatException){
    //Si les nombres ne sont pas entier
    }
    0
  7. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
     
    oui
    en java (ou c d'ailleur c'est la même syntax)
    int test;
    char chaine='a';
    test= (int)chaine;
    dans test tu aura la valeur en ascii du caractere

    COIN!
    0
  8. Onde2Choc
     
    Merci à tous pour vos réponses. Je suis en train de faire un programme de calcul des nombres premiers. Pour l'instant en voila le code :
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
     int nombreTest;                    
     double nombreVerif;
     long nombreEntier;
     long diviseur;
    
    printf("Voici la liste des nombres entiers de 1 à 1001 : ");
    
    for(nombreEntier=2; nombreEntier=1001; nombreEntier++)
    {
        for(diviseur=1; diviseur=(nombreEntier-1); diviseur++)
        {
           nombreVerif = nombreEntier / diviseur;
           nombreTest = (int)nombreVerif;
    
           if (nombreTest == nombreVerif)
           {
              printf(" %d \n", nombreEntier);
           }
    
        }
    }
    
    return 0;
    }

    Mais j'ai un bug : la fenêtre DOS ne fait qu'afficher une suite infinie de 1001. Vous voyez l'erreur ?
    0
  9. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
     
    ya un probleme dans ta boucle for, le controle du milieu n'est pas bon.

    for (debut;tanque condition vrai;action)
    toi tu veux le faire tant que nombreEntier=1001 enfin ca part en vrille.
    fait ca plutot ca marchera mieux
    for(nombreEntier=2; nombreEntier<=1001; nombreEntier++)
    

    tu fait ta boucle tant que le nombre est inferieiur a 1001
    idem pour la seconde
    for(diviseur=1; diviseur<=(nombreEntier-1); diviseur++)
    


    COIN!
    0
  10. Onde2Choc
     
    Ah merci en effet erreur de débutant... :'( marre des erreurs à la c** !
    0
  11. Onde2Choc
     
    Aaaarg maintenant le programme renvoie la liste des nombres premiers de 1 à 1001 : le seul nombre premier entre un et 10000 est... 0 (première nouvelle). En plus j'ai rajouté un scanf(" &d", &fin); pour simuler une pause dans le programme, mais lorsque j'appuie sur entrée il n'y a aucun effet... DEPRIME TOTALE RIEN NE MARCHE !!!!
    0
    1. Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   499
       
      tu peux donner ton code pour voir ?

      Proverbe Thaïlandais:Pingouins dans les champs,
                                               hiver très méchant.
      0
  12. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
     
    essaye de faire ton algo autrement
    cast ton diviseur en double
    nombreVerif = nombreEntier / (double)diviseur;
    


    ou declare le en double la division merde quand ya du int dedans

    COIN!
    0
  13. Onde2Choc
     
    Bien sûr le voila :
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
     int nombreTest;                    
     double nombreVerif;
     long nombreEntier;
     long diviseur;
     char fin;
    
    printf("Voici la liste des nombres entiers de 1 a 10000 : ");
    
    for(nombreEntier=2; nombreEntier<=10000; nombreEntier++)       /*1ere boucle for, nombreEntier étant le nombre à tester*/
    {
        for(diviseur=1; diviseur<=nombreEntier-1; diviseur++)    //2nde boucle for : divise nombreEntier par tous les nombres de 1
        {                                                         //à nombreEntier-1.
           nombreVerif = nombreEntier/diviseur;
           nombreTest = (int)nombreVerif;
    
           if (nombreTest == nombreVerif)
           {
              printf(" %d \n", nombreVerif);
           }
    
        }
      printf("Voila c'est tout. Appuyez sur [Q] puis sur [ENTREE] pour continuer...");
      scanf(" %s", &fin);
      break;
    }
    
    return 0;
    }
    


    Note : depuis mon dernier post j'ai réussi à faire fonctionner le scanf.
    0
  14. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
     
    ps: par rapport à mon dernier poste , si tu veux afficher les nb premier le scanf n'affichepas le resultat voulu, puis c'est un peu difficile à l'affichage

    COIN!
    0
  15. Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   499
     
    Purquoi ta boucle diviseur commence a 1 ??? tous les nombres sont divisibles par 1, nan ? ce serait pas mieux deja de commencer a 2 ?
    Qu'est ce que tu as comme probleme exactement ?

    Proverbe Thaïlandais:Pingouins dans les champs,
                                             hiver très méchant.
    0
  16. Onde2Choc
     
    Le scanf ne sert qu'à "causer" la fermeture du programme, c'est une sorte de pause.

    En gros, je voudrais que le programme fasse ça :
    1) nombreEntier = 2
    2) diviser nombreEntier par tous les nombres de 1 à (nombreEntier - 1)
    3) si tous les résultats sont des nombres décimaux, afficher nombreEntier, car il est, par déduction, entier
    4) nombreEntier = 3
    5) etc....

    note : en écrivant ce post je viens de me rendre compte que mon code ne veut rien dire, tel quel. La seconde boucle for ne sert qu'à écrire tous les diviseurs de nombreEntier, et non pas à vérifier si nombreEntier est un nombre premier... Je vais réécrire tout ça.
    0
    1. Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   499
       
      Ca me fait toujours marrer l'auto correction !!!

      Proverbe Thaïlandais:Pingouins dans les champs,
                                               hiver très méchant.
      0
  17. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
     
    ah oui j l'avais corriger dans mon visual mais j ai oublié de l'indiquer

    tiens voila le code squi affiche tous les entier premier compris entre 1 et 100

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
     int nombreTest;                    
     double nombreVerif;
     long nombreEntier;
     long diviseur;
     int controle;
    
    printf("Voici la liste des nombres entiers de 1 à 1001 : ");
    
    for(nombreEntier=1; nombreEntier<=100; nombreEntier++)
    {
    	controle=0;
        for(diviseur=2; diviseur<=(nombreEntier-1); diviseur++)
        {
           nombreVerif = nombreEntier / (double)diviseur;
           nombreTest = (int)nombreVerif;
    
           if (nombreTest == nombreVerif)
           {
              controle=1;
           }
    
        }
    	if(controle==0)
    	{
    		printf(" %d \n", nombreEntier);
    	}
    }
    
    return 0;
    }
    


    j'ai corrigé les bornes mais tu pourra remettre 1001 ala place de 100 (j ai un vieux pc qui rame donc je le menage^^)

    COIN!
    0
  18. Onde2Choc
     
    Merci Canard007 mais j'ai trouvé un code qui marche avant de lire ton post, lol ! En effet Kermit l'auto-correction c'est marrant quand c'est celle des autres ! Mais quand ça t'arrives tu te trouves c*n mais à un point :-D... enfin bon je suis débutant c normal ! Je suis là pour faire rire le forum de mes problèmes stupides !
    D'ailleurs dans la catégorie "je parle mais je ferais mieux de me taire", il y a un sujet de Calvin, qui s'intitule : "[C]Où est le problème", qui est très drôle.

    Merci quand même pour votre aide !
    0
    1. Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   499
       
      C clair... c plus drole quand c les autres ! Ca m'est arrivé pas plus tard que ce matin alors je c de quoi je parle...

      Proverbe Thaïlandais:Pingouins dans les champs,
                                               hiver très méchant.
      0
  19. Canard007 Messages postés 5954 Date d'inscription   Statut Contributeur 216
     
    de rien
    ca fait toujours plaisir de pouvoir aider
    bon courage pour la suite

    COIN!
    0