Script d'autorisation de départ : boucle incomplète et condition logique
Un exploitant de fret aérien a écrit un petit script pour décider de l'autorisation de départ d'un vol. Les six pallets prévus ont les masses suivantes, en kilogrammes : 480, 620, 390, 750, 510 et 440. Le réservoir contient 380 kg de carburant ; la charge marchande maximale est de 3 000 kg et le carburant minimal de décollage est de 400 kg. Le script est le suivant : lire n ; somme ← 0 ; pour i de 1 à n−1 faire somme ← somme + masse[i] ; fin pour ; si (carburant < 400) et (somme > 3000) alors afficher VOL REFUSÉ sinon afficher VOL AUTORISÉ. Le chef d'exploitation constate que le système a autorisé le vol alors que le responsable du chargement soutient le contraire. Les masses sont transmises à la tour par un message codé sur 12 bits, en kilogrammes, la masse totale étant la seule valeur transmise. Le régulateur demande une correction du script et une vérification du codage avant la prochaine rotation.
1. Identifier les deux erreurs du script, les corriger, puis tracer l'exécution des deux versions avec les données du vol.
Read the worked answer
Erreur 1 - borne de boucle : « pour i de 1 à n−1 » ignore le dernier élément. Avec n = 6, le pallet de 440 kg n'est jamais additionné (erreur de type off-by-one).
Erreur 2 - opérateur logique : « et » au lieu de « ou ». Le vol doit être refusé dès qu'un seul critère est violé ; avec « et », il faut que les deux le soient pour refuser, ce qui autorise des vols surchargés ou sous-carburés.
somme ← 0
pour i de 1 à n faire
somme ← somme + masse[i]
fin pour
si (carburant < 400) OU (somme > 3000) alors
afficher VOL REFUSÉ
sinon
afficher VOL AUTORISÉ
Trace, version fausse : somme = 480+620+390+750+510 = 2 750 ; carburant 380 < 400 → vrai ; 2 750 > 3 000 → faux ; vrai ET faux = faux → AUTORISÉ, à tort.
Trace, version corrigée : somme = 3 190 ; 380 < 400 vrai et 3 190 > 3 000 vrai ; vrai OU vrai = vrai → REFUSÉ.
2. Écrire la condition d'autorisation sous forme équivalente sans « si … sinon », et justifier par les lois logiques.
Read the worked answer
Énoncé : refuser si (C < 400) ∨ (M > 3000), avec C = carburant et M = masse totale.
Négation (lois de De Morgan) : ¬[(C < 400) ∨ (M > 3000)] ≡ (C ≥ 400) ∧ (M ≤ 3000).
D'où le test direct d'autorisation :
si (carburant >= 400) ET (somme <= 3000) alors
afficher VOL AUTORISÉ
sinon
afficher VOL REFUSÉ
Vérification par table de vérité (les deux conditions, quatre cas) :
- C ≥ 400 vrai, M ≤ 3000 vrai → autorisé ;
- C ≥ 400 vrai, M > 3000 faux → refusé (surcharge) ;
- C < 400 faux, M ≤ 3000 vrai → refusé (carburant) ;
- C ≥ 400 faux, M > 3000 faux → refusé.
Point de vigilance : inverser une condition composée ne consiste pas à inverser chaque comparaison en gardant le même connecteur ; il faut aussi remplacer « ou » par « et ». C'est exactement l'erreur qui a produit l'autorisation indue.
3. Vérifier que la masse totale peut être transmise sur 12 bits, et donner son écriture hexadécimale.
Read the worked answer
Capacité du codage : 12 bits non signés → 2¹² = 4 096 valeurs, de 0 à 4 095 kg.
Masse à transmettre : 3 190 kg (masse corrigée, tous pallets comptés). 3 190 ≤ 4 095, donc la valeur est représentable ; la marge restante est de 905 kg.
Conversion hexadécimale :
- 3 190 ÷ 16 = 199, reste 6
- 199 ÷ 16 = 12, reste 7
- 12 = C
Lecture des restes de bas en haut : 0xC76.
Contrôle en binaire : C 7 6 → 1100 0111 0110, soit 2 048 + 1 024 + 64 + 32 + 16 + 4 + 2 = 3 190. Correct.
Conclusion : le codage convient pour ce vol, mais le plafond de 4 095 kg est structurel : si l'exploitant ajoute un septième pallet ou passe à des masses en livres, le format devra être revu. C'est un point à signaler au régulateur en même temps que la correction du script, car le contrôle de la masse totale ne sert à rien si la valeur transmise sature silencieusement.