[newbie] isdigit + double = :'(

CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007 - 23 sept. 2004 à 19:30
 capoueidiablo - 22 oct. 2004 à 04:26
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

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
23 sept. 2004 à 20: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.....
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
23 sept. 2004 à 20:20
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();
0
Maegis Messages postés 101 Date d'inscription vendredi 15 février 2002 Statut Membre Dernière intervention 6 août 2007
23 sept. 2004 à 20:30
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
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
23 sept. 2004 à 20:31
ooooooops!!!avait pas vu le getchar, je metais tellement fixé sur le sidigit sur un double.....
0

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

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 sept. 2004 à 20:34
ya pas de clrscr() dans stdio.h, ce genre de fonction ne pas pas etre standard
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
23 sept. 2004 à 21:06
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....
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 sept. 2004 à 21:08
ni clearscr(), la notion d'ecran n'existe pas en c
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
23 sept. 2004 à 21:11
alors t'es obligé de faire system ("CLS"); ????
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
23 sept. 2004 à 21:13
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?)
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 sept. 2004 à 21:17
"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 )
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 sept. 2004 à 21:17
d'ailleur ca implique la console...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 sept. 2004 à 21:18
de toute facon je vois pas tres bien a quoi ca sert ??
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
23 sept. 2004 à 21:25
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
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 sept. 2004 à 21:28
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
23 sept. 2004 à 21:31
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
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 sept. 2004 à 21:36
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()
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
23 sept. 2004 à 21:39
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....
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 sept. 2004 à 21:43
cherche sur ce site sconio ou econio et tu aura un exemple d'un clrscr coherent sous windows
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 sept. 2004 à 11:54
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
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
24 sept. 2004 à 12:39
printf("Donne un nombre stp ? ");
fflush(stdout);

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