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;
}
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.
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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 ?
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 ; 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
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
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
ben oui , ce sont vraiment des fautes d'inattention .
#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
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
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.
C OK ;-)
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
C OK ;-)
C OK ;-)
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
C OK ;-)