Un programme en C en mode console qui simule un distributeur de boissons complet : achat avec gestion de la monnaie, espace d'administration sécurisé et sauvegarde persistante des ventes sur fichier binaire.
// Aperçu
Ce projet reproduit le fonctionnement d'un distributeur automatique de boissons directement dans le terminal. L'utilisateur choisit une boisson dans un menu encadré, insère ses pièces une à une, et la machine calcule le rendu de monnaie. Chaque vente est comptabilisée et enregistrée pour persister entre deux exécutions.
Un espace d'administration protégé par mot de passe permet de consulter le
chiffre d'affaires, le rapport des ventes, de changer le mot de passe ou de réinitialiser la machine.
Le tout est écrit en C standard, sans dépendance externe, et compile avec gcc.
// Fonctionnalités
4 boissons avec prix, affichées dans un cadre ASCII aligné dynamiquement.
Insertion pièce par pièce (0,10 à 2 €), contrôle des pièces et rendu calculé.
Création de compte au premier lancement, accès protégé par mot de passe.
État de caisse (chiffre d'affaires) et rapport des quantités vendues.
Ventes sauvegardées dans vente.dat via fread / fwrite.
Contrôle de scanf, gestion de l'EOF et nettoyage du buffer clavier.
// Démonstration
Menu client affiché au lancement :
************************************************** * BIENVENUE AU DISTRIBUTEUR AUTOMATIQUE * ************************************************** * * * 1. Cafe Court ..................... 0.40 EUR * * 2. The a la Menthe ................ 0.50 EUR * * 3. Chocolat Chaud ................. 0.60 EUR * * 4. Cappuccino ..................... 0.80 EUR * * * * 0. Quitter le programme * * 999. ESPACE ADMINISTRATION * * * ************************************************** Saisissez votre choix : 1
Cycle d'achat avec insertion de pièces et rendu de monnaie :
--- Achat : Cafe Court (0.40 EUR) --- Pieces acceptees : 0.10 0.20 0.50 1 2 (EUR) Inserez une piece (reste a payer 0.40 EUR) : 0.20 -> Insere : 0.20 EUR | Reste a payer : 0.20 EUR Inserez une piece (reste a payer 0.20 EUR) : 0.50 Preparation en cours... Rendu de monnaie : 0.30 EUR Votre Cafe Court est prete. Bonne degustation !
Espace administration (après authentification) :
---------- MENU ADMINISTRATION ---------- 1. Etat de la caisse (Chiffre d'affaires) 2. Rapport des ventes (Quantites vendues) 3. Gestion du compte (Changer le mot de passe) 4. Reinitialiser la machine (Caisse et ventes) 0. Retour au menu client ----------------------------------------- Saisissez votre choix : 2 === RAPPORT DES VENTES === Cafe Court : 3 vendu(s) The a la Menthe : 1 vendu(s) Chocolat Chaud : 0 vendu(s) Cappuccino : 2 vendu(s) Total boissons vendues : 6
// Sous le capot
Modèle de données. Chaque boisson est une struct Produit
(nom, prix en centimes, quantité vendue). Travailler en centimes — des entiers — évite
les erreurs d'arrondi des flottants sur les montants.
typedef struct { char nom[30]; int prix; /* en centimes */ int quantite; /* unites vendues */ } Produit;
Persistance binaire. Les ventes sont relues au démarrage et réécrites après chaque achat. Seules les quantités sont reprises du fichier ; noms et prix restent ceux du programme, ce qui évite toute corruption du catalogue.
fread(temp, sizeof(Produit), NB_PRODUITS, f); /* ... */ fwrite(produits, sizeof(Produit), NB_PRODUITS, f);
Saisie défensive. Le retour de scanf
est systématiquement vérifié, le buffer clavier est vidé entre deux lectures, et la fin de
flux (EOF) est gérée pour que le programme se termine proprement plutôt que de boucler.
Affichage soigné. Le cadre du menu est dessiné par des fonctions
utilitaires (ligneBordure, ligneCentree, ligneProduit)
qui calculent l'alignement des points et le centrage du texte sur une largeur fixe.