Bonjour,

Je suis un étudiant L1 en ingénieurat informatique, et on a il y'a 1 mois commencé à programmer en C. Récemment, on nous a donné un programme à faire, qui est le suivant :

Nom : im.png
Affichages : 771
Taille : 73,1 Ko
(excusez la taille de l'image j'ai pas pu la diminuer)

J'ai fait l'énoncé 1, 2 et 3 parfaitement

Seul bémol, je suis bloqué à l'affichage du 3. En effet, voici un exemple :

Nom : baisc.png
Affichages : 947
Taille : 58,2 Ko

Comme vous voyez, le programme m'affiche bel et bien les deux dates les plus petites de chacun des clients , mais n'affiche pas TOUTES les dates. Exemple : le client 1 met 4 voyages : il rempli 4 destinations différentes avec 4 dates différentes. Le client 2 fait de même. Le programme lorsqu'on saisira l'option 3 pour le tri, affichera uniquement les valeurs les plus petites. Je veux pourtant afficher TOUTES les dates par ordre décroissant, de la plus petite à la plus grande.

Voici mon code :
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <stdio.h>
#include <stdlib.h> // inutile je crois dans le code mais on sait jamais
 
// définition de deux structures : l'une (ensb) pour les détails du voyage, l'autre (client) pour les informations privées du client
 
typedef struct{
        char destination[20];
        int jour;
        int mois;
        int annee;
    }ensb;
 
typedef struct{
        int id;
        char nom[20];
        char prenom[20];
        int nbv;
        ensb voy[50]; // détails du voyage
    }client;
 
void main()
{
    int choix,i=0,N=0,j,f,min,posmin=0,k;
    client C[150]; // tableau 'C' qui fait directement référence à la structure 'client' et qui contient ses champs
    ensb B[150]; // de même, sauf que le tableau s'appelle B et prend les champs de la structure 'ensb'
    ensb aux;
 
    do{
 
    do{
        printf("\nGestion de voyage : Menu\n");
        printf("1. Remplir un tableau de N clients\n");
        printf("2. Afficher le tableau des clients\n");
        printf("3. Trier les voyages des clients selon l'ordre decroissant de la date\n");
        printf("4. Afficher le voyageur le plus fidele\n");
        printf("5. Afficher la destination la plus demandee pour un voyageur sachant son identifiant\n");
        printf("6. Afficher le mois de l’annee avec le plus grand nombre de reservations\n");
        printf("0. Quitter\n");
        printf("\n");
        printf("R: ");
        scanf("%d",&choix);
    }while(choix <0||choix>6); //contrôle de saisie
 
    if(choix==1){
        printf("Quel est le nombre N de clients a remplir ? : ");
        scanf("%d",&f);
 
        for(i=0;i<f;i++){
            printf("Quel est l'identifiant du client ?\n");
            fflush(stdin);
            scanf("%d",&C[i].id);
            printf("Quel est le nom du client ?\n");
            fflush(stdin);
            scanf("%s",&C[i].nom);
            printf("Quel est le prenom du client  ?\n");
            fflush(stdin);
            scanf("%s",&C[i].prenom);
            printf("Quel est le nombre de voyages du client ?\n");
            scanf("%d",&C[i].nbv);
 
                for(j=0;j<C[i].nbv;j++){ //remplissage en fonction du nombre que le client aura donné (nbv)
                    printf("Destination : ");
                    fflush(stdin);
                    gets(C[i].voy[j].destination);
                    printf("Date (forme JJ:MM:AAAA) : ");
                    fflush(stdin);
                    scanf("%d:%d:%d",&C[i].voy[j].jour,&C[i].voy[j].mois,&C[i].voy[j].annee);} // il est important de noter que la forme %d:%d:%d est plus pratique pour l'utilisateur dans notre cas
                        }
                }
 
    else if(choix==2){
            printf("\nAffichage du tableau des clients\n");
            for(i=0;i<f;i++){ // le 'f' pour rappel est le nombre N de clients à remplir
                printf("\n");
                printf("ID : %d | Nom : %s | Prenom : %s | Nombre de voyages : %d\n",C[i].id,C[i].nom,C[i].prenom,C[i].nbv);
               for(j=0;j<C[i].nbv;j++){
                    printf("\n");
                    printf("Destination : %s. Date de la destination : %d:%d:%d\n",C[i].voy[j].destination,C[i].voy[j].jour,C[i].voy[j].mois,C[i].voy[j].annee);}}
                    }
 
    else if(choix==3)
    {
        printf("Classement des destinations par ordre decroissant\n");
        for(i=0;i<f;i++)
        {
            for(j=0;j<C[i].nbv;j++) // on entre dans les boucles des deux structures
                {
                    posmin=j; //posmin prend la première case du tableau
                    for(k=j+1;k<C[i].nbv;k++) // nouveau compteur k qui prend la première case du tableau + 1 (j+1)
                        {
                            if((C[i].voy[k].annee < C[i].voy[posmin].annee) || (C[i].voy[k].annee == C[i].voy[posmin].annee && C[i].voy[k].mois < C[i].voy[posmin].mois) || (C[i].voy[k].annee == C[i].voy[posmin].annee && C[i].voy[k].mois == C[i].voy[posmin].mois && C[i].voy[k].jour < C[i].voy[posmin].jour))
                            { //toutes les possibilités pour vérifier le min, exemple : si l'année X est inférieur à l'année Y...
                                posmin=k; //quand une de ces conditions est trouvée, posmin prend la valeur k (la valeur validée par le if)
                            }
                        }
                    aux=C[i].voy[k]; //aux qu'on a déclaré au début avec la structure ensb (ensb aux) prend les champs voy[k]
                    C[i].voy[k] = C[i].voy[posmin]; // voy[k] prend la valeur de posmin
                    C[i].voy[posmin] = aux;  //posmin prend à son tour la valeur de aux
 
                }
                // on affiche ensuite
                    printf("\n");
                    printf("\nDate de la destination : %d %d %d\n ",C[i].voy[posmin].jour,C[i].voy[posmin].mois,C[i].voy[posmin].annee);
        }
    }
 
    }while(choix!=0); // on répète le menu tant que le choix n'est pas égal à 0
}
J'ai essayé absolument toutes les possibilités, comme le fait de refaire une boucle pour re-afficher les valeurs mais c'est la même chose. J'ai aussi afficher les autres valeurs (autre que posmin) comme par exemple de cette façon :

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
 
        for(i=0;i<f;i++)
        {
            for(j=0;j<C[i].nbv;j++) 
                {
                    posmin=j; 
                    for(k=j+1;k<C[i].nbv;k++) 
                        {
                            if((C[i].voy[k].annee < C[i].voy[posmin].annee) || (C[i].voy[k].annee == C[i].voy[posmin].annee && C[i].voy[k].mois < C[i].voy[posmin].mois) || (C[i].voy[k].annee == C[i].voy[posmin].annee && C[i].voy[k].mois == C[i].voy[posmin].mois && C[i].voy[k].jour < C[i].voy[posmin].jour))
                            { 
                                posmin=k;
                            }
                        }
                    aux=C[i].voy[k]; 
                    C[i].voy[k] = C[i].voy[posmin];
                    C[i].voy[posmin] = aux; 
 
                }
                // on affiche ensuite
                    printf("\n");
                    printf("\nDate de la destination : %d %d %d\n",C[i].voy[posmin].jour,C[i].voy[posmin].mois,C[i].voy[posmin].annee);
                    printf("Autre valeur : %d %d %d\n",C[i].voy[j].jour,C[i].voy[j].mois,C[i].voy[j].annee);
        }
    }
mais ça donne ça :

Nom : wqa.png
Affichages : 711
Taille : 58,1 Ko

Ca ne montre pas toutes les valeurs, et ça met des [0] [0] [0] quelques fois, quelques fois non.

Ca fait 2 jours que je bosse dessus, et je suis bloqué. Quelqu'un peut m'éclaircir ou me corriger ?

Merci