Problème avec isdigit

Résolu
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 - 29 sept. 2005 à 19:00
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 - 1 oct. 2005 à 14:46
Voila j'ai un petit problème je voudrai faire en sorte que lors d'une
insertion de nombre on recommence le code jusqu'à ce que le nombre soit
un nombre (autrement dit une vérification pour ne pas tapez des lettres
ou une lettre).

do

{

fflush(stdin);

printf("test entrer un nombre :);scanf("%d",&number);

}while(isdigit(number)!=0);



En français : jusqu'à ce que number soit un chiffre.



Mais voila cela ne fait aucun effet , et si l'on entre une lettre le
programme continue sont petit bonhomme de chemin. juste pour voir j'ai
changer en ==0 et la il trouve si j'ai introduit une lettre mais si
j'introduit un chiffre pas après , la boucle recommence quand mm
autrement dit pas moyen d'en sortir.



Quelq'un peut il m'aider svp?



merci d'avance

30 réponses

cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
29 sept. 2005 à 19:08
bool Verif(char *c)

{

char *d = c;

while(*d != '\0')

{

if((*d > 57) || (*d < 48))

return false;

d++;

}

return true;

}



int main()

{

char Buff[128];



do

{

printf("\nEntrer un nombre : ");

scanf("%s", Buff);

}while(!Verif(Buff));



system("PAUSE");

return 0;

}



J'pense pas que c'est la meilleure façon mais bon

if(!Meilleur("Joky")) return ERREUR;<
3
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 sept. 2005 à 19:11
do

{

printf(...)

scanf("%s", buf); //Pour lire la donnée tapée + le entree de validation

} while (buf[0] < '0' || buf[0] > '9');



Pour convertir ton caractère en chiffre, te reste plus qu'a faire:

chiffre = buf[0] - '0';

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 sept. 2005 à 19:18
Ah ouias, j'avais zappé si on lit un chiffre plus grand que 9!!!!

Petite remarque sur le code de Joky: la valeur numérique 57 correspond
au caractère ASCII '9' et la valeur 48 au caractère '0'.


Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
29 sept. 2005 à 19:19
Oui mais si on tape 1r alors là ton code ne sert plus à rien :)

Tandis que le mien vérifie toute la chaine :)

Nanananère !



Par contre, le mien ne gère pas les virgules ou point,

Donc on le transforme comme ça :



bool Verif(char *c)

{

char *d = c;

while(*d != '\0')

{

if((*d-'1' < 0) || (*d-'9'>0))

{

if((*d '.') || (*d ','))

break;



return false;

}

d++;

}

return true;

}


if(!Meilleur("Joky")) return ERREUR;<
0

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

Posez votre question
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
29 sept. 2005 à 19:20
Oups en lisant le post de Julien je me suis dit que j'avais oublier le 0 lol

if((*d-'1' < 0) || (*d-'9'>0))

devient

if((*d-'0' < 0) || (*d-'9'>0))

if(!Meilleur("Joky")) return ERREUR;<
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 sept. 2005 à 19:24
Non cela ne marche pas car 1: problème de convertion de *char en int et
si je fait sans pointeur cela passe mais cela fait la mm chose, pas
moyen de sortir de la boucle :/
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 sept. 2005 à 19:26
Utilise atoi ou atof.

Mais la fonction de Joky doit marcher. AU moins la premiere, pas encore lu la seconde.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 sept. 2005 à 19:33
yop cela marche maintenant, enfin preske , pour sortir de la boucle il
faut que j'introduise une valeur supérieur ou égale a 6000 :s comprend
plus rien la.
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 sept. 2005 à 19:39
Sinon, une autre idée, qui rejoint celle de joky





bool Verif(char *chaine)


{


int i;

int nbPoint = 0;


for (i = 0; i < strlen(chaine), i++)

{

if (chaine[i] == '.')

{

nbPoint++;

if (nbPoint > 1)

return false;

}

else if (isdigit(chaine[i]) == 0)

return false;

}

return true;

}

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 sept. 2005 à 19:41
Sorry, pas vu ton post entre temps.

Tu peux montrer comment est ton code maintenant stp.

Parcque c'est vrai que ca parait bizarre le coup du 6000.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 sept. 2005 à 19:41
Mais je ne comprend pas pourquoi vous voulez que la fonction recoit un
char alors que ma variable est un entier (que d'ailleur le compilateur
aimera pas car imposible convertir *char en int) :s
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 sept. 2005 à 19:43
on doit test si la variable entrée est bien un chiffre (ou un nombre) et pas une lettre.
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
29 sept. 2005 à 19:45
Ben faut pas que tu fasses un scanf("%d"...) parcque si tu rentre
d'autre données non valide derriere, tu le sauras pas et ca ira remplir
ton buffer clavier.

Alors le mieux, c'est de lire une chaine de caractères jusqu'au caratère de retour à la ligne puis de la parser.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
29 sept. 2005 à 19:48
Ralala quelle complication lol

C'est mieux faire le traitement avec un char, et si justement c'est bien un chiffre tu le converti après :



int Number = atoi(Buff);

if(!Meilleur("Joky")) return ERREUR;<
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 sept. 2005 à 19:49
voila j'ai remplacer le %d par %s et deviner quoi!!! ca marche mais pas
ds le bon sans, quand j'entre un nombre il va pas et quand j'entre une
lettre il prend or c'est le contraire que je veu mdr
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
29 sept. 2005 à 19:50
Fait un copier de toute ta fonction ;)
if(!Meilleur("Joky")) return ERREUR;<
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 sept. 2005 à 19:55
tous le code AVANT les modifications :



//Include des bibliothèques.

#include "entete.h"

#include <ctype.h>



#define ONSS_PLAFOND 1800 //Constante .



void main(void)

{



int D_shnumemp;

float D_intsalbrut,D_intsalimp,D_intprecompt,D_intsalnet,D_intonss;



// Encodeage.

printf("Introduisez le numéro de l'employ%c :_",130);scanf("%d",&D_shnumemp);

fflush(stdin);

printf("Introduisez le salair brut de l'employer no: %d :_",D_shnumemp);scanf("%f",&D_intsalbrut);

// Calcules.

if(D_intsalbrut<ONSS_PLAFOND)

{

D_intonss=((D_intsalbrut/100)*9);

}else{

D_intonss=((ONSS_PLAFOND/100)*9);

}

D_intsalimp=(D_intsalbrut-D_intonss);

D_intprecompt=((D_intsalimp/100)*20);

D_intsalnet=D_intsalimp-D_intprecompt;



// Affichage

clrscr();

printf("\n\tCalcules des salaires de l'employer no %d :",D_shnumemp);

printf("\n\n\n\tSalaire imposable : %.2f",D_intsalimp);

printf("\n\tPr%ccompte proff%csionnel : %.2f",130,130,D_intprecompt);

printf("\n\tSalaire net : %.2f",D_intsalnet);

getch();

}





et maintenant le code modifier :



//Include des bibliothèques.

#include "entete.h"

#include <ctype.h>



#define ONSS_PLAFOND 1800 //Constante plafond.



bool test_lettre(char c)

{

return(toupper(c) >= 'A' && toupper(c) <= 'Z');

}



void main(void)

{



char D_shnumemp;

float D_intsalbrut,D_intsalimp,D_intprecompt,D_intsalnet,D_intonss;



// Encodeage.

do

{

printf("Introduisez le numéro de l'employ%c :_",130);scanf("%s",&D_shnumemp);

fflush(stdin);

}while(test_lettre(D_shnumemp)==0);

fflush(stdin);

printf("Introduisez le salair brut de l'employer no: %d :_",D_shnumemp);scanf("%f",&D_intsalbrut);

// Calcules.

if(D_intsalbrut<ONSS_PLAFOND)

{

D_intonss=((D_intsalbrut/100)*9);

}else{

D_intonss=((ONSS_PLAFOND/100)*9);

}

D_intsalimp=(D_intsalbrut-D_intonss);

D_intprecompt=((D_intsalimp/100)*20);

D_intsalnet=D_intsalimp-D_intprecompt;



// Affichage

clrscr();

printf("\n\tCalcules des salaires de l'employer no %d :",D_shnumemp);

printf("\n\n\n\tSalaire imposable : %.2f",D_intsalimp);

printf("\n\tPr%ccompte proff%csionnel : %.2f",130,130,D_intprecompt);

printf("\n\tSalaire net : %.2f",D_intsalnet);

getch();

}
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
29 sept. 2005 à 19:57
Non mais c'était pas ça que je demandais lol

C'était le code de la fonction qu'on vient de faire ensemble :)

Pour voir si t'as pas oublié un ptit truc vu qu'il ne fait pas ce qu'on veut :)

Enfin chez moi, le code marche impec, donc forcément problème de code chez toi ;)

if(!Meilleur("Joky")) return ERREUR;<
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
29 sept. 2005 à 20:00
hum je vous fait toute mes excuse les gars, la fonction marche très
bien c'est jusque j'avai mal coder un truc qui d'ailleur ne faisait pas
partie de la fonction. Désoler de vous avoir fait perdre votre temps.
Désoler et merci en tous cas.
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
29 sept. 2005 à 20:02
Ca fait pas perdre du temps lol

Moi ça m'éclate :p
if(!Meilleur("Joky")) return ERREUR;
0
Rejoignez-nous