1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    En formation Développeur Logiciel à l'AFPA
    Inscrit en
    novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En formation Développeur Logiciel à l'AFPA

    Informations forums :
    Inscription : novembre 2017
    Messages : 4
    Points : 1
    Points
    1

    Par défaut Sites référençant des codes sources C console très simples ?

    Bonjour,

    Je suis actuellement en formation de Développeur Logiciel à l'AFPA, on a fait une bonne semaine d'algo puis maintenant on essaie de transposer nos connaissances vers le C.
    Seul problème c'est qu'aujourd'hui on est seul devant notre PC, ça fais plusieurs heures que l'on galère à trouver la solution d'un truc simple..

    Alors mon but c'est pas de pomper le code des autres, c'est vraiment d'essayer de comprendre comment ça marche.

    Pour l'instant voici ce que j'ai fais.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
     
    int main()
    {
        //Définition des variables
        char NOM[20];
        char PRENOM[30];
        int AGE;
        float TAILLE;
     
        //Saisies des valeurs et vérifications
        printf("Bonjour\n");
     
        printf("Merci de saisir votre prenom SVP : \n");
        gets (PRENOM);
     
        printf("Merci de saisir votre nom SVP : \n");
        gets (NOM);
     
        printf("Merci de saisir votre age SVP : \n");
        scanf ("%i",&AGE);
     
        printf("Merci de saisir votre taille SVP : \n");
        scanf ("%f",&TAILLE);
     
     
        //Affichage du résultat
        printf("Bonjour %s %s: vous avez %d ans et vous mesurez %.2f metres.\n", NOM, PRENOM, AGE, TAILLE);
     
        return 0;
    }

    Mon but, c'est de pouvoir vérifier la valeur de ce qui est saisi dans mes variables, c'est à dire être sûr que l'utilisateur a rentré des chiffres pour son âge, et que cet age soit compris entre machin et machin sinon il s'affiche un message d'erreur jusqu'à ce que l'utilisateur rentre une valeur correcte.
    J'aimerai savoir comment faire pour les 4 types d'informations qui sont demandés dans ce programme console.
    J'ai essayé 10.000 façon et je me ramasse toujours, j'ai bien compris que c'est la mentalité du développeur de se tromper et de persévérer mais j'aimerai savoir tout de même si il existe des sites permettant de consulter des codes sources de codes déjà tout fait pour pouvoir voir comment font les autres et progresser.

    Je vous remercie et bonne journée.

  2. #2
    Membre éclairé
    Avatar de VivienD
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    octobre 2009
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : octobre 2009
    Messages : 346
    Points : 862
    Points
    862

    Par défaut

    Bonjour,

    Pour ton problème en particulier, je te conseille une boucle do ... while pour chacune des entrées. Par exemple, l'entrée AGE, tu auras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /*
     * En admettant que tu as défini la fonction valid_age de telle sorte qu'elle renvoie 1, ou true,
     * si l'age est valide et 0, ou false, sinon.
     *
     */
    do
    {
        printf("Merci de saisir votre age SVP : \n");
        scanf ("%i",&AGE);
        if(valid_age(AGE))
            break;
        printf("L'age que vous avez entré n'est pas valide!\n");
    }
    while(1);
    Quant au(x) site(s) de référencement de codes sources, je ne pense pas que ça existe. Il y a bien sûr les dépôts sur GitHub et consorts mais il faut avoir une certaine expérience pour pouvoir déchiffrer les codes qui y pullulent. En revanche, il me semble que Développez.net a quelques codes sources à disposition; jetes-y donc un coup d'œil.
    Ohrwurm! Quand tu nous tiens!
    _____________
    Pro: Programmation en C embarqué
    Loisir: Programmation en C++11 avec la STL ou Qt 5

  3. #3
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 082
    Points : 5 916
    Points
    5 916

    Par défaut

    Pour ma part les majuscule en C ne sont pas réservé pour les variables ,seulement pour les defines.
    Il faut aussi avoir en tête que scanf est déconseillé (même si je comprend quand on débute de vouloir l'utiliser).

    Sinon un peu HS j'espere que ta formation propose autre chose que du C , il faut plusieurs années pour faire du code professionnel en C de plus les offres d'emploi en C sont relativement rare (et sur des domaines demandant en général une certaine expertise ).

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    En formation Développeur Logiciel à l'AFPA
    Inscrit en
    novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En formation Développeur Logiciel à l'AFPA

    Informations forums :
    Inscription : novembre 2017
    Messages : 4
    Points : 1
    Points
    1

    Par défaut

    Merci à vous deux, je prends note de ta proposition, j'essaierai de l’implémenter demain je te montre ce que j'avais fait mais ça voulait pas prendre en compte la valeur quand elle était comprise entre 18 et 67.. Ca continuait à tourner en boucle et à afficher le message de saisie de l'âge non stop !
    Je suis passé par tous les stades, de la boucle infinie au plantage à ça, c'est vraiment pas évident hahaha.

    Sinon ouais faut pas s'inquiéter on fait que 3 semaines de C sur 10 mois de formation (dont 2 mois et demi vers la fin de stage bénévole en entreprise aussi), c'est vraiment pour comprendre la relation du code avec la machine, savoir comment tout fonctionne sinon le gros du travail se fait en C++ JAVA, Javascript et Php/CSS.
    Mis à part pour cette journée là, le prof est quand même très bien et très pédago ! Ça me change de la gendarmerie hahaha.

    J'ai consulté les quelques codes sources sur le site et effectivement c'est pas ce qui peut m'intéresser et la plupart sont trop avancés je ne comprends aucune fonction.


    do
    {
    printf("Merci de saisir votre age SVP : \n");
    gets (AGE);
    BOOLEEN_AGE = sscanf ("%i",&AGE);
    if (BOOLEEN_AGE = (0))
    {
    printf("Saisie incorrecte, l'age doit etre compris entre 18 et 67 ans\n");
    printf("Merci de saisir votre age SVP : \n");
    gets(AGE);
    }
    }
    while (( (AGE < 17) || (AGE > 68 ));


    Est-ce que l'un d'entre vous peut m'expliquer où se situe mon erreur ? Je remarque déjà que j'ai oublié de mettre le break, c'est ça ? (D’où la boucle infini j'suppose)

    Et pourquoi scanf est plutot déconseillé ?
    Le prof nous a proposé la fonction gets mais je suis plus à l'aise avec scanf actuellement, c'est plus "modulable" et intuitif je trouve.

    Ah oui, et je vais arrêter de mettre mes fonctions en maj alors, c'était pour les repérer plus facilement mais le code couleur CodeBlocks suffira.

  5. #5
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 082
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 082
    Points : 3 165
    Points
    3 165

    Par défaut

    gets ? Sérieusement ? Plus personne n'utilise gets depuis 1990. Ne te recommandait-il pas plutôt fgets (le couple fgets / sscanf en fait) ?

    scanf est fortement déconseillée pour la saisie tout simplement parce qu'elle ne permet pas (en tout cas pas aisément) d'intercepter tous les cas d'erreur, y compris les plus triviaux : essaie de saisir 28abcd lorsqu'on te demande ton âge, par exemple. Cette fonction n'est tout simplement pas faite pour cela.

    Dans le cadre pédagogique d'un exercice pour débutant en revanche, personnellement je n'y vois pas d'inconvénient. Comprendre par la pratique pourquoi scanf n'est pas adaptée est même une très bonne chose.

    En ce qui concerne ton erreur, c'est un souci de logique : l'algorithme est mauvais, plus que sa transcription en C.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    En formation Développeur Logiciel à l'AFPA
    Inscrit en
    novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En formation Développeur Logiciel à l'AFPA

    Informations forums :
    Inscription : novembre 2017
    Messages : 4
    Points : 1
    Points
    1

    Par défaut

    Okay je vais essayer de retravailler mon algorithmes alors de façon à ce que ce soit correct une fois transcrits en C.
    Sinon oui c'est bien gets, il nous a parlé de sscanf et scanf mais il a balancé ça sans nous expliquer quoi que ce soit pour le moment avec les problématiques exposées avant.
    Je pense que l'explication de ces fonctions sont au programme d'aujourd'hui.

    En tout cas je suis agréablement surpris de l'entraide de ce forum c'est fou.

    Encore merci

  7. #7
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 082
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 082
    Points : 3 165
    Points
    3 165

    Par défaut

    Je te recommande de consulter cppreference pour la documentation des fonctions usuelles, par exemple sscanf et consorts. Attention toutefois à ne pas confondre leur portail C (celui que j'ai mis en lien) avec leur portail C++, c'est un langage bien différent régi par une autre série de normes.

    Autant prendre l'habitude de lire la documentation originale en anglais, tu te familiariseras avec le jargon. Il existe une version française de ce site mais il s'agit je crois d'une traduction automatique.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    En formation Développeur Logiciel à l'AFPA
    Inscrit en
    novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En formation Développeur Logiciel à l'AFPA

    Informations forums :
    Inscription : novembre 2017
    Messages : 4
    Points : 1
    Points
    1

    Par défaut

    D'accord je suis plutôt à l'aise en anglais, il y a juste "array" que je n'arrive pas à saisir encore, en tout cas merci beaucoup.

    Est-ce que tu peux regarder ce que j'ai fait pour le prenom (je repasserai à l'âge plus tard) grâce à ce que j'ai appris en consultant internet, j'ai remplacé les gets par fgets, j'ai créé un "define" qui sert de mémoire temporaire pour être sûr de ne pas perdre des valeur saisies si j'ai bien compris. J'ai changé la casse de mes variables, j'ai ustilisé la fonction strlen aussi, qui doit correspondre à string lenght.

    Problème, j'ai une erreur au niveau du else, il me dit " error: 'else' without a previous 'if', je comprends ce que ça veut dire pourtant les crochets m'ont l'air correct ? Je comprends pas

    En fait, mon but c'est que ce soit impossible de passer à l'étape d'après tant que l'utilisateur ne remplis pas correctement un prénom de 20 charactères max et là ce n'est pas le cas.
    Est-ce qu'il faut que j'intègre une boucle do ... while avec dans le while la condition booléenne que ce soit bien un string ET que ce soit maximum 20 carac ?

    Aussi, j'ai bêtement rajouté return 0 si la booleenne est NULL, ça veut dire que le programme se termine si l'utilisateur ne rentre rien non ? Autant l'enlever si c'est le cas c'est pas ça que je veux

    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
    51
    52
    53
    54
    55
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
     
    #define buffer 100
     
    int main(void)
    {
        //Définition des variables
        char string_nom[buffer];
        char string_prenom[buffer];
        int age[buffer];
        double taille[buffer];
        int booleen_age;
        int booleen_prenom;
     
        //Saisies des valeurs et vérifications
        printf("Bonjour\n");
     
        printf("Merci de saisir votre prenom SVP : \n");
        booleen_prenom = fgets (string_prenom, buffer, stdin);
     
        if (booleen_prenom == NULL)
        {
            printf("Vous n'avez rentré aucun caractère, bien vouloir saisir votre prenom.\n");
            return 0;
        }
        if (strlen(string_prenom) < 20);
        {
            printf("Votre saisie est trop grande, le prenom est limite a 20 caracteres, bien vouloir saisir un prenom correct");
        }
        else
        {
            printf("Votre prenom %s est bien pris en compte.\n", string_prenom);
        }
     
     
     
        printf("Merci de saisir votre nom SVP : \n");
        fgets (string_nom, buffer, stdin);
     
        printf("Merci de saisir votre age SVP : \n");
        fgets (age, buffer, stdin);
     
        printf("Merci de saisir votre taille SVP : \n");
        fgets (taille, buffer, stdin);
     
     
        //Affichage du résultat
        printf("Bonjour %s %s: vous avez %d ans et vous mesurez %.2f metres.\n", string_nom, string_prenom, age, taille);
     
       return 0;
     
    }
    PS: J'arrive pas à faire apparaître mon code en mode editeur sur le forum, je pensais que c'était automatique ?

  9. #9
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 082
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 082
    Points : 3 165
    Points
    3 165

    Par défaut

    Il y a plusieurs incompréhensions.


    Citation Envoyé par Zeroww Voir le message
    j'ai créé un "define" qui sert de mémoire temporaire pour être sûr de ne pas perdre des valeur saisies si j'ai bien compris.
    #define est une directive destinée au préprocesseur. Tu vois la fonctionnalité rechercher et remplacer de ton éditeur de texte ? Ben à peu de choses près c'est aussi con que ça : en aucun cas cette ligne ne va te réserver un espace mémoire ou avoir une quelconque incidence sur le séquencement de ton programme.

    Ce que fait cette directive, c'est simplement enregistrer un symbole buffer dont le préprocesseur remplacera toutes les occurrences ultérieures par 100. Ce qui crée ton buffer de 100 octets, c'est la déclaration : char string_prenom[buffer]; .


    Citation Envoyé par Zeroww Voir le message
    j'ai ustilisé la fonction strlen aussi, qui doit correspondre à string lenght.
    Oui mais tu ne dois pas le supposer d'après le nom de la fonction, tu dois lire et bien comprendre la doc.


    Citation Envoyé par Zeroww Voir le message
    Problème, j'ai une erreur au niveau du else, il me dit " error: 'else' without a previous 'if', je comprends ce que ça veut dire pourtant les crochets m'ont l'air correct ? Je comprends pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (strlen(string_prenom) < 20);
    {
        printf("Votre saisie est trop grande, le prenom est limite a 20 caracteres, bien vouloir saisir un prenom correct");
    }
    else
    {
        printf("Votre prenom %s est bien pris en compte.\n", string_prenom);
    }
    Lis et relis bien ce bloc, l'erreur doit finir par te sauter aux yeux.


    Citation Envoyé par Zeroww Voir le message
    En fait, mon but c'est que ce soit impossible de passer à l'étape d'après tant que l'utilisateur ne remplis pas correctement un prénom de 20 charactères max et là ce n'est pas le cas.
    Est-ce qu'il faut que j'intègre une boucle do ... while avec dans le while la condition booléenne que ce soit bien un string ET que ce soit maximum 20 carac ?

    Aussi, j'ai bêtement rajouté return 0 si la booleenne est NULL, ça veut dire que le programme se termine si l'utilisateur ne rentre rien non ? Autant l'enlever si c'est le cas c'est pas ça que je veux
    Vas-y par étapes. Assure-toi d'avoir bien compris le fonctionnement d'un programme simple avant d'en complexifier la logique. Avant de penser à mettre une boucle, commence par saisir une ligne de l'utilisateur puis par l'afficher, pourquoi pas en s'en servant d'entrée pour tester le fonctionnement de quelques fonctions de traitement de chaînes issues de la bibliothèque standard ?


    Citation Envoyé par Zeroww Voir le message
    PS: J'arrive pas à faire apparaître mon code en mode editeur sur le forum, je pensais que c'était automatique ?
    Non, il te faut encadrer le code de balises [code].


    Pense à compiler et lier en activant les avertissements (warnings). En ligne de commande pour GCC/MinGW c'est -pedantic -Wall -Wextra. Code::Blocks te donne probablement le moyen quelque part d'activer ces options ou de compléter la ligne d'invocation.

Discussions similaires

  1. Comment créer un exe à partir des codes source
    Par daniel50171 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 20/08/2007, 20h49
  2. Réponses: 8
    Dernier message: 28/06/2007, 16h19

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