IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème d'affichage de structures


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Problème d'affichage de structures
    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 : 595
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 : 696
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 : 555
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

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai résolu le problème. Je n'avais pas utilisé le bon compteur lors de la permutation. Une seconde erreur se trouverait jusqu'à la boucle également.

    Merci quand même.

    Bonne soirée

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Grandstone Voir le message
    (excusez la taille de l'image j'ai pas pu la diminuer)
    Suffit de la retailler avec n'importe quel éditeur d'image. Même le bête "paint" de zindow sait le faire. Pas besoin d'être ingénieur en informatique quoi...

    Citation Envoyé par Grandstone Voir le message
    Voici mon code sur pastebin (pour une meilleure visibilité car trop long) : https://pastebin.com/BWRYNa9R
    On préfère l'avoir sur le forum ce qui permet le copier/coller. Surtout que 108 lignes c'est pas extraordinaire. Mais bon, puisqu'il est sur pastebin...

    Donc les critiques
    1. main() n'est pas void
    2. on ne fflushe jamais stdin (UB)
    3. je ne vois pas trop l'utilité du tableau "B" (et en plus vu son nom...)
    4. indentation anarchique

    Et sinon décomposer les étapes en fonctions individuelles serait une optimisation intéressante. Une fonction qui permettrait par exemple de saisir un client, une autre qui permettrait de saisir une étape, une autre qui affiche le client, une autre qui affiche les étapes, une qui affiche le menu, etc. Puis on combine le tout comme on veut.

    Et pour ton tri, si tu as le droit d'utiliser qsort() alors c'est réglé.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour
    Suffit de la retailler avec n'importe quel éditeur d'image. Même le bête "paint" de zindow sait le faire. Pas besoin d'être ingénieur en informatique quoi...
    C'est pas 'retailler' mais redimensionner, car retailler revient à couper une partie de l'image tandis que la redimensionner est l'action de la rendre plus petite. Ensuite, à vrai-dire, j'avais la flemme de redimensionner chaque image, tant qu'elle est lisible c'est le principal.

    Citation Envoyé par Sve@r Voir le message
    On préfère l'avoir sur le forum ce qui permet le copier/coller. Surtout que 108 lignes c'est pas extraordinaire. Mais bon, puisqu'il est sur pastebin...
    J'ai vu sur d'autre forums que Pastebin est beaucoup utilisé, en plus la syntax highlighting de developpez.nez me plaît pas trop avec le fond bleu (que je trouve illisible, chacun ses goûts), alors j'ai préféré poster là-bas.

    Citation Envoyé par Sve@r Voir le message
    Donc les critiques [*]main() n'est pas void[*]on ne fflushe jamais stdin (UB)[*]je ne vois pas trop l'utilité du tableau "B" (et en plus vu son nom...)[*]indentation anarchique
    Oui erreur de ma part, je voulais écrire mais je me suis trompé de forme.
    On m'a appris à fflush stdin mais je viens de m'apercevoir que c'est une très mauvaise pratique. Merci pour la remarque.
    Le tableau B ne sert effectivement à rien dans le code que j'ai envoyé, mais allait me servir dans les prochaines étapes (que j'avais déjà rédigé sur un brouillon).
    Enfin, l'indentation est très mauvaise du fait que j'avais écris le code sur brouillon. De base, je suis la norme Allman pour l'indentation ou K&R mais vu que mon code est pas encore fini et que c'est juste un brouillon, je me soucie pas mal de l'indentation, même si je devrais commencer à prendre cette bonne habitude.

    Citation Envoyé par Sve@r Voir le message
    Et sinon décomposer les étapes en fonctions individuelles serait une optimisation intéressante. Une fonction qui permettrait par exemple de saisir un client, une autre qui permettrait de saisir une étape, une autre qui affiche le client, une autre qui affiche les étapes, une qui affiche le menu, etc. Puis on combine le tout comme on veut.
    Et pour ton tri, si tu as le droit d'utiliser qsort() alors c'est réglé.
    Remarque que j'avais pas précisé est qu'on est pas encore arrivé aux fonctions, donc j'ai préféré ne pas les utiliser jusqu'à ce qu'on y arrive en cours. Mais oui, ça serait plus propre et optimal d'utiliser les fonctions et de les appeler à chaque fois.

    Pour qsort, je connaissais pas.

    Merci de la réponse. Bonne soirée.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Grandstone Voir le message
    Enfin, l'indentation est très mauvaise du fait que j'avais écris le code sur brouillon. De base, je suis la norme Allman pour l'indentation ou K&R mais vu que mon code est pas encore fini et que c'est juste un brouillon, je me soucie pas mal de l'indentation, même si je devrais commencer à prendre cette bonne habitude.
    Ben oui. Ca ne sert pas qu'à rendre un code plus élégant, ça sert aussi à organiser sa propre logique. Si par exemple un "else" n'est pas au niveau du "then" du dessus c'est que t'as (par exemple) raté un truc dans la boucle du dessus...

    Citation Envoyé par Grandstone Voir le message
    Remarque que j'avais pas précisé est qu'on est pas encore arrivé aux fonctions, donc j'ai préféré ne pas les utiliser jusqu'à ce qu'on y arrive en cours. Mais oui, ça serait plus propre et optimal d'utiliser les fonctions et de les appeler à chaque fois.
    Sans déconner quoi, on te donne un truc aussi complexe sans t'avoir enseigné les fonctions tout en t'ayant quand-même dit que "main()" est de type "int" ? C'est quoi ce cours de merde ?

    Citation Envoyé par Grandstone Voir le message
    Pour qsort, je connaissais pas.
    Ok c'est normal si tu débutes. C'est une fonction de la librairie standard qui permet de trier absolument n'importe quel tableau d'absolument n'importe quel type d'items (même des items créés par toi)... mais à condition évidemment que tu lui indiques comment comparer deux items. Et cette indication se fait par le biais de pointeur de fonction. Mais si tu n'as pas appris les fonctions et que tu n'as pas appris les pointeurs...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Ouais, je suis actuellement en train de m'entraîner à faire l'indentation K&R de manière automatique, que ce soit sur mes brouillons ou non.

    Pour les fonctions je comprends pas aussi, mais bon ils me répondent que 'on y va petit à petit'....
    Pour le main de type int, si j'écris int main(void) c'est correct ? Parce que j'ai vu que int main(int argc, char *argv[]) est 'l'affichage standard'. J'ai bien compris que la deuxième écriture comporte deux arguments en entrées, mais y a t-il vraiment une utilité d'utiliser la 1ère ou deuxième écriture ?

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Cela dépend il me semble si tu es sous Windows pour la première écriture ou sous Linux pour la deuxième.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Grandstone Voir le message
    J'ai bien compris que la deuxième écriture comporte deux arguments en entrées
    Ca te permet d'appeler ton programme en lui donnant ce qu'on nomme des "arguments" (des éléments de travail). C'est généralement plus parlant pour quelqu'un qui travaille sous Linux car il a déjà l'habitude de travailler en ligne de commandes (à l'inverse de zindow qui privilégie le "point and click").
    Exemple (donc en mode "lignes de commandes" ou mode "MsDos" sous zindow): quand tu appelles un programme style "rm" (Linux) ou "del" (zindow) tu ne l'appelles pas sans rien. Tu lui donnes en paramètre le fichier à effacer (ex rm toto ou del titi.doc).
    Ben argc et argv te permettent de programmer un exec qui lui aussi pourra récupérer et traiter les paramètres qu'on lui passe lors de son appel. int argc contient le nombre de paramètres et char *argv[] est un tableau où seront rangés chacun des paramètres (sous formes de chaines) passés au programme.
    Il existe en plus un 3° paramètre de main() nommé traditionnellement char *envp[] qui contient tout l'environnement de travail du programme (là encore la notion "d'environnement" bien qu'existante sous zindow est plus connue dans le monde Linux)

    Citation Envoyé par Grandstone Voir le message
    mais y a t-il vraiment une utilité d'utiliser la 1ère ou deuxième écriture ?
    Ce sont des variables donc c'est comme pour tout. Si tu t'en sers alors oui c'est utile mais si tu ne t'en sers pas alors...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2019
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Ah je comprends mieux maintenant parce qu'on a commencé à travailler il y'a peu sous Linux donc on fait tout par l'interface de commande (CLI) et je comprends mieux l'utilité de l'écriture argc et argv. Merci pour tes explications détaillées !

    Bonne journée et bonne continuation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'affichage avec les structures
    Par jlion5 dans le forum C
    Réponses: 1
    Dernier message: 03/05/2008, 13h13
  2. problème d'affichage suite a une structure
    Par clampin dans le forum Débuter
    Réponses: 4
    Dernier message: 26/12/2007, 18h00
  3. [PHP-JS] Problème affichage avec structure if
    Par kitty2006 dans le forum Langage
    Réponses: 31
    Dernier message: 07/09/2006, 18h01
  4. [structure et pointeur] problème d'affichage
    Par kitsune dans le forum C
    Réponses: 17
    Dernier message: 22/03/2006, 22h20
  5. [Virtual Pascal] [WinSock] Problème d'affichage structure SERVENT
    Par Alcatîz dans le forum Autres IDE
    Réponses: 2
    Dernier message: 12/07/2005, 22h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo