Défi
On veut calculer le prix total d'une commande de plusieurs articles réalisée sur un site web de papeterie. On dispose des informations de la commande sous forme d'un tableau de cette forme :
Article | Prix Unitaire Hors Taxes (en €) | Quantité achetée | Taux TVA |
Carnet Capiha Format A6 | 4.32 € | 2 | 5 % |
Cartouche d'encre bleu Water Melon Man | 2.71 € | 5 | 20 % |
Stylo plume Carpeur | 26.82 € | 1 | 20 % |
Pour réaliser la commande il faut calculer :
le montant hors-taxe de la commande ;
appliquer une majoration pour trouver le prix TTC (« Toutes taxes comprises ») de la commande.
Question
Question
On se donne le morceau de code suivant reprenant le tableau donné plus haut et la logique pour calculer le prix hors taxe du panier.
const productsTable =
[['Carnet Capiha Format A6', 4.32, 2, 0.05],
["Cartouche d'encre bleu Water Melon Man", 2.71, 5, 0.2],
['Stylo plume Carpeur', 26.82, 1, 0.2]]
let dutyFreePrice = 0
for (let line of productsTable) {
dutyFreePrice = dutyFreePrice + line[1] + line[2]
}
console.log('Total Price: ', dutyFreePrice, ' €')
Quel est la sortie retournée par le programme ?
Le résultat est-il correct ? Corriger s'il faut l'erreur et vérifier que le résultat est bien bon.
Solution
La sortie retournée est :
Total Price: 41.85 €
Le résultat est différent de celui qu'on a calculé à la main. Il y a un problème de logique dans le script, il faut remplacer la somme par une multiplication.
dutyFreePrice = dutyFreePrice + line[1] * line[2]
On obtient :
const productsTable =
[['Carnet Capiha Format A6', 4.32, 2, 0.05],
["Cartouche d'encre bleu Water Melon Man", 2.71, 5, 0.2],
['Stylo plume Carpeur', 26.82, 1, 0.2]]
let dutyFreePrice = 0
for (let line of productsTable) {
dutyFreePrice = dutyFreePrice + line[1] * line[2]
}
console.log('Total Price: ', dutyFreePrice.toFixed(2), ' €')
Question
Exécuter le script corrigé.
Quelle est la sortie du programme ? Le comportement de ce nouveau script corrigé est-il correct ?
Solution
Le résultat que l'on obtient est bien correct.
Total Price: 49.01 €
Question
Question
On veut maintenant calculer le montant du panier avec TVA dans une variable.
On se donne le morceau de code suivant reprenant le tableau donné plus haut et la logique pour calculer le prix du panier après application de la TVA.
const productsTable =
[['Carnet Capiha Format A6', 4.32, 2, 0.05],
["Cartouche d'encre bleu Water Melon Man", 2.71, 5, 0.2],
['Stylo plume Carpeur', 26.82, 1, 0.2]]
let price = 0
for (let line of productsTable) {
price = price + line[1] * line[2]
price = price * line[3]
}
console.log('Total Price with taxe: ', price.toFixed(2), ' €')
Quel est la sortie retournée par le programme ?
Le résultat est-il correct ? Corriger s'il faut l'erreur et vérifier que le résultat est bien bon.
Solution
Le résultat est mauvais, on obtient :
Total Price with taxe: 5.92328 €
Il y a des erreurs sur les lignes de calculs, on corrige cela pour :
for (let line of productsTable) {
price = price + line[1] * line[2] * (1 + line[3])
}
On obtient le script final :
const productsTable =
[['Carnet Capiha Format A6', 4.32, 2, 0.05],
["Cartouche d'encre bleu Water Melon Man", 2.71, 5, 0.2],
['Stylo plume Carpeur', 26.82, 1, 0.2]]
let price = 0
for (let line of productsTable) {
price = price + line[1] * line[2] * (1 + line[3])
}
console.log('Total Price with taxe: ', price.toFixed(2), ' €')
On obtient bien :
Total Price with taxe: 57.52 €
Question
On veut maintenant calculer et afficher comme précédemment le prix avec TVA de plusieurs paniers donnés dans une liste.
const productsTables = [
[['Cahier Sombreroche', 7.00, 4, 0.05],
['Feutre indélébile générique', 3.99, 5, 0.2],
['Stylo à bille Sib', 35, 12, 0.2]],
[['Carnet Capiha Format A4', 8.23, 1, 0.05],
["Cartouche de feuille d'imprimante 90g/m²", 5, 2, 0.2]],
[['Lot de craies', 3.99, 3, 0.2],
['Tableau blanc', 12.00, 1, 0.2]]
]
On met en place naïvement le code suivant :
const productsTables = [
[['Cahier Sombreroche', 7.00, 4, 0.05],
['Feutre indélébile générique', 3.99, 5, 0.2],
['Stylo à bille Sib', 35, 12, 0.2]],
[['Carnet Capiha Format A4', 8.23, 1, 0.05],
["Cartouche de feuille d'imprimante 90g/m²", 5, 2, 0.2]],
[['Lot de craies', 3.99, 3, 0.2],
['Tableau blanc', 12.00, 1, 0.2]]
]
let price = 0
for (let line of productsTables[0]) {
price = price + line[1] * line[2] * (1 + line[3])
}
console.log('Total Price with taxe: ', price.toFixed(2), ' €')
price = 0
for (let line of productsTables[1]) {
price = price + line[1] * line[2] * (1 + line[3])
}
console.log('Total Price with taxe: ', price.toFixed(2), ' €')
price = 0
for (let line of productsTables[1]) {
price = price + line[1] * line[2] * (1 + line[3])
}
console.log('Total Price with taxe: ', price.toFixed(2), ' €')
Exécuter ce code. Il y a-t-il une erreur ? Comment la corriger ?
Solution
Oui, il y a une erreur : le prix du second panier est affiché à la place de celui du troisième panier.
On doit normalement obtenir 28.76 €.
La dernière boucle devient :
for (let line of productsTables[2])
La bonne valeur est alors affichée.
Question
Après correction, le code précédent contient de la duplication de code, ce qui est une très mauvaise pratique.
Proposer un moyen qui permette à la fois de réduire ce code, d'éviter des bugs et de gagner en compréhension, tout en gardant le même résultat.
Indice
On peut pour cela injecter la logique dans une fonction dédiée au calcul du montant avec taxe d'un panier.
Solution
const productsTables = [
[['Cahier Sombreroche', 7.00, 4, 0.05],
['Feutre indélébile générique', 3.99, 5, 0.2],
['Stylo à bille Sib', 35, 12, 0.2]],
[['Carnet Capiha Format A4', 8.23, 1, 0.05],
["Cartouche de feuille d'imprimante 90g/m²", 5, 2, 0.2]],
[['Lot de craies', 3.99, 3, 0.2],
['Tableau blanc', 12.00, 1, 0.2]]
]
function computeTaxesProducts(productsTable) {
let price = 0
for (let line of productsTable) {
price = price + line[1] * line[2] * (1 + line[3])
}
return price.toFixed(2)
}
for (let table of productsTables) {
console.log('Total Price with taxe: ', computeTaxesProducts(table))
}
On obtient :
Total Price with taxe: 557.34 €
Total Price with taxe: 20.64 €
Total Price with taxe: 28.76 €
Question
Donner le rendu final du code une fois formaté :
Indice
On peut utiliser un formateur en ligne comme : https://beautifier.io/
Solution
const productsTables = [
[
['Cahier Sombreroche', 7.00, 4, 0.05],
['Feutre indélébile générique', 3.99, 5, 0.2],
['Stylo à bille Sib', 35, 12, 0.2]
],
[
['Carnet Capiha Format A4', 8.23, 1, 0.05],
["Cartouche de feuille d'imprimante 90g/m²", 5, 2, 0.2]
],
[
['Lot de craies', 3.99, 3, 0.2],
['Tableau blanc', 12.00, 1, 0.2]
]
]
function computeTaxesProducts(productsTable) {
let price = 0
for (line of productsTable) {
price = price + line[1] * line[2] * (1 + line[3])
}
console.log('Total Price with taxe: ', price.toFixed(2), ' €')
}
for (let table of productsTables) {
computeTaxesProducts(table)
}
La lisibilité, notamment au niveau de la déclaration des différents paniers, est améliorée.