[newbie] crée un fichier .h en C

CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007 - 27 oct. 2004 à 16:12
CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007 - 27 oct. 2004 à 18:16
Bonjour à tous,

Je crée un fichier en c qui permet de verrifier si ce que l'on entre est bien un chiffre, mais je voudrais mettre se code dans les programmes que je creer ... sans devoir repater tout le code, je voudrais créer une fonction qui renvoit 0 ou 1 (O si c'est pas un nombre et 1 si c'est bien un nombre) exemple
#include <verfnbre.h>

[...]

do
{
x = verfnbre(monbombre)
if(x=1)
{
printf("bien un nombre");
}
else
{
printf("pas un nombre");
}
}while(x=0);

[...]

je ne sais pas si c'est possible ... pouvez vous me dire comment faire ou me diriger vers une autre piste ...

Merci de votre aide

@+

DOS-chkdsk-2K

24 réponses

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 oct. 2004 à 16:19
Tu inclue ton code ds un .h, tu mets le prototype au debut du header (ou ailleur ds le .h, on sen fout) et apres, lors dune prochaine utilisation, tu n'auras qu'a inclure le .h pour utiliser ta fonction.
Ou tu peux créer une dll pour stocker le code de ta fonction, mais on en est pas la ;)

voila, bonne chance

++
0
CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007
27 oct. 2004 à 16:36
atta je comprends pas trop ...
voici le code source et je voudrais en faire un .h je dois faire comment ?

#include <stdio.h>

main()
{
 int  leprogramme;
 int  lg_du_nbre;
 int  message_d_erreur;
 int  il_y_a_un_pt;
 int  la_boucle;
 int  debut_de_la_chaine_nor;

 char nbre_en_char[10];

 do
 {
   clrscr();
   printf("Entrez un nombre ? ");
   scanf("%s",&nbre_en_char);

   lg_du_nbre = strlen(nbre_en_char);

   if(nbre_en_char[0]==46)/* Ver si égalà .*/
   {
      message_d_erreur =1;
   }

   else
   {

     if(nbre_en_char[0]==48)/* Ver si égal à 0*/
     {

if(nbre_en_char[1]==46)/* Ver si égal à .*/
        {
            il_y_a_un_pt = 1;
    debut_de_la_chaine_nor = 2;
        }

        else
        {
   	    message_d_erreur =1;
        }

     }

     else
     {
        il_y_a_un_pt = 0;
debut_de_la_chaine_nor=0;
     }

   }

   for(la_boucle=debut_de_la_chaine_nor;la_boucle<lg_du_nbre;la_boucle++)
   {
      if(nbre_en_char[la_boucle]==46)
      {
  if(il_y_a_un_pt==1)
          {
            message_d_erreur =1;
          }
          else
          {
            il_y_a_un_pt = 1;
          }

      }
      else
      {
  if((48>=nbre_en_char[la_boucle])||(57<=nbre_en_char[la_boucle]))
          {
            message_d_erreur =1;
          }
      }
   }

   if(message_d_erreur==1)
   {
     printf("ERREUR");
     message_d_erreur = 0;
     getch();
   }
   else
   {
   printf("BON");
   getch();
   }
 leprogramme=0;
 }while(leprogramme==0);

}


mais là il n'affiche que ERREUR ou BON, mais je ne sais ps comment faire pour qu'il renvoit 1 ou 0;
car sinon je dois copier/coller chaque fois le code lorsque je veux entrer un nombre ...

mais déjà merci de ton aide ;)
DOS-chkdsk-2K
0
CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007
27 oct. 2004 à 16:38
ah oui aussi il fait un un printf & un scanf au début du programme a changer aussi mais je ne sais pas comment faire ....

DOS-chkdsk-2K
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 oct. 2004 à 16:43
oula, atta c le code pour savoir si c une chaine est un nombre ?
Regarde :

#include <stdio.h>
#include <stdlib.h>

int main() {

char sznumber[128];
char *c = sznumber;
//recup le chiffre
scanf("%s", sznumber);

while (*c > '0' && *c++ < '9');
if (!*c) printf("c'est un nombre !");
else printf("C'est pas un nombre ...");

system("PAUSE");

return 0;
}

Voila, c deja plus court, je te montre comment faire une fonction de ce code, et apres tu le feras sur la tienne.

A la fin, tu as un test ki te permet de mettre bon ou pas, ok ?
Bah tt simplement, tu remplace par un return QUELQUECHOSE..
regarde :

int Verif(char *sznumber)
{
char sznumber[128];
char *c = sznumber;
//recup le chiffre
scanf("%s", sznumber);

while (*c > '0' && *c++ < '9');
if (!*c) return 1; //c'est un nombre

return 0; //ce n'est pas un nombre;..
}

int main()
{
if (Verif("14237434") == 1) printf("c'est un nombre !");
return 0;
}

Voila !
Si tu comprend pas certains points du code, c po grave, ct juste pour te montrer ke tu peux faire BOCOU plus simple, mais n'hesite pas a poser des kestions ..

Bonne chance

++
0

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

Posez votre question
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 oct. 2004 à 16:50
Et maintenant kelk petits conseil et remarque sur ton code :

scanf("%S", &nbre_en_char);

C bon, mais en C, si tu mets nbre_en_char, ce sera traduit comme &nbre_en_char[0], en clair, nbre_en_char est un pointeur vers le premier element du tableau, donc pas besoin de &.

Ensuite :

Dans tes boucles for, les variables d'incrementation, evite les noms a rallonge, paskapres tu te perds : utilise des lettres comme 'i', 'j'...etc, mais la c une kestion de gout.

Ben pour finir, jte conseille de continuer a faire plein de petites fonctions comme ca, c'est bien pour commencer (j'ai fait comme ca moi...), et si ta besoin d'une 'correction' (ce ke je te donnerai ne sera pas parfait, jsui pas un guru comme dirait l'autre).

Mais n'hesite pas.

++
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 oct. 2004 à 16:55
ton code est faut AlexMAN, tu a fais l'erreur de celui qui va trop vite

-1 1u 1l 1L ... sont des nombres

pour verifier qu'une saisie est bien un entier

int IsInteger( const char *sznumber, int *n)
{
int _n;

if( sscanf( sznumber, "%d", &_n ) == 1 )
{
if( n ) *n = _n;
return 1;
}
return 0;
}
0
CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007
27 oct. 2004 à 17:03
Je voudrais garder si possible le principe de mon code ... mais je n'arrive pas crée le fichier .h et l'utiliser comme on utilise atoi, etc ....

J n'ai pas tester ton code djl mais quand tu entre 00.1 ou 0.0.1 il fait quoi ?

DOS-chkdsk-2K
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 oct. 2004 à 17:05
djl > ok pour -1, mais kan tu saisis un nombre, tu ne mets pas '1u' etc... si ?
0
CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007
27 oct. 2004 à 17:11
la seule chose qu'il ne fait pas car je n'ai pas besoin c'est les nombres négatifs ....

AlexMan je fait cela pour un control d'erreur histoire de pas lancer le programme quand tu tapes 12.34E ...

DOS-chkdsk-2K
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 oct. 2004 à 17:11
ca donne 0 (zero)

mais tu veux des entier ou des entiers et des reels ?

sinon le modele c'est

un .h

#ifndef __UN_NOM_A_RALLONGE__
#define __UN_NOM_A_RALLONGE__

/* declarations */

#endif

un .c

#include "le .h"

/* definitions */

le .c à juste besoin d'etre compilé une fois
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 oct. 2004 à 17:13
AlexMAN > non jamais, mais je crois pas qu'on puisse considerer ca comme une erreur

de meme 1.f c'est un reel ( considerer comme une erreur == dire que ce n'est pas un reel )

ma fonction laisse passer 2jhfjkhj par exemple, moi je vois pas d'erreur, 2 est saisie et avec un fgets le flux est clean
0
CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007
27 oct. 2004 à 17:18
djl > si je tape mon code direct ca va passer ? avec les int, char etc ?
DOS-chkdsk-2K
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 oct. 2004 à 17:20
djl > En langage C/C++, ce n'est pas une erreur, mais ds la vie courante, personne n'utilise ce genre de syntaxe pour designer un nombre. Donc maintenant tt depend a ki sadresse ce soft...
j'avoue ke ma fonction etait un peu a chier..
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 oct. 2004 à 17:28
AlexMAN > oui, en fait oui je vois

CHKDSK2K > j'ai pas lu ton code mais il est beaucoup trop long pour ce qui est demandé et tu risques de tomber dans le piege de la non portabilité
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 oct. 2004 à 17:32
il est tombé dedans de tte maniere, avec les getch() ...
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 oct. 2004 à 17:39
et le code ascii litteral, vaut mieux se fier au fonction de ctype.h

ca te va ca ? (pas testé)

#include <ctype.h>

int IsInteger( const char *sznumber)
{
char *p = sznumber;

while( *p && isspace( *p ) ) p++;

if( !(*p) ) return 0;

if( !isdigit( *p ) || p != '.' || p != '-' )
return 0;

while( *++p )
{
if( *p == '.' )
{
if( fp ) return 0;
fp = 1;
}
else if( !isdigit( *p ) ) return 0;

}
return 1;
}
0
CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007
27 oct. 2004 à 17:40
AlexMAN > j'ai laissé les getcht(); pour le mmt car quand je lance le programe il fait une pause et il affiche sinon il quitte programme ...

DOS-chkdsk-2K
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 oct. 2004 à 17:41
il manque la declaration int fp = 0;
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 oct. 2004 à 17:42
CHKDSK2K > lance le ligne de commande ton programme
0
CHKDSK2K Messages postés 144 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 18 septembre 2007
27 oct. 2004 à 18:08
djl > je n'ai pas compris là ... je dois faire quoi ?

DOS-chkdsk-2K
0
Rejoignez-nous