Partage
  • Partager sur Facebook
  • Partager sur Twitter

séparateur de partie décimale

Langage C exercice sur la fonction lireDouble()

    19 mai 2020 à 18:51:02

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void viderBuffer();
    int lire(char* chaine, int longueur);
    double lireDouble();
    int main(int argc, char *argv[])
    {
    double poids = 0;
    printf("Quel est votre poids ? :");
    poids = lireDouble();
    printf("Ah vous pesez donc %lf kilos", poids);
    return 0;
    }
    void viderBuffer()
    {
    int c = 0;
    while (c != '\n' && c != EOF)
    c = getchar();
    }
    int lire(char* chaine, int longueur)
    {
    char *positionEntree = NULL;
    if (fgets(chaine, longueur, stdin) != NULL)
    {
    positionEntree = strchr(chaine, '\n');
    if (positionEntree != NULL)
    *positionEntree = '\0';
    else
    viderBuffer();
    return 1;
    }
    else
    {
    viderBuffer();
    return 0;
    }
    }
    double lireDouble()
    {
    char nombreTexte[100] = {0};
    char *virgule = NULL;
    if (lire(nombreTexte, 100))
    {
    virgule = strchr(nombreTexte, ',');
    if (virgule != NULL)
    virgule[0] = '.';
    return strtod(nombreTexte, NULL);
    }
    else
    return 0;
    }

    Bonjour. Ci-dessus vous pouvez voir le code qui fonctionne, néanmoins j'ai quand même un question.

    J'ai longtemps bloqué sur le fait que la partie décimale renvoyée lorsque je mettais une virgule était nul.

    J'ai trouvé que le problème vient du type de pointeur dans la fonction LireDouble(), si je met: 

    1
    int *virgule = NULL;

    La partie décimale est automatiquement mise à 0.

    Cependant avec:

    1
    char *virgule = NULL;

    là ça marche sans problème

    Alors je ne comprends pas pourquoi le pointeur ici doit être de type char et un pas un autre, je pensais que le char pouvait aller de -127 à 128 alors comment peut il stocker une adresse qui fait souvent quelques millions en valeur. 

     Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      19 mai 2020 à 19:07:17

      Un pointeur n'est pas de type 'char' mais plutôt de type 'char *'.
      Un pointeur c'est une adresse et elle peut contenir 32 ou 64 bits (4 ou 8 octets) dépendamment de ton processeur.
      essaies ce qui suit:
          printf("dimension = %d\n", sizeof(char *));
      sizeof donne la longueur en octets (pas en bits).
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        19 mai 2020 à 19:21:39

        Merci pour ta réponse.

        Sur mon ordi, char* contient 8 octets et int* pareil mais ducoup je ne comprend pas pourquoi la fonction lireDouble() fonctionne avec char* et pas avec int* si ils contiennent tout les deux le même nombres d'octets, ils devraient fonctionner pareil non ?

        Merci d'avance.

        • Partager sur Facebook
        • Partager sur Twitter
          19 mai 2020 à 19:41:43

          Mais pourquoi utiliser une fonction qui lit du char pour ensuite en faire une valeur double ? scanf("%lf",&mydouble); est le plus simple.

          Et stp,

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            19 mai 2020 à 20:11:09

            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            void viderBuffer();
            int lire(char* chaine, int longueur);
            double lireDouble();
            int main(int argc, char *argv[])
            {
            double poids = 0;
            printf("Quel est votre poids ? :");
            poids = lireDouble();
            printf("Ah vous pesez donc %lf kilos", poids);
            return 0;
            }
            void viderBuffer()
            {
            int c = 0;
            while (c != '\n' && c != EOF)
            c = getchar();
            }
            int lire(char* chaine, int longueur)
            {
            char *positionEntree = NULL;
            if (fgets(chaine, longueur, stdin) != NULL)
            {
            positionEntree = strchr(chaine, '\n');
            if (positionEntree != NULL)
            *positionEntree = '\0';
            else
            viderBuffer();
            return 1;
            }
            else
            {
            viderBuffer();
            return 0;
            }
            }
            double lireDouble()
            {
            double nombreTexte[100] = {0};
            char *virgule = NULL;
            if (lire(nombreTexte, 100))
            {
            virgule = strchr(nombreTexte, ',');
            if (virgule != NULL)
            virgule[0] = '.';
            return strtod(nombreTexte, NULL);
            }
            else
            return 0;
            }
            Parce que dans l'exercice on veut pouvoir entrer un nombre avec une virgule et qu'il soit valide, mais peu importe si on lit du char le problème c'est le pointeur virgule que je ne comprend pas, si je met 
            int* virgule = NULL;
            Ca marche pas alors qu'avec
            char* virgule = NULL;
            Ca marche
            Ma question c'est pourquoi en fonction du type du pointeur "virgule" dans ce programme ça fonctionne ou pas ? 
            Merci d'avance.
            • Partager sur Facebook
            • Partager sur Twitter
              19 mai 2020 à 20:35:07

              Parce que quand tu écris virgule[0] = '.'; si c'est un char il écrira juste le point donc sur 1 octets mais si c'est un int, il va en écrire un peu plus ! puisqu'il va écrire comme si c'était un int donc sizeof(int) octets. ça va donc écraser des cases du tableau de char.

              • Partager sur Facebook
              • Partager sur Twitter
                19 mai 2020 à 20:53:06

                Ok merci beaucoup pour ta réponse je comprend mieux maintenant.

                Bonne soirée.

                • Partager sur Facebook
                • Partager sur Twitter
                  21 mai 2020 à 13:54:55

                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <string.h>
                  void viderBuffer();
                  int lire(char* chaine, int longueur);
                  double lireDouble();
                  int main(int argc, char *argv[])
                  {
                  double poids = 0;
                  printf("Quel est votre poids ? :");
                  poids = lireDouble();
                  printf("Ah vous pesez donc %lf kilos", poids);
                  return 0;
                  }
                  void viderBuffer()
                  {
                  int c = 0;
                  while (c != '\n' && c != EOF)
                  c = getchar();
                  }
                  int lire(char* chaine, int longueur)
                  {
                  char *positionEntree = NULL;
                  if (fgets(chaine, longueur, stdin) != NULL)
                  {
                  positionEntree = strchr(chaine, '\n');
                  if (positionEntree != NULL)
                  *positionEntree = '\0';
                  else
                  viderBuffer();
                  return 1;
                  }
                  else
                  {
                  viderBuffer();
                  return 0;
                  }
                  }
                  double lireDouble()
                  {
                  char nombreTexte[100] = {0};
                  char *virgule = NULL;
                  if (lire(nombreTexte, 100))
                  {
                  virgule = strchr(nombreTexte, ',');
                  if (virgule != NULL)
                  virgule[0] = '.';
                  return strtod(nombreTexte, NULL);
                  }
                  else
                  return 0;
                  }

                  MaximeA3 a écrit:

                  #include <stdio.h>
                  #include <stdlib.h>
                  #include <string.h>
                  void viderBuffer();
                  int lire(char* chaine, int longueur);
                  double lireDouble();
                  int main(int argc, char *argv[])
                  {
                  double poids = 0;
                  printf("Quel est votre poids ? :");
                  poids = lireDouble();
                  printf("Ah vous pesez donc %lf kilos", poids);
                  return 0;
                  }
                  void viderBuffer()
                  {
                  int c = 0;
                  while (c != '\n' && c != EOF)
                  c = getchar();
                  }
                  int lire(char* chaine, int longueur)
                  {
                  char *positionEntree = NULL;
                  if (fgets(chaine, longueur, stdin) != NULL)
                  {
                  positionEntree = strchr(chaine, '\n');
                  if (positionEntree != NULL)
                  *positionEntree = '\0';
                  else
                  viderBuffer();
                  return 1;
                  }
                  else
                  {
                  viderBuffer();
                  return 0;
                  }
                  }
                  double lireDouble()
                  {
                  double nombreTexte[100] = {0};
                  char *virgule = NULL;
                  if (lire(nombreTexte, 100))
                  {
                  virgule = strchr(nombreTexte, ',');
                  if (virgule != NULL)
                  virgule[0] = '.';
                  return strtod(nombreTexte, NULL);
                  }
                  else
                  return 0;
                  }
                  Parce que dans l'exercice on veut pouvoir entrer un nombre avec une virgule et qu'il soit valide, mais peu importe si on lit du char le problème c'est le pointeur virgule que je ne comprend pas, si je met 
                  int* virgule = NULL;
                  Ca marche pas alors qu'avec
                  char* virgule = NULL;
                  Ca marche
                  Ma question c'est pourquoi en fonction du type du pointeur "virgule" dans ce programme ça fonctionne ou pas ? 
                  Merci d'avance.

                  ça fonction parce que la fonction  strchr(nombreTexte,','); renvoi un poiteur vers  le caractère que tu recherche   c'est le pour cela tu déclare comme ce si sa fonction char* virgule = NULL; la fonction strchr renvoi toujours un poienteur vers le caratère rechercher c'est le pour cela si tu mais mais int *virgule = NULL; sa ne mache pas
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mai 2020 à 14:57:15

                    Salut,

                    J'ai une question par rapport à ton premier message écrit sans la balise de code. Tu as coloré à la main toutes tes fonctions pour que ça rende bien dans le forum ?

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      22 mai 2020 à 16:51:24

                      Fvirtman a écrit:

                      Salut,

                      J'ai une question par rapport à ton premier message écrit sans la balise de code. Tu as coloré à la main toutes tes fonctions pour que ça rende bien dans le forum ?


                      Salut nan j'ai copié-coller le code directement dans le chat sans passer par l'insertion de code.

                      -
                      Edité par MaximeA3 22 mai 2020 à 16:51:47

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 mai 2020 à 20:21:01

                        Fvirtman a écrit:

                        Salut,

                        J'ai une question par rapport à ton premier message écrit sans la balise de code. Tu as coloré à la main toutes tes fonctions pour que ça rende bien dans le forum ?

                        Ma synthèse vocale n'a pas crié plus fort que d'habitude, en tout cas. :)

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le Tout est souvent plus grand que la somme de ses parties.

                          2 juillet 2020 à 8:29:26

                          Fvirtman a écrit:

                          Salut,

                          J'ai une question par rapport à ton premier message écrit sans la balise de code. Tu as coloré à la main toutes tes fonctions pour que ça rende bien dans le forum ?

                          non

                          • Partager sur Facebook
                          • Partager sur Twitter

                          séparateur de partie décimale

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown