[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 ?
A voir également:

18 réponses

grofwa Messages postés 440 Date d'inscription   Statut Membre Dernière intervention   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
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
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
"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
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
Onde2Choc
 
Un cast, hein ? Je retiendrais. Mais peut on forcer une variable de type char à devenir une variable de type int ?
0
Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   495
 
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
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

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

Posez votre question
./
 
On pourrait imaginer aussi :
try{
//Opérations sur les nombres entiers
}catch(NumberFormatException){
//Si les nombres ne sont pas entier
}
0
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
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
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
Onde2Choc
 
Ah merci en effet erreur de débutant... :'( marre des erreurs à la c** !
0
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
Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   495
 
tu peux donner ton code pour voir ?

Proverbe Thaïlandais:Pingouins dans les champs,
                                         hiver très méchant.
0
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
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
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   495
 
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
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
Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   495
 
Ca me fait toujours marrer l'auto correction !!!

Proverbe Thaïlandais:Pingouins dans les champs,
                                         hiver très méchant.
0
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
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
Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   495
 
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
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
de rien
ca fait toujours plaisir de pouvoir aider
bon courage pour la suite

COIN!
0