[newbie] isdigit + double = :'(

Signaler
Messages postés
144
Date d'inscription
mardi 2 septembre 2003
Statut
Membre
Dernière intervention
18 septembre 2007
-
 capoueidiablo -
Bonjour all,

le probleme est que apres la verfication il ne m'affiche pas le nombre que j'ai entré .... :'(

voici le cs

#include <stdio.h>
#include <ctype.h>

void main()
{
double code;

int val;

system("CLS");

printf("Donne un nombre stp ? ");

code = getchar();

val = isdigit(code);
if (val == 0)
{
system("CLS");
printf("J AI DIT UN NOMBRE ET PAS %lf !!!", code);
getch();
}
else
{
system("CLS");
printf(" TU AS TAPE : %lf",code);
getch();
}
}

DOS-chkdsk-2K

22 réponses

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
premierement, utilise pas systeme si c'est pas strictement necessaire, car c'est tres lourd. il me semble que la fonction doit etre clrscr() ds stdio.h pr vider l'ecran.
ensuite essaye de remplacer ton double par un int, ca marchera surement bien mieux.....
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
ensuite plutot que de taper tt ton code ds le if puis tt retaper ds le else, tu pourrais faire:

system("CLS");
if (val == 0)
{
printf("J AI DIT UN NOMBRE ET PAS %lf !!!", code);
}
else
{
printf(" TU AS TAPE : %lf",code);
}
getch();

ou encore

system.("CLS");
printf ((val == 0)? "jai dis un nombre et pas" : "tu as tapé");
printf ("%lf", code);
getch();
Messages postés
101
Date d'inscription
vendredi 15 février 2002
Statut
Membre
Dernière intervention
6 août 2007

C'est simplement que getchar retourne un! caractere et que tu essaie de l'afficher avec un %lf dans printf, en fait ce que tu affiches c'est le code ascii du caratere tapé
En plus ta variable code est un double, avec getchar tu n'as que le premier caractere tappé.
Si tu veux lire un nombre a virgule, il ne faut pas utiliser getchar, utilise plutot scanf
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
ooooooops!!!avait pas vu le getchar, je metais tellement fixé sur le sidigit sur un double.....
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ya pas de clrscr() dans stdio.h, ce genre de fonction ne pas pas etre standard
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
ca doit etre clearscr() alors......et cest effectivement peut-etre pas std......mais ds ts les cas system("CLS")......enfin je vais oas me repeter....
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ni clearscr(), la notion d'ecran n'existe pas en c
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
alors t'es obligé de faire system ("CLS"); ????
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
et un printf ("\033[2J_033[1;1H"); ca marche? (j'injecte ca en c++ sous unix pour faire un clear de l'ecran, en c et sous win, ca marche ca?)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
"alors t'es obligé de faire system ("CLS"); ???? "

non, si ton os le peux, tu fais un appel systeme

sous windows on ferais ca en win32, voir le source de conio sous devcpp (conio.c) par exemple

ton printf c'est une sequence ansi, c'est pas non plus ce qu'il ya de plus portable (il faut activer le driver ansi.sys sous win > nt )
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
d'ailleur ca implique la console...
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
de toute facon je vois pas tres bien a quoi ca sert ??
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
isdigit permet s'utilise avec des chiffres et non des nombres!
et prend en param un "char c;" qui correspond au code ascii du nombre soit un int!

Shell
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
djl > le pb de system ("CLS"); c'est qu'a chaque fois tu passes en mode kernel pour quelques cycles puis te repasse en mode user.......mon code est effectivement pas tres portable, (dailleurs merci de m'avoir précisé comment et pourquoi, lol), mais il est deja beaucoup moins lourd qu'un system ("CLS")......si ton prog doit rafraichir l'affichage a chaque fois, mon dieu que de lourdeur pour un prog qui fait juste des affichages
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
j'ai jamais critiquer ton code ??

j'ai dit que ca ne puvais pas etre dans un entete standard, j'ai meme dit qu'il fallait faire un appel system et c'est a priori ce que fais clrscr()
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
lol. t'engatse pas djl, je ne fais qu'essayer moi aussi de comprendre :D
je pense ke niveau c t'es bien plus calé que moi, je ne fais qu'exposer ce que je pense pour avoir ton repondant et comprendre les choses....
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
cherche sur ce site sconio ou econio et tu aura un exemple d'un clrscr coherent sous windows
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Vu que ca fait déjà quelques jours que tu te prends la tete avec ce probleme voici une réponse parmi d'autre. Les nombres à virgule sont aussi considérés comme nombre, et n'oublie pas que isdigit ne traite que des chiffres au format ASCII et non des nombres. C'est pourquoi j'utilise un char.
Bref voici le code, ca te parlera surment plus que mes explications :

#include <windows.h>
#include <stdio.h>

int main(int argc, char* argv[]) 
{
size_t		i;
char	code[256];
double  nombre;

system("CLS");

// On demande à l'utilisateur d'entrée un nombre
printf("Donne un nombre stp ? ");

// On recupere le nombre dans un tableau de type char
scanf("%s",&code);

// On parcours chaque éléments du tableau
for(i=0;i<strlen(code);i++)
{
// On vérifie que l'élément soit bien un chiffre ou une virgule sinon on sort de la boucle en mettant i = -2
if(isdigit(code[i]) == 0 && code[i] != '.')
i = -2;
   	}

// Si I vaut -1 cela veur dire qu'on est sorti de la boucle prématurement et donc que "code" n'est pas un nombre
if (i != -1)
{
system("CLS");
// On convertit le nombre en de char -> double pour qu'ensuite on puisse l'utiliser dans des calculs
nombre = atof(code);
printf("TU AS TAPE : %0.2lf\n\n",nombre);
system("PAUSE");
}
else
{
system("CLS");
printf("J'AI DIT UN NOMBRE ET PAS %s !!!\n\n", code);
system("PAUSE");
}
return 0; 
}


Il n'y a pas de grande difficulté et le code est commenté.

Shell
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
printf("Donne un nombre stp ? ");
fflush(stdout);

sinon ca peut ne pas s'afficher (avant le scanf) si tes i/o sont line buffered