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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
 
#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 : 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
 
 
#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