Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programme plante à l'execution

Sujet résolu
    25 mars 2020 à 18:07:51

    Bonjour à tous, j'ai fait un programme où le but est utilisé une structure indexée pour modifier la structure PATIENTS.

    Je n'ai pas d'erreur à la compilation pourtant le programme s'arrete immédiatement à l'execution.

    Quelqu'un peut-il m'aider ?

    Voici le code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /*STRUCTURES*/
    
    struct DATE {
        int jour;
        int mois;
        int annee;
        };
    
    struct PATIENTS {
        char num_reg_nat[16] ;
        char nom [25] ;
        char prenom[15] ;
        struct DATE datenaissance ;
        char vipo ;
        char adresse [40] ;
        int code_postal ;
        char ville[15] ;
        char telephone[15] ;
        int flag;
        };
    
    struct INDEX {
        char num_reg_nat_IND[16] ;
        char nom_IND [25] ;
        int pos_IND;
        int flag_IND;
        };
    /* FONCTIONS parametres */
    
        void INIT (struct PATIENTS*,struct INDEX*, int*);/*vec + index* + n*/
        void TRI_INDEX (struct INDEX*, int*);/*index*/
        void RECHERCHE (struct PATIENTS*, struct INDEX*, int*);/*index + vec*/
        void AJOUT (struct PATIENTS*, int*);/* vec* + n*/
        void SUPPRESSION (struct PATIENTS*, struct INDEX*, int*);/*index + patients*/
        void AFFICHE (struct INDEX*, int*);/*index* + vec*/
    
    /*MAIN*/
    int main (void)
    {
        struct PATIENTS vec[50];
        struct INDEX index[50];
        short recom=1,reponse=0;
        int position=7;
    
        INIT (vec, index, &position);
        TRI_INDEX (index,&position);
    
        while (recom==1)
            {
                do
                    {
                        system ("cls");
                        printf ("\t====================\n");
                        printf ("\t MENU.\n");
                        printf ("\t====================\n\n");
                        printf ("\t1.\t Rechercher un patient\n");
                        printf ("\t2.\t Ajouter un patient\n");
                        printf ("\t3.\t Supprimer un patient\n");
                        printf ("\t4.\t Afficher tous les patients\n\n");
                        printf ("\t5.\t Quitter\n\n\n\n");
                        printf ("\t Votre choix : ");
    
                        scanf ("%hd", &reponse);
    
                    } while (reponse < 1 || reponse > 5);
    
    
                switch (reponse)
                {
                    case 1:
                        RECHERCHE (vec, index, &position);
                        break;
                    case 2:
                        AJOUT(vec, &position);
                        INIT (vec, index, &position);
                        TRI_INDEX (index, &position);
                        break;
                    case 3:
                        SUPPRESSION (vec, index, &position);
                        TRI_INDEX (index, &position);
                        break;
                    case 4:
                        TRI_INDEX (index, &position);
                        AFFICHE (index, &position);
                        break;
                    case 5:
                        break;
                }
                    printf ("Pour recommencer --> taper 1 : ");
                    scanf ("%hd", &recom);
            }
    }
    
    /*FONCTIONS*/
    
    void INIT (struct PATIENTS *pvec, struct INDEX *pindex,  int *n)
    {
        int i;
    
        for (i=0;i<(*n);i++)
        {
            strcpy(pindex->num_reg_nat_IND, pvec->num_reg_nat);
            fflush(stdin);
            strcpy(pindex->nom_IND, pvec->nom);
            fflush(stdin);
            pindex->pos_IND = i;
            pindex->flag_IND = 1;
    
            (*n)++;
            pvec++;
            pindex++;
        }
    }
    
    void TRI_INDEX (struct INDEX *pindex,int *n)
    {
        int i,tmp;
    
        for (i=0;i<*n;i++)
        {
            if(pindex->flag_IND == 1)
            {
                if(strcmp(pindex->nom_IND[i], pindex->nom_IND[i+1])>0)
                {
                    tmp = pindex->nom_IND[i];
                    pindex->nom_IND[i] =pindex->nom_IND[i+1];
                    pindex->nom_IND[i+1] = tmp;
                }
            }
            pindex++;
        }
    }
    
    void RECHERCHE (struct PATIENTS *pvec, struct INDEX *pindex, int *n)
    {
        int i;
        char cible[25];
    
        system ("cls");
        printf ("Quel est le nom du patient ? ");
        gets (cible);
        fflush (stdin);
    
        for(i=0;i<(*n);i++)
        {
            if(pindex->flag_IND == 1)
            {
                if (strcmp(cible, pindex->nom_IND)!=0)
                {
                    pvec = pindex->pos_IND;
                    printf ("====================\n");
                    printf ("Informations du patient.\n");
                    printf ("====================\n\n");
                    printf ("Numero de registre nationale : %s \n", pvec->num_reg_nat);
                    fflush(stdin);
                    printf ("Nom Prenom : %s %s \n", pvec->nom, pvec->prenom);
                    fflush(stdin);
                    printf ("Date de naissance : %d/%d/%d \n", pvec->datenaissance.jour, pvec->datenaissance.mois, pvec->datenaissance.annee);
                    fflush(stdin);
                    printf ("VIPO : %c \n", pvec->vipo);
                    fflush(stdin);
                    printf ("L'adresse complete est : %s %d %s \n", pvec->adresse, pvec->code_postal, pvec->ville);
                    fflush(stdin);
                    printf ("Le numero de telephon est : %s \n", pvec->telephone);
                    fflush(stdin);
                }
            }
            pindex++;
        }
    }
    
    void AJOUT (struct PATIENTS *pvec, int *n)
    {
        int tmp=0;
        char saisie[32];
    
        pvec=pvec+(*n);
        (*n)++;
    
        system ("cls");
        printf ("\t Ajout patient.\n");
        printf ("\t====================\n\n");
    
        do
        {
            printf ("Quel est son numero de registre national ? (format: xx.xx.xx-xxx.xx) ");
            fgets (saisie, sizeof saisie, stdin);
            tmp = sscanf (saisie, "%d/%d/%d",&(pvec->datenaissance.jour), &(pvec->datenaissance.mois), &(pvec->datenaissance.annee));
        }while (tmp != 1);
        tmp=0;
        strcpy(saisie,"");
    
        printf ("Quel est son nom ? ");
        gets (pvec->nom);
        printf ("Quel est son prenom ? ");
        gets (pvec->prenom);
    
        do
        {
            printf ("Quel est la date de naissance ? (format: jj/mm/aaaa) ");
            fgets (saisie, sizeof saisie, stdin);
            tmp = sscanf (saisie, "%d/%d/%d",&(pvec->datenaissance.jour), &(pvec->datenaissance.mois), &(pvec->datenaissance.annee));
        }while (tmp != 3);
    
        do
        {
            printf ("Quel est son VIPO ?(remplir O ou N) ");
            scanf ("%c",&(pvec->vipo));
        }while(pvec->vipo!='O' && pvec->vipo!='N');
    
        printf ("Quel est son adresse ? ");
        gets (pvec->adresse);
    
        do
        {
            printf ("Quel est son code postal ? (doit etre compris entre 1000 et 9999 ");
            scanf ("%d",&(pvec->code_postal));
        }while(pvec->code_postal<1000 || pvec->code_postal>9999);
    
    
        printf ("Quel est son numero de telephone ? ");
        gets(pvec->telephone);
    
    }
    
    void SUPPRESSION (struct PATIENTS *pvec, struct INDEX *pindex, int *n)
    {
        char supp[25];
        int i=0;
    
        system ("cls");
        printf ("Entrer le nom du patient a supprimer : \n");
        gets(supp);
    
        while (strcmp(pindex->nom_IND,supp)!=0 && i<*n)
            {
                pindex++;
                i++;
            }
    
        if (i==*n)
        {
             printf("Patient introuvable \n");
        }else
        {
            pindex->flag_IND = 0;
            pvec->flag = 0;
        }
    }
    
    void AFFICHE (struct INDEX *pindex, int *n)
    {
        int i;
    
        system ("cls");
        printf ("\t Liste des patients.\n");
        printf ("\t====================\n\n");
    
        for(i=0;i<(*n);i++)
        {
            if(pindex->flag_IND == 1)
            {
                printf("\t %s \n",pindex->nom_IND);
            }
            pindex++;
        }
    
    }



    -
    Edité par Shyrlock 25 mars 2020 à 20:49:17

    • Partager sur Facebook
    • Partager sur Twitter
      25 mars 2020 à 18:45:00

      Shyrlock a écrit:

      Je n'ai pas d'erreur à la compilation pourtant le programme s'arrete immédiatement à l'execution.


      Pas d'erreur de compilation mais un gros warning ligne 127 !

      Les warnings, faut en tenir compte !

      • Partager sur Facebook
      • Partager sur Twitter
        25 mars 2020 à 18:55:55

        Sans compter qu'un tri, avec une seule boucle....

        PS :

        - si DATE qui représente une date est au singulier, un patient est PATIENT, pas PATIENTS.

        - plutot que de trimballer un tableau de structures + un entier, mets les dans une structure qui contient les deux

        struct TABLEAU_PATIENTS {
            struct PATIENT tableau[25];
            int nb;
        }; 

        dont tu passeras l'adresse. Peut être y stocker aussi l'index (table des indices de patients, ordonnée par noms ?)

        -
        Edité par michelbillaud 25 mars 2020 à 18:59:41

        • Partager sur Facebook
        • Partager sur Twitter
          25 mars 2020 à 21:11:08

          J'ai corrigé mon warning et j'ai toujours le meme probleme rouloude. c'est la fonction INIT qui fonctionne pas correctement. 


          Je n'ai pas encore tout à fait fini mon programme michelbillaud, je souhaite resoudre mon probleme de plantage avant, mais oui tu as raison.

          • Partager sur Facebook
          • Partager sur Twitter
            25 mars 2020 à 21:39:46

            Slt lorsque j'ai tenté de compiler ton code avec les options  -Wall -Wextra -Werror ,j'ai eu une bonne dizaine de warnings. En d'autres termes ton code est bourré d'erreurs. Par exemple à la ligne 127 if(strcmp(pindex->nom_IND[i], pindex->nom_IND[i+1])>0) tu essaies de comparer deux caratères avec la fonction strcmp alors qu'elle sert a comparé deux chaines. Et aussi à la ligne 154 tu essaies d'affecter une valeur à une structure de type PATIENTS quii est pvec alors que tu dois choisir un champ precis pour l'affectation, par exemple pvec->code_postal = pindex->pos_IND; et non pvec = pindex->pos_IND.

            Il y a plein d'autres erreurs. Revoir ton code.

            -
            Edité par BamAss 25 mars 2020 à 22:23:32

            • Partager sur Facebook
            • Partager sur Twitter

            Nobody Is Anonyme!!!

              26 mars 2020 à 0:34:25

              Le compilateur est ton ami : il te signale gentiment les erreurs, sans s'énerver.

              • Partager sur Facebook
              • Partager sur Twitter

              Programme plante à l'execution

              × 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.
              • Editeur
              • Markdown