Language C: Gestion des véhicules
Fermé
Salim
-
20 déc. 2021 à 02:40
Bouba_0236 Messages postés 1 Date d'inscription mardi 7 juin 2022 Statut Membre Dernière intervention 12 juin 2022 - 12 juin 2022 à 22:39
Bouba_0236 Messages postés 1 Date d'inscription mardi 7 juin 2022 Statut Membre Dernière intervention 12 juin 2022 - 12 juin 2022 à 22:39
A voir également:
- Language C: Gestion des véhicules
- Language binaire - Guide
- Windows 7 language pack french download offline ✓ - Forum Windows 7
- Office 2016 language pack french 64-bit ✓ - Forum Bureautique
- Anno 1404 change language ✓ - Forum Jeux vidéo
- Windows display language french - Guide
8 réponses
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié le 20 déc. 2021 à 12:27
Modifié le 20 déc. 2021 à 12:27
Bonjour Salim,
La logique du programme que l'on te demande de faire n'est pas très difficile, dans le sens où il n'y a pas d'algorithme complexe à concevoir, ni à implémenter.
Si tu as appris à écrire un modèle conceptuel de données, tu devrais certainement le faire avec les indications de l'énoncé, afin d'avoir une référence claire.
Sinon, le but de l'exercice est, je pense, de montrer que tu sais utiliser des struct et les manipuler dans des structures de données permettant d'insérer, retirer, modifier ou récupérer ces éléments. Les structures de données contenant les éléments pourront être des tableaux ou des listes chaînées selon tes choix de conception ou ce que l'on te demande. Le reste, ce sont des fioritures (afficher un menu, prendre une entrée de l'utilisateur et l'exploiter) ou de la pure mise en oeuvre, saisie, validation de saisie ou des données,...
Tu pourrais commencer par créer tes types struct selon les indications de l'énoncé.
Ensuite, crée tes structures de données et les primitives permettant de les gérer.
Dal
La logique du programme que l'on te demande de faire n'est pas très difficile, dans le sens où il n'y a pas d'algorithme complexe à concevoir, ni à implémenter.
Si tu as appris à écrire un modèle conceptuel de données, tu devrais certainement le faire avec les indications de l'énoncé, afin d'avoir une référence claire.
Sinon, le but de l'exercice est, je pense, de montrer que tu sais utiliser des struct et les manipuler dans des structures de données permettant d'insérer, retirer, modifier ou récupérer ces éléments. Les structures de données contenant les éléments pourront être des tableaux ou des listes chaînées selon tes choix de conception ou ce que l'on te demande. Le reste, ce sont des fioritures (afficher un menu, prendre une entrée de l'utilisateur et l'exploiter) ou de la pure mise en oeuvre, saisie, validation de saisie ou des données,...
Tu pourrais commencer par créer tes types struct selon les indications de l'énoncé.
Ensuite, crée tes structures de données et les primitives permettant de les gérer.
Dal
voici les seuls indications que donne mon profs. Je suis vraiment bete à ne pas avoir tout mis.
4.1 Conseils
Réfléchissez d'abord sur papier.
Faites des dessins, des schémas, etc.
Pour chaque fonctionnalité, déterminez d'abord sur papier ce que vous comptez faire
avec :
Qu'est-ce que la fonctionnalité prend en entrée ;
ce qu'elle renvoie en sortie ;
y a-t-il un état global du programme (via des variables globales) qui est modié ?
Attaquez-vous à une fonctionnalité à la fois (par personne).
Certaines fonctionnalités sont plus diffciles à programmer que d'autres : répartissez-vous
les tâches en fonction de vos capacités.
Mais il faut aussi programmer ensemble de temps en temps souvent celui qui est à
côté du programmeur peut aider à repérer certaines erreurs. . .
Certaines fonctionnalités s'appuient sur des sous-fonctionnalités communes : identifiez es à l'avance (faites des dessins et schémas !) pour pouvoir les programmer et permettre
d'accélérer votre développement.
Il vaut mieux un programme avec une partie des fonctionnalités implantées, mais qui
compile et qui tourne, plutôt qu'un programme avec tout un tas de fonctionnalités à
moitié réalisées.
Une bonne façon de s'organiser est de faire un squelette , par exemple en programmant tous les affichages pour chaque fonction du programme, et en marquant au début
Fonctionnalité pas encore programmé .. Cela vous permettra de voir comment votre
programme s'articule.
De préférence, utilisez plusieurs chiers si possible (au moins 2) :
1. Définissez vos structures de données (en particulier les types struct) dans un chier
en-tête (par exemple : plaques_immatriculation.h) ;
2. dans ce même chier en-tête, écrire les prototypes de fonctions que vous allez utiliser ;
3. écrivez le code de vos fonctions dans un chier C (par exemple plaques_immatriculation.c).
Pour des raisons d'organisation, vous voudrez peut-être utiliser plusieurs chiers
C, par exemple :
menus.c : contient le code de toutes les fonctions qui achent un menu à
l'écran ;
entrees_sorties.c : contient toutes les fonctions permettant de saisir des
infos ou acher celles déjà stockées ;
plaques_immatriculation.c : toutes les autres fonctions.
Code::Blocks vous permet d'ajouter plusieurs chiers C au même projet.
4.1 Conseils
Réfléchissez d'abord sur papier.
Faites des dessins, des schémas, etc.
Pour chaque fonctionnalité, déterminez d'abord sur papier ce que vous comptez faire
avec :
Qu'est-ce que la fonctionnalité prend en entrée ;
ce qu'elle renvoie en sortie ;
y a-t-il un état global du programme (via des variables globales) qui est modié ?
Attaquez-vous à une fonctionnalité à la fois (par personne).
Certaines fonctionnalités sont plus diffciles à programmer que d'autres : répartissez-vous
les tâches en fonction de vos capacités.
Mais il faut aussi programmer ensemble de temps en temps souvent celui qui est à
côté du programmeur peut aider à repérer certaines erreurs. . .
Certaines fonctionnalités s'appuient sur des sous-fonctionnalités communes : identifiez es à l'avance (faites des dessins et schémas !) pour pouvoir les programmer et permettre
d'accélérer votre développement.
Il vaut mieux un programme avec une partie des fonctionnalités implantées, mais qui
compile et qui tourne, plutôt qu'un programme avec tout un tas de fonctionnalités à
moitié réalisées.
Une bonne façon de s'organiser est de faire un squelette , par exemple en programmant tous les affichages pour chaque fonction du programme, et en marquant au début
Fonctionnalité pas encore programmé .. Cela vous permettra de voir comment votre
programme s'articule.
De préférence, utilisez plusieurs chiers si possible (au moins 2) :
1. Définissez vos structures de données (en particulier les types struct) dans un chier
en-tête (par exemple : plaques_immatriculation.h) ;
2. dans ce même chier en-tête, écrire les prototypes de fonctions que vous allez utiliser ;
3. écrivez le code de vos fonctions dans un chier C (par exemple plaques_immatriculation.c).
Pour des raisons d'organisation, vous voudrez peut-être utiliser plusieurs chiers
C, par exemple :
menus.c : contient le code de toutes les fonctions qui achent un menu à
l'écran ;
entrees_sorties.c : contient toutes les fonctions permettant de saisir des
infos ou acher celles déjà stockées ;
plaques_immatriculation.c : toutes les autres fonctions.
Code::Blocks vous permet d'ajouter plusieurs chiers C au même projet.
je pense il faut que j'identifie les fonctions. Juste ce passage la je ne comprends pas très bien...
Qu'est-ce que la fonctionnalité prend en entrée ;
ce qu'elle renvoie en sortie ;
y a-t-il un état global du programme (via des variables globales) qui est modifié ?
Attaquez-vous à une fonctionnalité à la fois (par personne).
Qu'est-ce que la fonctionnalité prend en entrée ;
ce qu'elle renvoie en sortie ;
y a-t-il un état global du programme (via des variables globales) qui est modifié ?
Attaquez-vous à une fonctionnalité à la fois (par personne).
Merci beaucoup. J'apprécie la pédagogie dans ce forum, contrairement à d'autres où on se fait agresser. Par contre je n'ai pas appris à écrire un modèle conceptuel de données. On fait des algorigrammes avant chaque programme, même sous programme. Sinon on travaille la logique sur feuille. Seulement ça m'a fait du bien de demander ,sincèrement ça m'éclairci un peu. Le brouillard se dissipe. Légèrement mais surement. Comme je vous l'ai dit, ce projet doit se faire en binôme, mais j'ai personne, je me retrouve seul. Je comprends pourquoi les profs nous ont obligés à trouver un partenaire. Mais j'ai espoir de le réussir ce projet. A près c'est sur que je serai pas efficace seul, si on était 2 on trouverai une solution rapidement. En fait, selon vous est ce que je devrai identifier les acteurs, les fonctionnalités et les fonctions d'abord? C'est ça que je craint j'ai peur d'en oublier. Pour les structures, ça devrait aller.
Je suis bête, je demande l'avis des autres pour des pistes de recherches mais je ne mets pas tout, où ai-je la tête bon sang!
Travail demandé:
Les fonctionnalités qui doivent être assurées par ce logiciel sont les suivantes :
Permettre la saisie des informations d'une personne ;
Permettre la suppression des informations d'une personne ;
Cela peut potentiellement entraîner la suppression d'un véhicule s'il n'avait qu'un ou
une propriétaire.
permettre la saisie des informations d'un véhicule ;
Comme indiqué précédemment, si le ou la propriétaire du véhicule n'est pas déjà dans
la base, alors il faut la créer.
permettre la suppression des informations d'un véhicule ;
Cela implique supprimer ce véhicule de la liste des véhicules possédés par son ou sa
propriétaire.
Afficher l'adresse d'une personne ;
Afficher la liste des véhicules possédés par une personne ;
Afficher les informations d'un véhicule d'après son identifant SIV.
Travail demandé:
Les fonctionnalités qui doivent être assurées par ce logiciel sont les suivantes :
Permettre la saisie des informations d'une personne ;
Permettre la suppression des informations d'une personne ;
Cela peut potentiellement entraîner la suppression d'un véhicule s'il n'avait qu'un ou
une propriétaire.
permettre la saisie des informations d'un véhicule ;
Comme indiqué précédemment, si le ou la propriétaire du véhicule n'est pas déjà dans
la base, alors il faut la créer.
permettre la suppression des informations d'un véhicule ;
Cela implique supprimer ce véhicule de la liste des véhicules possédés par son ou sa
propriétaire.
Afficher l'adresse d'une personne ;
Afficher la liste des véhicules possédés par une personne ;
Afficher les informations d'un véhicule d'après son identifant SIV.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
21 déc. 2021 à 10:32
21 déc. 2021 à 10:32
Salut Salim,
Le modèle conceptuel de données, c'est un type de schéma où l'on regroupe des données par entités et on définit les relations entre elles et les "cardinalités" (un véhicule a 2 propriétaires au plus). Si tu n'as pas appris à le faire mais qu'on t'a appris à travailler à partir de schémas, fais tes schémas.
Le but est que tu t'appropries les données de l'énoncé en les reformulant sous une forme synthétique et complète.
Dans les données de chaque élément, tu devrais prévoir un champ ID qui va identifier de façon unique l'instance d'élément en question. Cet identifiant unique peut être l'immatriculation pour un véhicule puisqu'il est sensé être unique, mais c'est plus pratique que ce soit un entier. Cet entier est la clef permettant d'identifier le véhicule possédé par une personne dans les données concernant cette personne. Comme une personne peut avoir au plus 5 véhicules, tu pourras prévoir dans ta struct personne un champ qui soit un tableau de 5 entiers pouvant contenir les ID des véhicules qu'il possède et un autre champ pour stocker le nombre de véhicules.
Dal
Le modèle conceptuel de données, c'est un type de schéma où l'on regroupe des données par entités et on définit les relations entre elles et les "cardinalités" (un véhicule a 2 propriétaires au plus). Si tu n'as pas appris à le faire mais qu'on t'a appris à travailler à partir de schémas, fais tes schémas.
Le but est que tu t'appropries les données de l'énoncé en les reformulant sous une forme synthétique et complète.
Dans les données de chaque élément, tu devrais prévoir un champ ID qui va identifier de façon unique l'instance d'élément en question. Cet identifiant unique peut être l'immatriculation pour un véhicule puisqu'il est sensé être unique, mais c'est plus pratique que ce soit un entier. Cet entier est la clef permettant d'identifier le véhicule possédé par une personne dans les données concernant cette personne. Comme une personne peut avoir au plus 5 véhicules, tu pourras prévoir dans ta struct personne un champ qui soit un tableau de 5 entiers pouvant contenir les ID des véhicules qu'il possède et un autre champ pour stocker le nombre de véhicules.
Dal
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
22 déc. 2021 à 01:22
22 déc. 2021 à 01:22
Voilà un exemple pour te donner une idée :
C'est un exemple illustratif rapide, qui compile sans erreurs ni wainings, mais pas vraiment testé.
La façon la plus correcte de le faire serait sans doutes d'utiliser des listes chaînées.
Avec le type struct element les primitives de manipulation de listes pourront être utilisables sans changements que tu gères une liste de VEHICULEs ou de PROPRIETAIREs, car elles manipuleront juste des pointeurs de type struct element :-)
- utilisant plutôt un ID de personne comme clef d'un élément véhicule,
- un type struct element commun permettant de traiter les deux types d'éléments avec un enum pour les distinguer et une union pour les stocker
- des listes constituées de simples tableaux
- un exemple de fonction d'ajout gérant les deux types de listes
#define MAX_VEHICULES 100 #define MAX_PROPRIETAIRES 200 enum type_element { VEHICULE, PROPRIETAIRE }; struct vehicule { int ID; char SIV[10]; int proprietaires[2]; int nb_prop; }; struct proprietaire { int ID; char nom[256]; char prenom[256]; }; struct element { enum type_element type; union { struct vehicule v; struct proprietaire p; }; }; int ajouter_element(enum type_element type, struct element liste[], struct element el, int * nb_el, int * cur_ID, int foreign_key) { int faire_ajout = 0; switch (type) { case PROPRIETAIRE: /* TODO: Vérifier que l'on n'ajoute pas deux fois la même personne */ faire_ajout = 1; el.p.ID = *cur_ID++; break; case VEHICULE: /* TODO: Vérifier que l'on n'ajoute pas deux fois le même véhicule et * que l'on n'ajoute pas plus de 2 véhicules pour un propriétaire ni * plus de 5 véhicules pour un propriétaire */ faire_ajout = 1; el.v.ID = *cur_ID++; el.v.proprietaires[el.v.nb_prop++] = foreign_key; break; } if (faire_ajout) { liste[*nb_el++] = el; return *cur_ID; } else return 0; } int main(void) { struct element vehicules[MAX_VEHICULES] = { 0 }; struct element proprietaires[MAX_PROPRIETAIRES] = { 0 }; int nb_vehicules = 0; int nb_proprietaires = 0; int cur_IDV = 0; int cur_IDP = 0; struct element duponte = { .type = PROPRIETAIRE, .p.nom = "DUPONT", .p.prenom = "ERIC" }; int id_dupont_eric = ajouter_element(PROPRIETAIRE, proprietaires, duponte, &nb_proprietaires, &cur_IDP, -1); if (id_dupont_eric) { struct element voit_duponte = { .type = VEHICULE, .v.SIV = "AB-1234-CD" }; ajouter_element(VEHICULE, vehicules, voit_duponte, &nb_vehicules, &cur_IDV, id_dupont_eric); } return 0; }
C'est un exemple illustratif rapide, qui compile sans erreurs ni wainings, mais pas vraiment testé.
La façon la plus correcte de le faire serait sans doutes d'utiliser des listes chaînées.
Avec le type struct element les primitives de manipulation de listes pourront être utilisables sans changements que tu gères une liste de VEHICULEs ou de PROPRIETAIREs, car elles manipuleront juste des pointeurs de type struct element :-)
Salim
>
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
22 déc. 2021 à 01:50
22 déc. 2021 à 01:50
Vôtre exemple est très intéressant. Je comprends avec votre exemple ce que vous avez dit tout à l'heure et la nécessité de prévoir un champs ID
Salim
>
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
22 déc. 2021 à 01:55
22 déc. 2021 à 01:55
En fait il est claire que je dois utiliser les structures c'est le meilleur moyen et le plus simple pour pas s'embrouiller et résoudre vite et logiquement ce problème. Mais vous voyez les fonctionnalités dans l'énoncé ci dessus ? Vous croyez que je devrai continuer à faire pr chacune identifier ce qu'elles prennent en entrée et en sortie ? Car un moment ils me disent "voir si il a des variables globale qui sont modifié, pour ces fonctionnalités. En fait vous croyez je dois d'abord organiser ces fonctionnalités dans les structures, d'abord avant de s'occuper à programmer chacune d'elle selon les instructions de l'énoncé ? Dans votre exemple l'état global n'est pas modifié mais je sais que en allant plus loin avec ces fonctionnalités elles vont être modifiée les entité globale il faut que je fasse attention
Salim
>
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
22 déc. 2021 à 12:06
22 déc. 2021 à 12:06
Pouvez vous aussi m'expliquer svp c'est quoi des primitives de liste. Je vois ce que c'est car je reconnais mais c'est bizarre j'ai jamais entendu appeler comme ça
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
>
Salim
Modifié le 22 déc. 2021 à 12:32
Modifié le 22 déc. 2021 à 12:32
c'est une façon de désigner les fonctions de base (primitive) qui permettent la création et manipulation de la liste :
par exemple :
...
Typiquement, tu devrais mettre tout cela dans un module de gestion de la liste (par exemple liste.c / liste.h).
Une fois que tu disposes de tout cela et que tu as testé que ton module de gestion de liste fonctionne de façon satisfaisante, tu peux t'occuper de l'interaction avec l'utilisateur, de la validation des donnés saisies, de l'affichage, etc.
par exemple :
- list_new()
- list_free()
- list_add_el()
- list_del_el()
- list_find_by_ID()
- list_find_by_name()
- list_find_by_SIV()
...
Typiquement, tu devrais mettre tout cela dans un module de gestion de la liste (par exemple liste.c / liste.h).
Une fois que tu disposes de tout cela et que tu as testé que ton module de gestion de liste fonctionne de façon satisfaisante, tu peux t'occuper de l'interaction avec l'utilisateur, de la validation des donnés saisies, de l'affichage, etc.
Je pense comprendre votre méthode. Justement ça me fait du bien de voir comment vous aborderez le problème. En réalité c'est ce que j'ai essayé de faire aujourd'hui, utiliser des listes chaînés. Selon vous c'est la manière la plus "stable" mais votre façon d'aborder le problème est pas mal du tout surtout que j'ai appliqué vos conseils et j'ai aussi appliqué autre chose. Après dites moi si c'est bon mais pour chaque fonctionnalité j'ai d'abord essayé de trouver quoi elle prend en entrée et quoi elle prend en sortie. Mais votre exemple va beaucoup m'inspirer je vous en remercie du fond du cœur ne kiffe ce forum qui est pedaguoge. Ne vous genez absolument pas ! Vous me donner des pistes de recherche et c'est à vous de les tester ? Ne vous inquiétez pas je le ferai ça m'avance pas mal
Je sais pas si vous avez vu l'énoncé il y'a les principale fonctionnalités à programmer justement j'ai fait des schémas, ces fonctionnalités me paraissent beaucoup très claires vous avez raison c'est mieux ! Maintenant il faut que je les organise. Est il préférable que je les programme chacune d'elle et après je fait les structures ou j'organise d'abord les structures, enfin selon vous car votre exemple m'inspire
Bouba_0236
Messages postés
1
Date d'inscription
mardi 7 juin 2022
Statut
Membre
Dernière intervention
12 juin 2022
12 juin 2022 à 22:39
12 juin 2022 à 22:39
Salut Salim tu avais pu trouver une solution à ton problème parce que j’ai le même problème si tu peux m’aider?
Merci d’avance
Merci d’avance
21 déc. 2021 à 00:39