Skip to content
Snippets Groups Projects
README.md 6.62 KiB
Newer Older
Simon Desdevises's avatar
Simon Desdevises committed
# Lancement du projet
Simon Desdevises's avatar
Simon Desdevises committed

Simon Desdevises's avatar
Simon Desdevises committed
À la racine du projet, vous avez un fichier `run.sh` qui permet de lancer le projet de façon plus automatisée.
Simon Desdevises's avatar
Simon Desdevises committed

Simon Desdevises's avatar
Simon Desdevises committed
Commencez par lui donner les droits d'exécution:
Simon Desdevises's avatar
Simon Desdevises committed

```bash
chmod +x run.sh
```

Simon Desdevises's avatar
Simon Desdevises committed
Ensuite, lancez le projet avec la commande :
Simon Desdevises's avatar
Simon Desdevises committed

```bash
Simon Desdevises's avatar
Simon Desdevises committed
./run.sh <arguments>
Simon Desdevises's avatar
Simon Desdevises committed
```

Cela va créer un dossier `bin` dans le dossier du projet et compiler le fichier source en un binaire.

Simon Desdevises's avatar
Simon Desdevises committed
Il va ensuite lancer le binaire avec les arguments fournis.

Simon Desdevises's avatar
Simon Desdevises committed
Pour que le projet se déroule correctement, vous devez lui passer `./data` en argument.

Soit :
Simon Desdevises's avatar
Simon Desdevises committed

Simon Desdevises's avatar
Simon Desdevises committed
```sh
./run.sh ./data
```
Simon Desdevises's avatar
Simon Desdevises committed

Simon Desdevises's avatar
Simon Desdevises committed
# 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;
```
Simon Desdevises's avatar
Simon Desdevises committed

Simon Desdevises's avatar
Simon Desdevises committed
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;
```
Simon Desdevises's avatar
Simon Desdevises committed

Simon Desdevises's avatar
Simon Desdevises committed
Pour ce qui est de la structure `Reservations`, elle regroupe les informations des trois fichiers de réservations.
Simon Desdevises's avatar
Simon Desdevises committed
# Structure du projet

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 :

Simon Desdevises's avatar
Simon Desdevises committed
- **`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 &rarr; 9/9/2025 &rarr; 12/9/2025
4. 09/09/2025 &rarr; 12/09/2025 &rarr; 2
5. 30/03/2025 &rarr; 06/04/2025 &rarr; 0769389805 &rarr; Simon &rarr; Desdevises &rarr; 1
6. 12
7. 2025
8. 2025
9. 30/03/2025