13
td6
medina5 edited this page 2025-11-20 19:01:01 +01:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Travaux pratiques n° 6 : Application bancaire en C

Objectifs pédagogiques

Ce TP a pour but de consolider les compétences en programmation C sous Linux, en particulier :

  • la manipulation de structures et de fichiers binaires ;
  • la création dune interface utilisateur texte (TUI) avec menus ;
  • la gestion dentrées/sorties utilisateur et de contrôles de validité ;
  • lorganisation dun projet C modulaire et maintenable.

Énoncé

Vous êtes chargé de développer une application bancaire simplifiée fonctionnant en mode terminal. Lapplication permettra de créer des comptes, enregistrer des opérations (dépôts / retraits) et consulter les soldes.

Les données seront stockées dans des fichiers binaires, sans base de données.

Menu principal

Au lancement, lapplication affiche un menu textuel similaire à celui-ci :

====================================
  Application Bancaire (Votre Nom)
====================================
1. Créer un compte
2. Enregistrer une opération
3. Lister les comptes
4. Quitter
------------------------------------
Votre choix : _

Utilisation de ncurses qui est une bibliothèque qui donne un peu plus de contôle sur l'affichage que le simple printf.

#include <stdio.h>
#include <ncurses/ncurses.h>

int main() {

  initscr();              // Initialise ncurses
  noecho();               // Masque la saisie clavier
  curs_set(FALSE);        // Cache le curseur

  // boucle infinie
  for(;;) {
    menu_principal();

    int choix;
    choix = getch();      // Attend une touche

    if (choix == '4') {
      break;              // sortir de la boucle infinie
    }
  }

  endwin();
  return 0;
}
void menu_principal() {

  clear();
  mvprintw(0, 0, "====================================");
  mvprintw(1, 0, "  Application Bancaire (Votre Nom)  ");
  mvprintw(2, 0, "====================================");
  mvprintw(3, 0, "1. Créer un compte");
  mvprintw(4, 0, "2. Enregistrer une opération");
  mvprintw(5, 0, "3. Lister les comptes");
  mvprintw(6, 0, "4. Quitter");
  mvprintw(7, 0, "------------------------------------");
  mvprintw(8, 0, "Votre choix : _");

}
  • mvprintw : move print, le curseur à ligne et à la colonne indiquées et écrit du texte à la manière de printf. A la différence que printf écrit à la suite et ne permet pas de contrôler le positionnement.
  • clear : efface complètement l'écran.

Création de compte

  • Le programme demande :

    • le nom,
    • le prénom,
    • la date de naissance (format : JJ/MM/AAAA).
  • Verifier la validité de la date

  • Avant denregistrer, il vérifie quaucun autre compte nexiste avec le même nom et prénom.

  • Si le compte est valide, il est ajouté à un fichier binaire comptes.dat avec un solde initial de 0.

Proposez une structure cohérente

====================================
  Création de compte
====================================
Nom :
Prenom :
Date de naissance :
------------------------------------

Afficher

void menu_creationcompte() {

  mvprintw(3, 0, "Nom : "); clrtoeol();
  mvprintw(4, 0, "Prenom : "); clrtoeol();
  mvprintw(5, 0, "Date de naissance : "); clrtoeol();
  move(6, 0); clrtoeol();

  echo();
  curs_set(TRUE);

  move(3, 6);
  getstr(compte.nom);

  move(4, 9);
  getstr(compte.prenom);

  do {
    move(5, 20); clrtoeol();
    getstr(compte.naissance);

  } while (verif_date(compte.naissance) == 0);

  if (verif_compte(compte.nom, compte.prenom) == 1) {
    FILE *fichier = fopen("comptes.dat", "ab");
    fwrite(&compte, sizeof(Compte), 1, fichier);
    fclose(fichier);
  } else {
    mvprintw(10, 0, "Cette personne existe deja");
    getch();
  }
}

La fonction pour vérifier la date

int verif_date(char *chaine) {
  if (strlen(chaine)!=10) return 0;
  if (chaine[2] != '/') return 0;
  if (chaine[5] != '/') return 0;
  if (chaine[0]< '0' || chaine[0] > '3') return 0;
  if (chaine[3]< '0' || chaine[3] > '1') return 0;

  return 1;
}

Enregistrement dopération

  • Lutilisateur choisit un compte existant.
  • Le programme demande :
    • le type dopération : Dépôt (D) ou Retrait (R) ;
    • le montant (nombre réel positif).
  • Le solde du compte est mis à jour.
  • Lopération est enregistrée dans un fichier binaire operations.dat.
  • Le solde ne doit pas devenir négatif après un retrait.

Liste des comptes

  • Afficher un tableau des comptes :
-------------------------------------------
ID   Nom           Prénom        Solde (€)
-------------------------------------------
1    Dupont        Alice         150.00
2    Martin        Bob           325.50
-------------------------------------------
Choisissez un ID pour voir le détail (0 = retour) :
void menu_listercompte() {

  clear();
  mvprintw(0, 0, "====================================");
  mvprintw(1, 0, "  Liste des comptes                 ");
  mvprintw(2, 0, "====================================");

  Compte compte;

  FILE *fichier = fopen("comptes.dat", "rb");
  if (!fichier) {
    mvprintw(3, 0, "** Erreur d'ouverture du fichier **");
    getch();
    return;
  }

  int i = 1;
  while (fread(&compte, sizeof(Compte), 1, fichier)!=0) {
    mvprintw(2 + i, 0, "%d", i);
    mvprintw(2 + i, 3, compte.nom);
    mvprintw(2 + i, 15, compte.prenom);
    mvprintw(2 + i, 30, "%.2f", compte.solde);
    i++;
  }

  getch(); /* Il faut que l'utilisateur appuie sur une touche sinon l'affichage repart directement sur
  l'écran principal et on n'a le temps de ne rien voir. */
}
  • Si un compte est sélectionné, afficher lhistorique des opérations :
Historique du compte n°2 - Bob Martin
-------------------------------------
Date         Type   Montant
-------------------------------------
10/11/2025   D      +200.00
11/11/2025   R      -50.00
-------------------------------------
Solde actuel : 150.00 €

Compilation

NCurses

#include <ncurses.h>

int main() {
  initscr();              // Initialise ncurses
  noecho();               // Masque la saisie clavier
  curs_set(FALSE);        // Cache le curseur

  mvprintw(5, 10, "Bonjour, ncurses !");
  refresh();              // Affiche à lécran
  getch();                // Attend une touche

  endwin();               // Restaure le terminal
  return 0;
}
Fonction Description
initscr() Initialise lécran ncurses
endwin() Quitte ncurses et restaure le terminal
clear() Efface lécran
mvprintw(y, x, "texte") Affiche du texte à la position (y, x)
refresh() Met à jour laffichage
getch() Attend une touche du clavier
echo() / noecho() Active / désactive laffichage de la saisie
curs_set(0 ou 1) Affiche ou cache le curseur
move(y, x) Se déplacer

Pour les saisies

char nom[30];
mvprintw(3, 5, "Nom : ");
getstr(nom);

fichier tasks.json

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "C/C++: gcc.exe build active file",
      "type": "cppbuild",
      "command": "C:\\msys64\\ucrt64\\bin\\gcc.exe",
      "args": [
        "-fdiagnostics-color=always",
        "-g",
        "${file}",
        "-lncurses",
        "-DNCURSES_STATIC",
        "-o",
        "${fileDirname}\\${fileBasenameNoExtension}.exe"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "problemMatcher": ["$gcc"],
      "detail": "Compilation du programme banque.c avec ncurses"
    }
  ]
}

Instructions :

  • faire une fonction d'affichage par menu