Cours JavaScript et TypeScript · Module 1: Bases de JavaScript

Projet final : système d'enregistrement des dinosaures

8 min de lecture
Dans cette leçon4

Félicitations, jeune paléontologue ! Tu as atteint la fin du premier module et il est temps de tester ce que tu as appris. Dans ce projet final, tu combineras tous les concepts JavaScript que tu as appris en un seul système cohérent - le système d'enregistrement des dinosaures de Jurassic Park.

Imagine que le laboratoire de génétique vient de cloner un nouveau lot de dinosaures. En tant que programmeur principal du parc, ta tâche est de créer un système qui enregistre chaque nouveau spécimen, lui assigne les paramètres appropriés et affiche un rapport dans la console. C'est comme créer l'ADN numérique de chaque dinosaure de notre base de données !

Avant de passer au code, rappelons les outils à notre disposition : les variables (var, let, const), les types de données (string, number, boolean, null, undefined), les opérateurs, les instructions conditionnelles, les boucles, les fonctions, et la console pour afficher les résultats.

Objectif du projet

Tu vas construire un système complet d'enregistrement des dinosaures qui :

  • Stocke les données des dinosaures dans des variables des types appropriés
  • Utilise des opérateurs pour les calculs et les comparaisons
  • Applique des instructions conditionnelles pour la classification des espèces
  • Utilise des boucles pour le traitement des données
  • Organise la logique en fonctions
  • Affiche des rapports lisibles dans la console

Exigences fonctionnelles

1. Enregistrement de spécimen - Variables et types de données

La première étape consiste à créer un ensemble de variables stockant les données des dinosaures. Souviens-toi de choisir les types de données appropriés et les méthodes de déclaration de variables.

1// Données constantes de l'espèce (ne changent pas après l'enregistrement)
2const speciesName = "Tyrannosaurus Rex";
3const speciesCode = "TREX-001";
4const registrationDate = "2024-03-15";
5
6// Données variables du spécimen (peuvent changer avec le temps)
7let currentWeight = 8500; // en kilogrammes
8let height = 5.2; // en mètres
9let isHealthy = true;
10let currentEnclosure = "Sector A-7";
11
12// Données pas encore connues
13let lastFeedingTime = null;
14let veterinaryNotes = undefined;
15
16// Utilisation de var pour la démonstration (en pratique, nous évitons var)
17var parkId = 42;
18
19// Afficher les données dans la console
20console.log("=== ENREGISTREMENT DE DINOSAURE ===");
21console.log("Espèce :", speciesName);
22console.log("Code :", speciesCode);
23console.log("Poids :", currentWeight, "kg");
24console.log("Taille :", height, "m");
25console.log("En bonne santé :", isHealthy);
26console.log("Enclos :", currentEnclosure);
27console.log("Dernier nourrissage :", lastFeedingTime);
28console.log("Notes vétérinaires :", veterinaryNotes);

Remarque le choix de const vs let - les données de l'espèce ne changent pas, mais les paramètres du spécimen peuvent varier. La valeur null signifie une absence intentionnelle de données (pas encore nourri), tandis que undefined signifie des données pas encore saisies.

2. Classification des espèces - Instructions conditionnelles et opérateurs

Le système doit classer automatiquement les dinosaures en fonction de leurs paramètres. Ici, tu utiliseras des opérateurs de comparaison, des opérateurs logiques et des instructions conditionnelles.

1// Paramètres du dinosaure
2const weight = 8500;
3const diet = "carnivore"; // "carnivore", "herbivore", "omnivore"
4const aggressionLevel = 9; // échelle 1-10
5
6// Classification du niveau de menace à l'aide de if/else
7let threatLevel;
8let requiresDoubleBarrier;
9
10if (diet === "carnivore" && aggressionLevel > 7) {
11  threatLevel = "CRITICAL";
12  requiresDoubleBarrier = true;
13} else if (diet === "carnivore" && aggressionLevel <= 7) {
14  threatLevel = "HIGH";
15  requiresDoubleBarrier = true;
16} else if (diet === "omnivore") {
17  threatLevel = "MEDIUM";
18  requiresDoubleBarrier = false;
19} else {
20  threatLevel = "LOW";
21  requiresDoubleBarrier = false;
22}
23
24// Classification de la taille à l'aide de switch
25let sizeCategory;
26switch (true) {
27  case weight > 5000:
28    sizeCategory = "colossal";
29    break;
30  case weight > 1000:
31    sizeCategory = "large";
32    break;
33  case weight > 100:
34    sizeCategory = "medium";
35    break;
36  default:
37    sizeCategory = "small";
38    break;
39}
40
41// Opérateurs logiques pour les conditions spéciales
42const needsReinforcement = weight > 5000 || aggressionLevel >= 9;
43const canCohabitate = diet !== "carnivore" && aggressionLevel < 5;
44const isDocile = !requiresDoubleBarrier && aggressionLevel <= 3;
45
46console.log("Niveau de menace :", threatLevel);
47console.log("Catégorie de taille :", sizeCategory);
48console.log("Nécessite une double barrière :", requiresDoubleBarrier);
49console.log("Nécessite un renforcement :", needsReinforcement);
50console.log("Peut cohabiter avec d'autres :", canCohabitate);
51console.log("Docile :", isDocile);

3. Rapport de nourrissage - Boucles et opérateurs arithmétiques

Le système doit calculer les besoins en nourriture pour toute la semaine. Ici, tu utiliseras des boucles for et while et des opérateurs arithmétiques.

1const dinoName = "Rex";
2const baseFood = 150; // kg de viande par jour
3const growthRate = 1.02; // 2% de croissance quotidienne
4
5console.log("=== RAPPORT DE NOURRISSAGE ===");
6console.log("Dinosaure :", dinoName);
7
8// boucle for - calculer les besoins quotidiens
9let totalFood = 0;
10
11for (let day = 1; day <= 7; day++) {
12  // Chaque jour, le dinosaure a besoin de plus de nourriture
13  let dailyFood = baseFood * (growthRate ** (day - 1));
14  dailyFood = Math.round(dailyFood * 100) / 100;
15  totalFood += dailyFood;
16
17  console.log("Jour " + day + " : " + dailyFood + " kg");
18}
19
20console.log("Total hebdomadaire :", Math.round(totalFood) + " kg");
21
22// boucle while - vérifier les réserves de l'entrepôt
23let stockKg = 2000; // réserve de viande dans l'entrepôt
24let daysUntilEmpty = 0;
25let dailyConsumption = baseFood;
26
27while (stockKg > 0) {
28  stockKg -= dailyConsumption;
29  dailyConsumption *= growthRate; // augmente avec le temps
30  daysUntilEmpty++;
31}
32
33console.log("Les réserves dureront :", daysUntilEmpty, "jours");
34
35// opérateur modulo - horaire de nourrissage
36for (let hour = 0; hour < 24; hour++) {
37  if (hour % 8 === 0) {
38    console.log("Heure " + hour + ":00 - HEURE DU NOURRISSAGE !");
39  }
40}

4. Fonctions du système - Organisation du code

Chaque sous-système du parc devrait être encapsulé dans une fonction. Cela permet la réutilisation du code et une meilleure organisation.

1// Fonction pour enregistrer un dinosaure
2function registerDinosaur(name, species, weight, diet) {
3  console.log("--- Enregistrement ---");
4  console.log("Nom :", name);
5  console.log("Espèce :", species);
6  console.log("Poids :", weight, "kg");
7  console.log("Régime :", diet);
8
9  // Renvoyer le code d'enregistrement
10  const code = species.substring(0, 3).toUpperCase() + "-" + parkId;
11  parkId++; // incrémenter le compteur global
12  return code;
13}
14
15// Variable globale comme compteur
16var parkId = 1;
17
18// Fonction pour calculer l'IMC du dinosaure
19function calculateDinoBMI(weight, height) {
20  if (height <= 0) {
21    console.log("Erreur : la taille doit être supérieure à 0 !");
22    return null;
23  }
24  const bmi = weight / (height * height);
25  return Math.round(bmi * 100) / 100;
26}
27
28// Fonction pour générer une alerte de sécurité
29function securityAlert(name, threatLevel, isContained) {
30  if (!isContained) {
31    console.log("!!! ALARME !!! Le dinosaure " + name + " s'est échappé !");
32    console.log("Niveau de menace : " + threatLevel);
33    return true; // évacuation requise
34  }
35  console.log(name + " - statut : en sécurité");
36  return false; // aucune menace
37}
38
39// Commentaires multi-lignes décrivant la logique du système
40/*
41  Système d'enregistrement des dinosaures :
42  1. Enregistrer un nouveau spécimen
43  2. Calculer son IMC
44  3. Vérifier le statut de sécurité
45  4. Générer le rapport final
46*/
47
48// Utiliser les fonctions
49const rexCode = registerDinosaur("Rex", "Tyrannosaurus", 8500, "carnivore");
50const triCode = registerDinosaur("Tricia", "Triceratops", 6000, "herbivore");
51const veloCode = registerDinosaur("Blue", "Velociraptor", 75, "carnivore");
52
53console.log("Codes d'enregistrement :", rexCode, triCode, veloCode);
54
55const rexBMI = calculateDinoBMI(8500, 5.2);
56const triBMI = calculateDinoBMI(6000, 2.8);
57console.log("IMC de Rex :", rexBMI);
58console.log("IMC de Tricia :", triBMI);
59
60// Conversion de type en pratique
61const userInput = "7500"; // données de formulaire sous forme de chaîne
62const numericWeight = Number(userInput);
63console.log("Type avant conversion :", typeof userInput);
64console.log("Type après conversion :", typeof numericWeight);
65console.log("Est-ce un nombre ?", !isNaN(numericWeight));
66
67// Concaténation vs addition
68console.log("500" + 100); // "500100" - concaténation de chaînes !
69console.log(Number("500") + 100); // 600 - addition correcte
70
71// Booléen dans les conditions
72const isElectrified = true;
73const hasPower = false;
74const fenceActive = isElectrified && hasPower;
75console.log("Clôture active :", fenceActive); // false

Conseils d'implémentation

Lorsque tu créeras ton propre système d'enregistrement, souviens-toi de quelques principes clés :

  1. Choisis le bon type de déclaration de variable - const pour les valeurs constantes (espèce, date d'enregistrement), let pour les valeurs variables (poids, emplacement), évite var
  2. Utilise des commentaires - aussi bien sur une seule ligne (//) que multi-lignes (/* */) pour documenter la logique du système
  3. Souviens-toi des points-virgules - bien que JavaScript permette de les omettre grâce à l'ASI, c'est une bonne pratique de les utiliser pour la lisibilité
  4. Convertis les types consciemment - utilise Number(), String(), Boolean() au lieu de te reposer sur la conversion implicite
  5. Teste dans la console - console.log(), console.table() et console.warn() sont tes meilleurs amis lors du débogage
  6. Organise le code en fonctions - chaque opération logique (enregistrement, classification, rapport) devrait être une fonction distincte

Bonne chance !

Crée ton propre système d'enregistrement des dinosaures dans l'éditeur ci-dessous. Utilise tous les concepts que tu as appris : variables, types de données, opérateurs, instructions conditionnelles, boucles et fonctions. Souviens-toi - il n'y a pas de place pour l'erreur à Jurassic Park, alors teste ton code minutieusement !

Comme l'a dit le Dr Ian Malcolm : « La vie trouve toujours un chemin » - et tu viens de trouver ton chemin avec JavaScript !

Code de cette leçon : index.js
1// Projet final : Système d'enregistrement des dinosaures
2// Combine tous les concepts appris : variables, types, conditions, boucles, fonctions
3
4// === 1. BASE DE DONNÉES DES ESPÈCES ===
5// TODO : Crée un tableau d'objets avec les données des dinosaures
6// Chaque dinosaure doit avoir : name, species, weight, diet, isHealthy, enclosure
7const parkDinosaurs = [
8  // TODO : Ajoute au moins 5 dinosaures
9];
10
11// === 2. FONCTION D'ENREGISTREMENT ===
12// TODO : Crée une fonction registerDinosaur(name, species, weight, diet)
13// Elle doit renvoyer un objet avec les données + un ID généré automatiquement et une date d'enregistrement
14function registerDinosaur(name, species, weight, diet) {
15  // TODO : Renvoie un objet dinosaure avec les champs :
16  // id (p. ex. "DINO-001"), name, species, weight, diet,
17  // isHealthy (true par défaut), registrationDate
18}
19
20// === 3. CLASSIFICATION DES ESPÈCES ===
21// TODO : Crée une fonction classifyDinosaur(dino) qui, selon le régime et le poids,
22// renvoie le niveau de menace : "critical", "high", "medium", "low"
23function classifyDinosaur(dino) {
24  // TODO : Utilise if/else pour la classification
25  // Carnivore > 5000kg = "critical"
26  // Carnivore <= 5000kg = "high"
27  // Herbivore > 3000kg = "medium"
28  // Autres = "low"
29}
30
31// === 4. RAPPORT DU PARC ===
32// TODO : Utilise une boucle pour itérer sur le tableau de dinosaures
33// Affiche le rapport : name, species, niveau de menace
34function generateParkReport(dinosaurs) {
35  console.log("=== RAPPORT DU PARC JURASSIQUE ===");
36  // TODO : Utilise for...of pour itérer
37  // Pour chaque dinosaure, affiche les données et la classification
38}
39
40// === 5. STATISTIQUES ===
41// TODO : Calcule et affiche les statistiques du parc
42// - Nombre total de dinosaures
43// - Poids moyen
44// - Nombre de carnivores vs herbivores
45
46// Démarre le système :
47console.log("Système d'enregistrement des dinosaures lancé !");

Tu as repéré une erreur dans cette leçon ?

Articles utiles