💻 Examen du Baccalauréat Pratique – Session 2026

Épreuve Pratique : Algorithmique et Programmation (Section : Sciences de l’informatique)

📥 Télécharger les Sujets PDF (Sujet 1) 📦 Télécharger ressources (Algo1.rar)

📖 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

Quantité en décimale : 192

Objets Qt (Interface)

Objet, QR, QD : QLineEdit / QLabel
btConvertir, btAjouter : QPushButton
cbChoix : QComboBox

🛠️ 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_()