Correction TD 6
2
Home.md
2
Home.md
@@ -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
BIN
build/Debug/outDebug
Executable file
Binary file not shown.
BIN
build/Debug/td3.o
Normal file
BIN
build/Debug/td3.o
Normal file
Binary file not shown.
6
td5.md
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
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 l’ajout d’opérations (dépôt/retrait) |
|
||||
| 6 | Implémenter la consultation des soldes et historiques |
|
||||
| 7 | Améliorer l’interface (clear screen, couleurs, etc.) |
|
||||
|
||||
---
|
||||
|
||||
## Pistes d’amé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 d’implé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 d’un programme utilisant ncurses
|
||||
|
||||
```shell
|
||||
$ gcc main.c -lncurses -o banque
|
||||
```
|
||||
86
td6.md
86
td6.md
@@ -32,6 +32,56 @@ Au lancement, l’application 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 d’opération
|
||||
|
||||
* L’utilisateur choisit un compte existant.
|
||||
|
||||
Reference in New Issue
Block a user