Partage
  • Partager sur Facebook
  • Partager sur Twitter

Stocker le résultat d'une procédure

Stuctures, tableaux, pointeurs, switch case

Sujet résolu
    23 juin 2017 à 19:02:49

    Bonjour, 
    Je suis débutant en C et je poste pour la 1ere fois sur ce forum. 
    Je souhaite stocker le résultat de la procédure remplirT, car j'ai besoin de ces informations dans les cas 'b', 'c', 'd', 'e' de mon switch case. J'ai pensé a ajouter remplirT(ptr, nb) dans chacun de ces cas, mais le programme s’arrête uniquement a cette ligne, et ne traite pas les autres fonctions, pourquoi ? Faudrait-il saisir les voitures dans tous les cas ? Comment stocker le résultat de cette procédure pour l'exploiter ensuite ?
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct Voiture
    {
        char marque[40];
        int id;
        unsigned long int km;
        int etat;
    };
    
    void remplirT(struct Voiture *ptr, int nb);
    void afficherT(struct Voiture *ptr, int nb);
    void louableT(struct Voiture T[], int nb);
    int rechercheRecursive(struct Voiture T[], int nb);
    //void suppression(struct Voiture T[], int nb);
    
    struct Voiture T[5000];
    struct Voiture *ptr;
    int nb;
    
    int main()
    {
        printf("Indiquez le nombre de voitures a saisir : ");
        scanf("%d", &nb);
        ptr = (struct Voiture *)malloc(nb * sizeof(struct Voiture));
    
        char choix;
        printf("\n\t\t*** MENU ***\t\t\n\n");
        printf("a : saisir des voitures\nb : afficher des voitures\nc : afficher des caracteristiques d'une voiture si possible\nd : rechercher une voiture\ne : supprimer des voitures\nf : fin du programme\n\n");
        getchar();
        scanf("%c", &choix);
    
        switch (choix)
        {
        case 'a' :
            remplirT(ptr, nb);
            break;
        case 'b' :
            afficherT(ptr, nb);
            break;
        case 'c' :
            louableT(T, nb);
            break;
        case 'd' :
            rechercheRecursive(T, nb);
            break;
        //case 'e' :
          //  suppression(T, nb);
            break;
        case 'f' :
            printf("Fin du programme\n");
            break;
        default :
            printf("Mauvais choix\n");
            break;
        }
    
        return (0);
    }
    
    void remplirT(struct Voiture *ptr, int nb)
    {
        int x;
        for (x = 0; x < nb; x++)
        {
            printf("Saisir la marque %d : ", x + 1);
            scanf("%s", &(ptr + x)->marque);
            printf("Saisir le numero d'identification %d : ", x + 1);
            scanf("%d", &(ptr + x)->id);
            printf("Saisir le kilometrage %d : ", x + 1);
            scanf("%Lf", &(ptr + x)->km);
            printf("Saisir l'etat %d (0 pour disponible et 1 sinon) : ", x + 1);
            scanf("%d", &(ptr + x)->etat);
        }
    }
    
    void afficherT(struct Voiture *ptr, int nb)
    {
        int x;
        for (x = 0; x < nb; x++)
        {
            printf("%s\t%d\t%Lf\t%d\n", (ptr + x)->marque, (ptr + x)->id, (ptr + x)->km, (ptr + x)->etat);
        }
    }
    
    void louableT(struct Voiture T[], int nb)
    {
        int ID, a, x;
        printf("Numero d'identification de la voiture a louer : ");
        scanf("%d", &ID);
    
        for (a = 0; a < nb; a++)
        {
            if (ID == T[a].id)
            {
                printf("Cette voiture est en location : ");
                printf("Voici ces caracteristiques : \n");
                for (x = 0; x < nb; x++)
                    printf("Numero d'identification : %d\t Kilometrage : %Lf\t Etat : %d\n", T[x].id, T[x].km, T[x].etat);
            }
            else
            {
                printf("Erreur, cette voiture n'existe pas\n");
            }
        }
    }
    
    int rechercheRecursive(struct Voiture T[], int nb)
    {
        int ID, x;
        printf("Donner un identifiant : ");
        scanf("%d", &ID);
    
        if (nb > x) return 0;
        if (ID == T[x].id)
            return printf("Marque : %s, %d i-eme element\n", T[x].marque, rechercheRecursive(++T, --nb));
    }
    
    /*
    void suppression(struct Voiture T[], int nb)
    {
        char marques[40];
        char *pMarque = marques;
        int x;
        printf("Donnez une marque : ");
        fgets(pMarque, 40, stdin);
    
        if (pMarque == T.marque)
        {
    
        }
    }
    */
    
    Merci d'avance

    -
    Edité par FoolBar 23 juin 2017 à 19:03:05

    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2017 à 19:10:24

      Je t'ai répondu il y a quelques minutes dans ton premier poste qui à miraculeusement disparu. (C'est le deuxième que je vois disparaitre en 2 jours) bizarre bizarre !!!

       Bon j'ai retrouvé ma réponse dans mon cache :

      Déjà un problème à la première instruction (ligne 25), tu fais une allocation avec malloc pour un nombre nb d'éléments or nb vaut 0. corrigé entre les deux post

      Dans ta fonction remplirT quelque problèmes sur les scanf :

      ligne 69, Marque représente déjà une adresse, donc pas de &

      ligne 73, le descripteur Lf ne convient pas pour un unsigned long int.

      A savoir que tu peut utiliser les crochers sur avec pointeur ptr : ptr[x]

      -
      Edité par rouloude 23 juin 2017 à 19:13:47

      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2017 à 20:40:47

        Apres corrections et implémentation d'une boucle do while :

        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        
        struct Voiture
        {
            char marque[40];
            int id;
            unsigned long int km;
            int etat;
        };
        
        void remplirT(struct Voiture *ptr, int nb);
        void afficherT(struct Voiture *ptr, int nb);
        void louableT(struct Voiture T[], int nb);
        int rechercheRecursive(struct Voiture T[], int nb);
        //void suppression(struct Voiture T[], int nb);
        
        struct Voiture T[5000];
        struct Voiture *ptr;
        int nb;
        
        int main()
        {
            printf("Indiquez le nombre de voitures a saisir : ");
            scanf("%d", &nb);
        
            ptr = (struct Voiture *)malloc(nb * sizeof(struct Voiture));
            char choix;
        
            do
            {
                system("cls");
                printf("\t\t*** MENU ***\t\t\n\n");
                printf("a : saisir des voitures\nb : afficher des voitures\nc : afficher des caracteristiques d'une voiture si possible\nd : rechercher une voiture\ne : supprimer des voitures\nf : fin du programme\n\n");
                getchar();
                scanf("%c", &choix);
        
                switch (choix)
                {
                case 'a' :
                case 'A' :
                    system("cls");
                    remplirT(ptr, nb);
                    getch();
                    break;
                case 'b' :
                case 'B' :
                    system("cls");
                    afficherT(ptr, nb);
                    getch();
                    break;
                case 'c' :
                case 'C' :
                    system("cls");
                    louableT(T, nb);
                    getch();
                    break;
                case 'd' :
                case 'D' :
                    system("cls");
                    rechercheRecursive(T, nb);
                    getch();
                    break;
                    //case 'e' :
                    //  suppression(T, nb);
                    break;
                case 'f' :
                case 'F' :
                    system("cls");
                    printf("Fin du programme\n");
                    getch();
                    break;
                default :
                    system("cls");
                    printf("Mauvais choix\n");
                    getch();
                    break;
                }
            }
            while (choix != 'f' && choix != 'F');
        
            return (0);
        }
        
        void remplirT(struct Voiture *ptr, int nb)
        {
            int x;
            for (x = 0; x < nb; x++)
            {
                printf("Saisir la marque %d : ", x + 1);
                scanf("%s", (ptr + x)->marque); // marque represente deja une adresse cdc, donc pas de &
                printf("Saisir le numero d'identification %d : ", x + 1);
                scanf("%d", &(ptr + x)->id);
                printf("Saisir le kilometrage %d : ", x + 1);
                scanf("%lu", &(ptr + x)->km);
                printf("Saisir l'etat %d (0 pour disponible et 1 sinon) : ", x + 1);
                scanf("%d", &(ptr + x)->etat);
            }
        }
        
        void afficherT(struct Voiture *ptr, int nb)
        {
            int x;
            for (x = 0; x < nb; x++)
            {
                printf("%s\t%d\t%lu\t%d\n", (ptr + x)->marque, (ptr + x)->id, (ptr + x)->km, (ptr + x)->etat);
            }
        }
        
        void louableT(struct Voiture T[], int nb)
        {
            int ID, a, x;
            printf("Numero d'identification de la voiture a louer : ");
            scanf("%d", &ID);
        
            for (a = 0; a < nb; a++)
            {
                if (ID == T[a].id)
                {
                    printf("Cette voiture est en location : ");
                    printf("Voici ces caracteristiques : \n");
                    for (x = 0; x < nb; x++)
                        printf("Numero d'identification : %d\t Kilometrage : %lu\t Etat : %d\n", T[x].id, T[x].km, T[x].etat);
                }
                else
                {
                    printf("Erreur, cette voiture n'existe pas\n");
                }
            }
        }
        
        int rechercheRecursive(struct Voiture T[], int nb)
        {
            int ID, x;
            printf("Donner un identifiant : ");
            scanf("%d", &ID);
        
            if (nb > x) return 0;
            if (ID == T[x].id)
                return printf("Marque : %s, %d i-eme element\n", T[x].marque, rechercheRecursive(++T, --nb));
        }
        
        /*
        void suppression(struct Voiture T[], int nb)
        {
            char marques[40];
            char *pMarque = marques;
            int x;
            printf("Donnez une marque : ");
            fgets(pMarque, 40, stdin);
        
            if (pMarque == T.marque)
            {
        
            }
        }
        */
        



        • Partager sur Facebook
        • Partager sur Twitter

        Stocker le résultat d'une procédure

        × 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