Module 3 : Les structures de données

Cours

1. Types numériques

Un programme manipule des données stockées dans la mémoire centrale. Les types numériques incluent les entiers (int $\mathbb{Z}$) et les réels (float $\mathbb{R}$).

📌 Règle Mnémonique PEMDAS : Ordre de priorité des opérations

En informatique comme en mathématiques, les expressions numériques sont évaluées selon l'ordre de priorité PEMDAS :

Parenthèses ( )
Exposants / Puissance **
Multiplication *
Division / , // , %
Addition +
Soustraction -
PEMDAS Opération Priorité Algorithme Python Exemple
P Parenthèses 1 (Max) ( ) ( ) (1 + 5) * (3 - 5) → -12
E Exposants / Puissance 2 Puissance(x, n) ** 2 ** 3 → 8
M Multiplication 3 * * 2 * 3 → 6
D Division réelle 3 / / 5 / 2 → 2.5
Division entière 3 div // 5 // 2 → 2
Reste division (Modulo) 3 mod % 5 % 2 → 1
A Addition 4 + + 5 + 3 → 8
S Soustraction 4 - - 5 - 3 → 2

b. Partie entière et partie décimale

Illustration Partie entière et partie décimale

c. Opérateurs de division & Division euclidienne

Illustration Division euclidienne

d. Les fonctions prédéfinies sur les nombres

Illustration du fonctionnement de la fonction round(x) en Python
Algorithme Python Description Exemple
Ent(x) int(x) Retourne la partie entière Ent(5.75) ⟶ 5
Arrondi(x) round(x) Retourne l'entier le plus proche (entier pair si .5) round(3.5) ⟶ 4
Racine(x) sqrt(x) (from math) Retourne la racine carrée d'un nombre positif sqrt(25) ⟶ 5.0
Abs(x) abs(x) Retourne la valeur absolue de x abs(-4) ⟶ 4
Aléa(a, b) randint(a, b) (from random) Retourne un nombre aléatoire dans [a, b] randint(1, 6) ⟶ 4

2. Le type booléen

Une variable booléenne ne peut prendre que la valeur Faux ou Vrai (False / True en Python).

1. Fonctions logiques de base (NON, ET, OU) & Portes logiques

En informatique et en électronique numérique, les opérations logiques fondamentales sont concrétisées par des portes logiques (symboles normalisés ANSI / IEEE d'origine américaine et CEI / IEC européenne).

Fonction NON (Négation) not x / non x
Équation : S = x̄ Python : not x
Schémas à porte logique :
Porte logique NON (symboles ANSI et CEI)
Entrée x Sortie S = non x
0 (Faux) 1 (Vrai)
1 (Vrai) 0 (Faux)
⚡ Circuit Inverseur (NF) : Fermé Fermé ⟶ Éteinte Éteinte
Ouvert Ouvert ⟶ Allumée Allumée
Fonction ET (Conjonction) x and y / x et y
Équation : S = x • y Python : x and y
Schémas à porte logique :
Porte logique ET (symboles ANSI et CEI)
x y Sortie S = x et y
0 0 0 (Faux)
0 1 0 (Faux)
1 0 0 (Faux)
1 1 1 (Vrai)
⚡ Circuit en Série : Allumée Allumée uniquement si x ET y sont tous les deux Fermé Fermés (1).
Fonction OU (Disjonction) x or y / x ou y
Équation : S = x + y Python : x or y
Schémas à porte logique :
Porte logique OU (symboles ANSI et CEI)
x y Sortie S = x ou y
0 0 0 (Faux)
0 1 1 (Vrai)
1 0 1 (Vrai)
1 1 1 (Vrai)
⚡ Circuit en Parallèle : Allumée Allumée dès qu'au moins x OU y est Fermé Fermé (1).

2. ⚡ Simulation Interactive des Portes Logiques (Circuits & Diodes)

Testez chaque circuit indépendamment des autres : cliquez directement sur les entrées (0 ou 1) de chaque porte logique (ou sur ses boutons) pour faire basculer son état et observer la diode de sortie en temps réel !

1. Opérateur NON non x
Schéma & Entrée Cliquez sur x
Diode NON
⚡ Diode ALLUMÉE (Vrai)
not (False) ⟶ True
2. Opérateur ET x et y
Schéma & Entrées Cliquez sur x ou y
Diode ET
⚡ Diode ÉTEINTE (Faux)
False and False ⟶ False
3. Opérateur OU x ou y
Schéma & Entrées Cliquez sur x ou y
Diode OU
⚡ Diode ÉTEINTE (Faux)
False or False ⟶ False

3. 🔢 Ordre d'évaluation des opérateurs de Comparaison et des opérateurs logiques

Priorité Catégorie d'opérateurs Algorithme Python Exemple d'évaluation
1 (Max) Parenthèses ( ) ( ) (5 > 2) et (3 < 4) → Vrai
2 Opérateurs Arithmétiques + , - , * , / , mod , div + , - , * , / , % , // 5 + 3 > 7 → 8 > 7 → Vrai
3 Opérateurs de Comparaison = , ≠ , > , ≥ , < , ≤ == , != , > , >= , < , <= x == 5 , age >= 18
4 NON Logique (Négation) non not not (5 > 2) → False
5 ET Logique (Conjonction) et and True and False → False
6 (Min) OU Logique (Disjonction) ou or True or False → True

3. Les types textuels

Les données textuelles sont stockées, en algorithmique, dans des variables de type :

  • Caractère ;
  • Chaîne.

En Python, on dispose uniquement du type str.

Différence entre chaîne et caractère

a. Le type caractère

i. Présentation

Le type caractère représente un seul caractère qui peut être :

  • Une lettre : majuscule ("A", "B", ...) ou minuscule ("a", "b", ...)
  • Un chiffre : "0", "1", "2", ..., "9"
  • Un symbole : "!", "\"", "#", "$", "%", ...
ii. Table ASCII

Dans la mémoire de l'ordinateur, un caractère est représenté par son code ASCII (American Standard Code for Information Interchange). Ainsi, chaque caractère possède un code (un nombre) correspondant :

🔎 Recherche interactive Table ASCII (Standard 32-127)
Code Car. Code Car. Code Car. Code Car. Code Car. Code Car. Code Car. Code Car.
48 0 65 A
iii. Les fonctions prédéfinies sur les caractères
Algorithme Python Description Exemple
ord(car) ord(car) Retourne le code ASCII du caractère car. ord("A") → 65
chr(code) chr(code) Retourne le caractère ASCII équivalent au code. chr(65) → "A"
⚠️
Important : En algorithme, il n'y a pas de fonction minus(car).
Pour convertir une lettre majuscule car en minuscule, on peut écrire :
chr(ord(car) + 32)

b. Le type Chaîne

i. Présentation

Une Chaîne de caractères est la succession de n caractères ASCII ($n \ge 0$).

  • Si $n$ est nulle ($n = 0$), on parle d'une Chaîne vide : ch ← ""  // Chaîne vide
    Illustration Chaîne vide vs Chaîne non vide
  • On peut accéder au $i^e$ caractère ($0 \le i < n$) d'une Chaîne ch en utilisant la notation : ch[i]
    Schéma d'indexation de la Chaîne Youssef
  • Pour concaténer (coller) deux Chaînes, on utilise l'opérateur + :
    Schéma de concaténation Langage + Py + thon
ii. Les fonctions prédéfinies sur les Chaînes
Algorithme Python Description Exemple
long(ch) len(ch) Calcule la longueur de la Chaîne ch. long("BAC26") → 5
long("") → 0
Pos(ch1, ch2) ch2.find(ch1) Retourne la position (indice) de la 1ère occurrence de ch1 dans ch2 (-1 si non trouvée). Pos("26", "BAC26") → 3
Pos("Hi", "BAC26") → -1
ConvCh(x) str(x) Convertir une valeur numérique x en Chaîne. ConvCh(10) → "10"
ConvCh(17.5) → "17.5"
Valeur(ch) int(ch)
float(ch)
Convertit une Chaîne en une valeur numérique, sinon provoque une erreur. Valeur("10") → 10
Valeur("17.5") → 17.5
EstNum(ch) ch.isdecimal() Vérifie si la Chaîne ch est composée uniquement de chiffres. EstNum("10") → Vrai
EstNum("2k") → Faux
sous_chaîne(ch, d, f) ch[d:f] Extrait de la Chaîne ch les caractères situés entre la position d (incluse) et f (non incluse). sous_chaîne("BAC26", 3, 5) → "26"
effacer(ch, d, f) ch[:d] + ch[f:] Efface de la Chaîne ch les caractères situés entre la position d (incluse) et f (non incluse). effacer("BAC26", 3, 5) → "BAC"
majus(ch) ch.upper() Convertit la Chaîne ch en majuscules. majus("bac 26") → "BAC 26"

Exercices Interactifs

Exercice 1 – Opérateurs numériques

Compléter le tableau ci-dessous (Expression Python équivalente, Résultat et Type) :

💡 Afficher les indices de résolution
📌 Règles et astuces pour l'Exercice 1 :
  • Division réelle (/) : En Python, la division simple produit toujours un flottant (float). Ainsi, 12 / 4 donne 3.0 (et non 3).
  • Division entière (div → //) : Renvoie le quotient entier (ex : 11 // 5 donne 2, de type int).
  • Reste de la division (mod → %) : Calcule le reste de la division euclidienne (ex : 11 % 4 donne 3 car $11 = 4 \times 2 + 3$, type int).
  • Opérateurs relationnels en Python :
    • Égalité : == (ex : 1+2 == 3-0).
    • Différence : != (pour $\ne$).
    • Inférieur ou égal : <= (pour $\le$).
    • Appartenance : in avec une liste entre crochets (ex : 5 in [12, 6, -3, 5, 7]).
  • Type booléen (bool) : Le résultat d'une comparaison est un booléen : True ou False (avec majuscule initiale).
Expression en Algorithme Expression en Python Résultat Type ✔️
5 + 6
4.5 - 2.5
12 / 4
11 mod 4
11 div 5
12 ≠ (10+2)
4 ≤ 4
5 ∈ {12, 6, -3, 5, 7}
1+2 = 3-0

Exercice 2 – Expressions numériques / logiques

Compléter le tableau ci-dessous. Les cellules grises sont données, les cases blanches sont à remplir :

💡 Afficher les indices de résolution
📌 Règles et astuces pour l'Exercice 2 :
  • Correspondance Algorithme → Python :
    • Abs(x) → abs(x) (valeur absolue).
    • Ent(x) → int(x) (partie entière, type int).
    • Arrondi(x) → round(x) (arrondi à l'entier le plus proche).
    • Racine(x) → sqrt(x) (module math). Attention : sqrt() retourne toujours un float (ex : sqrt(16) donne 4.0).
    • Aléa(a, b) → randint(a, b) (module random).
    • mod → % et div → //.
  • Propagation du type réel (float) : Tout nombre avec un point décimal (ex: 15. ou 1.5) ou division réelle (/) convertit toute l'expression arithmétique en float.
  • Priorité des opérations (PEMDAS) : Parenthèses → Exposants → Multiplications, Divisions et Modulo → Additions et Soustractions.
  • Simulation conditionnelle : Dans x = (a > b) * a + (a <= b) * b, la condition vraie vaut 1 et la fausse vaut 0, sélectionnant la plus grande valeur (maximum).
  • Test hors limites : Dans Aléa(10, 20) > 30, un nombre tiré entre 10 et 20 ne peut jamais être supérieur à 30, donc le résultat est toujours False (type bool).
# Expression en algorithme Expression en Python Résultat Type ✔️
1 x = 15 + 3 * 2 + 5
2 x ← (18 mod 5) / 2
3 x = (13 % 5) // 2
4 x ← Abs(-12.5)+3
5 a = 3 ; b = 6
x = (a > b) * a + (a <= b) * b
6 c ← 8 ; d ← 1 ; x ← Abs(a-c) + Abs(b-d)
7 x ← Ent(Racine((a-c)*(a-c)+(b-d)*(b-d)))
8 x ← 15 + 3 * 2 + Ent(5.56)
9 x ← 15. + 3 * 2 + Ent(5.56)
10 x = (7+ round(14.36)) % 2
11 x ← 20 > 10 * 1.5
12 x ← Aléa(10, 20) > 30
13 x ← Arrondi(Abs(-12.9)) + Racine(16)

Exercice 3 – Exécution manuelle (Trace mémoire)

Donner la trace d'exécution des variables X, Y et Z après l'exécution de chaque instruction :

💡 Afficher les indices de résolution
📌 Conseils méthodologiques (Trace mémoire) :
  • Initialisation : Tant qu'une variable n'a reçu aucune affectation, indiquer un tiret - (ou laisser vide).
  • Conservation des valeurs : À chaque nouvelle ligne, seules les variables affectées changent de valeur. Les autres variables conservent leur valeur de la ligne précédente.
  • Priorité des opérations : Les opérateurs *, div et mod sont prioritaires sur + et -. N'effectuez les additions ou soustractions qu'après avoir évalué les multiplications ou divisions.
  • Rôle des parenthèses : Toute opération entre parenthèses ( ) doit être calculée en premier, avant toute autre opération extérieure.
  • Rappel des opérateurs :
    • div : quotient entier de la division euclidienne (sans virgule ni décimales).
    • mod : reste entier de la division euclidienne.
# Instruction X Y Z ✔️
1 X ← 10
2 Y ← 2
3 X ← X + Y * 2
4 Z ← X div 2 + Y
5 Y ← (Z + X) mod 2
6 Z ← X * 3 + 4 mod 2

Exercice 4 – Fonction Aléa

Compléter le tableau ci-dessous avec l'instruction Python équivalente et l'intervalle de variation de la variable X :

💡 Afficher les indices de résolution
📌 Règles et exemples d'encadrement des intervalles :

Traduction Python : Aléa(a, b) se traduit par x = randint(a, b) (module random), avec $a \le x \le b$.

  • Multiplication par une constante positive (ex: $\times 2$) :
    On multiplie chaque membre de l'inégalité :
    1 ≤ x ≤ 5
    1 * 2 ≤ x * 2 ≤ 5 * 2
    → 2 ≤ x * 2 ≤ 10
  • Multiplication par une constante négative (ex: $\times -3$) :
    Attention : multiplier par un nombre négatif inverse le sens des bornes :
    1 ≤ x ≤ 5
    5 * (-3) ≤ x * (-3) ≤ 1 * (-3)
    → -15 ≤ x * (-3) ≤ -3
  • Division entière (ex: // 2) :
    On applique la division entière aux bornes :
    1 ≤ x ≤ 7
    1 // 2 ≤ x // 2 ≤ 7 // 2
    → 0 ≤ x // 2 ≤ 3
  • Produit de deux tirages indépendants ($x \times y$) :
    Si $1 \le x \le 4$ et $0 \le y \le 3$ :
    Min : 1 * 0 = 0 • Max : 4 * 3 = 12
    → 0 ≤ x * y ≤ 12
  • Quotient de deux tirages indépendants ($x / y$) :
    Si $10 \le x \le 40$ et $2 \le y \le 5$ :
    Min : plus petit numérateur / plus grand dénominateur = 10 / 5 = 2.0
    Max : plus grand numérateur / plus petit dénominateur = 40 / 2 = 20.0
    → 2.0 ≤ x / y ≤ 20.0
# Instruction Algorithme Instruction Python Intervalle de variation ✔️
1 x ← Aléa(1, 6)
≤ X ≤
2 x ← Aléa(1, 6) * 10
≤ X ≤
3 x ← Aléa(1, 6) * -2
≤ X ≤
4 x ← Aléa(1, 6) // 2
≤ X ≤
5 x ← Aléa(1, 6) * Aléa(0, 2)
≤ X ≤
6 x ← Aléa(10, 90) / Aléa(1, 9)
≤ X ≤

Exercice 5 – Concaténation de Chaînes

Soient les variables Python : ch1 = "python", ch2 = "javascript", ch3 = "uml" et ch4 = "perl".

📊 Représentation visuelle des chaînes et des indices de leurs caractères (0 à n-1)
ch1 = "python"
0 p
1 y
2 t
3 h
4 o
5 n
ch2 = "javascript"
0 j
1 a
2 v
3 a
4 s
5 c
6 r
7 i
8 p
9 t
ch3 = "uml"
0 u
1 m
2 l
ch4 = "perl"
0 p
1 e
2 r
3 l
💡 Afficher les indices de résolution
📌 Décomposition pas à pas des 6 expressions :
  • Expression 1 (ch1[0]) : Extrait le 1er caractère (indice 0) de "python" → 'p'.
  • Expression 2 (ch2.upper()) : Met toute la chaîne "javascript" en lettres majuscules.
  • Expression 3 : Concatène les lettres aux indices donnés : ch1[0] ('p') + ch3[0] ('u') + ch2[5] ('c') + ch4[1] ('e').
  • Expression 4 : ch2[9].upper() donne 'T', ch1[2].upper() donne 'T'. Assembler avec ch2[7] ('i'), ch2[8] ('p'), ch1[4] ('o') et ch1[0] ('p').
  • Expression 5 : len(ch1) - len(ch4) = 6 - 4 = 2 → str(2) = "2". Pour le terme chr(ord(ch1[3]) - 3) : ch1[3] est 'h' (ASCII 104), et $104 - 3 = 101$ qui est la lettre 'e'.
  • Expression 6 : Utiliser len(ch3) = 3 et len(ch4) = 4 : ch3[2] ('l') + ch2[3] ('a') + ch4[2] ('r') + ch3[1] ('m') + ch4[1] ('e').

Remplir le tableau ci-dessous par l'affichage de chacune des instructions (résultat sans les guillemets) :

# Instruction Python Résultat affiché ✔️
1 print(ch1[0])
2 print(ch2.upper())
3 print(ch1[0] + ch3[0] + ch2[5] + ch4[1])
4 print(ch2[9].upper() + ch2[7] + ch2[8] + ch1[2].upper() + ch1[4] + ch1[0])
5 print(str(len(ch1) - len(ch4)) + ch4[1] + " " + ch2[4] + ch2[5] + ch2[7] + chr(ord(ch1[3]) - 3) + ch1[5])
6 print(ch3[len(ch3) - 1] + ch2[len(ch3)] + ch4[len(ch4) - 2] + ch3[len(ch3) // 2] + ch4[len(ch4) - len(ch3)])

Exercice 6 – Manipulation de Chaînes

Soient les variables : ch1 = "Algorithmique", ch2 = "Python", et ch3 = "4502".

📊 Représentation visuelle des chaînes et des indices de leurs caractères (0 à n-1)
ch1 = "Algorithmique"
0 A
1 l
2 g
3 o
4 r
5 i
6 t
7 h
8 m
9 i
10 q
11 u
12 e
ch2 = "Python"
0 P
1 y
2 t
3 h
4 o
5 n
ch3 = "4502"
0 4
1 5
2 0
3 2

Compléter le tableau ci-dessous en évaluant chaque instruction :

💡 Afficher les indices de résolution
📌 Règles et astuces pour l'Exercice 6 :
  • Lignes 1 à 3 (Long, ConvCh, Valeur) : Long() → len() ; ConvCh() → str() (concatène `"13"` et `"6"` en `"136"`) ; Valeur() → int() (convertit `"613"` en nombre entier 613).
  • Ligne 4 (Réel) : Réel(C) → float(C). La soustraction avec un nombre réel donne un float ($613 - 136.0 = 477.0$).
  • Lignes 5 et 6 (Découpage et Effacement) : sous_chaine(ch, d, f) correspond à ch[d:f] (de l'indice $d$ à $f-1$). Effacer(F, 0, 2) supprime les 2 premiers caractères (équivaut à F[2:]). Note : $136 - 15 = 121$ et chr(121) = 'y'.
  • Ligne 7 (EstNum / isdecimal) : isdecimal() vaut True (1) si la chaîne ne contient que des chiffres, sinon False (0). C ("136") est décimal mais pas G ("Rhythmique"), donc $1 \times 3 + 0 \times 10 = 3$.
  • Ligne 8 (Pos / find) : Pos(motif, ch) → ch.find(motif). Retourne la position (indice à partir de 0) du motif dans la chaîne (ex: `"go"` commence à l'indice 2 dans `"Algorithmique"`).
  • Lignes 9 et 10 (Combinaison finale) : Calcul arithmétique de $K$ ($4502 - 477 - 2000 = 2025$), puis assemblage des tranches de chaîne avec K.
# Instruction Algorithme Instruction Python Résultat Type ✔️
1 A ← Long(ch1)
B ← Long(ch2)
2 C ← ConvCh(A) + ConvCh(B)
3 D ← Valeur(ConvCh(B) + ConvCh(A))
4 E = D - float(C)
5 F ← sous_chaine(ch1, Long(ch3), Long(ch1))
6 G ← Majus(F[0]) + Chr(Valeur(C) - 15) + Effacer(F, 0, 2)
7 H = C.isdecimal() * len(C) + G.isdecimal() * len(G)
8 I = ch1.find("go")
J = ch1.find("que")
9 K ← Valeur(ch3) – Ent(E) – Valeur(ch3[3]) * 1000
10 L ← Effacer(ch1, I+2, Long(ch1)) + ConvCh(K) + Effacer(ch1, 0, J)

Exercice 7 – Fonctions prédéfinies Chaînes (QCM)

🧪 Simulateur Graphique SVG des Fonctions Prédéfinies Mode Interactif

Cocher la ou les bonnes réponses pour chacune des propositions ci-dessous :

1. Soit l'instruction X ← Ent(12.33) :
💡 Afficher l'indication
Indication : La fonction Ent(x) extrait la partie entière d'un nombre réel (ex : Ent(12.33) = 12). Le résultat obtenu est toujours un nombre entier.
2. L'instruction R ← arrondi(12.75) permet d'affecter à la variable R :
💡 Afficher l'indication
Indication : La fonction Arrondi(x) arrondit au nombre entier le plus proche. Comme la partie décimale 0.75 est supérieure ou égale à 0.5, 12.75 s'arrondit à 13.
3. Soit l'instruction : C ← sous_chaine("informatique", 2, 5) :
💡 Afficher l'indication
Indication : sous_chaine("informatique", 2, 5) extrait les caractères de l'indice 2 à 5 (exclu), ce qui correspond aux positions 2 ('f'), 3 ('o') et 4 ('r') → "for". Le résultat d'une fonction sous_chaine est toujours une chaîne de caractères (string).
4. L'instruction T ← EstNum("123") affecte à T :
💡 Afficher l'indication
Indication : La fonction EstNum(ch) vérifie si la chaîne est composée exclusivement de chiffres. Elle renvoie un résultat booléen (VRAI ou FAUX). Pour "123", elle renvoie VRAI.
5. Soit l'instruction : P ← Pos("2", "FIFA 2022") :
💡 Afficher l'indication
Indication : La fonction Pos(ch1, ch2) recherche l'indice de la première occurrence de ch1 dans ch2. Dans "FIFA 2022", le premier '2' se trouve à l'indice 5. Une position/indice est toujours de type entier.

Exercice 8 – Générateur de Mot de Passe (Password)

Création d'un mot de passe mp de 6 caractères composé de 2 chiffres (0 → 9), 2 majuscules ("A" → "Z") et 2 minuscules ("a" → "z") :

💡 Afficher les indices de conception (Algorithme & ASCII)
📌 Principe algorithmique de génération du mot de passe :
  • 2 Chiffres ('0' → '9') : Codes ASCII de 48 à 57. Obtenus par chr(alea(48, 57)) ou convch(alea(0, 9)).
  • 2 Majuscules ('A' → 'Z') : Codes ASCII de 65 à 90. Obtenus par chr(alea(65, 90)).
  • 2 Minuscules ('a' → 'z') : Codes ASCII de 97 à 122. Obtenus par chr(alea(97, 122)).
  • Assemblage final : Concaténation des 6 caractères générés dans la variable résultat : mp ← c1 + c2 + m1 + m2 + min1 + min2.
🔑 Mot de passe :

Exercice 9 – Permutation des Chiffres

Saisir un entier a composé de 2 chiffres (10 → 99) et permuter ses chiffres pour obtenir b (ex: 49 → 94) :

💡 Afficher les indices de résolution (Division & Modulo)
📌 Décomposition arithmétique d'un entier à 2 chiffres :
  • Chiffre des dizaines : Obtenu par la division entière par 10 : d ← a div 10 (en Python : d = a // 10). Pour 49, $49 // 10 = 4$.
  • Chiffre des unités : Obtenu par le reste de la division par 10 : u ← a mod 10 (en Python : u = a % 10). Pour 49, $49 \% 10 = 9$.
  • Reconstruction du nombre permuté : On multiplie les unités par 10 et on ajoute les dizaines : b ← u * 10 + d. Pour 49 : $9 \times 10 + 4 = 94$.
Entier a =

Exercice 10 – Autonomie de la Batterie

Calculer la consommation moyenne (en % aux 100 km) et la distance maximale dm (autonomie restante en km) qu'un véhicule électrique peut parcourir avec le niveau de batterie actuel :

Autonomie de la Batterie
Autonomie de la Batterie
💡 Afficher les indices & formules de calcul
📌 Formules mathématiques et algorithmiques :
  • Distance parcourue ($\text{dp}$) : Différence des compteurs kilométriques : $\text{dp} = \text{ikf} - \text{ikd}$ (en km).
  • Énergie consommée ($\text{ec}$) : Baisse du niveau de batterie : $\text{ec} = \text{nib} - \text{nfb}$ (en %).
  • Consommation moyenne aux 100 km ($\text{cm}$) : Règle de trois : $\text{cm} = \frac{\text{ec} \times 100}{\text{dp}}$ (% / 100 km).
  • Distance maximale restante ($\text{dm}$) : Autonomie calculable par proportionnalité : $\text{dm} = \frac{\text{nfb} \times \text{dp}}{\text{ec}} = \frac{\text{nfb} \times 100}{\text{cm}}$ (en km).

Exercice 11 – Circuit Logique et Portes Logiques

Simulation du circuit logique de l'équation booleénne : $$L = (a \cdot \bar{c}) + (b \cdot c)$$

💡 Afficher les indices & rôle du circuit (Multiplexeur)
📌 Analyse des portes logiques et de l'équation :
  • Porte NON (Inverseur) : Calcule $\bar{c}$ ($0 \rightarrow 1$ et $1 \rightarrow 0$).
  • Porte ET supérieure ($T_1 = a \cdot \bar{c}$) : Active (sortie 1) uniquement lorsque $a=1$ et $c=0$.
  • Porte ET inférieure ($T_2 = b \cdot c$) : Active (sortie 1) uniquement lorsque $b=1$ et $c=1$.
  • Porte OU finale ($L = T_1 + T_2$) : Allume la lampe si $T_1=1$ ou $T_2=1$.
  • Rôle de sélection (Multiplexeur 2:1) : La variable $c$ agit comme un commutateur : si $c=0$, la lampe recopie l'état de l'entrée $a$ ($L=a$) ; si $c=1$, elle recopie l'état de l'entrée $b$ ($L=b$).
État de la Lampe L : FAUX (0) — Éteinte 🔴
📊 Table de Vérité de la fonction $L = (a \cdot \bar{c}) + (b \cdot c)$ :
a b c c̄ T1 = a • c̄ T2 = b • c L = T1 + T2
0 0 0 1 0 0 0
0 0 1 0 0 0 0
0 1 0 1 0 0 0
0 1 1 0 0 1 1
1 0 0 1 1 0 1
1 0 1 0 0 0 0
1 1 0 1 1 0 1
1 1 1 0 0 1 1

Exercice 12 – Citerne d'Huile et Logistique de Transport

Un oléiculteur dispose d'une quantité d'huile Q (Litres). L'huile est mise en bouteilles de 1L, rangées dans des caisses de 12 bouteilles, puis transportées par un camion de 30 caisses max par voyage :

💡 Afficher les indices de calcul (Divisions euclidiennes)
📌 Enchaînement des calculs de logistique :
  • Nombre total de bouteilles : Division de la quantité par la contenance : $\text{bouteilles} = \text{Ent}(Q / \text{vol})$.
  • Reste d'huile non embouteillée : $\text{reste\_huile} = Q \pmod{\text{vol}}$.
  • Caisses pleines de 12 bouteilles : Quotient entier : $\text{caisses} = \text{bouteilles} \text{ div } 12$ (en Python : // 12).
  • Bouteilles restantes sans caisse : Reste entier : $\text{bouteilles\_restantes} = \text{bouteilles} \text{ mod } 12$ (en Python : % 12).
  • Voyages complets du camion (30 caisses) : $\text{voyages} = \text{caisses} \text{ div } 30$ (en Python : // 30).
  • Caisses du dernier voyage partiel : $\text{caisses\_dernier} = \text{caisses} \text{ mod } 30$ (en Python : % 30).

Exercice 13 – Fonctions sur les Chaînes

Compléter le tableau ci-dessous avec la chaîne ch ← "programme 2025" :

💡 Afficher les indices de résolution
📌 Règles des fonctions algorithmiques de chaînes et types :
  • Types standards attendus : Entier, Réel, Caractère, Chaîne, Booleen.
  • Fonction chr(code) : Convertit un code ASCII numérique en caractère (ex: ent(100.5) = 100, et le code ASCII 100 donne 'd', type Caractère). Mettre entre apostrophes simples.
  • Fonction ord(car) : Retourne le code ASCII entier du caractère (ex: ord('o') donne 111, type Entier).
  • Indices de la chaîne ch : ch[0]='p', ch[2]='o', ch[3]='g', ch[5]='a', ch[8]='e', ch[13]='5'.
  • sous_chaine(ch, d, f) : Extrait les caractères de l'indice $d$ jusqu'à $f-1$ exclu (longueur $f-d$, type Chaîne, ex: sous_chaine(ch, 3, 9) donne "gramme").
  • effacer(ch, d, f) : Supprime la portion entre $d$ et $f-1$ et recolle les morceaux (type Chaîne, ex: effacer(ch, 3, 9) donne "pro 2025").
  • Génération de lettre majuscule : alea(0, 25) + 65 donne un code ASCII entre 65 ('A') et 90 ('Z'), donc chr(...) produit une lettre majuscule de type Caractère.
  • Comparaison booléenne : La condition "A" ≤ e ≤ "Z" teste si e est une majuscule, ce qui est toujours VRAI (type Booleen).
  • convch() et valeur() : convch() transforme un nombre en Chaîne, et valeur() transforme une chaîne en Entier.
🔤 Visualisation de la chaîne ch ← "programme 2025" 14 Caractères (indices 0 à 13)
Instruction en algorithme Type Résultat ✔️
a ← chr(ent(100.5))
b ← majus(ch[0]) + ch[5] + ch[3] + ch[8]
c ← sous_chaine(ch, 3, 9)
d ← effacer(ch, 3, 9)
e ← chr(65 + alea(0, 25))
f ← convch(45 div 10 + 15 mod 2 + arrondi(3.2))
g ← "A" ≤ e ≤ "Z"
i ← valeur(ch[13] + sous_chaine(ch, 10, 13))
j ← ord(ch[2])

Exercice 14 – Générateur de Pseudonymes

Un site propose des pseudonymes automatisés lors de la création d'un compte.
Le pseudonyme est composé par les trois premières lettres du prénom suivies par la longueur du prénom, les trois dernières lettres du nom suivies par la longueur du nom, le tout succédé par un nombre aléatoire de 2 chiffres.
Exemple : Nom & Prénom = "Sami Ben Salah" → Pseudonyme proposé : SAM4_LAH9_31

🧪 Simulateur Interactif de Pseudonymes Chaîne Unique (Prénom Nom)
📘 Correction : Algorithme & Code Python de Génération
📜 En Algorithme :
Algorithme Pseudonyme
Variables
    ch, prenom, nom, p1, p2, p3, pseudo : Chaîne
    p : Entier
Début
    Ecrire("Nom & Prénom : ") ; Lire(ch)
    p ← pos(" ", ch)
    prenom ← sous_chaine(ch, 0, p)
    nom ← sous_chaine(ch, p + 1, long(ch))
    
    p1 ← majus(sous_chaine(prenom, 0, 3)) + convch(long(prenom))
    p2 ← majus(sous_chaine(nom, long(nom) - 3, long(nom))) + convch(long(nom))
    p3 ← convch(alea(10, 99))
    
    pseudo ← p1 + "_" + p2 + "_" + p3
    Ecrire("Pseudonyme proposé : ", pseudo)
Fin
🐍 En Python :
import random

ch = input("Nom & Prénom : ")
p = ch.find(" ")
prenom = ch[:p]
nom = ch[p+1:]

p1 = prenom[:3].upper() + str(len(prenom))
p2 = nom[-3:].upper() + str(len(nom))
p3 = str(random.randint(10, 99))

pseudo = f"{p1}_{p2}_{p3}"
print("Pseudonyme proposé :", pseudo)
✍️ Exercice d'entraînement : Compléter le tableau

Appliquer les règles de génération pour trouver les composantes et le pseudonyme de chaque utilisateur :

💡 Afficher les indices de calcul (p1, p2 et Pseudonyme)
📌 Décomposition pas à pas pour chaque nom d'utilisateur :
  • Composante p1 (Prénom) : Les 3 premières lettres du prénom en majuscules + le nombre total de lettres du prénom.
    • Sami : 3 premières lettres SAM, longueur 4 → SAM4.
    • Mohamed : 3 premières lettres MOH, longueur 7 → MOH7.
    • Ali : 3 premières lettres ALI, longueur 3 → ALI3.
    • Yassine : 3 premières lettres YAS, longueur 7 → YAS7.
  • Composante p2 (Nom de famille) : Les 3 dernières lettres du nom en majuscules + la longueur totale du nom (après le 1er espace).
    • Ben Salah : Dernières lettres LAH, longueur totale 9 → LAH9.
    • Mani : Dernières lettres ANI, longueur 4 → ANI4.
    • Bouazizi : Dernières lettres IZI, longueur 8 → IZI8.
    • Trabelsi : Dernières lettres LSI, longueur 8 → LSI8.
  • Format du pseudonyme complet : Assembler avec tirets bas : p1_p2_XX (ex: SAM4_LAH9_XX où XX représente 2 chiffres quelconques de 10 à 99).
Nom & Prénom p1 (3 1ères lettres prénom + long) p2 (3 dèr. lettres nom + long) Pseudonyme (ex: SAM4_LAH9_31) ✔️
Sami Ben Salah
Mohamed Mani
Ali Bouazizi
Yassine Trabelsi