Ajouts de la version non sécurisée + Makefile + Générateur de fichiers .db

This commit is contained in:
2024-12-02 20:45:45 +01:00
parent 675eaface8
commit abd096bb21
10 changed files with 943 additions and 0 deletions

13
DataGenerator/Makefile Normal file
View File

@@ -0,0 +1,13 @@
# Nom de l'exécutable
TARGET = generate_accounts
# Fichier source
SRC = generate_accounts.c
# Règle par défaut : compilation et lien
all:
gcc $(SRC) -o $(TARGET)
# Nettoyage des fichiers générés
clean:
rm -f $(TARGET)

71
DataGenerator/README.md Normal file
View File

@@ -0,0 +1,71 @@
# 🏦 Générateur de comptes bancaires
Ce programme en C permet de générer un fichier contenant des comptes bancaires aléatoires avec des noms et des montants répartis en fonction de vos paramètres. 🎲💰
## 🚀 Fonctionnalités
- Génération de comptes avec des **prénoms réalistes** (ex. Emma, Moncef, Lenny).
- Répartition personnalisée des montants par compte :
- Total à distribuer.
- Nombre de comptes.
- Montants minimum et maximum par compte.
- Exportation des données dans un fichier `.db` avec format fixe.
## 🛠️ Compilation
Pour compiler le programme, utilisez la commande suivante dans votre terminal:
```bash
gcc -o generate_accounts generate_accounts.c
```
ou
```bash
make
```
## 🏃 Utilisation
### Commande
```bash
./generate_accounts -t <total_amount> -n <num_accounts> -m <min_amount> -M <max_amount> [-f <filename>]
```
| Option | Description | Obligatoire | Exemple |
| ------ | --------------------------------------------------- | ----------- | ------- |
| `-t` | Montant total à répartir entre les comptes | ✅ | `-t 10000` |
| `-n` | Nombre total de comptes à générer | ✅ | `-n 5` |
| `-m` | Montant minimum par compte | ✅ | `-m 500` |
| `-M` | Montant maximum par compte | ✅ | `-M 3000` |
| `-f` | Nom du fichier de sortie (par défaut `accounts.db`) | ❌ | `-f accounts.db` |
### Exemple
#### Commande
```bash
./generate_accounts -t 10000 -n 5 -m 500 -M 3000 -f accounts.db
```
#### Résultat attendu
Fichier `accounts.db` :
```yaml
Emma 2500
Liam 3000
Olivia 1500
Noah 2000
Ava 1000
```
## ⚠️ Gestion des erreurs
1. Montant insuffisant pour répartir les comptes :
```bash
./generate_accounts -t 1000 -n 5 -m 500 -M 3000
```
**Erreur :** Paramètres invalides
2. Montant maximum inférieur au minimum :
```bash
./generate_accounts -t 10000 -n 5 -m 1000 -M 500
```
**Erreur :** Paramètres invalides

View File

@@ -0,0 +1,124 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#define NAME_LENGTH 10 // Longueur fixe pour le nom
#define ENTRY_LENGTH 16 // Longueur fixe pour une entrée (nom + argent + saut de ligne)
// Génère un nom aléatoire parmis une liste prédéfinie
void generate_random_name(char *name) {
const char *names[] = {
"Emma", "Liam", "Olivia", "Noah", "Ava", "Oliver",
"Sophia", "Elijah", "Isabella", "James", "Mia",
"Charlotte", "Amelia", "Harper", "Evelyn", "Jack",
"Benjamin", "Lucas", "Henry", "Alexander", "Ella",
"Grace", "Chloe", "Lily", "Ellie", "Hannah", "Aiden",
"Samuel", "Levi", "Owen", "Julian", "Nora", "Hazel",
"Victoria", "Aurora", "Camila", "Aria", "Luna", "Scarlett",
"Moncef", "Mohamed", "Ali", "Ahmed", "Hassan", "Hosni",
"Lenny", "Khalid", "Louay", "Yanis", "Denis", "Luc",
};
int num_names = sizeof(names) / sizeof(names[0]);
int index = rand() % num_names;
strncpy(name, names[index], NAME_LENGTH);
name[NAME_LENGTH] = '\0'; // Assure que le nom est bien terminé
}
// Génère un fichier de comptes aléatoires
void generate_accounts(const char *filename, int total_amount, int num_accounts, int min_amount, int max_amount) {
if (num_accounts <= 0 || min_amount < 0 || max_amount < min_amount || total_amount < num_accounts * min_amount) {
fprintf(stderr, "Paramètres invalides.\n");
return;
}
FILE *file = fopen(filename, "w");
if (!file) {
perror("Erreur à l'ouverture du fichier");
return;
}
srand(time(NULL));
int remaining_amount = total_amount;
for (int i = 0; i < num_accounts; i++) {
char name[NAME_LENGTH + 1];
generate_random_name(name);
int max_for_account = remaining_amount - (num_accounts - i - 1) * min_amount;
if (max_for_account > max_amount) {
max_for_account = max_amount;
}
int amount = (i == num_accounts - 1) ? remaining_amount : (rand() % (max_for_account - min_amount + 1) + min_amount);
remaining_amount -= amount;
// Formatage des données dans une ligne de 16 caractères
char entry[ENTRY_LENGTH + 1];
snprintf(entry, ENTRY_LENGTH + 1, "%-10s%5d\n", name, amount);
fwrite(entry, 1, ENTRY_LENGTH, file);
}
fclose(file);
printf("Comptes générés et enregistrés dans %s\n", filename);
}
int main(int argc, char *argv[]) {
// Paramètres par défaut
int total_amount = 0;
int num_accounts = 0;
int min_amount = 0;
int max_amount = 0;
char *filename = "accounts.db";
int opt;
while ((opt = getopt(argc, argv, "t:n:m:M:f:")) != -1) {
switch (opt) {
case 't':
total_amount = atoi(optarg);
break;
case 'n':
num_accounts = atoi(optarg);
break;
case 'm':
min_amount = atoi(optarg);
break;
case 'M':
max_amount = atoi(optarg);
break;
case 'f':
if (strlen(optarg) > 0) {
filename = optarg;
}
break;
default:
fprintf(stderr, "Usage: %s -t total_amount -n num_accounts -m min_amount -M max_amount [-f filename]\n", argv[0]);
exit(EXIT_FAILURE);
}
}
// Vérification des paramètres
if (total_amount <= 0 || num_accounts <= 0 || min_amount < 0 || max_amount < min_amount || total_amount < num_accounts * min_amount) {
fprintf(stderr, "Paramètres invalides.\n");
fprintf(stderr, "Usage: %s -t total_amount -n num_accounts -m min_amount -M max_amount [-f filename]\n", argv[0]);
exit(EXIT_FAILURE);
}
// Afficher les paramètres utilisés
printf("Génération des comptes avec les paramètres suivants :\n");
printf(" Montant total : %d\n", total_amount);
printf(" Nombre de comptes : %d\n", num_accounts);
printf(" Montant minimum par compte : %d\n", min_amount);
printf(" Montant maximum par compte : %d\n", max_amount);
printf(" Fichier de sortie : %s\n", filename);
// Génération des comptes
generate_accounts(filename, total_amount, num_accounts, min_amount, max_amount);
return 0;
}