struct dans struct, remplir dans function
Bonjour,
dans le cadre de mes études (rien à voir avec la prog.), je suis un cours de programmation en C.
Je débute complètement, et je rencontre un souci avec un exercice, le but est de générer une sorte de base de donnée avec les ouvriers d'une entreprise.
Le sujet de l'exercice impose la création initiale d'une structure "ouvrier", et d'une sous-structure "date de naissance" dépendent d'ouvrier.
Je n'ai jamais travaillé avec des structures avant et mon cours est vraiment succin sur le sujet (il s'agit d'un cours à distance, sous forme de Power Point très succin)
J'ai déjà fait pas mal de recherche sur le net ou j'ai pu trouver beaucoup d'infos et d'exemples, mais les exemples de struct dans des structs sont très rares, et tout se passe dans la fonction "main", d'où mes questions.
Ci-dessous les infos concernant les déclarations des structures
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
typedef struct{
int jour;
int mois;
int annee;
} DateNais; // déclaration de la structure DateNais
typedef struct{
char nom[30];
char prenom[30];
DateNais Date;
} Ouvrier; // déclaration de la structure Ouvrier |
Dans une première question, l'objectif est de renseigner les infos d'un ouvrier, puis de les afficher à l'écran. J'ai donc le programme suivant*:
Code:
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
|
#include <stdio.h>
#include <stdlib.h>
//Déclaration de la structure
typedef struct{
int jour;
int mois;
int annee;
} DateNais; // déclaration de la structure DateNais
typedef struct{
char nom[30];
char prenom[30];
DateNais Date;
} Ouvrier; // déclaration de la structure Ouvrier
int main(void)
{
Ouvrier ouv1; //Création de l'ouvrier ouv1
/* Lire les détails de l'ouvrier*/
printf ("\nRenseigner les informations de l'ouvrier \n");
printf("Nom ?"); gets (ouv1.nom);
printf("Prenom ?"); gets (ouv1.prenom);
printf("Annee de naissance (jj:mm:aaaa) ?"); scanf("%d:%d:%d",&ouv1.Date.jour,&ouv1.Date.mois,&ouv1.Date.annee );
/*Ecrire les détails de l'ouvrier*/
printf ("\nLes informations sont: \n");
printf ("Nom : %s \n", ouv1.nom);
printf ("Prenom : %s \n", ouv1.prenom);
printf ("Date de naissance : %02d:%02d:%d \n",ouv1.Date.jour,ouv1.Date.mois,ouv1.Date.annee);
return 0;
} |
Cette partie du code fonctionne correctement selon moi.
Pour la seconde question, le but est d'aller plus loin en permettant au programme de renseigner plusieurs ouvriers, et de les afficher si souhaité.
La question ne me paraît pas difficile, mais je souhaite créer une fonction pour ajouter un ouvrier, et créer une autre fonction pour afficher les infos renseignée d'un ouvrier, en réutilisant les bouts de programmes affichés plus haut dans mon main.
Le souci est que je rencontre quelques soucis pour créer ces fonctions, en particulier pour la date de naissance, je ne sais pas comment accéder à la sous-structure "Date" dans la structure "ouvrier" depuis la fonction "lire"...
Code:
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
|
#include <stdio.h>
#include <stdlib.h>
//Déclaration de la structure
typedef struct datenais{
int jour;
int mois;
int annee;
} DateNais; // déclaration de la structure DateNais
typedef struct ouvrier{
char nom[30];
char prenom[30];
DateNais Date;
} Ouvrier; // déclaration de la structure Ouvrier
void lire (struct ouvrier *ouvX)
{
/* Lire les détails de l'ouvrier*/
printf ("\nRenseigner les informations de l'ouvrier \n");
printf("Nom ?"); scanf ("%s",ouvX->nom);
printf("Prenom ?"); scanf ("%s",ouvX->prenom);
printf("Annee de naissance (jj:mm:aaaa) ?"); scanf("%d:%d:%d", ouvX->Date.jour,ouvX->Date.mois,ouvX->Date.annee );
/*
printf ("\nLes informations sont: \n");
printf ("Nom : %s \n", ouvX->nom);
printf ("Prenom : %s \n", ouvX->prenom);
printf ("Date de naissance : %02d:%02d:%d \n",ouvX->Date.jour,ouvX->Date.mois,ouvX->Date.annee);
*/
}
int main(void)
{
Ouvrier ouv1; //Création de l'ouvrier ouv1
lire(&ouv1);
/*Ecrire les détails de l'ouvrier*/
printf ("\nLes informations sont: \n");
printf ("Nom : %s \n", ouv1.nom);
printf ("Prenom : %s \n", ouv1.prenom);
printf ("Date de naissance : %02d:%02d:%d \n",ouv1.Date.jour,ouv1.Date.mois,ouv1.Date.annee);
return 0;
} |
J'ai les questions suivantes*:
- D'une part, j'ai changé les gets en scanf pour renseigner le nom et le prénom, car je n'arrivais pas réutiliser gets dans la fonction. Ça fonctionne bien avec scanf, mais j'aimerais comprendre comment utiliser gets dans la fonction... comment faire ?
- Ensuite, je n'arrive pas à renseigner les infos de la sous-structure "Date", le programme se lance bien, mais j'ai un message d'erreur avant me disant que chaque scanf ("%d") est int *, mais que ouvX->Date. jour ou mois ou année est int. Et le programme plante quand je renseigne les dates...
Comment faire pour remplir correctement les dates dans les sous-structures ? ça doit encore être une histoire de pointeur.
- Et pour finir, je créé un ouvrier dans la fonction main, mais est-il possible de le faire dans la fonction lire ? (je ne pense pas, sinon l'ouvrier disparait de la mémoire à la fin de la fonction lire, mais je ne suis pas sur).
Merci d'avance pour votre aide,
Frédéric