Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Erreur]TP licence info 1ere en C Parking

Mon année en dépend.. Je vais donner le plus d'informations.

    30 avril 2023 à 18:42:46

    Bonjour, j'ai besoin d'aide pour un TP en langage C que je trouve TRES compliqué pour le premier, mon année dans cette matière dépend de ce TP et je suis vraiment bloqué... Je vais d'abord vous donnez l'énoncé :

    jusqu'ici tout va bien puis la suite : 

    Là j'ai énormément de mal et il m'en reste vraiment beaucoup c'est a rendre dans 4 jours (certes j'avais beaucoup de temps pour le faire mais j'essayé de le faire par mes propres moyens !) , je vais vous envoyer mon code en espérant que quelqu'un puisse bien vouloir m'aider ... : 

    cette fonction là m'a été donné evidemment, ensuite : 

    pour l'instant je m'en sortais pas trop mal : 

    cette fonction fonctionne mais la suivant entrer_parking je n'y arrive pas et sortir je n'y pense même pas  : 

    voici mon main, que quelqu'un m'aide s'il vous plait, je vais donner mon contact discord et mail secondaire pour les intéressés : 

    Mon discord : ZomerSky#0664

    mon mail : [Édit staff pas de données personnelles]

    Merci d'avance c'est à rendre avant mercredi midi ...

    -
    Edité par LorisBoulanger 30 avril 2023 à 20:53:20

    • Partager sur Facebook
    • Partager sur Twitter
      30 avril 2023 à 19:29:31

      Hello,

      Alors, pour l'urgence, ce n'est pas notre problème. Si tu ne sais pas le faire maintenant, tu ne savais pas le faire il y a 3 mois (ou plus).

      Ensuite, je ne sais pas ce que tu as fait, mais tes codes ne sont que des images toutes identiques.

      -
      Edité par edgarjacobs 30 avril 2023 à 20:04:34

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        30 avril 2023 à 20:26:17

        Voici tout mon code que j'ai pris en capture d'écran et je vais envoyer mon sujet ici aussi 
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        
        #define MAX_LIGNES 1024
        #define MAX_CHARS 1024
        
        
        // Définition d'une structure pour stocker les informations sur un parking
        typedef struct {
            char identifiant[MAX_CHARS];
            char nom[MAX_CHARS];
            char adresse[MAX_CHARS];
            char ville[MAX_CHARS];
            char etat[MAX_CHARS];
            int places_disponibles;
            int capacite_max;
            char date_mise_a_jour[MAX_CHARS];
            char affichage_panneaux[MAX_CHARS];
        } ligneDEnregistrement;
        
        
        // Définition d'une structure pour stocker les informations sur un client
        typedef struct {
            char identifiant[MAX_CHARS];
            char plaque_immatriculation[MAX_CHARS];
            char date_sortie[MAX_CHARS];
            char heure_sortie[MAX_CHARS];
            int montant;
            char heure_entree[MAX_CHARS];
            char date_entree[MAX_CHARS];
        } clients;
        
        
        // Fonction pour lire un fichier CSV contenant des informations sur les parkings
        int lecture_csv(char *nomFichier, ligneDEnregistrement tableau_enregistrement[], int max_lignes) {
          
            // Ouvrir le fichier en mode lecture
            FILE *file = fopen(nomFichier, "r");
          
            // Vérifier si l'ouverture du fichier a réussi
            if (!file) {
                printf("Erreur d'ouverture du fichier\n");
                exit(1);
            }
          
            // Initialiser un tampon pour stocker chaque ligne lue dans le fichier
            char line[MAX_CHARS];
          
            // Initialiser un compteur pour suivre le nombre de lignes lues
            int index = 0;
          
            // Ignorer la première ligne (en-tête) du fichier
            fgets(line, MAX_CHARS, file);
          
            // Lire chaque ligne du fichier tant que la fin de fichier n'est pas atteinte ou la limite de lignes n'est pas dépassée
            while (fgets(line, MAX_CHARS, file) && index < max_lignes) {
                ligneDEnregistrement data;
              
                // Utiliser la fonction strtok() pour diviser chaque ligne lue en champs séparés par des point-virgules
                char *token;
                token = strtok(line, ";");
              
                // Stocker chaque champ dans la structure correspondante
                strcpy(data.identifiant, token);
                token = strtok(NULL, ";");
                strcpy(data.nom, token);
                token = strtok(NULL, ";");
                strcpy(data.adresse, token);
                token = strtok(NULL, ";");
                strcpy(data.ville, token);
                token = strtok(NULL, ";");
                strcpy(data.etat, token);
                token = strtok(NULL, ";");
                data.places_disponibles = atoi(token);
                token = strtok(NULL, ";");
                data.capacite_max = atoi(token);
                token = strtok(NULL, ";");
                strcpy(data.date_mise_a_jour, token);
                token = strtok(NULL, ";\n");
                strcpy(data.affichage_panneaux, token);
                // Ajouter la structure au tableau
                tableau_enregistrement[index++] = data;
            }
          
            // Fermer le fichier
            fclose(file);
          
            // Retourner le nombre de lignes lues
            return index;
        }
        
        
        void afficher_enregistrements(ligneDEnregistrement tableau_enregistrement[], int nb_enregistrement) {
            for (int i = 0; i < nb_enregistrement; i++) {
                printf("----------------------------------------------------------");
                printf("\nIdentifiant: %s\n", tableau_enregistrement[i].identifiant);   
                printf("Nom: %s\n", tableau_enregistrement[i].nom);
                printf("Adresse: %s\n", tableau_enregistrement[i].adresse);
                printf("Ville: %s\n", tableau_enregistrement[i].ville);
                printf("État: %s\n", tableau_enregistrement[i].etat);
                printf("Places disponibles: %d\n", tableau_enregistrement[i].places_disponibles);
                printf("Capacité max: %d\n", tableau_enregistrement[i].capacite_max);
                printf("Date de mise à jour: %s\n", tableau_enregistrement[i].date_mise_a_jour);
                printf("Affichage panneaux: %s\n", tableau_enregistrement[i].affichage_panneaux);
                printf("----------------------------------------------------------");
                printf("\n");   // affiche une ligne vide pour séparer les enregistrements
            }
        }
        
        
        
        void calculer_stats_parkings(ligneDEnregistrement tableau_enregistrement[], int nb_lignes) {
          
            // Initialiser les compteurs
            int nb_total_parkings = nb_lignes;   // compte le nombre total de parkings
            int nb_parkings_ville[4] = {0};   // compte le nombre de parkings pour chaque ville (Lille, Tourcoing, Roubaix, Villeneuve d'Ascq)
            float taux_occupation[MAX_LIGNES] = {0};   // stocke le taux d'occupation de chaque parking
          
            // Compter le nombre de parkings dans chaque ville
            char villes[4][MAX_CHARS] = {"Lille", "Tourcoing", "Roubaix", "Villeneuve d'Ascq"};   // stocke les villes possibles
          
            for (int i = 0; i < nb_lignes; i++) {   // pour chaque ligne d'enregistrement
                for (int j = 0; j < 4; j++) {   // pour chaque ville possible
                  
                    if (strcmp(tableau_enregistrement[i].ville, villes[j]) == 0) {   // si la ville de l'enregistrement correspond à la ville actuelle
                  
                        nb_parkings_ville[j]++;   // incrémente le compteur de parkings de cette ville
                    }
                }
            }
            // Calculer le taux d'occupation de chaque parking
            for (int i = 0; i < nb_lignes; i++) {   // pour chaque ligne d'enregistrement
              
                taux_occupation[i] = (float) tableau_enregistrement[i].places_disponibles / tableau_enregistrement[i].capacite_max;
            }
            // Afficher les statistiques pour chaque ville
            for (int i = 0; i < 4; i++) {
                if (nb_parkings_ville[i] == 1) {
                    printf("%s: %d parking\n", villes[i], nb_parkings_ville[i]);
                } else {
                    printf("%s: %d parkings\n", villes[i], nb_parkings_ville[i]);
                }
                for (int j = 0; j < nb_lignes; j++) {
                    if (strcmp(tableau_enregistrement[j].ville, villes[i]) == 0) {
                        printf("\t%s (%.0f%% occupé)\n", tableau_enregistrement[j].nom, taux_occupation[j]*100);
                    }
                }
            }
            printf("\nNombres de parkings totaux : %d\n\n", nb_total_parkings);
        }
        
        
        void menu(){
            int choix;
            printf("1 : Chercher un parking \n");
            printf("2 : Entrer dans un parking \n");
            printf("3 : Sortir du parking \n\n");  
        }
        
        
        int chercher_parking(ligneDEnregistrement tableau_enregistrement[], int nb_lignes){
            char ville[MAX_CHARS];
            int verrouille;// initialisation de la variable pour savoir si le parking doit être verrouillé
            int nb_parkings_ville = 0;// initialisation du compteur de parkings de la ville
          
            printf("Quelle est la ville où vous souhaitez trouver un parking ?\n");
            scanf("%s", &ville);
          
            for (int i = 0; i < nb_lignes; i++) {  // boucle pour parcourir chaque ligne d'enregistrement
                if (strcmp(tableau_enregistrement[i].ville, ville) == 0) { // si la ville correspond
                  
                    // affichage des informations sur le parking
                    printf("----------------------------------------------------------");
                    printf("\nnom du parking : %s\nadresse : %s\ndisponibilités : %d places \netat : %s\n\n", 
                    tableau_enregistrement[i].nom, tableau_enregistrement[i].adresse, 
                    tableau_enregistrement[i].places_disponibles, tableau_enregistrement[i].etat);
                  
                    // demande de verrouillage du parking
                    printf("Voulez vous verrouillez ce parking ?\n1 pour Oui \n0 pour Non\n");
                    scanf("%d", &verrouille);  // lecture de la réponse
                    if (verrouille == 1) {  // si le verrouillage est demandé
        
                      // verifie si le parking est plein ou complet
                        if (strcmp(tableau_enregistrement[i].etat, "FERME") == 0 || strcmp(tableau_enregistrement[i].etat, "COMPLET") == 0){
                          
                            printf("Ce parking est plein et/ou ferme, relancer le programme et choisissez un autre parking\n");
                          
                            // quitter la fonction si le parking est plein ou complet
                            return 0;
                      }
                        // affichage des infos du parking et decrementation du nombre de places du parking 
                        afficher_enregistrements(&tableau_enregistrement[i], 1);
                        tableau_enregistrement[i].places_disponibles --;
                      
                        // verrouillage du parking
                        printf("\nVous verrouillez ce parking, il reste maintenant %d places\n", tableau_enregistrement[i].places_disponibles);
                                      
                        return i;  // quitter la fonction
                  }
              }
          }
            // Tous les parkings ont été parcourus, aucun n'a été validé donc arrêt
            printf("\nVous avez parcouru tous les parkings de cette ville ou alors vous avez rentré un nom de ville incorrecte, vous abandonnez la recherche.\n");
          
            return 0; // quitter la fonction
        }
        
        
        int entrer_parking(ligneDEnregistrement tableau_enregistrement[], int nb_lignes){
            char immatriculation[MAX_CHARS];
            char date_e[MAX_CHARS];
            char heure_e[MAX_CHARS];
            int ligne_info;
            int compteur_enregistre = 0;
            int montant = 0;
          
            // lancement de chercher_parking et recupere la ligne d'informations du parking dans le fichier csv
            ligne_info = chercher_parking(tableau_enregistrement, nb_lignes);
        
            // on verifie si chercher_parking renvoie 0 ou i en valeur
            if (ligne_info == 0){
              return 0;
            }
                
            // affichage des informations sur le parking choisi
            printf("\nBienvenue dans le parking %s situé à l'adresse suivante : %s\n", tableau_enregistrement[ligne_info].nom, tableau_enregistrement[ligne_info].adresse);
        
            // lecture automatique de la plaque d'immatriculation
            printf("\nVeuillez scanner votre plaque d'immatriculation : \n");
            scanf("%s", immatriculation);
        
            // stockage des infos dans le tableau_client
            printf("\nQuelle est la date d'aujourd'hui ?\n");
            scanf("%s", date_e);
            printf("Quelle est l'heure actuelle ?\n");
            scanf("%s", heure_e);
          
            clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
        
            return 0;  // quitter la fonction   
        }
        
        
        
        int main() {
          
            // initialisation des structures et des variables
            ligneDEnregistrement tableau_enregistrement[MAX_LIGNES];
            clients* mon_client = &mon_client; // où mon_client est une variable de type clients
            int nb_enregistrement;
          
            // compte le nombre de ligne/enregistrement du fichier csv
            nb_enregistrement = lecture_csv("exemple.csv", tableau_enregistrement, MAX_LIGNES);
          
            // appels des fonctions pour les tests
            /*
            calculer_stats_parkings(tableau_enregistrement, nb_enregistrement);
            menu();
            */
            entrer_parking(tableau_enregistrement, nb_enregistrement);
          
            return 0;
        }
        
        
        • Partager sur Facebook
        • Partager sur Twitter
          30 avril 2023 à 20:33:36

          Pourquoi on vous fait faire des applications COBOL en C ?  :-)

          • Partager sur Facebook
          • Partager sur Twitter
            30 avril 2023 à 20:36:52

            Re,

            Commence par éliminer toutes les warnings:

            park.c: In function 'menu':
            park.c:155:9: warning: unused variable 'choix' [-Wunused-variable]
              155 |     int choix;
                  |         ^~~~~
            park.c: In function 'chercher_parking':
            park.c:168:13: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[1024]' [-Wformat=]
              168 |     scanf("%s", &ville);
                  |            ~^   ~~~~~~
                  |             |   |
                  |             |   char (*)[1024]
                  |             char *
            park.c:168:13: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[1024]' [-Wformat=]
              168 |     scanf("%s", &ville);
                  |            ~^   ~~~~~~
                  |             |   |
                  |             |   char (*)[1024]
                  |             char *
            park.c:165:9: warning: unused variable 'nb_parkings_ville' [-Wunused-variable]
              165 |     int nb_parkings_ville = 0;// initialisation du compteur de parkings de la ville
                  |         ^~~~~~~~~~~~~~~~~
            park.c: In function 'entrer_parking':
            park.c:239:27: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
              239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                  |                           ^~~~~~~~~~~~~~~~~~~~~~
            park.c:239:27: note: (near initialization for 'mon_client.identifiant[0]')
            park.c:239:75: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
              239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                  |                                                                           ^~~~~~~~~~~~~~~
            park.c:239:75: note: (near initialization for 'mon_client.identifiant[1]')
            park.c:239:92: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
              239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                  |                                                                                            ^~~~~~
            park.c:239:92: note: (near initialization for 'mon_client.identifiant[2]')
            park.c:239:100: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
              239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                  |                                                                                                    ^~~~~~~
            park.c:239:100: note: (near initialization for 'mon_client.identifiant[3]')
            park.c:239:118: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
              239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                  |                                                                                                                      ^~~~~~~
            park.c:239:118: note: (near initialization for 'mon_client.identifiant[5]')
            park.c:239:127: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
              239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                  |                                                                                                                               ^~~~~~
            park.c:239:127: note: (near initialization for 'mon_client.identifiant[6]')
            park.c:239:26: warning: missing braces around initializer [-Wmissing-braces]
              239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                  |                          ^
                  |                           {                                                                                                         }
            park.c:239:5: warning: missing initializer for field 'plaque_immatriculation' of 'clients' [-Wmissing-field-initializers]
              239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                  |     ^~~~~~~
            park.c:26:10: note: 'plaque_immatriculation' declared here
               26 |     char plaque_immatriculation[MAX_CHARS];
                  |          ^~~~~~~~~~~~~~~~~~~~~~
            park.c:239:13: warning: unused variable 'mon_client' [-Wunused-variable]
              239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                  |             ^~~~~~~~~~
            park.c:215:9: warning: unused variable 'compteur_enregistre' [-Wunused-variable]
              215 |     int compteur_enregistre = 0;
                  |         ^~~~~~~~~~~~~~~~~~~
            park.c: In function 'main':
            park.c:250:27: warning: initialization of 'clients *' from incompatible pointer type 'clients **' [-Wincompatible-pointer-types]
              250 |     clients* mon_client = &mon_client; // où mon_client est une variable de type clients
                  |                           ^
            
            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              30 avril 2023 à 20:45:36

              Bonjour ! Pour info on ne voit pas tes images (tu n'arais pas donné leur adresse sur ton disque dur ? ou sur un site où il faut s'inscrire pour les voir ? ça expliquerait que tu vois les images et pas nous) et donc on n'a aucune info (c'est quoi le sujet ?) Et pour que l'aide soit efficace, pense à poser des questions précises.

              -
              Edité par robun 30 avril 2023 à 20:48:53

              • Partager sur Facebook
              • Partager sur Twitter
                30 avril 2023 à 20:57:11

                michelbillaud a écrit:

                Pourquoi on vous fait faire des applications COBOL en C ?  :-)


                Je ne sais même pas ce que sait des applications COBOL j'envoie les instructions :  

                j'espère que ça va s'envoyer cette fois... c'est juste des captures d'écrans avec l'outil

                • Partager sur Facebook
                • Partager sur Twitter
                  30 avril 2023 à 21:05:58

                  C'est toujours aussi déconnant....
                  • Partager sur Facebook
                  • Partager sur Twitter

                  On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                    30 avril 2023 à 21:19:24

                    edgarjacobs a écrit:

                    Re,

                    Commence par éliminer toutes les warnings:

                    park.c: In function 'menu':
                    park.c:155:9: warning: unused variable 'choix' [-Wunused-variable]
                      155 |     int choix;
                          |         ^~~~~
                    park.c: In function 'chercher_parking':
                    park.c:168:13: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[1024]' [-Wformat=]
                      168 |     scanf("%s", &ville);
                          |            ~^   ~~~~~~
                          |             |   |
                          |             |   char (*)[1024]
                          |             char *
                    park.c:168:13: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[1024]' [-Wformat=]
                      168 |     scanf("%s", &ville);
                          |            ~^   ~~~~~~
                          |             |   |
                          |             |   char (*)[1024]
                          |             char *
                    park.c:165:9: warning: unused variable 'nb_parkings_ville' [-Wunused-variable]
                      165 |     int nb_parkings_ville = 0;// initialisation du compteur de parkings de la ville
                          |         ^~~~~~~~~~~~~~~~~
                    park.c: In function 'entrer_parking':
                    park.c:239:27: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
                      239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                          |                           ^~~~~~~~~~~~~~~~~~~~~~
                    park.c:239:27: note: (near initialization for 'mon_client.identifiant[0]')
                    park.c:239:75: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
                      239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                          |                                                                           ^~~~~~~~~~~~~~~
                    park.c:239:75: note: (near initialization for 'mon_client.identifiant[1]')
                    park.c:239:92: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
                      239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                          |                                                                                            ^~~~~~
                    park.c:239:92: note: (near initialization for 'mon_client.identifiant[2]')
                    park.c:239:100: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
                      239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                          |                                                                                                    ^~~~~~~
                    park.c:239:100: note: (near initialization for 'mon_client.identifiant[3]')
                    park.c:239:118: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
                      239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                          |                                                                                                                      ^~~~~~~
                    park.c:239:118: note: (near initialization for 'mon_client.identifiant[5]')
                    park.c:239:127: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
                      239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                          |                                                                                                                               ^~~~~~
                    park.c:239:127: note: (near initialization for 'mon_client.identifiant[6]')
                    park.c:239:26: warning: missing braces around initializer [-Wmissing-braces]
                      239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                          |                          ^
                          |                           {                                                                                                         }
                    park.c:239:5: warning: missing initializer for field 'plaque_immatriculation' of 'clients' [-Wmissing-field-initializers]
                      239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                          |     ^~~~~~~
                    park.c:26:10: note: 'plaque_immatriculation' declared here
                       26 |     char plaque_immatriculation[MAX_CHARS];
                          |          ^~~~~~~~~~~~~~~~~~~~~~
                    park.c:239:13: warning: unused variable 'mon_client' [-Wunused-variable]
                      239 |     clients mon_client = {tableau_enregistrement[ligne_info].identifiant, immatriculation, date_e, heure_e, montant, heure_e, date_e};
                          |             ^~~~~~~~~~
                    park.c:215:9: warning: unused variable 'compteur_enregistre' [-Wunused-variable]
                      215 |     int compteur_enregistre = 0;
                          |         ^~~~~~~~~~~~~~~~~~~
                    park.c: In function 'main':
                    park.c:250:27: warning: initialization of 'clients *' from incompatible pointer type 'clients **' [-Wincompatible-pointer-types]
                      250 |     clients* mon_client = &mon_client; // où mon_client est une variable de type clients
                          |                           ^
                    

                    Justement j'ai envoyé mon code qui n'est pas bon j'essaie pleins de choses je suis trop débutant je m'aide de chat gpt et tout ça m'enerver en plus mes images s'envoie pas...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 avril 2023 à 21:30:35

                      @LorisBoulanger Bonsoir, pour poster une image vous devez utiliser l'outil du forum (huitième bouton)  et attendre que l'image soit uploader sur le serveur avant de cliquer sur OK.

                      Mais nous avons des personnes aveugles sur le forum qui aide, il serait préférable de poster l'énoncé sous forme de texte.

                      Insertion des images

                      Le forum dispose d’un outil pour poster des images directement dans vos messages via ce bouton : . Vous avez la possibilité d’y mettre soit une image depuis votre ordinateur, soit un lien direct si l’image est déjà sur Internet. Utilisez toujours l’outil d’intégration d’images du site, c’est la seule manière d’afficher des images dans vos messages.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 avril 2023 à 22:18:18

                        1. Fichier à utiliser Fichier parking-metrople.csv : est un fichier texte contenant les parkings de la métropole Lilloise. Il contient des informations générales comme le numéro, le nom, l’adresse, la capacité maximale et d’autres informations concernant l’état du parking et sa disponibilité qui ont été relevées à cet instant. Les données dans le fichier sont séparées par un point virgule. 2. Avant de commencer Étape N°1. Prenez connaissance du fichier et testez-le

                        Le menu Ensuite le programme affiche un menu avec les différentes fonctionnalités. Il faut permettre à l’utilisateur de • Chercher un parking • Entrer dans un parking • Sortir du parking

                        Étape N°7. Codez ce menu 

                        Chercher un parking • Un client cherche un stationnement dans une ville. • L’application lui propose les noms des parkings de la ville, leurs noms, adresses et disponibilités. • Le client choisit un parking et déclenche une entrée ou abandonne sa recherche

                        Étape N°8. Codez cette fonction 

                        Entrer dans un parking Une fois que le client a validé son choix de parking, le panneau d’affichage lui est présenté avec un rappel de l’adresse et d’autres informations utiles. A l’entrée, il y a une lecture automatique de la plaque d’immatriculation (saisie par l’utilisateur ici). Le parking stocke pour chaque entrée, le numéro du parking, la plaque du véhicule, la date et l’heure d’entrée dans une structure clients qui prévoit une date et heure de sortie et le montant à régler qui seront complétées à la sortie du parking.

                        Étape N°9. Codez cette fonction 

                        Sortir du parking En se présentant à la sortie, la plaque est lue automatiquement (saisie par l’utilisateur ici) Le montant à régler est calculé et est affiché pour paiement (nombre d’heures aléatoire compris entre 1 et 24 heures , le tarif horaire est de 4€ par heure) Les informations manquantes de la structure clients seront complétées

                        Étape N°10. Codez cette fonction 

                        Étape N°11. Supprimez toutes les variables globales en utilisant des pointeurs. 

                        Étape N°12. A l’aide de la documentation, mettez les fonctions dans un autre fichier (et demandez à l’enseignant de vous aider)  

                        Étape N°13. Dès qu’on client entre dans un parking, le nombre de place disponible est décrémenté de 1. Inversement lorsqu’il libère une place. b) Parking complet

                        Étape N°14. Dans le cas, où plus aucune place n’est disponible, il n’est plus possible pour un automobiliste d’entrer.

                        Étape N°15. Dès une entrée ou une sortie, le fichier csv doit être mise à jour

                        Étape N°16. Dans un autre fichier, toutes les données d’un client (parking utilisé, date et heure d’entrée et de sortie, et montant payé) seront enregistrées dans un fichier portant le nom du client.

                        a) Mode console à l’aide de la bibliothèque ncurses

                        Vous pourrez également utiliser des librairies telles que ncurses pour la gestion de l'interface utilisateur en mode console.

                        Étape N°17. Exécutez le fichier d’exemple

                        Étape N°18. Complétez le fichier en lui ajoutant des commentaires

                        Étape N°19. Modifiez votre programme en utilisant la bibliothèques ncurses

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 avril 2023 à 23:42:44

                          La solution :

                          LorisBoulanger a écrit:

                          c'est à rendre avant mercredi midi ...

                          Oh ben ça va, il y a encore le temps.

                          -
                          Edité par rouIoude 30 avril 2023 à 23:46:43

                          • Partager sur Facebook
                          • Partager sur Twitter
                          ...
                            1 mai 2023 à 0:09:35

                            rouIoude a écrit:

                            La solution :

                            LorisBoulanger a écrit:

                            c'est à rendre avant mercredi midi ...

                            Oh ben ça va, il y a encore le temps.

                            -
                            Edité par rouIoude il y a 21 minutes

                            Oui mais étant dessus depuis 1 mois et demi et en essayant de faire comprendre a mon prof que c'est vraiment dur pour moi sachant que c'est l'une des premières fois que je touche à du C bon...  c'est 60% de ma moyenne dans cette matière ça m'embete.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              1 mai 2023 à 2:45:47

                              Alors, c'est moi l'aveugle. :)
                              Est-ce que tu peux lire le fichier CSV et l'afficher correctement?
                              As-tu corrigé les erreurs de syntaxe ou autres que d'autres t'ont mentionnées?
                              @michelbillaud: tu m'as fait peur avec ton Cobol. :)

                              Ouf! Ce n'est pas du Cobol ... mais c'est le genre de choses qu'on fait généralement en Cobol.
                              @LorisBoulanger: je peux lire le  code coloré, mais pas le code en images.
                              Corriges tes erreurs et postes ton nouveau code sans erreur.
                              Tu pourrais également poster quelques lignes de ton fichier en format CSV au cas où quelqu'un voudrais tester.
                              Rappelles-toi également qu'on aide les gens sur une base volontaire et que nous ne sommes pas payés.

                              > Justement j'ai envoyé mon code qui n'est pas bon j'essaie pleins de choses je suis trop débutant je m'aide de chat gpt
                              Essayer plein de choses et se fier à chat gpt plutôt qu'à soi-même n'est pas une bonne pratique.
                              Ton prof ne vous apprend pas comment faire? (Peut-être qu'il ne le sait pas lui-même ...)
                              Quand on écrit du code, on y va avec une nouvelle fonction à la fois et on teste avant de passer à la suivante.
                              Bien sûr, il faut au moins une idée générale de ce qu'on veut faire dès le départ.

                              > Oui mais étant dessus depuis 1 mois et demi et en essayant de faire comprendre a mon prof que c'est vraiment dur pour moi sachant que c'est l'une des premières
                              Tu as commencé le projet il y a un mois et demi? Ou plus?
                              Le temps que tu perds à faire comprendre des chose au prof, tu ne l'as pas pour coder.
                              Ceci dit, je trouve que ce projet n'est pas évident pour un débutant.

                              J'ai relu l'énoncé plus d'une fois et il y a de quoi s'y perdre en effet.

                              Le menu devrait être plus ou moins au coeur du programme et il ne fait rien actuellement.

                              Je suis sans doute mal placé pour le dire, mais il serait préférable que tout fonctionne bien avant de penser à utiliser Ncurses.

                              -
                              Edité par PierrotLeFou 1 mai 2023 à 4:16:02

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Le Tout est souvent plus grand que la somme de ses parties.

                                1 mai 2023 à 9:41:59

                                LorisBoulanger a écrit:

                                Oui mais étant dessus depuis 1 mois et demi et en essayant de faire comprendre a mon prof que c'est vraiment dur pour moi sachant que c'est l'une des premières fois que je touche à du C bon... 

                                Euh faudrait atterrir : si ton prof te donne des exercices, c'est pas pour que tu puisses montrer que tu savais déjà faire, c'est pour que tu apprennes ce que tu ne sais pas faire encore.  Et forcément, y a des problèmes, c'est pas facile, ça demande du travail, de la persévérance, bla bla bla.

                                Ton prof le sait très bien, c'est pour ça qu'il vous a donné deux mois pour faire un truc qui prendrait quelques heures à quelqu'un qui sait faire.   Tenter de négocier un délai sur la base de "oui mais là c'est affreux vous me demandez d'apprendre à faire des trucs que je ne savais pas faire avant", ça va pas le faire.

                                [Un des problèmes des débutants, c'est de sous-estimer, souvent d'un ordre de grandeur, le temps  qu'il leur faudra pour faire marcher le programme qu'ils envisagent d'écrire, un jour, plus tard, la veille de le rendre par exemple.  Depuis les années 60, on sait que même les pros d'arrivent pas à estimer correctement, alors les débutants...]

                                @Pierrot : c'était un de mes exemples à étudier quand j'enseignais COBOL, au millénaire précédent, dans une autre galaxie  https://www.mbillaud.fr/SITE-PERSO-LABRI/IUT/cobol.html

                                Cobol c'est mieux, il y a des fichiers indexés (équivalents d'un dictionnaire Python)

                                    IDENTIFICATION DIVISION.
                                
                                    program-id. Parking.
                                    author. M Billaud.
                                
                                *****************************************************************
                                *   gestion d'un parking prive
                                *****************************************************************
                                
                                    ENVIRONMENT DIVISION.
                                    input-output section.
                                    file-control.
                                        select F-PARKING assign to "f-parking"
                                        organization is indexed
                                        access is dynamic
                                        record key PLAQUE
                                        alternate record key PROPRIETAIRE
                                            with duplicates.
                                
                                *****************************************************************
                                
                                    DATA DIVISION.
                                
                                        FILE SECTION.
                                
                                    fd F-PARKING.
                                    01 ENR-PARKING.
                                      02 PLAQUE     pic x(8).
                                      02 PROPRIETAIRE pic x(20).
                                      02 VEHICULE   pic x(20).
                                      02 PRESENT    pic x(1).
                                
                                
                                    WORKING-STORAGE SECTION.
                                
                                * Constantes utiles ...
                                
                                    77 VRAI     pic x   value "T".
                                    77 FAUX     pic x   value "F".
                                    77 CHOIX    pic x.
                                
                                * variables et indicateurs ...
                                
                                    77 PROPRIETAIRE-CHERCHE pic x(20).
                                    77 FF-PARKING   pic x.
                                    77 FIN-TRAVAIL  pic x.
                                    77 VEHICULE-EXISTE pic x.
                                    77 LIBELLE-QUESTION pic x(30).
                                    77 LIGNE-PARAMETRES pic x(80).
                                
                                *************************************************************
                                
                                    PROCEDURE DIVISION.
                                    PRINCIPALE SECTION.
                                
                                    TRAITEMENT.
                                *       ouverture, boucle principale, fermeture et fin.
                                *
                                        accept LIGNE-PARAMETRES.
                                        open i-o F-PARKING.
                                        move FAUX to FIN-TRAVAIL.
                                        perform MENU-PRINCIPAL
                                          until FIN-TRAVAIL = VRAI.
                                        close F-PARKING.
                                        stop run.       
                                
                                
                                    MENU-PRINCIPAL. 
                                *       affichage du menu principal
                                *       et aiguillage vers les differentes actions
                                
                                        display "Entree, Sortie, Inscriptions, Listes, Fin".
                                        accept CHOIX.
                                        evaluate choix 
                                        when "E" perform entree-vehicule
                                        when "S" perform sortie-vehicule
                                        when "I" perform inscriptions
                                        when "L" perform listes
                                        when "F" move VRAI to FIN-TRAVAIL
                                        when other display "Commande non comprise" CHOIX
                                        end-evaluate.
                                    
                                    ENTREE-VEHICULE.
                                *       demande la plaque du vehicule qui entre,
                                *       verifie qu'il est dans le fichier et change l'indicateur
                                *       de presence.
                                
                                        move  "Immatriculation du vehicule qui entre ? "
                                            to LIBELLE-QUESTION.
                                        perform CHERCHER-VEHICULE.
                                        if VEHICULE-EXISTE = VRAI
                                          then if PRESENT = VRAI
                                            then display "Il est deja rentre au parking !"
                                            else move VRAI to PRESENT
                                                 rewrite ENR-PARKING
                                                 display "Entree enregistree:"
                                                 perform AFFICHAGE
                                            end-if
                                          else display "Ce vehicule n'est pas enregistre"  
                                        end-if.
                                
                                
                                    SORTIE-VEHICULE.
                                *       idem pour les vehicules qui sortent.
                                
                                        move "Immatriculation du vehicule qui sort ? "
                                            to LIBELLE-QUESTION.
                                        perform CHERCHER-VEHICULE.
                                        if VEHICULE-EXISTE = VRAI
                                          then if PRESENT = FAUX
                                            then display "Il est deja sorti du parking !"
                                            else move FAUX to PRESENT
                                                 rewrite ENR-PARKING
                                                 display "Sortie enregistree:"
                                                 perform AFFICHAGE
                                            end-if
                                          else display "Ce vehicule n'est pas enregistre"  
                                        end-if.
                                
                                            
                                    CHERCHER-VEHICULE.
                                *       demande la plaque d'un vehicule, et lit 
                                *       l'enregistrement correspondant
                                *       positionne l'indicateur VEHICULE-EXISTE
                                
                                        display LIBELLE-QUESTION.
                                        accept PLAQUE.
                                        read F-PARKING key is PLAQUE
                                        invalid key     move FAUX to VEHICULE-EXISTE
                                        not invalid key move VRAI to  VEHICULE-EXISTE
                                        end-read.
                                
                                    INSCRIPTIONS.
                                *       Sous-menu des insriptions
                                
                                        display "Inscrire, Supprimer, Rien".
                                        accept CHOIX.
                                        evaluate CHOIX
                                        when "I" perform INSCRIRE
                                        when "S" perform SUPPRIMER
                                        when "R" display "Ok"
                                        when other
                                           display "Choix non compris, retour menu principal"
                                        end-evaluate.
                                
                                    INSCRIRE.
                                *       saisie et enregistrement d'une inscription
                                
                                        display "Immatriculation du vehicule a inscrire".
                                        accept PLAQUE.
                                        display "Nom du proprietaire ?".
                                        accept PROPRIETAIRE.
                                        display "Description du vehicule ?".
                                        accept VEHICULE.
                                        move FAUX to PRESENT.
                                
                                        write ENR-PARKING
                                        invalid key
                                            display "Vehicule deja enregistre !"
                                        not invalid key 
                                            display "Vehicule enregistre: "
                                            perform AFFICHAGE
                                        end-write.
                                
                                    SUPPRIMER.
                                *       saisie plaque du vehicule a supprimer,
                                *       puis suppression effective
                                
                                        move  "Immatriculation du vehicule a supprimer ?"
                                            to LIBELLE-QUESTION.
                                        perform CHERCHER-VEHICULE.
                                        if VEHICULE-EXISTE = VRAI
                                        then display "Suppression de :"
                                            perform AFFICHAGE
                                            delete F-PARKING record
                                        else
                                             display "Je n'ai pas ce vehicule"
                                        end-if.
                                
                                    LISTES.
                                *       sous menu des listes: par plaque ou par proprietaire
                                
                                        display "Vehicule, Proprietaire ?".
                                        accept CHOIX.
                                        evaluate CHOIX
                                        when "V" perform liste-vehicule
                                        when "P" perform liste-proprietaire
                                        end-evaluate.
                                
                                    LISTE-VEHICULE.
                                *       recherche d'un vehicule
                                
                                        move "Immatriculation du vehicule ? "
                                             to LIBELLE-QUESTION.
                                        perform CHERCHER-VEHICULE.
                                        if VEHICULE-EXISTE = VRAI
                                           display "Vehicule recherche:"
                                           perform AFFICHAGE
                                        else
                                           display "Pas trouve"
                                        end-if.
                                
                                    LISTE-PROPRIETAIRE.
                                *       saisie du nom du proprietaire
                                *       et affichage de tous ses vehicules
                                
                                        display "Nom du Proprietaire ?"
                                        accept Proprietaire.
                                        move proprietaire to proprietaire-cherche.
                                        start F-parking key is = proprietaire
                                        invalid key 
                                          display PROPRIETAIRE-CHERCHE "sans vehicule ici"
                                        not invalid key
                                            perform boucle-proprietaire
                                        end-start.
                                
                                
                                    BOUCLE-PROPRIETAIRE.
                                *       boucle de lecture et affichage.
                                
                                        move FAUX to FF-PARKING.
                                        move PROPRIETAIRE to PROPRIETAIRE-CHERCHE.
                                        Display "Vehicules appartenant a " PROPRIETAIRE ":"
                                        perform until FF-PARKING = VRAI
                                            read F-PARKING next record into ENR-PARKING
                                            at end move VRAI to FF-PARKING
                                            not at end 
                                                if PROPRIETAIRE = PROPRIETAIRE-CHERCHE
                                                  then perform AFFICHAGE
                                                  else move VRAI to FF-PARKING
                                                end-if
                                            end-read
                                        end-perform.
                                        display "* fin de liste".
                                
                                    AFFICHAGE.
                                *       affichage de l'enregistrement 
                                
                                        display "Vehicule " PLAQUE
                                            " appartenant a " PROPRIETAIRE.
                                        display "description: " VEHICULE.
                                        if PRESENT = VRAI
                                            display "Present au parking"
                                        else
                                            display "Sorti du Parking"
                                        end-if.
                                
                                

                                PS: il y a des  if PRESENT = VRAI, parce que c'est un peu tôt pour y ajouter des indicateurs de conditions. Ca devrait être (ou du moins ça pourrait)  if EST-PRESENT, avec la déclaration

                                77   PRESENT pic X.
                                  88    EST-PRESENT value "T".
                                




                                -
                                Edité par michelbillaud 1 mai 2023 à 10:04:52

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 mai 2023 à 11:44:05

                                  PierrotLeFou a écrit:

                                  Alors, c'est moi l'aveugle. :)
                                  Est-ce que tu peux lire le fichier CSV et l'afficher correctement?
                                  As-tu corrigé les erreurs de syntaxe ou autres que d'autres t'ont mentionnées?
                                  @michelbillaud: tu m'as fait peur avec ton Cobol. :)

                                  Ouf! Ce n'est pas du Cobol ... mais c'est le genre de choses qu'on fait généralement en Cobol.
                                  @LorisBoulanger: je peux lire le  code coloré, mais pas le code en images.
                                  Corriges tes erreurs et postes ton nouveau code sans erreur.
                                  Tu pourrais également poster quelques lignes de ton fichier en format CSV au cas où quelqu'un voudrais tester.
                                  Rappelles-toi également qu'on aide les gens sur une base volontaire et que nous ne sommes pas payés.

                                  > Justement j'ai envoyé mon code qui n'est pas bon j'essaie pleins de choses je suis trop débutant je m'aide de chat gpt
                                  Essayer plein de choses et se fier à chat gpt plutôt qu'à soi-même n'est pas une bonne pratique.
                                  Ton prof ne vous apprend pas comment faire? (Peut-être qu'il ne le sait pas lui-même ...)
                                  Quand on écrit du code, on y va avec une nouvelle fonction à la fois et on teste avant de passer à la suivante.
                                  Bien sûr, il faut au moins une idée générale de ce qu'on veut faire dès le départ.

                                  > Oui mais étant dessus depuis 1 mois et demi et en essayant de faire comprendre a mon prof que c'est vraiment dur pour moi sachant que c'est l'une des premières
                                  Tu as commencé le projet il y a un mois et demi? Ou plus?
                                  Le temps que tu perds à faire comprendre des chose au prof, tu ne l'as pas pour coder.
                                  Ceci dit, je trouve que ce projet n'est pas évident pour un débutant.

                                  J'ai relu l'énoncé plus d'une fois et il y a de quoi s'y perdre en effet.

                                  Le menu devrait être plus ou moins au coeur du programme et il ne fait rien actuellement.

                                  Je suis sans doute mal placé pour le dire, mais il serait préférable que tout fonctionne bien avant de penser à utiliser Ncurses.

                                  -
                                  Edité par PierrotLeFou il y a environ 7 heures

                                  Mon fichier csv s'affiche correctement, appart la fonction entrer_parking(celle que je n'y arrive pas), je n'ai pas d'erreur de syntaxe (j'utilise replit comme notre prof nous a dit), notre prof nous donne aucune information et avant les vacances quand on bossait dessus ne cours le chercher_ville par exemple j'ai du le changer car ce n'est pas ce qu'il attendait mais on ne sait pas ce qu'il attend, il a divisé la classe en groupe avec des TP de plus au moins dur et je me suis retrouvé avec 2 autres camarades dans le + dur, les autres devaient juste faire des fonctions additions, multiplication etc.. donc oui je trouve que c'est assez déplacé de se manger une note catastrophique alors que j'ai un Tp plus compliqué à faire, les autres de ma classe les ont rendu en 1 semaine bref. 

                                  Pour le menu je sais mais je "l'attacherais" vers la fin, je préfère réussir à faire les programmes séparément avant tout, je ne pense même pas pouvoir atteindre le ncurses, je l'ai juste mis pour vous donnez l'énoncé complet

                                  michelbillaud a écrit:

                                  LorisBoulanger a écrit:

                                  Oui mais étant dessus depuis 1 mois et demi et en essayant de faire comprendre a mon prof que c'est vraiment dur pour moi sachant que c'est l'une des premières fois que je touche à du C bon... 

                                  Euh faudrait atterrir : si ton prof te donne des exercices, c'est pas pour que tu puisses montrer que tu savais déjà faire, c'est pour que tu apprennes ce que tu ne sais pas faire encore.  Et forcément, y a des problèmes, c'est pas facile, ça demande du travail, de la persévérance, bla bla bla.

                                  Ton prof le sait très bien, c'est pour ça qu'il vous a donné deux mois pour faire un truc qui prendrait quelques heures à quelqu'un qui sait faire.   Tenter de négocier un délai sur la base de "oui mais là c'est affreux vous me demandez d'apprendre à faire des trucs que je ne savais pas faire avant", ça va pas le faire.

                                  [Un des problèmes des débutants, c'est de sous-estimer, souvent d'un ordre de grandeur, le temps  qu'il leur faudra pour faire marcher le programme qu'ils envisagent d'écrire, un jour, plus tard, la veille de le rendre par exemple.  Depuis les années 60, on sait que même les pros d'arrivent pas à estimer correctement, alors les débutants...]

                                  @Pierrot : c'était un de mes exemples à étudier quand j'enseignais COBOL, au millénaire précédent, dans une autre galaxie  https://www.mbillaud.fr/SITE-PERSO-LABRI/IUT/cobol.html

                                  Cobol c'est mieux, il y a des fichiers indexés (équivalents d'un dictionnaire Python)

                                      IDENTIFICATION DIVISION.
                                  
                                      program-id. Parking.
                                      author. M Billaud.
                                  
                                  *****************************************************************
                                  *   gestion d'un parking prive
                                  *****************************************************************
                                  
                                      ENVIRONMENT DIVISION.
                                      input-output section.
                                      file-control.
                                          select F-PARKING assign to "f-parking"
                                          organization is indexed
                                          access is dynamic
                                          record key PLAQUE
                                          alternate record key PROPRIETAIRE
                                              with duplicates.
                                  
                                  *****************************************************************
                                  
                                      DATA DIVISION.
                                  
                                          FILE SECTION.
                                  
                                      fd F-PARKING.
                                      01 ENR-PARKING.
                                        02 PLAQUE     pic x(8).
                                        02 PROPRIETAIRE pic x(20).
                                        02 VEHICULE   pic x(20).
                                        02 PRESENT    pic x(1).
                                  
                                  
                                      WORKING-STORAGE SECTION.
                                  
                                  * Constantes utiles ...
                                  
                                      77 VRAI     pic x   value "T".
                                      77 FAUX     pic x   value "F".
                                      77 CHOIX    pic x.
                                  
                                  * variables et indicateurs ...
                                  
                                      77 PROPRIETAIRE-CHERCHE pic x(20).
                                      77 FF-PARKING   pic x.
                                      77 FIN-TRAVAIL  pic x.
                                      77 VEHICULE-EXISTE pic x.
                                      77 LIBELLE-QUESTION pic x(30).
                                      77 LIGNE-PARAMETRES pic x(80).
                                  
                                  *************************************************************
                                  
                                      PROCEDURE DIVISION.
                                      PRINCIPALE SECTION.
                                  
                                      TRAITEMENT.
                                  *       ouverture, boucle principale, fermeture et fin.
                                  *
                                          accept LIGNE-PARAMETRES.
                                          open i-o F-PARKING.
                                          move FAUX to FIN-TRAVAIL.
                                          perform MENU-PRINCIPAL
                                            until FIN-TRAVAIL = VRAI.
                                          close F-PARKING.
                                          stop run.       
                                  
                                  
                                      MENU-PRINCIPAL. 
                                  *       affichage du menu principal
                                  *       et aiguillage vers les differentes actions
                                  
                                          display "Entree, Sortie, Inscriptions, Listes, Fin".
                                          accept CHOIX.
                                          evaluate choix 
                                          when "E" perform entree-vehicule
                                          when "S" perform sortie-vehicule
                                          when "I" perform inscriptions
                                          when "L" perform listes
                                          when "F" move VRAI to FIN-TRAVAIL
                                          when other display "Commande non comprise" CHOIX
                                          end-evaluate.
                                      
                                      ENTREE-VEHICULE.
                                  *       demande la plaque du vehicule qui entre,
                                  *       verifie qu'il est dans le fichier et change l'indicateur
                                  *       de presence.
                                  
                                          move  "Immatriculation du vehicule qui entre ? "
                                              to LIBELLE-QUESTION.
                                          perform CHERCHER-VEHICULE.
                                          if VEHICULE-EXISTE = VRAI
                                            then if PRESENT = VRAI
                                              then display "Il est deja rentre au parking !"
                                              else move VRAI to PRESENT
                                                   rewrite ENR-PARKING
                                                   display "Entree enregistree:"
                                                   perform AFFICHAGE
                                              end-if
                                            else display "Ce vehicule n'est pas enregistre"  
                                          end-if.
                                  
                                  
                                      SORTIE-VEHICULE.
                                  *       idem pour les vehicules qui sortent.
                                  
                                          move "Immatriculation du vehicule qui sort ? "
                                              to LIBELLE-QUESTION.
                                          perform CHERCHER-VEHICULE.
                                          if VEHICULE-EXISTE = VRAI
                                            then if PRESENT = FAUX
                                              then display "Il est deja sorti du parking !"
                                              else move FAUX to PRESENT
                                                   rewrite ENR-PARKING
                                                   display "Sortie enregistree:"
                                                   perform AFFICHAGE
                                              end-if
                                            else display "Ce vehicule n'est pas enregistre"  
                                          end-if.
                                  
                                              
                                      CHERCHER-VEHICULE.
                                  *       demande la plaque d'un vehicule, et lit 
                                  *       l'enregistrement correspondant
                                  *       positionne l'indicateur VEHICULE-EXISTE
                                  
                                          display LIBELLE-QUESTION.
                                          accept PLAQUE.
                                          read F-PARKING key is PLAQUE
                                          invalid key     move FAUX to VEHICULE-EXISTE
                                          not invalid key move VRAI to  VEHICULE-EXISTE
                                          end-read.
                                  
                                      INSCRIPTIONS.
                                  *       Sous-menu des insriptions
                                  
                                          display "Inscrire, Supprimer, Rien".
                                          accept CHOIX.
                                          evaluate CHOIX
                                          when "I" perform INSCRIRE
                                          when "S" perform SUPPRIMER
                                          when "R" display "Ok"
                                          when other
                                             display "Choix non compris, retour menu principal"
                                          end-evaluate.
                                  
                                      INSCRIRE.
                                  *       saisie et enregistrement d'une inscription
                                  
                                          display "Immatriculation du vehicule a inscrire".
                                          accept PLAQUE.
                                          display "Nom du proprietaire ?".
                                          accept PROPRIETAIRE.
                                          display "Description du vehicule ?".
                                          accept VEHICULE.
                                          move FAUX to PRESENT.
                                  
                                          write ENR-PARKING
                                          invalid key
                                              display "Vehicule deja enregistre !"
                                          not invalid key 
                                              display "Vehicule enregistre: "
                                              perform AFFICHAGE
                                          end-write.
                                  
                                      SUPPRIMER.
                                  *       saisie plaque du vehicule a supprimer,
                                  *       puis suppression effective
                                  
                                          move  "Immatriculation du vehicule a supprimer ?"
                                              to LIBELLE-QUESTION.
                                          perform CHERCHER-VEHICULE.
                                          if VEHICULE-EXISTE = VRAI
                                          then display "Suppression de :"
                                              perform AFFICHAGE
                                              delete F-PARKING record
                                          else
                                               display "Je n'ai pas ce vehicule"
                                          end-if.
                                  
                                      LISTES.
                                  *       sous menu des listes: par plaque ou par proprietaire
                                  
                                          display "Vehicule, Proprietaire ?".
                                          accept CHOIX.
                                          evaluate CHOIX
                                          when "V" perform liste-vehicule
                                          when "P" perform liste-proprietaire
                                          end-evaluate.
                                  
                                      LISTE-VEHICULE.
                                  *       recherche d'un vehicule
                                  
                                          move "Immatriculation du vehicule ? "
                                               to LIBELLE-QUESTION.
                                          perform CHERCHER-VEHICULE.
                                          if VEHICULE-EXISTE = VRAI
                                             display "Vehicule recherche:"
                                             perform AFFICHAGE
                                          else
                                             display "Pas trouve"
                                          end-if.
                                  
                                      LISTE-PROPRIETAIRE.
                                  *       saisie du nom du proprietaire
                                  *       et affichage de tous ses vehicules
                                  
                                          display "Nom du Proprietaire ?"
                                          accept Proprietaire.
                                          move proprietaire to proprietaire-cherche.
                                          start F-parking key is = proprietaire
                                          invalid key 
                                            display PROPRIETAIRE-CHERCHE "sans vehicule ici"
                                          not invalid key
                                              perform boucle-proprietaire
                                          end-start.
                                  
                                  
                                      BOUCLE-PROPRIETAIRE.
                                  *       boucle de lecture et affichage.
                                  
                                          move FAUX to FF-PARKING.
                                          move PROPRIETAIRE to PROPRIETAIRE-CHERCHE.
                                          Display "Vehicules appartenant a " PROPRIETAIRE ":"
                                          perform until FF-PARKING = VRAI
                                              read F-PARKING next record into ENR-PARKING
                                              at end move VRAI to FF-PARKING
                                              not at end 
                                                  if PROPRIETAIRE = PROPRIETAIRE-CHERCHE
                                                    then perform AFFICHAGE
                                                    else move VRAI to FF-PARKING
                                                  end-if
                                              end-read
                                          end-perform.
                                          display "* fin de liste".
                                  
                                      AFFICHAGE.
                                  *       affichage de l'enregistrement 
                                  
                                          display "Vehicule " PLAQUE
                                              " appartenant a " PROPRIETAIRE.
                                          display "description: " VEHICULE.
                                          if PRESENT = VRAI
                                              display "Present au parking"
                                          else
                                              display "Sorti du Parking"
                                          end-if.
                                  
                                  

                                  PS: il y a des  if PRESENT = VRAI, parce que c'est un peu tôt pour y ajouter des indicateurs de conditions. Ca devrait être (ou du moins ça pourrait)  if EST-PRESENT, avec la déclaration

                                  77   PRESENT pic X.
                                    88    EST-PRESENT value "T".
                                  




                                  -
                                  Edité par michelbillaud il y a environ 1 heure

                                   Faut bien avoir des bases quand même mais en ayant eu juste un mémo sur comment faire des printf, scanf, le type de variable avec les % , je trouve quand même que j'ai bien perséverer TOUT seul, et que pour faire ça, donné un TP en autodidacte sans aucune connaissance en la matière en déterminant si je vais avoir mon année je trouve ça un peu cru mais bon, cependant ton fichier Cobol m'aide en aucun cas je trouve à moins que c'est moi qui ne comprend pas grand chose.



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    1 mai 2023 à 14:24:56

                                    Est-ce que tu pourrais faire un message récapitulatif disant ce que tu as fait (la lecture du fichier CSV, etc.) et ce que tu n'as pas fait (la fonction entrer_parking, etc.) ? Ce qui est intéressant, c'est surtout ce que tu n'as pas fait : c'est là qu'on pourra t'aider.

                                    Bon, j'ai un peu réfléchi. C'est une première réflexion. Je mets des algorithmes en pseudo langage pour aller plus vite...

                                    - Les parkings sont des variables de type "parking" (un typefef struct comme ceux que tu as montrés plus haut).

                                    - On crée un tableau Tparking[], un tableau contenant un certain nombre de parkings. Si le tableau est de taille fixe, il faut aussi disposer du nombre effectif de parkings : Nparking

                                    Je choisis de mettre le tableau des parkings (et leur nombre) en variable globale. Tout le monde va hurler, mais je suis à l'aise avec cette méthode. Après tout, ce fichier est en lecture seule, en consultation. (C'est pour ça que leur nom commence par une majuscule.)

                                    On va utiliser l'autre structure, que j'appelle "client", et de même je crée un tableau Tclient (et Nclient). Attention : il faut y stocker le n° du parking. Attention : les dates et heures sont des nombres, pas des chaînes de caractères, car il y a un sens à les comparer. Il peut y avoir plusieurs clients, donc il faut commencer par s'identifier avant même d'aller au menu des parkings.

                                    Programme :
                                        Fin_pgm = false
                                        Initialisation (lecture du fichier des parkings et des clients)
                                        Tant que pas Fin_pgm :
                                            n° client = Choix_clients()
                                            menu()
                                            demander si le programme est fini :
                                                si oui, Fin_pgm = true
                                        Exit

                                    Le menu Ensuite le programme affiche un menu avec les différentes fonctionnalités. Il faut permettre à l’utilisateur de • Chercher un parking • Entrer dans un parking • Sortir du parking

                                    menu () : affiche le menu
                                    Fin_menu = false
                                    Tant que pas Fin_menu :
                                        n° option = choix_menu()
                                        Cas de n° option (c'est un switch)
                                            0 : Fin_menu = true
                                            1 : chercher_parking()
                                            2 : entrer_dans_parking()
                                            3 : sortir_du_parking()
                                    (return)
                                    
                                    choix_menu(ncli) : retourne le n° de menu
                                    (On a besoin de ncli = n° de client)
                                        Afficher le texte du menu :
                                            0 : fin
                                            1 : chercher un parking
                                            2 : entrer dans un parking
                                            3 : sortir du parking
                                        Lire n° option
                                        Retourner n° option
                                    
                                    chercher_parking() : retourne l'indice du parking dans le tableau
                                        afficher_les_parkings
                                        Lire le n° de parking
                                        Retourner npar = n° de parking (ou -1 si le n° n'est pas valide)
                                    
                                    afficher_les_parkings()
                                        Pour i de 1 à Nparking
                                        Afficher i, Tparking[i].identif, Tparking[i].nom, Tparking[i].etc
                                    
                                    entrer_dans_parking(ncli, npar) :
                                    --> cette fonction sert juste à dire que le client n° ncli est dans le
                                    parking n° npar
                                        afficher_donnees_parking(npar) (affiche les données de Tparking[npar])
                                        lire_donnees_client(ncli)
                                        Tclient[ncli].numparking = npar (pour dire que le client est
                                                                         dans le parking n° npar)
                                    
                                    sortir_du_parking(npar)
                                    --> cette fonction sert juste à dire que le client n'est plus dans le parking
                                        lire_donnees_client(ncli)
                                        Tclient[ncli].numparking = -1 (il n'est dans aucun parking)
                                        prix = calcul_prix(ncli, npar)
                                    
                                    calcul_prix(i, j) : retourne le prix
                                    --> ça dépend de :
                                        - tarif du parking i
                                        - heures de départ et d'arrivée du client j
                                    (Si on n'utilise pas de variables globales, il faut
                                     passer les deux tableaux en paramètres.)

                                    Étape N°11. Supprimez toutes les variables globales en utilisant des pointeurs. 

                                    Ah, zut, ton prof est télépathe !

                                    Bon, c'est juste une première réflexion. Il me semble que tu as fait une bonne partie du début, mais un peu différemment peut-être. Est-ce que ce que tu as posté pose des problèmes et si oui, où ?  Où as-tu besoin d'aide ?

                                    Conseil : ajoute les choses petit à petit. Par exemple commence par les menus et mets-y les fonctions à appeler selon les choix du menu. Simplement, dans chaque fonction, tu mets juste un affichage (le nom de la fonction) en attendant de la remplir par des instructions.

                                    Si tu as un peu de temps, essaie de comprendre le programme Cobol de michelbillaud. Le Cobol est proche du langage humain et son programme semble faire exactement ce qu'on te demande.

                                    -
                                    Edité par robun 1 mai 2023 à 14:42:00

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 mai 2023 à 15:43:46

                                      robun a écrit:

                                      Est-ce que tu pourrais faire un message récapitulatif disant ce que tu as fait (la lecture du fichier CSV, etc.) et ce que tu n'as pas fait (la fonction entrer_parking, etc.) ? Ce qui est intéressant, c'est surtout ce que tu n'as pas fait : c'est là qu'on pourra t'aider.

                                      Bon, j'ai un peu réfléchi. C'est une première réflexion. Je mets des algorithmes en pseudo langage pour aller plus vite...

                                      - Les parkings sont des variables de type "parking" (un typefef struct comme ceux que tu as montrés plus haut).

                                      - On crée un tableau Tparking[], un tableau contenant un certain nombre de parkings. Si le tableau est de taille fixe, il faut aussi disposer du nombre effectif de parkings : Nparking

                                      Je choisis de mettre le tableau des parkings (et leur nombre) en variable globale. Tout le monde va hurler, mais je suis à l'aise avec cette méthode. Après tout, ce fichier est en lecture seule, en consultation. (C'est pour ça que leur nom commence par une majuscule.)

                                      On va utiliser l'autre structure, que j'appelle "client", et de même je crée un tableau Tclient (et Nclient). Attention : il faut y stocker le n° du parking. Attention : les dates et heures sont des nombres, pas des chaînes de caractères, car il y a un sens à les comparer. Il peut y avoir plusieurs clients, donc il faut commencer par s'identifier avant même d'aller au menu des parkings.

                                      Programme :
                                          Fin_pgm = false
                                          Initialisation (lecture du fichier des parkings et des clients)
                                          Tant que pas Fin_pgm :
                                              n° client = Choix_clients()
                                              menu()
                                              demander si le programme est fini :
                                                  si oui, Fin_pgm = true
                                          Exit

                                      Le menu Ensuite le programme affiche un menu avec les différentes fonctionnalités. Il faut permettre à l’utilisateur de • Chercher un parking • Entrer dans un parking • Sortir du parking

                                      menu () : affiche le menu
                                      Fin_menu = false
                                      Tant que pas Fin_menu :
                                          n° option = choix_menu()
                                          Cas de n° option (c'est un switch)
                                              0 : Fin_menu = true
                                              1 : chercher_parking()
                                              2 : entrer_dans_parking()
                                              3 : sortir_du_parking()
                                      (return)
                                      
                                      choix_menu(ncli) : retourne le n° de menu
                                      (On a besoin de ncli = n° de client)
                                          Afficher le texte du menu :
                                              0 : fin
                                              1 : chercher un parking
                                              2 : entrer dans un parking
                                              3 : sortir du parking
                                          Lire n° option
                                          Retourner n° option
                                      
                                      chercher_parking() : retourne l'indice du parking dans le tableau
                                          afficher_les_parkings
                                          Lire le n° de parking
                                          Retourner npar = n° de parking (ou -1 si le n° n'est pas valide)
                                      
                                      afficher_les_parkings()
                                          Pour i de 1 à Nparking
                                          Afficher i, Tparking[i].identif, Tparking[i].nom, Tparking[i].etc
                                      
                                      entrer_dans_parking(ncli, npar) :
                                      --> cette fonction sert juste à dire que le client n° ncli est dans le
                                      parking n° npar
                                          afficher_donnees_parking(npar) (affiche les données de Tparking[npar])
                                          lire_donnees_client(ncli)
                                          Tclient[ncli].numparking = npar (pour dire que le client est
                                                                           dans le parking n° npar)
                                      
                                      sortir_du_parking(npar)
                                      --> cette fonction sert juste à dire que le client n'est plus dans le parking
                                          lire_donnees_client(ncli)
                                          Tclient[ncli].numparking = -1 (il n'est dans aucun parking)
                                          prix = calcul_prix(ncli, npar)
                                      
                                      calcul_prix(i, j) : retourne le prix
                                      --> ça dépend de :
                                          - tarif du parking i
                                          - heures de départ et d'arrivée du client j
                                      (Si on n'utilise pas de variables globales, il faut
                                       passer les deux tableaux en paramètres.)

                                      Étape N°11. Supprimez toutes les variables globales en utilisant des pointeurs. 

                                      Ah, zut, ton prof est télépathe !

                                      Bon, c'est juste une première réflexion. Il me semble que tu as fait une bonne partie du début, mais un peu différemment peut-être. Est-ce que ce que tu as posté pose des problèmes et si oui, où ?  Où as-tu besoin d'aide ?

                                      Conseil : ajoute les choses petit à petit. Par exemple commence par les menus et mets-y les fonctions à appeler selon les choix du menu. Simplement, dans chaque fonction, tu mets juste un affichage (le nom de la fonction) en attendant de la remplir par des instructions.

                                      Si tu as un peu de temps, essaie de comprendre le programme Cobol de michelbillaud. Le Cobol est proche du langage humain et son programme semble faire exactement ce qu'on te demande.

                                      -
                                      Edité par robun il y a environ 1 heure

                                      C'est exact je suis à l'étape 9 , j'ai réussis à faire mon entrer_parking mais je n'arrive pas à mettre des valeurs dans un tableau client, avec des pointeurs, en reprenant par exemple l'identifiant du parking pour le mettre dans le tableau client, et ensuite avec les variables heure, date , immatriculation etc.. les mettre aussi dans le tableau client, je ne sais pas du tout comment initialisé la chose, dans mon main aussi comment l'initialisé. et j'ai du mal a comprendre avec les clients* , clients , etc.. etc.. je voudrais à la fin de mon entrer_parking mettre des données dans le tableau_client (qui est vide) et les affichés pour voir si tout fonctionne... Surtout que je dois remplir seulement certaines informations dans le tableau_client et je le complèterai avec la fonction sortir_parking, donc comment initialisé et créer tout ça , et remplir seulement la moitié en laissant un vide à certains emplacement de la structre, j'espère m'être fait comprendre

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        1 mai 2023 à 16:30:13

                                        Tes posts sont difficilement lisible ça n'aide pas à t'aider Ça peut même décourager. Evites de citer des posts complet (Les citations ça sert juste pour citer une partie d'un post auquel tu veux répondre).

                                        J'ai regardé tes premières ligne de code de la fonction main :

                                        La première création de ton tableau sur la pile :

                                        ligneDEnregistrement tableau_enregistrement[MAX_LIGNES];

                                        Et hop un débordement de pile (ton tableau est trop grand pour être logé sur la pile (A moins que tu ai augmenté la taille de la pile mais ce n'est pas courant).

                                        La deuxième

                                        clients* mon_client = &mon_client;

                                        Alors là J'ai pas compris ? Tu veux donner à une variable la valeur de sa propre adresse ?

                                        Edit : (Pour tester la suite  j'ai augmenté la taille de la pile), La lecture du fichier et l'affichage sans en regarder les détails semble fonctionner.

                                        -
                                        Edité par rouIoude 1 mai 2023 à 16:53:11

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        ...
                                          1 mai 2023 à 17:04:16

                                          LorisBoulanger a écrit:

                                          C'est exact je suis à l'étape 9 , j'ai réussis à faire mon entrer_parking mais je n'arrive pas à mettre des valeurs dans un tableau client, avec des pointeurs, en reprenant par exemple l'identifiant du parking pour le mettre dans le tableau client, et ensuite avec les variables heure, date , immatriculation etc.. les mettre aussi dans le tableau client [...]

                                          Dans l'énoncé il est question d'utiliser des pointeurs pour éviter d'utiliser des variables globales. Je pense que l'idée est la suivante.

                                          Je définis un parking courant :

                                          parking parking_courant;   // où 'parking' est le nom de la structure

                                          Au début du programme, j'ai mis toutes les données du fichier dans un tableau tparking[]. Je recopie les valeurs du parking d'indice i dans 'parking_courant' :

                                          parking_courant.truc   = tparking[i].truc;
                                          parking_courant.machin = tparking[i].machin;
                                          parking_courant.bidule = tparking[i].bidule;
                                          

                                          La variable 'parking_courant' sera passée en paramètre d'un grand nombre de fonctions. Elle prend quelques octets. Eh bien souvent, pour optimiser, on passe en paramètre non pas la structure mais un pointeur sur la structure.

                                          Du coup, je vais plutôt définir :

                                          parking *pt_parking ;   // où 'parking' est le nom de la structure

                                          Ce n'est pas le parking courant, mais un pointeur sur le parking courant.

                                          Recopie des données :

                                          pt_parking->truc   = tparking[i].truc;
                                          pt_parking->machin = tparking[i].machin;
                                          pt_parking->bidule = tparking[i].bidule;

                                          On peut peut-être même faire :

                                          pt_parking = & tparking|i];  // à confirmer...

                                          C'est ce pointeur qui sera envoyé en paramètre des fonctions.

                                          Pareil pour le client : on peut définir une varaible pt_client qui pointe vers le client courant (une structure).

                                          LorisBoulanger a écrit:

                                          [...] et ensuite avec les variables heure, date , immatriculation etc.. les mettre aussi dans le tableau client, je ne sais pas du tout comment initialisé la chose, dans mon main aussi comment l'initialisé

                                          Je ne suis pas sûr de comprendre. Pour moi, l'initialisation est à faire une fois pour toutes au début du programme : on lit les fichiers et on remplit les tableaux. Je crois que tu sais lire les fichiers, eh bien pour chaque ligne du fichier, initialise les tableaux.

                                          /* On suppose que le fichier existe */
                                          bool fin_fichier = faux
                                          int i = 0;
                                          Tant que pas fin_fichier :
                                              lire_ligne_fichier(&identifiant, &date, &heure, &etc)
                                              Si fin de fichier :
                                                  fin_fichier = true
                                                  
                                              Else
                                                  tparking[i].identifiant = identifiant;
                                                  tparking[i].date = date
                                                  tparking[i].heure = heure
                                                  tparking[i].etc = etc
                                                  i++
                                              Fin Si
                                          Fin Tant que
                                          nombre_de_parking = i

                                          -
                                          Edité par robun 1 mai 2023 à 17:08:41

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            1 mai 2023 à 17:54:55

                                            Eviter les variables global, ça semble résolu, il n'y a pas de variable global dans ton code.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            ...
                                              1 mai 2023 à 18:07:38

                                              je vais essayer de vous faire comprendre ce que je veux, par exemple j'essaie de faire quelque chose comme ça

                                              client1->identifiant = tableau_enregistrement[ligne_info].identifiant;
                                              client1->immatriculation = immatriculation;

                                              où ligne_info désigne l'endroit où il y a l'identifiant du parking que je veux copie dans client1

                                              donc dans mon main je fais comme vous m'expliquez 

                                              int main() {
                                                
                                                  // initialisation des structures et des variables
                                                  ligneDEnregistrement tableau_enregistrement[MAX_LIGNES];
                                                  clients *mon_client ;
                                                  int nb_enregistrement;
                                                
                                                  // compte le nombre de ligne/enregistrement du fichier csv
                                                  nb_enregistrement = lecture_csv("exemple.csv", tableau_enregistrement, MAX_LIGNES);
                                                  entrer_parking(tableau_enregistrement, nb_enregistrement, mon_client);

                                              donc j'ai créer le pointeur mon_client, est dans ma fonction entrer_parking je le met en variable comme cela : 

                                              int entrer_parking(ligneDEnregistrement tableau_enregistrement[], int nb_lignes, clients* client1)

                                              je sais que ce n'est pas bon mais c'est ce que je voudrais essayer de faire ...


                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                1 mai 2023 à 18:14:05

                                                Donc tu veux écrire la fonction entrer_parking ? Et elle est censé faire quoi cette fonction (J'ai pas envie de me retaper tout le sujet) ?

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                ...
                                                  1 mai 2023 à 18:20:11

                                                  rouIoude a écrit:

                                                  Donc tu veux écrire la fonction entrer_parking ? Et elle est censé faire quoi cette fonction (J'ai pas envie de me retaper tout le sujet) ?


                                                  l'énoncé : Une fois que le client a validé son choix de parking, le panneau d’affichage lui est présenté avec un rappel de l’adresse et d’autres informations utiles. A l’entrée, il y a une lecture automatique de la plaque d’immatriculation (saisie par l’utilisateur ici). Le parking stocke pour chaque entrée, le numéro du parking, la plaque du véhicule, la date et l’heure d’entrée dans une structure clients qui prévoit une date et heure de sortie et le montant à régler qui seront complétées à la sortie du parking. 

                                                  du coup voici la fonction pour l'instant :

                                                  int entrer_parking(ligneDEnregistrement tableau_enregistrement[], int nb_lignes, clients* client1){
                                                      char immatriculation[MAX_CHARS];
                                                      char date_e[MAX_CHARS];
                                                      char heure_e[MAX_CHARS];
                                                      int ligne_info;
                                                      int compteur_enregistre = 0;
                                                      int montant = 0;
                                                    
                                                      // lancement de chercher_parking et recupere la ligne d'informations du parking dans le fichier csv
                                                      ligne_info = chercher_parking(tableau_enregistrement, nb_lignes);
                                                  
                                                      // on verifie si chercher_parking renvoie 0 ou i en valeur
                                                      if (ligne_info == 0){
                                                        return 0;
                                                      }
                                                          
                                                      // affichage des informations sur le parking choisi
                                                      printf("\nBienvenue dans le parking %s situé à l'adresse suivante : %s\n", tableau_enregistrement[ligne_info].nom, tableau_enregistrement[ligne_info].adresse);
                                                  
                                                      // lecture automatique de la plaque d'immatriculation
                                                      printf("\nVeuillez scanner votre plaque d'immatriculation : \n");
                                                      scanf("%s", immatriculation);
                                                  
                                                      // stockage des infos dans le tableau_client
                                                      printf("\nQuelle est la date d'aujourd'hui ?\n");
                                                      scanf("%s", date_e);
                                                      printf("Quelle est l'heure actuelle ?\n");
                                                      scanf("%s", heure_e);
                                                    
                                                      client1->identifiant = tableau_enregistrement[ligne_info].identifiant;
                                                      client1->immatriculation = immatriculation;
                                                    
                                                      return 0;  // quitter la fonction 

                                                  la fonction chercher_parking propose les parkings chacun leur tour pour une ville donnée, et l'utilisateur choisi ou non de verrouillez le parking, ce qui décrémente une place du parking (que je n'arrive pas a actualiser sur le fichier csv mais ce n'est pas le problème), et si les parkings ont tous été parcourus pour la ville donnée, la fonction s'arrete 

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    1 mai 2023 à 19:14:16

                                                        client1->identifiant = tableau_enregistrement[ligne_info].identifiant;
                                                        client1->immatriculation = immatriculation;

                                                    Donc tu as du avoir une erreur à la compilation ? Car tu essais d'affecter une chaîne de caractère à une autre avec l'opérateur '=' or ça ne marche pas comme cela, pour affecter une chaîne de caractère à une autre on utilise la fonction strcpy. (entre parenthèses à mon avis l'identifiant du Parking, n'a rien à voir avec l'identifiant du Client). 

                                                    Aussi tu envois un pointeur Client non initialisé à ta fonction, j'ai bien peur que ça essais d'écrire a des endroits non autorisé.

                                                    En passant : Quand je veux me garer dans une grande ville que je ne connais pas, Je cherche d'abord le parking et seulement ensuite je rentre dans le parking. Donc j'aurais fait Chercher_Parking qui m'aurait trouvé un parking et une fois identifié je serais rentré dans le parking, j'aurais donc envoyé l'adresse du parking sélectionné à la fonction Entrer_Parking.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    ...
                                                      1 mai 2023 à 19:19:17

                                                      rouIoude a écrit:

                                                          client1->identifiant = tableau_enregistrement[ligne_info].identifiant;
                                                          client1->immatriculation = immatriculation;

                                                      Donc tu as du avoir une erreur à la compilation ? Car tu essais d'affecter une chaîne de caractère à une autre avec l'opérateur '=' or ça ne marche pas comme cela, pour affecter une chaîne de caractère à une autre on utilise la fonction strcpy. (entre parenthèses à mon avis l'identifiant du Parking, n'a rien à voir avec l'identifiant du Client). 

                                                      Aussi tu envois un pointeur Client non initialisé à ta fonction, j'ai bien peur que ça essais d'écrire a des endroits non autorisé.

                                                      En passant : Quand je veux me garer dans une grande ville que je ne connais pas, Je cherche d'abord le parking et seulement ensuite je rentre dans le parking. Donc j'aurais fait Chercher_Parking qui m'aurait trouvé un parking et une fois identifié je serais rentré dans le parking, j'aurais donc envoyé l'adresse du parking sélectionné à la fonction Entrer_Parking.

                                                      Oui avec le = ça ne marche pas mais avec strcpy j'ai un problème de segmentation et je tourne en rond en essayant tous et n'importe quoi, je ne sais pas comment initialisé un pointeur dans ma fonction aussi , et en vrai c'est pas grave de mettre l'adresse du parking j'ai d'autres problèmes à résoudre mdr...

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        1 mai 2023 à 19:22:45

                                                        Problème de segmentation :

                                                        rouIoude a écrit:

                                                        Aussi tu envois un pointeur Client non initialisé à ta fonction, j'ai bien peur que ça essais d'écrire a des endroits non autorisé.

                                                        PS : Comme je te l'ai déjà dit, arrête de citer les posts complet ! 

                                                        -
                                                        Edité par rouIoude 1 mai 2023 à 19:23:59

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        ...
                                                          1 mai 2023 à 19:38:32

                                                          > Oui avec le = ça ne marche pas mais avec strcpy j'ai un problème de segmentation et je tourne en rond en essayant tous et n'importe quoi, je ne sais pas comment initialisé un pointeur dans ma fonction aussi , et en vrai c'est pas grave de mettre l'adresse du parking j'ai d'autres problèmes à résoudre mdr...

                                                          Il ne s'agit pas de faire n'importe quoi.

                                                          Tu prends un problème, et tu t'y attaques sérieusement jusqu'à

                                                          • ce que le problème soit résolu
                                                          • tu aies bien compris quel était le problème, et pourquoi ce que tu as fait est une solution.
                                                          prenons
                                                          > je ne sais pas comment initialisé un pointeur dans ma fonction aussi
                                                          • de quelle fonction s'agit -il ?
                                                          • quel pointeur ?
                                                          • l'initialiser pour en faire quoi ?
                                                          Comme quelqu'un l'a dit plus haut : faut pas partir à écrire plein de code, et chercher à le faire marcher ensuite.
                                                          ---
                                                          J'aime bien la question
                                                          > Étape N°11. Supprimez toutes les variables globales en utilisant des pointeurs.

                                                          En fait il y a une solution simple :

                                                          on met toutes les variables globales dans une structure "contexte" déclarée dans le main, et on passe l'adresse du contexte à toutes les fonctions :-)




                                                          -
                                                          Edité par michelbillaud 1 mai 2023 à 19:49:27

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            1 mai 2023 à 20:29:04

                                                            • de quelle fonction s'agit -il ? main et entrer_parking 
                                                            • quel pointeur ? je voudrais justement en creer un et savoir mettre des données dedans 
                                                            • l'initialiser pour en faire quoi ? le remplir avec mes variables  et les données que j'ai besoin sans le compléter entièrement vu que sortir_parking doit aussi ajouter des données dans ce pointeur
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              1 mai 2023 à 20:48:54

                                                              Un pointeur tu peux "le remplir" qu'avec une adresse. Par contre tu peut t'en servir pour remplir la mémoire où il pointe (dans ton cas un Client) mais encore faut-il que cette mémoire soit réservé et que le pointeur pointe dessus. Le tien pointeur il ne pointe nul part (on dit qu'il n'est pas initialisé. Mais tu n'as peut-être pas lu de cours sur les pointeurs ? Ça serait nécessaire si tu comptes les utiliser.

                                                              (Pour tester ta fonction, j'ai envoyé l'adresse d'un Client à la fonction).

                                                              -
                                                              Edité par rouIoude 1 mai 2023 à 20:51:35

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              ...

                                                              [Erreur]TP licence info 1ere en C Parking

                                                              × 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