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
Bonjour,
j’espère que vous allez bien et que vous vous portez bien. J’ai un problème, un projet. En fait je suis dans une formation où l(informatique n’est pas le centre de celle ci . Je suis à peine au début et on nous a donné ce projet à faire en binôme, les profs nous l’ont conseillé et obliger car c’est long et technique pour notre niveau de débutant. Pouvez vous m’aider svp.Je veux savoir comment vous vous y prendrez de manière logique (je ne demande pas d'aide pour le code) Enfin comment vous vous y prendrez pour problème c’est ça le plus important pour moi svp…Merci d'avance, que Dieu vous le rend fois 1000.

2 Description
On veut écrire un logiciel de gestion de propriétaires particuliers de véhicules français. Ces
derniers sont identiés via leur plaque d'immatriculation, qui est enregistré dans le système
d'immatriculation des véhicules (SIV), qui suit le format suivant : LL-CCC-LL, où L indique
qu'il s'agit d'une lettre en majuscule, et C indique qu'il s'agit d'un chire. Il est bon de noter
que les lettres I, U, et O sont interdites 1
. À chaque numéro d'immatriculation, on désire faire
correspondre un ou plusieurs propriétaires (deux maximum). Chaque propriétaire est déni par
les informations suivantes :
1. Nom de famille ;
2. prénom ;
3. date de naissance au format  AAAA/MM/JJ  ;
 AAAA est l'année de naissance sur quatre chires ;
 MM est le mois de naissance sur deux chires ;
 JJ est le jour de naissance sur deux chires.
4. adresse ;
 Optionnellement : un champ pour des informations spéciques, par exemple, le nom
ou le numéro du bâtiment, etc. (20 caractères maximum) ;
 numéro de la voie (trois chires maximum) ;
 nom de la voie (cinquante lettres maximum) ;
1. En eet, I ressemble trop à un 1, O trop à un 0, et U pourrait être mal lue et comprise comme la lettre V.
1
 nom de la ville (cinquante lettres maximum) ;
 code postal (exactement cinq chies).
5. numéro de téléphone (exactement dix chires) ;
6. une liste de véhicules possédés par cette personne (cinq maximum).
La base de données acceptera jusqu'à 100 véhicules équipés d'une plaque d'immatriculation
française se conformant au format SIV. Chaque entrée aura donc la forme suivante :
 Identiant SIV ;
 identité des propriétaires (2 max) ;
 description du véhicule :
 Marque (trente caractères maximum) ;
 Nombre de portes (0, 3 ou 5 2
).
Toute personne ajoutée au système implique qu'on ajoute forcément un véhicule. Tout véhicule rajouté doit être lié à une personne. Si la personne recherchée n'existe pas, alors il faut lui
créer une entrée.
Note : toutes les chaînes de caractères stockées dans le système sont en majuscules.
Voici un exemple d'achage pour votre programme :
[1] Ajouter une personne
[2] Supprimer une personne
[3] Ajouter un véhicule
[4] Supprimer un véhicule
[5] Afficher la liste des personnes
[6] Afficher la liste des véhicules
[7] Afficher les informations relatives à une personne
[8] Afficher les informations d'un véhicule
[9] Changer le ou la proprietaire d'un véhicule
[0] Sortir du programme
Entrez votre choix (0, 1, 2, 3, 4, 5, 6, 7, 8, ou 9) : _
Si on choisit (par exemple) d'acher les informations relatives à une personne, après avoir
saisi son nom de famille, on pourrait tomber sur le sous-menu suivant :
Quelles informations désirez-vous connaître sur ERIC DUPONT ?
[1] Afficher l'adresse de ERIC DUPONT
[2] Afficher la liste des plaques d'immatriculation des véhicules possédés par ERIC DUPONT
[0] Revenir au menu précédent
Faire un choix :

Configuration: Windows / Edge 96.0.1054.43

8 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
20 déc. 2021 à 07:23
0
Merci beaucoup. Oui bien sur je le sais et je vous remercie de vos aides. Sur hardware ils m'ont tous agressés c'est incroyable.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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
0
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.
0
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).
0
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.
0
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
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
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
22 déc. 2021 à 01:22
Voilà un exemple pour te donner une idée :
  • 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 :-)
0
Salim > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
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
0
Salim > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
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
0
Salim > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
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
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083 > Salim
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 :
  • 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.
0
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
0
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
0
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
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
0