La notation des nombres romains est basée sur l’utilisation des lettres M,D,C,L,X,V et I.
On se propose d’écrire un programme qui à partir d’une chaîne de caractères formée uniquement de chiffres romains, donne son équivalent décimal selon le principe suivant :
- L’équivalent décimal de chaque chiffre romain est : M=1000, D=500, C=100, L=50, X=10, V=5 et I=1.
- L’équivalent décimal de chaîne de chiffres romains est obtenu en additionnant les équivalents décimaux de ses chiffres.
Le parcours de la chaîne se fait de gauche àdroite et dans le cas où un chiffre est inférieur à son successeur, il sera précédé du signe moins(-)
Exemples :
CDXL= -100+500-10+50=440
CXVI=100+10+5+1=116
CXIV=100+10-1+5=114
MMCIX=1000+1000+100-1+10=2109
Pour convertir une chaîne de caractères formée uniquement de chiffres romains en son équivalent décimal, on peut utiliser l'algorithme suivant :
1- Créer un dictionnaire pour mapper chaque chiffre romain à sa valeur décimale.
2- Parcourir la chaîne de gauche à droite.
3- Ajouter la valeur du chiffre actuel à la somme totale. Si la valeur du chiffre actuel est inférieure à celle du chiffre suivant, soustraire cette valeur de la somme totale.
Dans cet algorithme, On va utiliser une fonction et trois procédures :
Algorithme du programme principal
1 2 3 4 5 |
Algorithme equivalent_romain_decimal Debut ch<- saisie_nombre_romain() Ecrire('Equivalent decimal de chaîne de chiffres romains= ',nombre_decimal(ch)) Fin |
Déclaration des objets
Objet | Type / Nature |
ch | chaîne des caractères |
La fonction verif_romain
Cette fonction vérifie si une chaîne est formée uniquement des chiffres romains.
1 2 3 4 5 6 7 |
fonction verif_romain(ch) Début i<-0 Tant que (ch[i] dans {'M','D','C','L','X','V', 'I'}) ou (i<long(ch)-1) Faire i<-i+1 retourner ch[i] dans {'M','D','C','L','X','V', 'I'} Fin |
Déclaration des objets
Objet | Type / Nature |
i | entier |
La fonction saisie_nombre_romain
Cette fonction retourne une chaîne formée des chiffres romains.
1 2 3 4 5 6 7 8 9 10 |
fonction saisie_nombre_romain() Début Ecrire('donner une chaine forme des lettres M,D,C,L,X,V et I: ') lire(ch) Tant que verif_romain(ch)=Faux ou long(ch)<2 : Ecrire('donner une chaine forme des lettres M,D,C,L,X,V et I: ') lire(ch) Fin tant que retourner ch Fin |
Déclaration des objets
Objet | Type / Nature |
ch | chaîne des caractères |
La fonction equivalent_decimal
Cette fonction convertit un chiffre romain en un chiffre décimal.
1 2 3 4 5 6 7 8 9 10 11 12 |
fonction equivalent_decimal(c) Début Selon c faire cas 'M': retourner 1000 cas 'D': retourner 500 cas 'C': retourner 100 cas 'L': retourner 50 cas 'X': retourner 10 cas 'V': retourner 5 cas 'I': retourner 1 Fin selon Fin |
La fonction nombre_decimal
Cette fonction convertir une chaîne formée des chiffres romains en un nombre décimal.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
fonction nombre_decimal(ch) Début s<-0 Pour i de 0 à long(ch)-1 faire v1<-equivalent_decimal(ch[i]) v2<-equivalent_decimal(ch[i+1]) Si (v1<v2) alors v1<- -v1 Fin si s<-s+v1 Fin pour retourner s+v2 Fin |
Déclaration des objets
Objet | Type / Nature |
i | entier |
v1 | entier |
v2 | entier |
s | entier |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
def verif_romain(ch): i=0 while (ch[i] in {'M','D','C','L','X','V', 'I'}) and (i<len(ch)-1): i=i+1 return ch[i] in {'M','D','C','L','X','V', 'I'} def saisie_nombre_romain(): ch=input('donner une chaine forme des lettres M,D,C,L,X,V et I: ') while verif_romain(ch)==False or len(ch)<2 : ch=input('donner une chaine forme des lettres M,D,C,L,X,V et I: ') return ch def equivalent_decimal(c): match c : case 'M': return 1000 case 'D': return 500 case 'C': return 100 case 'L': return 50 case 'X': return 10 case 'V': return 5 case 'I': return 1 def nombre_decimal(ch): s=0 for i in range(len(ch)-1): v1=equivalent_decimal(ch[i]) v2=equivalent_decimal(ch[i+1]) if (v1<v2): v1=-v1 s=s+v1 return s+v2 # programme principal ch= saisie_nombre_romain() print('Equivalent decimal de chaîne de chiffres romains= '+str(nombre_decimal(ch))) |
Exécution du programme
Pour créer une application en Python pour convertir une chaîne formée des chiffres romains en un nombre décimal en utilisant Qt Designer pour l'interface graphique, suivez ces étapes :
a- Ouvrez Qt Designer et créez un nouveau fichier de type Main Window.
b- Ajoutez ces widgets:
QLineEdit
nommé 'ch' pour entrer des lettres romains .
QPushButton
nommé 'decimal_bt' pour exécuter le module nombre_decimal afin de remplir le tableau à partir de la chaine 'ch'.
QLabel
nommé 'msg' pour afficher un message d'erreur si ch est vide ou contient des lettres non romains .
QLabel
nommé 'decimal_equivalent' pour afficher le nombre décimal équivalent.
Enregistrez le fichier avec l'extension .ui
, par exemple chiffres-romains-interface.ui
.
Voici un exemple de script Python qui utilise l'interface graphique générée par Qt Designer.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
from PyQt5.uic import loadUi from PyQt5 import QtCore, QtGui from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui, QtWidgets from numpy import array app = QApplication([]) windows = loadUi ("chiffres-romains-interface.ui") def verif_romain(ch): i=0 while (ch[i] in {'M','D','C','L','X','V', 'I'}) and (i<len(ch)-1): i=i+1 return ch[i] in {'M','D','C','L','X','V', 'I'} def equivalent_decimal(c): match c : case 'M': return 1000 case 'D': return 500 case 'C': return 100 case 'L': return 50 case 'X': return 10 case 'V': return 5 case 'I': return 1 def nombre_decimal() : ch = windows.ch.text() if verif_romain(ch)==False or len(ch)<2: windows.msg.setText("Donner une chaine forme des lettres M,D,C,L,X,V et I") else: windows.msg.clear() s=0 for i in range(len(ch)-1): v1=equivalent_decimal(ch[i]) v2=equivalent_decimal(ch[i+1]) if (v1<v2): v1=-v1 s=s+v1 windows.decimal_equivalent.setText('Equivalent decimal de chaîne de chiffres romains= '+str(s+v2)) windows.decimal_bt.clicked.connect(nombre_decimal) windows.show() app.exec_() |
Exécution du programme
Vous pouvez voir aussi :
La robotique éducative joue un rôle important dans l'éducation des enfants et des jeunes en les aidant à acquérir des compétences en science et technologie.
Dans ce cadre notre site web représente une excellente ressource pour les parents, les enseignants et les enfants qui souhaitent découvrir la robotique.
Zaouiet Kontech-Jemmel-Monastir-Tunisie
+216 92 886 231
medaliprof@gmail.com
Site robotique réalisé par Mohamed Ali-Prof Info