Cours de Javascript 2022

Chapitre 3 - Correction 4 : Horaire de train


let monsMorningHour = " 9h10";
let monsAfternoonHour = "13h30";
let monsEveningHour = "22h56";

let bruxellesMorningHour = "10h33";
let bruxellesAfternoonHour = "14h42";
let bruxellesEveningHour = "19h02";

let nivellesMorningHour = "5h34";
let nivellesAfternoonHour = "15h13";
let nivellesEveningHour = "20h00";

let charleroiMorningHour = "7h45";
let charleroiAfternoonHour = "12h53";
let charleroiEveningHour = "23h02";

alert("Bienvenue dans l'application SNCB qui sert à savoir l'horaire de vos trains, vous allez devoir saisir une destination et une période de la journée pour que je puisse vous donner l'heure de départ de votre train.");

let destinationNbr = DestinationChoice();
let periodNbr = PeriodChoice();
let destination = "";
let period = "";

if(destinationNbr == 1)
{
 destination=="Bruxelles";
 if(periodNbr==1)
 {
  period = bruxellesMorningHour;
 }
 if(periodNbr==2)
 {
  period = bruxellesAfternoonHour;
 }
 if(periodNbr==3)
 {
  period = bruxellesEveningHour;
 }
}

if(destinationNbr == 2)
{
 destination=="Mons";
 if(periodNbr==1)
 {
  period = monsMorningHour;
 }
 if(periodNbr==2)
 {
  period = monsAfternoonHour;
 }
 if(periodNbr==3)
 {
  period = monsEveningHour;
 }
}

if(destinationNbr == 3)
{
 destination=="Nivelles";
 if(periodNbr==1)
 {
  period = nivellesMorningHour;
 }
 if(periodNbr==2)
 {
  period = nivellesAfternoonHour;
 }
 if(periodNbr==3)
 {
  period = nivellesEveningHour;
 }
}

if(destinationNbr == 4)
{
 destination=="Charleroi";
 if(periodNbr==1)
 {
  period = charleroiMorningHour;
 }
 if(periodNbr==2)
 {
  period = charleroiAfternoonHour;
 }
 if(periodNbr==3)
 {
  period = charleroiEveningHour;
 }
}

alert("Votre train à destination de " + destination + " partira à " + period + ". Bon voyage !")

function DestinationChoice()
{
 _destination = parseInt(prompt("Choisissez votre destination en entrant le chiffre correspondant :\n1 - Bruxelles\n2 - Mons\n3 - Nivelles\n4 - Charleroi"));
 if(_destination>4||_destination < 0)
 {
  alert("Donnée entrée incorrecte, veuillez recommencer");
  DestinationChoice();
 }
 else
 {
  return _destination;
 }
}
function PeriodChoice()
{
 _period = parseInt(prompt("Choisissez votre période de la journée à laquelle vous voudrez partir :\n1 - Matin\n2 - Après-midi\n3 - Soir"));
 if(_period>3||_period < 0)
 {
  alert("Donnée entrée incorrecte, veuillez recommencer");
  PeriodChoice();
 }
 else
 {
  return _period;
 }
}

Explications :

On va déclarer toutes nos périodes en haut, dans des variables, ça sera plus simple de les modifier dans le futur si on en a besoin. Ensuite, on a 2 fonctions qui nous permettent boucler en cas d'erreur de l'utilisateur pour lui redemander de choisir un bon input. Enfin, la solution que vous avez sans doute envisagé, c'est de faire une suite de if imbriqué, c'est à dire d'abord de demander la destination, une fois la destination choisie, on refait des if dans le if pour faire choisir la période.

Solution alternative :

let monsMorningHour = " 9h10";
let monsAfternoonHour = "13h30";
let monsEveningHour = "22h56";

let bruxellesMorningHour = "10h33";
let bruxellesAfternoonHour = "14h42";
let bruxellesEveningHour = "19h02";

let nivellesMorningHour = "5h34";
let nivellesAfternoonHour = "15h13";
let nivellesEveningHour = "20h00";

let charleroiMorningHour = "7h45";
let charleroiAfternoonHour = "12h53";
let charleroiEveningHour = "23h02";

alert("Bienvenue dans l'application SNCB qui sert à savoir l'horaire de vos trains, vous allez devoir saisir une destination et une période de la journée pour que je puisse vous donner l'heure de départ de votre train.");

let destinationNbr = DestinationChoice();
let periodNbr = PeriodChoice();
let destination = "";
let period = "";

if(destinationNbr == 1)
{
 destination=="Bruxelles";
 period = FakePeriodSwitch(periodNbr,bruxellesMorningHour,bruxellesAfternoonHour,bruxellesEveningHour)
}

if(destinationNbr == 2)
{
 destination=="Mons";
 period = FakePeriodSwitch(periodNbr,monsMorningHour,monsAfternoonHour,monsEveningHour)
}

if(destinationNbr == 3)
{
 destination=="Nivelles";
period = FakePeriodSwitch(periodNbr,nivellesMorningHour,nivellesAfternoonHour,nivellesEveningHour)
}

if(destinationNbr == 4)
{
 destination=="Charleroi";
 period = FakePeriodSwitch(periodNbr,charleroiMorningHour,charleroiAfternoonHour,charleroiEveningHour)
}

alert("Votre train à destination de " + destination + " partira à " + period + ". Bon voyage !")

function DestinationChoice()
{
 _destination = parseInt(prompt("Choisissez votre destination en entrant le chiffre correspondant :\n1 - Bruxelles\n2 - Mons\n3 - Nivelles\n4 - Charleroi"));
 if(_destination>4||_destination < 0)
 {
  alert("Donnée entrée incorrecte, veuillez recommencer");
  DestinationChoice();
 }
 else
 {
  return _destination;
 }
}
function PeriodChoice()
{
 _period = parseInt(prompt("Choisissez votre période de la journée à laquelle vous voudrez partir :\n1 - Matin\n2 - Après-midi\n3 - Soir"));
 if(_period>3||_period < 0)
 {
  alert("Donnée entrée incorrecte, veuillez recommencer");
  PeriodChoice();
 }
 else
 {
  return _period;
 }
}
function FakePeriodSwitch(periodChoice,firstPeriod, secondPeriod, thirdPeriod)
{
 if(periodChoice==1)
 {
&emsp return firstPeriod;
 }
 if(periodChoice==2)
 {
  return secondPeriod;
 }
 if(periodChoice==3)
 {
  return thirdPeriod;
 }
}

Il y a potentiellement plein de solutions alternatives, mais si vous n'utilisez pas de fonctions, à l'heure actuelle, vous ne pouvez pas boucler en cas de mauvaise réponse de l'utilisateur. On doit donc utiliser une fonction récursive. La plus grande amélioration ici est le repérage du fait que finalement, toutes nos suites de if une fois la destination choisie sont les mêmes. Il est donc bien plus simple de créer une fonction qui permet de créer le choix et qui attend en paramètre les potentielles périodes de temps. Si tous les trains respectent le même fonctionnement (à savoir 3 train par jour), on peut potentiellement ajouter maintenant une infinité de train avec un minimum de nouvelles lignes.