Gestion de Produits et de Factures en C++

Exécution du code
Vidéo non disponible ! Réessayez plus tard
Cette vidéo fait partie de la formation
Apprendre la programmation C++
Revoir le teaser Je m'abonne
Transcription

79,00€ Je commande

À partir de
27€ /mois
Je m'abonne à Elephorm

Description Programme Avis

79,00€ Je commande

À partir de
27€ /mois
Je m'abonne à Elephorm

L’objectif de cette vidéo est de fournir une compréhension approfondie de la gestion de produits et factures en C++ et d’illustrer l’application concrète de concepts tels que les pointeurs intelligents, les constructeurs abstraits, et les exceptions.

Ce tutoriel présente la gestion de produits et de factures en utilisant le langage C++, couvrant la création, la modification, l'affichage et la sauvegarde des données.

Dans cette leçon, nous abordons en détail la réalisation d’un programme en C++ pour la gestion de produits et de factures. Le programme commence par un menu principal de type console pour la gestion de base des produits. L'utilisateur peut ajouter des références de produits, telles qu'une voiture à 10 000 euros ou une moto à 8 000 euros. Une fois les produits créés et sauvegardés dans un fichier, il est possible de créer des factures en ajoutant des achats de produits avec leurs quantités respectives.

Nous présentons également l'ajout de remises sur les factures, en suivant un processus similaire à l'ajout d'achats. Le programme effectue des vérifications pour éviter les erreurs, comme l'ajout de références produits inexistantes ou des prix négatifs, grâce à une classe d'exception. Nous parcourons notamment la définition et la gestion des classes Produit, Catalogue, Facture, et Ligne de Facture, en démontrant l'utilisation des concepts de pointeurs intelligents et de polymorphisme en C++.

Voir plus
Questions réponses
Comment le programme gère-t-il la vérification de l'existence d'une référence produit déjà ajoutée?
Le programme utilise une fonction de vérification qui parcourt les références existantes et lève une exception si la référence est déjà présente dans le catalogue.
Quelle est l'utilité des pointeurs intelligents dans ce programme?
Les pointeurs intelligents, tels que shared_ptr, sont utilisés pour gérer la mémoire de manière sécurisée et éviter les fuites de mémoire lors de la manipulation des objets comme les produits et les lignes de facture.
Comment le programme calcule-t-il les totaux de la facture?
Le programme calcule les totaux en parcourant toutes les lignes de la facture et en additionnant les prix hors taxe et TTC de chaque produit ou remise ajoutée.
Nous allons passer à présent au code de ce tp. Alors on ne va pas regarder l'intégralité du code, qui sera disponible en tant que fichier de travail, mais je vais vous montrer l'exécution, voilà ce qu'il doit se passer à l'exécution. Donc on va le compiler et l'exécuter, voilà. Donc là voilà notre menu principal. Donc là j'ai fait un menu de type console pour faire une gestion de base du produit. Donc pour l'instant on n'a encore rien fait, donc je vais ajouter une référence produit, donc 1. Donc on va créer un produit, alors référence du produit on va l'appeler par exemple VO. Alors le produit VO on va appeler ça, c'est une voiture, ça coûte 10 000 euros. Ensuite on va créer une autre référence produit, alors on va prendre MO, c'est une moto, ça coûte 8 000. On va reprendre encore une référence produit, alors on va prendre CA, un camion, ça coûte 35 000. Et puis on peut faire une dernière référence, c'est pas la peine d'en faire beaucoup. Référence du produit par exemple ESS, c'est de l'essence, c'est un litre d'essence, c'est-à-dire c'est le prix du litre d'essence, mettons 1,50 par exemple. Donc voilà, on a fait nos différentes références produits. Alors on peut sauvegarder notre catalogue, voilà, donc ça sauvegarde dans un fichier l'ensemble du catalogue. Et puis on peut maintenant faire la facture. Alors pour l'instant si je fais afficher la facture, bon là il n'y a rien, il n'y a aucune ligne, il y a juste l'entête et puis les totaux. On va pouvoir faire différentes factures. Admettons que j'achète un produit, donc là je demande la référence, par exemple un camion. La quantité, j'en achète deux, voilà, la ligne a été ajoutée. On peut vérifier avec afficher la facture que l'on a bien, voilà, de type achat, libellé, camion, prix unitaire 35 000, quantité 2, prix hors taxe 70 000, prix TTC 83 720, avec les différents totaux donc de la facture. On peut rajouter un achat, donc l'achat produit, je vais acheter de l'essence pour 300 litres. Donc je vérifie ma facture, voilà, j'ai mes deux camions et mes 300 litres d'essence, donc avec les totaux qui se calculent hors taxe et TTC. Et puis mettons une dernière référence produit, je vais faire une remise, tiens, pour changer, donc ajouter une remise. Donc valeur de la remise, par exemple, là quand même une facture de 84 000 euros, je vais faire une remise exceptionnelle de 1000 euros, voilà, pour raison promotion, par exemple, voilà. Et donc si j'affiche la facture, je vois qu'il s'affiche donc un type REM, remise, un libellé promotion, moins 1000, hein, d'accord ? Alors là il y a un petit décalage d'ailleurs, il faudra que je corrige, c'est parce que c'était un petit peu long, promotion, donc ça a dépassé, enfin, prix unitaire moins 1000, quantité 1, prix hors taxe moins 1000, donc c'est une réduction évidemment, donc c'est un prix en négatif. Voilà, donc j'ai un petit peu l'ensemble du programme qui est un petit peu testé ici. Donc je vais faire 6 pour quitter le programme. Voilà, on va regarder un petit peu le début du code ensemble. Alors ça c'est le main, qui est assez simple. En fait, pour éviter d'avoir une fonction main surchargée, j'ai créé une classe programme, hein, on voit ici, et donc tout le code en fait du programme est dans la fonction exec de la classe. J'ai créé également une classe d'exception erreur, qui a un problème quelconque, par exemple une référence qui n'existe pas, ou un produit qui est référencé avec deux références différentes. Je lève une exception de type erreur, donc là je la capture et j'affiche le message. Donc là c'est mon main principal. Donc on va regarder en fait un petit peu la classe programme qui nous donne l'intégralité du programme. Donc un programme va contenir donc deux attributs, un catalogue, une facture. On travaille qu'avec une seule facture à la fois, et on fait chacun des items du menu que j'avais. C'est créer produit, ajouter achat, ajouter remise, afficher facture, charger, sauver. Donc si on regarde le code de programme, on voit que la fonction exec, en fait j'affiche donc la gestion de la console, le menu principal. Je fais saisir à l'utilisateur son choix. Suivant le choix, j'appelle une ou l'autre des fonctions, ou je quitte quand le choix est égal à 6. Donc là voilà la fonction d'exécution. A chaque fois quand je crée un produit, je fais rentrer une référence de produit, je vérifie que la référence n'existe pas, sinon je fais une boucle tant qu'elle existe. Je fais rentrer le nom du produit. S'il y a un problème ou il y a un prix négatif pour un produit, je lève une exception. Et sinon j'appelle la fonction du catalogue ajouter produit. Pareil pour ajouter achat, et j'appelle les fonctions du catalogue. Et puis j'ajoute l'achat produit dans la facture. Éventuellement je capture l'exception erreur si elle est arrivée, par exemple un produit qui n'existe pas, une référence inconnue. Pour la remise c'est pareil. Donc ici j'ajoute une new remise au lieu d'ajouter un new achat produit, c'est le polymorphisme. Pour afficher la facture, je l'envoie dans la console. Et je choisis de sauvegarder ou de charger mon catalogue dans un fichier, donc un flux de fichiers que j'ai appelé catalogue, on pourrait l'appeler autrement, ou demander à l'utilisateur comment il veut appeler son fichier. Voilà la classe, on va dire, principale qui me fait l'ensemble de mon programme. Et ensuite, rapidement, toutes les classes qui sont ici. La classe produit, qui implémente l'interface sauvable, qui définit le prix, le libellé, sauvé, chargé. La classe catalogue, qui compose les produits, donc il y a un shared ptr, un pointeur intelligent, je suis en C++11, pour le produit. Une map, parce que mon produit étant référencé par une référence, j'utilise un tableau associatif qui me permet d'associer au numéro de référence, à la référence, le produit lui-même. Et puis les fonctions ajoutent, cherche, ref existe, et sauvé, chargé, qui me viennent de l'interface. La facture compose des lignes, donc j'utilise également des shared ptr. Mes lignes de facture sont ordonnées, je choisis donc un vecteur, un tableau, et puis j'ai mes fonctions, total, hors-taxe, ttc, tva, etc, et l'ajout d'une ligne par pointeur, bien sûr, puisque c'est une composition, ce n'est pas une valeur, et en plus elle est polymorphe. La classe ligne, qui est abstraite, on voit qu'elle a une fonction virtuelle, qui est le destructeur. La fonction type ligne, virtuelle pur, abstraite donc, prix unitaire, quantité, tva, libellé, toutes ces fonctions sont abstraites, donc virtuelle pur en C++. Tout string est en tête, else, par contre, sont concrètes. Fonction ligne, qui donne naissance à la classe achat produit, qui hérite de ligne, qui est associée avec produit, qui implémente les fonctions abstraites, prix unitaire, quantité, tva, libellé, et type ligne. Là, par exemple, on a choisi de référencer ACH pour un type achat. L'autre type de ligne l'a remise. Eh bien, une certaine valeur, une certaine raison, l'implémentation de nos fonctions virtuelles, prix unitaire, quantité, etc., pour la remise. Là, on a la définition de notre exception erreur, donc là, tout simplement, je mets une simple chaîne de caractère comme message, et puis de l'interface sauvable. Et bien sûr, il reste à faire le code de l'ensemble de ces fonctions, et à implémenter, comme ceci, toutes les fonctionnalités. On aura vu, à travers ce petit projet, un petit peu toutes les notions que l'on a brossées dans cette formation.

Programme détaillé de la formation