Newer
Older
À la racine du projet, vous avez un fichier `run.sh` qui permet de lancer le projet de façon plus automatisée.
```
Cela va créer un dossier `bin` dans le dossier du projet et compiler le fichier source en un binaire.
Il va ensuite lancer le binaire avec les arguments fournis.
Pour que le projet se déroule correctement, vous devez lui passer `./data` en argument.
Soit :
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Données
### Base de donnée
Les données utilisées pour le projet sont stockées dans le dossier `data`. C'est ce dossier que vous devez passer en
argument lors de l'exécution du projet.
À l'intérieur de ce dossier, vous trouverez les fichiers suivants :
- **`chambres.txt`** : Contient les informations sur les chambres. Ce fichier n'est pas amené à recevoir des
modifications.
- **`clients.txt`** : Contient les informations sur les clients. Elles sont triées via le numéro de téléphone, qui est
unique.
- **`reservation.txt`** : Contient les informations sur les réservations, triées par ordre chronologique.
- **`reservation_client.txt`** : Contient `client_id` - `reservation_id` et `index` → ce fichier est trié par
`client_id`, et `index` représente l'index de la réservation avec `reservation_id` dans le fichier `reservation.txt`.
- **`reservation_id.txt`** : Contient `reservation_id` et `index` → ce fichier est trié par `reservation_id`, et `index`
représente l'index de la réservation avec `reservation_id` dans le fichier `reservation.txt`.
Ce choix de structure de sauvegarde des données permet de maximiser les performances de recherche. Il y a bien
évidemment un coût en termes de stockage, cependant, celui-ci peut être négligé au vu du prix actuel du stockage.
Les performances de lecture sont donc considérablement augmentées, passant d'une complexité de `N` à `log(N)`.
Cependant, c'est l'inverse pour l'ajout et la suppression, dont la complexité passe de `N` dans une structure plus
basique à `2N`. J’ai donc fait le choix de favoriser les lectures, en supposant que les utilisateurs consultent plus
souvent leurs réservations qu'ils n'en créent.
Cela ajoute néanmoins de la complexité au développement et à la maintenabilité. Il serait donc pertinent de réaliser une
étude d'utilisation du logiciel afin de s'assurer que ce choix est réellement optimal.
### Structure des données
```c
typedef struct {
int id;
char nom[STR_SIZE];
int nb_couchage;
float prix;
} Chambre;
typedef struct {
Chambre chambres[NB_CHAMBRE];
int dernier_chambre;
} Chambres;
typedef struct {
int id;
char nom[STR_SIZE];
char prenom[STR_SIZE];
char telephone[PHONE_SIZE];
} Client;
typedef struct {
Client clients[NB_CLIENTS];
int dernier_client;
} Clients;
```
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
Pour ce qui est de la structure des données des clients et des chambres, j'ai choisi une structure basique. Pour les
clients, j'ai tout de même ajouté un `id`, même si un numéro de téléphone est propre à un client. Cela permet d'utiliser
un `integer` comme `clé de référence` plutôt qu'un `char[SIZE]`, qui prend beaucoup plus de place en stockage. De plus,
cela offre la possibilité de gérer le cas où un utilisateur changerait de numéro de téléphone.
```c
typedef struct {
int jour;
int mois;
int annee;
} Date;
typedef struct {
int id;
Date date_debut;
Date date_fin;
int nb_nuit;
int nb_voyageurs;
int id_chambre;
int id_client;
} Reservation;
typedef struct {
int id_client;
int id_reservation;
int index;
} Link_Reservation_Client;
typedef struct {
Link_Reservation_Client links_client[NB_RESERVATIONS];
int dernier_reservation;
} Links_Reservation_Client;
typedef struct {
int id_reservation;
int index;
} Link_Reservation_Id;
typedef struct {
Link_Reservation_Id links_id[NB_RESERVATIONS];
int dernier_reservation;
} Links_Reservation_Id;
typedef struct {
int index_in_list;
int index_global_reservation;
} Find_Reservation_By_Id;
typedef struct {
Reservation reservations[NB_RESERVATIONS];
Link_Reservation_Client links_client[NB_RESERVATIONS];
Link_Reservation_Id links_id[NB_RESERVATIONS];
int dernier_reservation;
} Reservations;
```
Pour ce qui est de la structure `Reservations`, elle regroupe les informations des trois fichiers de réservations.
Comme dit précédemment, les données sont stockées dans le dossier `data`.
Pour ce qui est des fichiers de code, vous trouverez les fichiers suivants :
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
- **`model.c`** : Contient les structures de données et les fonctions d'affichage.
- **`load_data.c`** : Contient les fonctions de chargement des données.
- **`utils.c`** : Contient les fonctions utilitaires (fonctions utilisées régulièrement dans plusieurs fichiers).
- **`reservation.c`** : Contient les fonctions d'interaction avec les données des réservations.
- **`chambre.c`** : Contient les fonctions d'interaction avec les données des chambres.
- **`client.c`** : Contient les fonctions d'interaction avec les données des clients.
- **`menu.c`** : Contient toutes les fonctions d'interaction avec le terminal pour naviguer dans l'application.
- **`main.c`** : Contient le code principal du projet.
Pour chaque fichier `.c` (hormis `main.c`), vous trouverez un fichier `.h` correspondant, qui contient les définitions
des structures de données et les prototypes des fonctions. Vous y retrouverez également les commentaires nécessaires à
la compréhension des fonctions.
# Fonctionnalités
Toutes les fonctionnalités présentes dans le cahier des charges sont opérationnelles. Je m'en suis tenu à l'exemple de
menu et n'ai pas ajouté d'options supplémentaires.
Pour ce qui est des fonctionnalités que j'aurais pu ajouter avec du temps supplémentaire :
- Modifications de données clients.
- Interaction dans le terminal, comme pour des scripts `node.js`, afin de ne pas se limiter à rentrer des nombres.
- Tests unitaires pour s'assurer que le logiciel fonctionne pour tous les cas.
Étant donné que ce dernier point n'est pas réalisé, je mets en exemple des données à saisir pour que le logiciel
fonctionne. (En théorie, il fonctionne pour n'importe quel exemple, mais je ne peux pas le garantir complètement.)
1. 13/02/2025 à 28/04/2025
2. 0678452136
3. 8 → 9/9/2025 → 12/9/2025
4. 09/09/2025 → 12/09/2025 → 2
5. 30/03/2025 → 06/04/2025 → 0769389805 → Simon → Desdevises → 1
6. 12
7. 2025
8. 2025
9. 30/03/2025