Crée une machine à états pour un distributeur avec les états : ATTENTE, SELECTION, PAIEMENT, DISTRIBUTION. Gère les transitions selon les actions de l'utilisateur.
Indices :
Solution :
#include <stdio.h>
enum distrib_state { ATTENTE, SELECTION, PAIEMENT, DISTRIBUTION };
static enum distrib_state etat = ATTENTE;
/* bouton : numéro de boisson sélectionnée (0 = aucun)
piece : 1 si une pièce a été insérée, 0 sinon */
void update(int bouton, int piece)
{
switch (etat) {
case ATTENTE:
printf("[ATTENTE] Insérez une pièce...\n");
if (piece) {
etat = SELECTION;
}
break;
case SELECTION:
printf("[SELECTION] Choisissez une boisson (1-3)\n");
if (bouton >= 1 && bouton <= 3) {
etat = PAIEMENT;
}
break;
case PAIEMENT:
printf("[PAIEMENT] Paiement en cours...\n");
/* Vérification du montant — toujours OK dans la sim */
etat = DISTRIBUTION;
break;
case DISTRIBUTION:
printf("[DISTRIBUTION] Voici votre boisson !\n");
/* attente 2000 ms (simulée) */
etat = ATTENTE;
break;
}
}
/* Un événement à injecter dans la machine : un libellé pour
l'affichage, et les deux entrées passées à update(). */
struct evenement {
const char *label;
int bouton;
int piece;
};
int main(void)
{
const struct evenement scenario[] = {
{ "Rien ne se passe", 0, 0 },
{ "Insertion d'une piece", 0, 1 },
{ "Appui sur le bouton 2", 2, 0 },
{ "Cycle de paiement", 0, 0 },
{ "Fin de distribution", 0, 0 },
};
const int n = sizeof(scenario) / sizeof(scenario[0]);
printf("=== Simulation distributeur ===\n");
for (int i = 0; i < n; i++) {
printf("\n--- Etape %d : %s (bouton=%d, piece=%d) ---\n",
i + 1, scenario[i].label,
scenario[i].bouton, scenario[i].piece);
update(scenario[i].bouton, scenario[i].piece);
}
printf("\n=== Retour en ATTENTE ===\n");
return 0;
}