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 d’une interface utilisateur texte (TUI) avec menus ;
- la gestion d’entrées/sorties utilisateur et de contrôles de validité ;
- l’organisation d’un projet C modulaire et maintenable.
Énoncé
Vous êtes chargé de développer une application bancaire simplifiée fonctionnant en mode terminal. L’application 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, l’application 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 deprintf. A la différence queprintfé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 d’enregistrer, il vérifie qu’aucun autre compte n’existe avec le même nom et prénom.
-
Si le compte est valide, il est ajouté à un fichier binaire
comptes.datavec 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 d’opération
- L’utilisateur choisit un compte existant.
- Le programme demande :
- le type d’opération : Dépôt (D) ou Retrait (R) ;
- le montant (nombre réel positif).
- Le solde du compte est mis à jour.
- L’opé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 l’historique 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 l’affichage |
getch() |
Attend une touche du clavier |
echo() / noecho() |
Active / désactive l’affichage 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