[C-JAVA]Vérifier qu'un nombre est un entier [Résolu/Fermé]

Signaler
-
Messages postés
3669
Date d'inscription
jeudi 15 juillet 2004
Statut
Contributeur
Dernière intervention
8 août 2006
-
Comment faire, en C/C++ ou Java, pour vérifier si un nombre est un entier ou décimal ? Peut on le faire ?
A voir également:

18 réponses

Messages postés
440
Date d'inscription
jeudi 24 juillet 2003
Statut
Membre
Dernière intervention
21 juillet 2006
477
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

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.
Messages postés
5927
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
212
"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!
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.
Un cast, hein ? Je retiendrais. Mais peut on forcer une variable de type char à devenir une variable de type int ?
Messages postés
3669
Date d'inscription
jeudi 15 juillet 2004
Statut
Contributeur
Dernière intervention
8 août 2006
485
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.
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);
On pourrait imaginer aussi :
try{
//Opérations sur les nombres entiers
}catch(NumberFormatException){
//Si les nombres ne sont pas entier
}
Messages postés
5927
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
212
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!
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 ?
Messages postés
5927
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
212
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!
Ah merci en effet erreur de débutant... :'( marre des erreurs à la c** !
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 !!!!
Messages postés
3669
Date d'inscription
jeudi 15 juillet 2004
Statut
Contributeur
Dernière intervention
8 août 2006
485
tu peux donner ton code pour voir ?

Proverbe Thaïlandais:Pingouins dans les champs,
                                         hiver très méchant.
Messages postés
5927
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
212
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!
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.
Messages postés
5927
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
212
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!
Messages postés
3669
Date d'inscription
jeudi 15 juillet 2004
Statut
Contributeur
Dernière intervention
8 août 2006
485
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.
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.
Messages postés
3669
Date d'inscription
jeudi 15 juillet 2004
Statut
Contributeur
Dernière intervention
8 août 2006
485
Ca me fait toujours marrer l'auto correction !!!

Proverbe Thaïlandais:Pingouins dans les champs,
                                         hiver très méchant.
Messages postés
5927
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
212
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!
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 !
Messages postés
3669
Date d'inscription
jeudi 15 juillet 2004
Statut
Contributeur
Dernière intervention
8 août 2006
485
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.
Messages postés
5927
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
212
de rien
ca fait toujours plaisir de pouvoir aider
bon courage pour la suite

COIN!