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 :

Petit exercice tout simple


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Petit exercice tout simple
    Bonjour ,

    je débute dans ma nouvelle école , je fais de programmation

    pour commencer on apprends la langage C/C++

    alors voila je comprends les Base , printf , scanf , facile , par contre la j'ai un petit souci , en recopiant ce que le prof a expliquer il y'a une petite erreur mais impossible de la trouver :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
     
    void main ()
    {
       char tmp(80);
       float a,b;
       printf ("indique ton premier \n");
       gets(tmp);
       sscanf(tmp"%fd", &a);
       printf ("indique ton 2 eme \n");
       gets(tmp);
       sscanf(tmp"%fd", &b);
       float c=a/b;
       printf("%fd/%fd=%fd\n", a,b,c);
       system("PAUSE");
    }

    Pour info j'utilise visual C++ 2008 , j'aimerais que le programme me montre ou il trouve les fautes , c'est possible?

    et sinon pourquoi on utilise le gets(tmp) a quoi va t-il servrir?

    tout ça juste pour faire une division , le float ok c'est pour que si on divise genre 3/2 il marque bien en virgule , mais les gets et tmp je comprends pas

    merci

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par sakita Voir le message
    pour commencer on apprends la langage C/C++
    Le langage C/C++ n'existe pas. Il y a le C et le C++ mais pas le C/C++ ce sont deux langages différents.

    Citation Envoyé par sakita Voir le message
    alors voila je comprends les Base , printf , scanf , facile,
    Pourtant l'utilisation correcte de scanf() est loin d'être simple.

    Citation Envoyé par sakita Voir le message
    par contre la j'ai un petit souci , en recopiant ce que le prof a expliquer il y'a une petite erreur mais impossible de la trouver :
    Mes remarques dans le code:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <stdio.h>
    #include <stdlib.h>
     
    /* 
       GL: entete non standard est qui plus est inutile ici. A enlever 
    */
    #include <conio.h>
     
    /* 
       GL: les formes standard de main sont 
          int main(void) et 
          int main(int, char**) 
    */
    void main ()
    {
    /*
       GL: la syntaxe correcte est char tmp[80];
    */
       char tmp(80);
       float a,b;
       printf ("indique ton premier \n");
    /*
       GL: gets est une source importante deprobleme, en effet il ne verifie pas 
       la taille du buffer, il y a risque important d'overflow.
       Il ne faut pas utiliser gets() mais fgets(). 
    */
       gets(tmp);
    /*
       GL: 
          il manque une virgule entre tmp et ".
          Le formateur %fd n'existe pas.
          Pas de verification du retour de sscanf(), la conversion peut ne pas se derouler correctement.
    */
       sscanf(tmp"%fd", &a);
       printf ("indique ton 2 eme \n");
       gets(tmp);
    /*
       GL: idem ci-dessus.
    */
       sscanf(tmp"%fd", &b);
    /*
       GL:
          En C90, les déclaration de variables doivent se faire en début de bloc.
          Et si b vaut 0 ? Il faudrait vérifier.
    */
       float c=a/b;
       printf("%fd/%fd=%fd\n", a,b,c);
       system("PAUSE");
    }
    Citation Envoyé par sakita Voir le message
    et sinon pourquoi on utilise le gets(tmp) a quoi va t-il servrir?
    A récupérer la saisie de l'utilisateur. Mais comme indiqué ci-dessus, gets() n'est absolument pas sur.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    merci , pour gets c'est le prof qui nous demande d'utiliser ça , donc pas le choix

    oui la on apprends d'abord le C , mais ce que je voulais dire c'est que va apprendre les 2 quoi !

    oui mais je parlais pour scanf de la base de chez base , je sais bien que c'est pas facile aprés

    j'ai que 1 semaine de progra dans les pattes

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce code est horrible et incite à de mauvaises pratiques: Change de prof. Celui-ci est de toute évidence incompétent, milite pour qu'il soit viré.
    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.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    lol , peut être mais apparement il n'utilise pu ce genre de commande pour les prochains exercice

    du genre la c'est " inscrivez 3 chiffre et ils se mettront par ordre croissant " je doit jouer avec les " if " et " else " ? ou y'a une commande spécifique? je suppose que c'est la première méthode

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 377
    Points : 23 663
    Points
    23 663
    Par défaut
    Citation Envoyé par sakita Voir le message
    je doit jouer avec les " if " et " else " ? ou y'a une commande spécifique? je suppose que c'est la première méthode
    L'un et l'autre. Il existe bien sûr en C des fonctions de tri toutes faites mais pour classer trois nombres, ça ne vaut pas le coup, et ce n'est pas l'intérêt de l'exercice. Il y a plein de manières de le faire. Choisis celle qui te convient le mieux.

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par sakita Voir le message
    Bonjour ,

    je débute dans ma nouvelle école , je fais de programmation

    pour commencer on apprends la langage C/C++
    Change d'école. Il n'y a pas de C/C++...
    alors voila je comprends les Base , printf , scanf , facile ,
    Hum... scanf() est tout sauf facile...
    par contre la j'ai un petit souci , en recopiant ce que le prof a expliquer il y'a une petite erreur mais impossible de la trouver :




    Pour info j'utilise visual C++ 2008 , j'aimerais que le programme me montre ou il trouve les fautes , c'est possible?

    et sinon pourquoi on utilise le gets(tmp) a quoi va t-il servrir?

    tout ça juste pour faire une division , le float ok c'est pour que si on divise genre 3/2 il marque bien en virgule , mais les gets et tmp je comprends pas

    merci
    Ce code est un tissu d'âneries...
    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
     
     
    -------------- Build: Debug in hello ---------------
     
    [ 50.0%] Compiling: main.c
    [100.0%] Linking console executable: bin\Debug\hello.exe
    C:\dev\hello\main.c:6: warning: function declaration isn't a prototype
    C:\dev\hello\main.c:6: warning: return type of 'main' is not `int'
    C:\dev\hello\main.c: In function `main':
    C:\dev\hello\main.c:7: error: syntax error before numeric constant
    C:\dev\hello\main.c:7: warning: function declaration isn't a prototype
    C:\dev\hello\main.c:10: warning: passing arg 1 of `gets' from incompatible pointer type
    C:\dev\hello\main.c:11: error: syntax error before string constant
    C:\dev\hello\main.c:13: warning: passing arg 1 of `gets' from incompatible pointer type
    C:\dev\hello\main.c:14: error: syntax error before string constant
    Process terminated with status 1 (0 minutes, 0 seconds)
    3 errors, 5 warnings
    Cette soi-disant école mérite une inspection. On y enseigne des contre-vérités :
    • Il n'y a pas de C/C++
    • scanf() n'est pas 'simple'.
    • main() retourne int. Toujours
    • un tableau se définit avec des [] et non des ().
    • gets() est un bug. Son usage est interdit dans les nouveaux développements. Elle n'est là que pour la compatibilité avec les anciens codes. Utiliser fgets(). (Attention, il y a quelques précautions d'usage).
    • Dans sscanf(), il manque une virgule pour séparer les paramètres...
    • Il n'existe pas de formateur "%fd". C'est "%f" ici, car les variables sont de type float.
    • La valeur retournée par sscanf() n'est pas testée...
    • Il est inutile de mettre un espace avant un '\n'.

    Une fois corrigé, ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    indique ton premier
    1.2
    indique ton 2 eme
    3.4
    1.200000/3.400000=0.352941
     
    Process returned 0 (0x0)   execution time : 6.354 s
    Press any key to continue.
    L'idée ici est de saisir une ligne de texte avec fgets() dans tmp, et ensuite de la convertir en valeur numérique avec sscanf().
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    j'ai dit c/c ++ comme ça pas besoin de peter un cable

    et pour scanf j'ai jamais dit que c'étais facile j'ai dit la base -_-

    et pour les fautes c'est pas l'école j'ai dit que c'étais moi qui avais mal recopier , car c'etais juste une première approche pour montrer des exemples

    je pense qu'il a un peu mélanger pour expliquer chaque code et du coup ça a fais un truc pas structuré et mal fais mais c'étais peut etre juste pour expliquer

    merci pour votre aide

Discussions similaires

  1. petite question toute simple sur les boucles
    Par elmcherqui dans le forum C++
    Réponses: 7
    Dernier message: 21/05/2008, 10h15
  2. [MySQL] Petit dictionnaire tout simple en français
    Par sitalgerie dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/03/2007, 23h23
  3. Petite fonction toute simple, mais
    Par renaud26 dans le forum Général JavaScript
    Réponses: 46
    Dernier message: 21/07/2006, 14h34
  4. un petit code tout simple o_O avec des $POST variable :)
    Par dark_vidor dans le forum Langage
    Réponses: 5
    Dernier message: 08/04/2006, 01h08
  5. Petit truc tout simple que je comprend pas
    Par Olaf MENJI dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/11/2005, 16h56

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