💻 Examen du Baccalauréat Pratique – Session 2026
Épreuve Pratique : Algorithmique et Programmation (Section : Sciences de l’informatique)
📖 Texte de l’Épreuve & Contexte
RÉPUBLIQUE TUNISIENNE — MINISTÈRE DE L’ÉDUCATION
EXAMEN DU BACCALAURÉAT — SESSION 2026
Épreuve Pratique : Algorithmique et Programmation | Section : Sciences de l’informatique | Durée : 1h 30min
Contexte Général :
Un musée souhaite informatiser la gestion de son stock d’objets archéologiques. Dans les anciens registres, les quantités des objets sont exprimées en chiffres romains.
On souhaite développer une application Python munie de deux interfaces graphiques qui permet :
- De saisir la désignation d’un objet archéologique et sa quantité en chiffres romains.
- De convertir la quantité en chiffres romains en son équivalent décimal.
- D’enregistrer l’objet dans un fichier d’enregistrements.
- De consulter et d’afficher de manière triée les objets enregistrés.
Règles des Chiffres Romains :
On supposera qu’un nombre romain est une chaîne de caractères non vide, composée de chiffres romains choisis uniquement parmi les lettres suivantes : I, V, X, L, C, D et M, et qu’elle ne contient pas plus de trois lettres identiques consécutives.
| Chiffre romain | I | V | X | L | C | D | M |
|---|---|---|---|---|---|---|---|
| Valeur décimale | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
Règles de conversion de gauche à droite :
- Si un chiffre romain a une valeur supérieure ou égale à celle du chiffre suivant, on ajoute sa valeur.
- Si un chiffre romain a une valeur strictement inférieure à celle du chiffre suivant, on retranche sa valeur.
- Si un chiffre romain est en dernière position, on ajoute sa valeur.
Exemple : CXCII vaut 192 en décimal ($100 – 10 + 100 + 1 + 1 = 192$).
🖥️ Simulation Interactive (Annexe – InterfAjout)
Testez la conversion dynamique des chiffres romains directement depuis l’interface simulée :
Ajout d’objets archéologiques
Objets Qt (Interface)
🛠️ Solution en Python (AjoutObjet.py)
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import *
from pickle import dump
def Valider(ch):
r = "IVXLCDM"
if ch == "":
return False
else:
test = True
i = 0
while (i < len(ch)) and (r.find(ch[i]) != -1) and test:
if ch.find(ch[i] + ch[i] + ch[i] + ch[i]) != -1:
test = False
else:
i = i + 1
return i == len(ch)
def Valeur(c):
if c == 'I': return 1
elif c == 'V': return 5
elif c == 'X': return 10
elif c == 'L': return 50
elif c == 'C': return 100
elif c == 'D': return 500
elif c == 'M': return 1000
return 0
def RomainToDecimal():
ch = w.QR.text().strip().upper()
if not Valider(ch):
QMessageBox.critical(w, "Erreur", "Nombre romain invalide")
else:
s = Valeur(ch[len(ch) - 1])
for i in range(len(ch) - 1):
if Valeur(ch[i]) >= Valeur(ch[i + 1]):
s = s + Valeur(ch[i])
else:
s = s - Valeur(ch[i])
w.QD.setText(str(s))
def Ajouter():
nom = w.Objet.text().strip()
qr = w.QR.text().strip()
qd = w.QD.text().strip()
if nom == "":
QMessageBox.critical(w, "Erreur", "Veuillez saisir le nom de l'objet")
elif qd == "":
QMessageBox.critical(w, "Erreur", "Veuillez convertir la quantité romaine en décimal")
else:
f = open("Objets.dat", "ab")
enregistrement = {"Objet": nom, "QR": qr, "QD": int(qd)}
dump(enregistrement, f)
f.close()
w.Objet.clear()
w.QR.clear()
w.QD.clear()
QMessageBox.information(w, "Confirmation", "Objet ajouté avec succés")
app = QApplication([])
w = loadUi("InterfAjout.ui")
w.show()
w.btConvertir.clicked.connect(RomainToDecimal)
w.btAjouter.clicked.connect(Ajouter)
app.exec_()