Langage C · 2024–2025

Distributeur Automatique Intelligent

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.

C Structures (struct) Fichiers binaires Authentification Gestion de saisie

Le projet en bref

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.

Ce que fait le programme

Menu client

4 boissons avec prix, affichées dans un cadre ASCII aligné dynamiquement.

Monnaie

Insertion pièce par pièce (0,10 à 2 €), contrôle des pièces et rendu calculé.

Espace admin sécurisé

Création de compte au premier lancement, accès protégé par mot de passe.

Statistiques

État de caisse (chiffre d'affaires) et rapport des quantités vendues.

Persistance

Ventes sauvegardées dans vente.dat via fread / fwrite.

Saisie robuste

Contrôle de scanf, gestion de l'EOF et nettoyage du buffer clavier.

Le programme en action

Menu client affiché au lancement :

distributeur — menu client
**************************************************
*     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 :

distributeur — achat
--- 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) :

distributeur — admin
---------- 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

Points techniques

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.