Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programmation procédurale

Correction d’exercices sur les structures

Sujet résolu
    5 mars 2022 à 18:07:47

    bonjour , je vous post les exercices numéro 3 et 4 du chapitre sur les structures , est il possible d’avoir un avis avant que je passe aux corrections 

    Exercice 3 : un programme qui affiche quatre flocons de neige de la fenêtre de la console , chaque flocons est une lettre, définir une structure de données permettant de coder chaque flocons. Déclarer quatre flocons , initialiser un flocon à la déclaration et un autre avec des valeurs aléatoires, copier chaque flocons et afficher les valeurs des quatre flocons de façon claire.

    Exercice 4 : le monde ou se trouve le player est parcouru par des ennemis. Donner les caractéristiques essentiel d'un ennemi à imaginer et la structure la mieux adaptée. Initialiser un ennemi à la déclaration et un autre avec des valeurs aléatoires. Afficher les valeurs de cet ennemi. Faire un clone.

    Merci.:)

    exo 3 :

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define LARGEUR_FENETRE 640
    #define ROUGE 256
    #define JAUNE 256
    #define VERT 256
    #define A 65
    #define Z 90
    typedef struct coord{
       int x, y;
    }t_coord;
    typedef struct rgb{
       int r, g, b;
    }t_rgb;
    typedef struct donnee{
        unsigned char lettre;
        t_coord pos;
        t_rgb color;
    }t_donnee;
    
    
    int main(void)
    {
       srand((unsigned)time(NULL));
       /*initialisation*/
       t_donnee flocon[4] = { {'A', {50, 0}, { 10, 20 , 3} } ,
                              {(rand()%(A-Z)+A), {rand()%LARGEUR_FENETRE},{rand()%ROUGE, rand()%JAUNE, rand()%VERT} } };
       /*copie des structure*/
       flocon[3] = flocon[1];
       flocon[2] = flocon[0];
       /*affichage des structure*/
       for(int i = 0 ; i < 4 ; i++)
       {
           printf("flocon %d de letrre : %c a comme position x : %d et y : %d et de couleur bleu: %d, vert: %d et rouge: %d\n",
                  i+1 , flocon[i].lettre, flocon[i].pos.x, flocon[i].pos.y, flocon[i].color.r, flocon[i].color.g, flocon[i].color.b);
       }
       return 0;
    
    }
    

    exo 4 :

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define LARGEUR_FENETRE 640
    #define HAUTEUR_FENETRE 480
    #define NOMBRE_VIES 100
    #define FORCE 100
    #define VITESSE 50
    /*defintion des structures*/
    typedef struct coord {
       int x, y;
    }t_coord;
     typedef struct profil{
       int nb_vie, force, vitesse;
       t_coord h, l;
    }t_profil;
    int main()
    {
       srand((unsigned)time(NULL));
       t_profil ennemi[3] = { {30, 60, 80, {500, 200}},
                              rand()%NOMBRE_VIES, rand()%FORCE, rand()%VITESSE, {rand()%LARGEUR_FENETRE, rand()%HAUTEUR_FENETRE} };
       printf("ennemi %d a : %d en vie, %d en force %d en vitesse et sa position est %d pour largeur et %d pour hauteur\n",2,ennemi[1].nb_vie,ennemi[1].force,
                                                                                                                             ennemi[1].vitesse,
                                                                                                                             ennemi[1].h,ennemi[1].l);
      /*clone du dernier ennemi*/
       ennemi[2] = ennemi[1];
       return 0;
    }
    




    -
    Edité par COUZ-1 5 mars 2022 à 21:55:40

    • Partager sur Facebook
    • Partager sur Twitter

    C OK ;-)

      5 mars 2022 à 20:51:07

      Bonjour, Merci d'indiquer un titre de sujet en rapport avec votre problématique. Quel est votre question? Quelle est la description de votre problème?

      Mauvais titre

      Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

      Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

      De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

      Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

      Pour modifier votre titre, éditez le premier message de votre sujet.

      (titre originel : exercice 3 et 4)

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        5 mars 2022 à 22:41:15

        Hello,

        co3.c: In function 'main':
        co3.c:28:27: warning: missing initializer for field 'y' of 't_coord {aka struct coord}' [-Wmissing-field-initializers]
                                   {(rand()%(A-Z)+A), {rand()%LARGEUR_FENETRE},{rand()%ROUGE, rand()%JAUNE, rand()%VERT} } };
                                   ^
        co3.c:11:11: note: 'y' declared here
            int x, y;
                   ^
        
        co4.c: In function 'main':
        co4.c:20:4: warning: missing initializer for field 'l' of 't_profil {aka struct profil}' [-Wmissing-field-initializers]
            t_profil ennemi[3] = { {30, 60, 80, {500, 200}},
            ^~~~~~~~
        co4.c:15:15: note: 'l' declared here
            t_coord h, l;
                       ^
        co4.c:21:77: warning: missing braces around initializer [-Wmissing-braces]
                                   rand()%NOMBRE_VIES, rand()%FORCE, rand()%VITESSE, {rand()%LARGEUR_FENETRE, rand()%HAUTEUR_FENETRE} };
                                                                                     ^
        co4.c:21:77: note: (near initialization for 'ennemi[1].h')
        co4.c:21:27: warning: missing initializer for field 'l' of 't_profil {aka struct profil}' [-Wmissing-field-initializers]
                                   rand()%NOMBRE_VIES, rand()%FORCE, rand()%VITESSE, {rand()%LARGEUR_FENETRE, rand()%HAUTEUR_FENETRE} };
                                   ^~~~
        co4.c:15:15: note: 'l' declared here
            t_coord h, l;
                       ^
        co4.c:20:25: warning: missing braces around initializer [-Wmissing-braces]
            t_profil ennemi[3] = { {30, 60, 80, {500, 200}},
                                 ^
        co4.c:20:25: note: (near initialization for 'ennemi')
        

        En plus, dans le printf() ligne 22, tu tentes d'afficher une structure avec un format %d.... ça va pas le faire.

        Ne testes-tu pas tes programmes avant de poser tes questionss  sur le forum ?

        -
        Edité par edgarjacobs 5 mars 2022 à 22:42:37

        • 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

          6 mars 2022 à 13:27:31

          bonjour edgarjacobs , 

          Si , tous mes programmes sont testés avant d'être postés sur le forum et d'après moi ils répondent bien aux exercices c'est pour cette raison que je vous les poste ,pourquoi,  y 'a t'il quelque chose qui ne va pas ?:euh:

          si je comprends bien pour l'affichage : comme c'est une variable de type personnalisée je ne peut donc pas utiliser un code de format de type int pourtant les champs de ma structure  sont bien de type int , je viens de revoir les exercices précédent et pour afficher j'utilise aussi un code de format de type int :o ; est-ce les expressions " ennemi[1].vitesse " , par exemple, qui sont fausses...???

          je viens de recompiler mon code et j'ai bien les fameux message d'erreur pour l'initialisation est l'affichage , désolé de ne pas avoir prit en compte ces messages

          je suis parti sur des constantes de préprocesseur pour délimiter des bornes pour pouvoir générer des valeurs aléatoires

          je viens de revoir mon code :

           t_profil ennemi[3] = { {30, 60, 80, {500, 200}},
                                    {rand()%NOMBRE_VIES, rand()%FORCE, rand()%VITESSE, {rand()%LARGEUR_FENETRE, rand()%HAUTEUR_FENETRE} } };
          
             for(int i = 1 ; i < 2 ; i++)
                 printf("ennemi %d a : %d en vie, %d en force %d en vitesse et sa position est %d pour largeur et %d pour hauteur\n",i,ennemi[i].nb_vie,ennemi[i].force,
                                                                                                                                   ennemi[i].vitesse,
                                                                                                                                   ennemi[i].h,ennemi[i].l);


          je pense avoir compris pourquoi l'erreur commise pour afficher une structure avec un format %d :

          dans mon code j'utilise une valeur constante "ennemi[1].nb_vie pour lire ma structure ; le code format %d ne peut pas transcoder cette valeur constante

          -
          Edité par COUZ-1 6 mars 2022 à 15:02:38

          • Partager sur Facebook
          • Partager sur Twitter

          C OK ;-)

            6 mars 2022 à 13:35:16

            COUZ-1 a écrit:

            Si , tous mes programmes sont testés avant d'être postés sur le forum , pourquoi,  y 'a t'il quelque chose qui ne va pas ?

            Tester, c'est bien, mais la première chose à faire avant, c'est de tenir compte des warnings lors de la compilation.

            par exemple dans ton premier code, il te dit que tu n'as pas initialisé le champ pos.y de flocon[1]

            -
            Edité par rouIoude 6 mars 2022 à 13:41:26

            • Partager sur Facebook
            • Partager sur Twitter
            ...
              6 mars 2022 à 14:02:07

              Bonjour rouloude, 

              je viens de  recompiler mon code pour le premier exercice et je n'ai pas de message d'erreur, et si je peut me permette je viens de revoir le chapitre sur l'initialisation d'une structure a la déclaration et dans leur exemple certain champs ne sont pas initialisé a la déclaration est sont automatiquement mis a 0 .

              exemple dans l'ouvrage de Frédéric Drouillon :

              struct time {
              
                 int jour, mois, annee;
              
              }
              
              struct time{
              
                int heure, minute, seconde;
              
              }
              
              struct moment{
              
                struct date date;
              
                struct time time;
              
              };
              
              dans le main :
              
               struct moment m = { {1}, {3, 4} };



              ok je viens de voir l'erreur pour la déclaration avec des valeurs aléatoires , doit-on l'initialiser quand même , même si pos.y vaut 0?

              je viens de recompiler pour le quatrième exercices et la , j'ai bien des message d'erreurs , désolé de ne pas avoir pris en compte ces messages : je suis parti sur des constantes de préprocesseur pour délimiter des bornes et pouvoir générer des valeurs aléatoires

              -
              Edité par COUZ-1 6 mars 2022 à 14:20:53

              • Partager sur Facebook
              • Partager sur Twitter

              C OK ;-)

                6 mars 2022 à 15:51:23

                Tu tentes d'afficher ennemi[1].h (.l) avec le format %d, mais h et l sont du type t_coord, pas int.

                C'est ennemi[1].h.x et ennemi[1].h.y que tu dois afficher (et fatalement ennemi[1].l.x et ennemi[1].l.y).

                Quant aux warnings, tu peux (presque) les ignorer si tu es sur de ce que tu fais en n'initialisant pas tous les champs (ils sont de fait mis à zéro, '\0' ou NULL suivant le cas). Mais je corrigerais au moins celles qui indiquent "missing brace"

                Edit: je compile avec gcc et les flags -Wall -Wextra -Wunused -Wsign-conversion (et -Wswitch-default, mais ça c'est un vieux réflexe)

                -
                Edité par edgarjacobs 6 mars 2022 à 16:56:54

                • 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

                  7 mars 2022 à 6:31:44

                  bonjour edgarjacobs

                  ben oui , ce sont vraiment des fautes d'inattention:colere: .

                  #define NOMBRE_VIES 100
                  #define FORCE 100
                  #define VITESSE 50
                  /*defintion des structures*/
                  typedef struct coord {
                     int x, y;
                  }t_coord;
                   typedef struct profil{
                     int nb_vie, force, vitesse;
                     t_coord h, l;
                  }t_profil;
                  int main()
                  {
                     srand((unsigned)time(NULL));
                     t_profil ennemi[3] = { {30, 60, 80, {500, 200}},
                                            {rand()%NOMBRE_VIES, rand()%FORCE, rand()%VITESSE, {rand()%LARGEUR_FENETRE, rand()%HAUTEUR_FENETRE} } };
                  
                     for(int i = 1 ; i < 2 ; i++)
                         printf("ennemi %d a : %d en vie, %d en force %d en vitesse et sa position est %d pour largeur et %d pour hauteur\n",i,ennemi[i].nb_vie,ennemi[i].force,
                                                                                                                                           ennemi[i].vitesse,
                                                                                                                                           ennemi[i].h.y,ennemi[i].l.x);
                    /*clone du dernier ennemi*/
                     ennemi[2] = ennemi[1];
                     return 0;

                  je compile et recompile et je n'ai plus de messages d'erreurs et  la compilation s'effectue en millième de seconde , c'est plutôt bon signe :)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  C OK ;-)

                    7 mars 2022 à 7:15:26

                      Il ne faut pas se faire d'illusion, quand on programme, on fait des dizaines de "fautes d'inattention" par jour. C'est le boulot qui est comme ça.

                    Faire des progrès, c'est accepter cette réalité comme elle est, et décider d'en tenir compte.

                    • On admet qu'on fera des erreurs,  et que c'est normal. Faut pas prendre ça personnellement, on s'énerve pas.
                    • On décide de s'organiser en conséquence
                    • On met le compilateur de son côté en lui demandant de nous fournir toutes les indications (warnings) sur les trucs qu'il trouve louche
                    • On ne cherche pas à faire le malin avec des trucs tordus. Il faudra remettre le nez dedans pour y chercher des erreurs
                    • On découpe bien en fonctions pour simplifier
                    • On nomme bien les variables
                    • Etc...

                    Dans la structure, si les membres h et l désignent hauteur et largeur, autant les appeler comme ça. Si ca désigne autre chose, mets le nom qui va bien.

                    Pour le tableau, tu vis dangereusement en utlisant des données non initialisées.

                    -
                    Edité par michelbillaud 7 mars 2022 à 7:24:25

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Programmation procédurale

                    × 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