IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

problème de débutant


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Par défaut problème de débutant
    Bonjour tout le monde

    le langage c étant vaste je ne vois pas souvent la différence qu'on deux fonctions qui aboutissent toutes deux au même résultat :
    par exemple quel est la différence entre %d et %ld notre prof a utilisé %d alors que on préfère %ld.

    ensuite ce code devrait marcher en principe mais ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main(int argc, char *argv[])
    {
      long age = 0; // On initialise la variable à 0
     
      printf("Quel age avez-vous ? ");
      scanf("%ld", &age); // On demande d'entrer l'age avec scanf
      printf("Ah ! Vous avez donc %ld ans !\n\n", age);
     
      system("PAUSE");      
      return 0;    <----- j'ai pris le soin de l'enlever linux
    }
    mais en entrant l'age avec la virgule exemple 23.5 le résultat affiché est un zéro.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    La différence entre %d et %ld est la même qu'entre int et long. %d c'est pour récupérer des variables de type int alors que %ld c'est pour les long, c'est juste une question de taille.

    En ce qui concerne ton code, non il ne devrait pas marcher ! scanf() est une fonction très chiante de ce côté là, quand on lui demande un int, elle va récupérer un int, si on lui met un float, (comme 23.5) le résultat est indéterminé.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abdelilah Voir le message
    Bonjour tout le monde

    le langage c étant vaste je ne vois pas souvent la différence qu'on deux fonctions qui aboutissent toutes deux au même résultat :
    par exemple quel est la différence entre %d et %ld notre prof a utilisé %d alors on préfère %ld.

    ensuite ce code devrait marcher en principe mais ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main(int argc, char *argv[])
    {
      long age = 0; // On initialise la variable à 0
     
      printf("Quel age avez-vous ? "); 
      scanf("%ld", &age); // On demande d'entrer l'age avec scanf
      printf("Ah ! Vous avez donc %ld ans !\n\n", age);
     
      system("PAUSE");      
      return 0;    <----- j'ai pris le soin de l'enlever linux
    }
    mais en entrant l'age avec la virgule exemple 23.5 le résultat affiché est un zéro.
    PsychoH13 le dit bien. scanf est chiant car il veut une entrée formatée (correspondant aux règles demandées) et que toi, t'es libre de taper ce que tu veux. C'est une fonction qu'on propose aux débutants parce qu'elle permet rapidement de commencer à faire des trucs mais ensuite, faut passer à autre chose. Par exemple voici le même programme mais tu pourras pas entrer 23.5...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdio.h>
    int main(int argc, char *argv[])
    {
      long age = 0; // On initialise la variable à 0
      char saisie[128];
     
      printf("Quel age avez-vous ? ");flush(stdout);   // Le fflush c'est juste pour afficher le message sans attendre
     
      fgets(saisie, 128, stdin);
      if (sscanf(saisie, "%ld", &age) == 1)
              printf("Ah ! Vous avez donc %ld ans !\n\n", age);
      else
              printf("Saisie incorrecte => vous n'avez pas entré un nombre valide\n");
     
      system("PAUSE");      
      return 0;    <----- j'ai pris le soin de l'enlever linux
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Par défaut
    bonjour

    1000*mercis je me disais que mon problème ferait rire du monde il n'en est rien
    en plus vous m'avez bien expliqué.

    je suis content quoique ça n'a pas marché sous linux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
    #include <stdlib>
    int main(int argc, char *argv[])
    {
      long age = 0; // On initialise la variable à 0
      char saisie[128];
     
      printf("Quel age avez-vous ? ");flush(stdout);   // Le fflush c'est 
    juste pour afficher le message sans attendre
     
      fgets(saisie, 128, stdin);
      if (sscanf(saisie, "%ld", &age) == 1)
              printf("Ah ! Vous avez donc %ld ans !\n\n", age);
      else
              printf("Saisie incorrecte => vous n'avez pas entré un nombre
    valide\n");
     
      return 0;
    }
    il me "crache" ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    abdel@ubuntu:~/dev-c$ nano age.c
    abdel@ubuntu:~/dev-c$ gcc -o age age.c 
    age.c:2:18: error: stdlib: Aucun fichier ou répertoire de ce type
    age.c: In function ‘main’:
    age.c:9: error: ‘juste’ undeclared (first use in this function)
    age.c:9: error: (Each undeclared identifier is reported only once
    age.c:9: error: for each function it appears in.)
    age.c:9: error: expected ‘;’ before ‘pour’
    age.c:15: error: missing terminating " character
    age.c:16: error: stray ‘\’ in program
    age.c:16: error: ‘valide’ undeclared (first use in this function)
    age.c:16: error: expected ‘)’ before ‘n’
    age.c:16: error: missing terminating " character
    age.c:19: error: expected ‘;’ before ‘}’ token


    par moment je me perd puisque les commandes devraient marcher qulqu'un pourait il m'éclairer.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    1. #include <stdlib.h> et non pas <stdlib>.
    2. Supprime les retours à la ligne dans le commentaire et la chaîne de caractères.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abdelilah Voir le message
    bonjour

    1000*mercis je me disais que mon problème ferait rire du monde il n'en est rien
    en plus vous m'avez bien expliqué.
    It's our job...

    Citation Envoyé par abdelilah Voir le message
    par moment je me perd puisque les commandes devraient marcher qulqu'un pourait il m'éclairer.
    Désolé, je tape souvent en live sans prendre le temps de compiler et tester mon code. En général il marche du 1er coup (quel frimeur ) mais parfois je laisse passer une connerie que n'importe quel programmeur confirmé corrigerait en 1/2 seconde mais qui peut faire peur au débutant...

    Sinon j'espère que t'as compris l'idée
    1) je fais saisir une chaîne => je peux entrer ce que je veux
    2) j'extraits de cette chaîne le nombre qui est sensé y être => sscanf() renvoie le nombre d'éléments extraits correspondants à ce qui est demandé (si j'ai entré un nombre, sscanf trouve un nombre et me renvoie "1")
    3) si j'ai pas "1" en final, c'est que sscanf n'a pas trouvé de nombre dans ce qui a été entré mais dans tous les cas mon clavier n'est pas pollué par ce qui reste et qui n'aurait pas été traité si j'avais utilisé simplement "scanf()"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Par défaut
    Bonsoir

    j'ai tout reformulé sous nano et recompilé avec gcc et ça a marché.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
    #include <stdlib.h>
     
    main()
     
     {
     
    double age = 0;
    printf("declarez un réel \n");
    scanf("%lf", &age);
    printf("donc vous avez %lf années",age);
     
    return 0;
     
     }
    le problème vient de scanf en effet il faut garder le même format c.à.d %lf pour scanf et %lf pour print,sur le papier %lf et %f c'est la même chose mais le cas échéant cela produit tout simplement un zéro.
    En somme le problème était dans %lf encore une fois merci.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abdelilah Voir le message
    sur le papier %lf et %f c'est la même chose
    Ca dépend quel papier. Celui de ton prof qui répète peut-être les erreurs qu'on lui a enseignées c'est possible mais pas sur les bons papiers...

    Citation Envoyé par abdelilah Voir le message
    le problème vient de scanf en effet il faut garder le même format c.à.d %lf pour scanf et %lf pour print,sur le papier %lf et %f c'est la même chose mais le cas échéant cela produit tout simplement un zéro.
    En somme le problème était dans %lf encore une fois merci.
    Pour scanf, c'est hyper important d'être hyper rigoureux car tu lui passes une adresse (pour lui c'est un truc inconnu) qu'il ensuite remplir en fonction de ce que tu lui dis. Pour printf, ca l'est un peu moins car tu lui passes des valeurs et il y a le mécanisme de cast qui "peut" parfois te sauver la mise dans ce que tu lui envoies. Mais c'est pas pour ça qu'il ne faut pas l'être (rigoureux je veux dire)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requete, problème de débutant
    Par focus dans le forum Access
    Réponses: 4
    Dernier message: 16/02/2006, 05h51
  2. Problème de débutant dans une requête
    Par decour dans le forum Access
    Réponses: 7
    Dernier message: 14/10/2005, 14h17
  3. [C#][service windows] problème de débutant avec 1 timer
    Par Nycos62 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 14/10/2005, 11h22
  4. Réponses: 3
    Dernier message: 24/09/2005, 09h34
  5. [DB2] problèmes de débutant
    Par rémi_tounul dans le forum DB2
    Réponses: 4
    Dernier message: 21/04/2005, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo