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 4](td4) : Prendre un fichier en entrée et le séparer en plusieurs fichiers.
- [Travaux dirigés 5](td5) :
- [Travaux dirigés 6](td6) :
- [Travaux dirigés 6](td6) : Application bancaire en C (fichiers binaires)
### 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
Structure pour stat
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 : _
```
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
* 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
* Lutilisateur choisit un compte existant.