Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice du cours, problème

(Partie 2, Chapitre 6)

Sujet résolu
    21 juin 2019 à 1:40:46

    Bonjour à tous, je suis actuellement entrain de faire un exercice sur le chapitre "créez vos propres types de variables".

    Voici l'énoncé : créez ce tableau de typePersonneet demandez les infos de chacun grâce à une boucle (qui se répète tant qu'il y a des joueurs). Faites un petit tableau de 2 joueurs pour commencer, mais si ça vous amuse, vous pourrez agrandir la taille du tableau plus tard.

    Affichez à la fin du programme les infos que vous avez recueillies sur chacun des joueurs.

    (lien pour en savoir plus : https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/16119-creez-vos-propres-types-de-variables (l'énoncé est dans la partie 2 du chapitre)

    Dans un projet, j'ai le fichier main.c et main.h voici leur programmes : 

    #include <stdio.h>
    #include <stdlib.h>
    #include "main.h"
    
    
    
    int main(int argc, char *argv[])
    {
        int i = 0, k = 0;
        Personne joueur[2];
    
    
        for(k = 0 ; k < 2 ; k++)
        {
            printf("Joueur %d, Quel est votre nom ?\n", k+1);
            scanf("%d", joueur[k].nom);
        }
        for(k = 0 ; k < 2 ; k++)
        {
            printf("Joueur %d, Quel est votre prenom ?\n", k+1);
            scanf("%d", joueur[k].prenom);
        }
        for(k = 0 ; k < 2 ; k++)
        {
            printf("Joueur %d, Quel est votre adresse ?\n", k+1);
            scanf("%d", joueur[k].adresse);
        }
        printf("\n\n");
        for(i = 0 ; i < 2 ; i++)
        {
    
        printf("Joueur %d, Bonjour %d %d, vous vivez a %d\n",i+1, joueur[i].nom, joueur[i].prenom, joueur[i].adresse);
        }
        return 0;
    }
    
    typedef struct info Personne;
    struct info
    {
        int nom;
        int prenom;
        int adresse;
    };
    

    Voici le screen de la console, 

    Je cite donc le problème : Un fois que j'ai compilé et exécuté, on me demande donc le nom du joueur 1, une fois le nom tapé, tous les autres questions apparaissent (comme si les lignes contenant de "scanf" ne fonctionnaient pas). Et dans les deux dernière phrases, comment devrais-je faire pour éviter que cela affiche les adresses ? (si c'est bien les adresses, j'ai essayé avec le & et * mais sans résultat)


    Merci beaucoup pour vos futurs aides !

    (Je ne suis qu'un débutant qui suit les cours de classrooms donc pas la peine de m'engueuler ou peu importe :()

    • Partager sur Facebook
    • Partager sur Twitter
      21 juin 2019 à 4:03:29

      Une chaîne de caractères, ça se lit avec le format %s, avec  un  s comme string.
      • Partager sur Facebook
      • Partager sur Twitter
        21 juin 2019 à 4:04:05

        Des entiers pour stocker le nom et le prénom,  c'est peut-être un peu juste.
        • Partager sur Facebook
        • Partager sur Twitter
          21 juin 2019 à 12:19:29

          Salut,

          On est tous passés par la case débutant :)

          Des remarques sur ton code, en plus des remarques de michelbillaud et rouloude :

          • pourquoi avoir créé un "main.h" ? L'intérêt d'avoir un .h est de communiquer à ceux qui veulent utiliser le "sous-module" comment on l'utilise. Par exemple, si tu veux découper ton programme en 3 "sous-modules", le .h va être là pour que en tant que programmeur tu aies juste à lire ce qu'il y a dans le .h sans avoir à lire le .c. Pour un main.c ça a très peu d'intérêt d'avoir un main.h, puisque aucun module ne va utiliser ton main (c'est au contraire ton main qui va utiliser les autres modules)

            Tu peux en fait déplacer ta définition de structure directement dans le main.c
          • Fais attention à bien indenter - la ligne 32 manque une tabulation. ça parait rien comme ça, mais si tu t'habitues à ne pas bien indenter, après tu vas te retrouver avec des codes difficiles à lire quand tu feras des programmes de plus de 100 lignes

          Des explications en plus sur les remarques de mes co-utilisateurs du forum :

          michelbillaud a écrit:

          Une chaîne de caractères, ça se lit avec le format %s, avec  un  s comme string.

          On peut retrouver la liste de ces formats sur http://www.cplusplus.com/reference/cstdio/scanf/ quand on ne s'en souvient plus.

          Les principaux à retenir : %d pour un entier de type int, %s pour une chaine de caractères, %ld pour un entier de type long, %f pour un float, %lf pour un double

          Pour chacun de ces formats il faut préciser un pointeur vers la valeur à modifier. Sauf dans le cas %s : parce qu'une chaine de caractères est déjà un pointeur ! ;)

          rouloude a écrit:

          Des entiers pour stocker le nom et le prénom,  c'est peut-être un peu juste.

          Pour stocker une chaine de caractères dans une structure, il faut y mettre un tableau de char. Sinon, un int, ça va te faire juste une case de 4 octets..
          • Partager sur Facebook
          • Partager sur Twitter
            21 juin 2019 à 15:23:16

            D'accord, merci beaucoup pour vos réponses,

            j'avais crée le fichier .h pour mettre le struct car c'etait marqué dans les cours qu'on mettait souvent le struct dans le fichier .h

            Je dois vraiment deplacer le struct dans le fichier .c ?

            Je dois remplacer %d par %s mais dans quels lignes ? (ou précisement ?) Car j'en avais essayé d'en remplacer et d'autres non, cela n'a rien donné

            (Sinon vous pouvez m'envoyer la correction pour que je puisse reconnaître mes erreurs ? Merci !)

            -
            Edité par DemonForce 21 juin 2019 à 15:25:27

            • Partager sur Facebook
            • Partager sur Twitter
              21 juin 2019 à 17:46:38

              DemonForce a écrit:

              1. j'avais crée le fichier .h pour mettre le struct car c'etait marqué dans les cours qu'on mettait souvent le struct dans le fichier .h

              2. (Sinon vous pouvez m'envoyer la correction pour que je puisse reconnaître mes erreurs ? Merci !)

              -
              Edité par DemonForce il y a environ 1 heure


              1. Souvent ne veut pas dire toujours, et il ne faut pas forcément faire tout ce que disent les cours.

              Si le cours ne t'explique pas POURQUOI on fait telle ou telle chose, c'est un mauvais cours. (*)

              2. Ca serait une mauvaise idée. Si on te donne une correction, tu te diras "ah oui mais bien sûr c'est évident", surtout si c'est une belle correction bien travaillée. Mais tu n'auras rien appris. C'est comme jouer d'un instrument de musique. Quelqu'un peut  jouer un morceau devant toi, ça aura l'air facile. Mais tu ne sauras rien faire.

              (*) on déclare les structures (**) dans un fichier d'entete (.h) quand on veut que cette déclaration soit partagée par plusieurs fichiers sources. Tout bêtement pour éviter de recopier du code pour redéfinir la même chose. Est-ce le cas ici ? Très probablement non.

               (**) les structures ou autre chose, pour les mêmes raisons.

              -
              Edité par michelbillaud 21 juin 2019 à 17:50:08

              • Partager sur Facebook
              • Partager sur Twitter
                21 juin 2019 à 19:12:38

                La réponse à ta question se trouve dans le chapitre "Les chaînes de caractères"

                https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/15765-les-chaines-de-caracteres

                Tu verras également pourquoi les types de ta structure ne sont pas adaptés.

                • Partager sur Facebook
                • Partager sur Twitter
                  21 juin 2019 à 22:56:45

                  potterman28wxcv a écrit:

                  La réponse à ta question se trouve dans le chapitre "Les chaînes de caractères"

                  https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/15765-les-chaines-de-caracteres

                  Tu verras également pourquoi les types de ta structure ne sont pas adaptés.


                  Sujet résolu, merci à toi !
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Exercice du cours, problème

                  × 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