13.1. Introduction au chiffres romains
                     
                   
                
               
             
            
               Dans les chapitres précédents, nous avons «plongé»
                          en regardant immédiatement du code et en essayant de le comprendre le
                          plus vite possible. Maintenant que vous connaissez un peu plus de
                          Python, nous allons prendre un peu de recul
                          et regarder ce qui se passe avant que le code
                          soit écrit.
               
             
            Dans ce chapitres et les suivants, nous allons écrire, déboguer et optimiser un ensemble de fonctions utilitaires pour convertir
               vers et depuis des chiffres romains. Nous avons vu la méthode de construction et de validation des chiffres romains au chapitre
               Section 7.3, «Exemple : chiffres romains», nous allons maintenant considérer ce qu’il faut faire pour étendre cette méthode pour qu’elle fonctionne dans les deux sens.
            
            Les règles de construction des chiffres romains amènent à un certain nombre d’observations intéressantes :
            
            
               
                  - Il n’y a qu’une seule façon correcte de représenter une valeur
                               en chiffres romains.
                  
 
                  - L’inverse est aussi vrai : si une chaîne de caractères en chiffres romains est un
                               nombre valide, elle ne représente qu’un nombre (c.a.d.
                               qu’elle ne peut être lue que d’une manière).
                  
 
                  - Il y a un intervalle limité de valeurs pouvant être exprimées
                               en chiffres romains, les nombres de 1 à
                               3999 (les Romains avaient plusieurs manières
                               d’exprimer des nombres plus grand, par exemple en inscrivant une
                               barre au dessus d’un caractère pour signifier que sa valeur normale
                               devait être multipliée par 1000, mais nous
                               n’allons pas prendre ça en compte. Pour ce qui est de ce chapitre,
                               les chiffres romains vont de 1 à
                               3999).
                  
 
                  - Il n’est pas possible de représenter 0 en
                               chiffres romains (étonnamment, les anciens romains n’avaient pas de
                               notion du 0 comme chiffre. Les nombres servaient
                               à compter les choses qu’on avait, comment compter ce que l’on n’a
                               pas ?).
                  
 
                  - Il n’est pas possible de représenter les valeurs négatives en
                               chiffres romains.
                  
 
                  - Il n’est pas possible de représenter des fractions ou des nombres non-entiers en chiffres romains.
 
               
             
            Sachant tout cela, que pouvons nous exiger d’un ensemble de fonctions
                     pour convertir vers et depuis les chiffres romains ?
            
            Spécification de roman.py
               
                  - toRoman doit retourner la représentation
                               en chiffres romains de tous les entiers entre 1
                               et 3999.
                  
 
                  - toRoman doit échouer s’il lui est passé
                               un entier hors de l’intervalle 1 à
                               3999.
                  
 
                  - toRoman doit échouer s’il lui est passé
                               une valeur non-entière.
                  
 
                  - fromRoman doit prendre un nombre en chiffres romains
                               valide et retourner la valeur qu’il représente.
                  
 
                  - fromRoman doit échouer s’il lui est passé
                               un nombre en chiffres romains invalide.
                  
 
                  - Si vous prenez un nombre, le convertissez en chiffres romains,
                               puis le convertissez à nouveau en nombre, vous devez obtenir la même
                               valeur que celle de départ. Donc fromRoman(toRoman(n)) ==
                                  n pour tout n compris dans
                               1..3999.
                  
 
                  - toRoman doit toujours retourner un des chiffres
                               romains en lettres majuscules.
                  
 
                  - fromRoman doit seulement accepter des
                               chiffres romains en majuscules (il doit échouer s’il lui est passé
                               une entrée en minuscules.
                  
 
               
             
            
               Pour en savoir plus
               
                  - Ce
                                  site a plus d’information sur les nombres romains, y compris
                               une histoire
                               fascinante de la manière dont les Romains et d’autres civilisations
                               les utilisaient vraiment (pour faire court, à l’aveuglette et sans
                               cohérence).