Correction TD 6

2025-11-20 18:46:25 +01:00
parent 6eca2fb8c4
commit 4a7048aef4
6 changed files with 190 additions and 1 deletions

@@ -72,7 +72,7 @@ Sa syntaxe de base a inspiré de nombreux langages plus récents dont C++, Java
- [Travaux dirigés 3](td3) : Calculer la moyenne et la variance d'une série de données contenues dans un fichier. - [Travaux dirigés 3](td3) : Calculer la moyenne et la variance d'une série de données contenues dans un fichier.
- [Travaux dirigés 4](td4) : Prendre un fichier en entrée et le séparer en plusieurs fichiers. - [Travaux dirigés 4](td4) : Prendre un fichier en entrée et le séparer en plusieurs fichiers.
- [Travaux dirigés 5](td5) : - [Travaux dirigés 5](td5) :
- [Travaux dirigés 6](td6) : - [Travaux dirigés 6](td6) : Application bancaire en C (fichiers binaires)
### Remarques ### Remarques

BIN
build/Debug/outDebug Executable file

Binary file not shown.

BIN
build/Debug/td3.o Normal file

Binary file not shown.

6
td5.md

@@ -28,3 +28,9 @@ Ajouter plus de ligne pour voir la diff entre float et int
float plus de capacité mais moins précis float plus de capacité mais moins précis
Structure pour stat Structure pour stat
Fonctions avec pointeur Fonctions avec pointeur
### Reprise du TD 4 pour le rendre dynamique
Le format n'est pas connu à l'avance il va falloir lire caractères par caractères pour trouver le nombre de colonnes.
### Reprise du TD 3 pour spécifier le nom du fichier en entrée.

97
td6.correction.md Normal file

@@ -0,0 +1,97 @@
💾 **Structure suggérée :**
```c
typedef struct {
int id; // identifiant unique
char nom[30];
char prenom[30];
char date_naissance[11]; // "JJ/MM/AAAA"
double solde;
} Compte;
```
```c
typedef struct {
int compte_id; // lien avec le compte
char type; // 'D' ou 'R'
double montant;
char date[20]; // horodatage ou saisie manuelle
} Operation;
```
## Contraintes techniques
* Le programme doit être en **langage C standard (C99 ou C11)**.
* Utiliser des **structures** et des **fichiers binaires** (`fwrite`, `fread`).
* Le menu doit être **interactif** :
* Vous pouvez utiliser **ncurses** ou simplement des entrées clavier avec `scanf` et `printf`.
* Une attention particulière sera portée à :
* la **gestion des erreurs** (fichiers, saisie utilisateur, doublons),
* la **lisibilité du code** (fonctions, indentation, commentaires),
* la **persistance des données** entre deux exécutions.
---
## Étapes suggérées
| Étape | Objectif |
| ----- | ----------------------------------------------------- |
| 1 | Créer les structures `Compte` et `Operation` |
| 2 | Lire et écrire des comptes dans un fichier binaire |
| 3 | Ajouter la gestion du menu principal |
| 4 | Implémenter la création de compte |
| 5 | Implémenter lajout dopérations (dépôt/retrait) |
| 6 | Implémenter la consultation des soldes et historiques |
| 7 | Améliorer linterface (clear screen, couleurs, etc.) |
---
## Pistes damélioration (pour les plus avancés)
* Trier les comptes par solde ou par nom.
* Afficher la date/heure automatique des opérations (via `time.h`).
* Implémenter un menu navigable avec **ncurses**.
* Exporter les comptes vers un fichier texte CSV pour visualisation externe.
---
## Livrables
* Fichier source : `banque.c`
* Fichiers de données : `comptes.dat`, `operations.dat`
* Rapport ou README décrivant :
* les structures utilisées,
* les fonctions principales,
* les choix dimplémentation.
---
## 🔧 Critères dévaluation
| Critère | Points |
| ------------------------------------------------------ | ------- |
| Compilation sans erreur | 2 |
| Respect de la consigne et fonctionnalités principales | 6 |
| Qualité du code (lisibilité, modularité, commentaires) | 4 |
| Gestion des erreurs et cohérence des données | 3 |
| Interface utilisateur claire et fonctionnelle | 3 |
| Total | **/18** |
---
Souhaite-t-il que je rédige aussi un **squelette de code de départ** (avec les menus et la structure générale du programme) que les étudiants pourront compléter ? Cela permettrait de démarrer le TP plus facilement.
```
sudo apt install libncurses5-dev libncursesw5-dev
```
Compilation dun programme utilisant ncurses
```shell
$ gcc main.c -lncurses -o banque
```

86
td6.md

@@ -32,6 +32,56 @@ Au lancement, lapplication affiche un **menu textuel** similaire à celui-ci
Votre choix : _ 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`.
```c
#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;
}
```
```c
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 ### Création de compte
* Le programme demande : * Le programme demande :
@@ -58,6 +108,42 @@ Date de naissance :
------------------------------------ ------------------------------------
``` ```
Afficher
```c
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();
}
}
```
### Enregistrement dopération ### Enregistrement dopération
* Lutilisateur choisit un compte existant. * Lutilisateur choisit un compte existant.