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
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;
}
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.
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...
@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.
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
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.
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
Le Tout est souvent plus grand que la somme de ses parties.
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...]
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
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...]
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.
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.
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
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 :
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.
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' :
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.
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
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 ...
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
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.
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...
> 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 :-)
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
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).
× 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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.