diff --git a/Home.md b/Home.md index 16d80e4..ca4f833 100644 --- a/Home.md +++ b/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 diff --git a/build/Debug/outDebug b/build/Debug/outDebug new file mode 100755 index 0000000..0d881f0 Binary files /dev/null and b/build/Debug/outDebug differ diff --git a/build/Debug/td3.o b/build/Debug/td3.o new file mode 100644 index 0000000..340d122 Binary files /dev/null and b/build/Debug/td3.o differ diff --git a/td5.md b/td5.md index cee1e95..1ef6e7f 100644 --- a/td5.md +++ b/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. diff --git a/td6.correction.md b/td6.correction.md new file mode 100644 index 0000000..765132b --- /dev/null +++ b/td6.correction.md @@ -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 +``` diff --git a/td6.md b/td6.md index 8b34996..2b15ef5 100644 --- a/td6.md +++ b/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 +#include + +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.