6

Le livre Dragon comprend un exercice sur la conversion d'entiers en chiffres romains en utilisant un schéma de traduction orienté syntaxiquement.Convertir des nombres entiers en chiffres romains en utilisant un schéma de traduction orienté syntaxiquement?

Comment cela peut-il être complété?

+1

ressemble à une question de devoirs, sent comme une question de devoirs ...;-) –

+0

Oui, je sais ... J'aimerais pouvoir prouver que je ne triche pas. C'est en fait une question de devoirs, pour les étudiants CS ... Juste, pas pour moi, je lis juste le livre par moi-même, et je n'ai pas d'enseignant (ou assez d'ami) pour aller demander. –

Répondre

2

Je considérerais l'analyse de droite à gauche.

D'abord, je tracerait la colonne unités:

0 -> '' 
1 -> 'I' 
2 -> 'II' 
3 -> 'III' 
4 -> 'IV' 
... 
9 -> 'IX' 

Ensuite, il y avait une deuxième colonne (par exemple, deuxième à partir de la colonne de droite = dizaines), j'utiliser pour la carte à

0 -> '' 
1 -> 'X' 
2 -> 'XX' 
... 
9 -> 'XC' 

Cela devrait être ajouté à la sortie initiale.

Répétez l'opération pour les colonnes suivantes (centaines, milliers) jusqu'à épuisement des lettres.

Revérifiez que le numéro n'est pas '0' ou négatif.

+0

Cela signifie que pour créer une grammaire sans contexte qui me permettrait ensuite de convertir en utilisant un schéma de traduction dirigé par sytanx, j'ai besoin de créer 10 règles pour chaque "colonne". (donc, environ 34 règles pour pouvoir arriver à 3999) Ai-je raison? –

+0

En fait, j'ai pensé à quelque chose comme ça, je m'attendais à ce qu'il y ait une méthode plus élégante ... Y at-il? –

+0

Oui, cela signifie 10 règles par colonne. Je suppose que vous pourriez écrire une seule fonction qui fonctionne pour chacune des colonnes, et prend les lettres comme paramètres ... Donc, pour 219, vous produiriez f (2, 'C', 'D', 'M') + f (1. 'X', 'L', 'C') + f (9, 'I', 'V', 'X') Ne «sent» pas le contexte . – Oddthinking

2

Une autre façon est de stocker en tableau bidimensionnel les chiffres romains pour 1, 5, 10, 50, 100, 500, 1000 et ainsi de suite. Exemple (dans un tableau PHP):

$roman = array(
    [0] = array(1=>"I", 5=>"V", 10=>"X"), 
    [1] = array(1=>"X", 5=>"L", 10=>"C"), 
    [2] = array(1=>"C", 5=>"D", 10=>"M"), 
    [3] = array(1=>"M", 5=>"^V", 10=>"^X"), 
); 

Ensuite, prenez chaque chiffre de droite à gauche et appliquez la traduction suivante. Définir un niveau de $ variable = 0 et augmenter sa valeur de 1 après chaque chiffre traité: ('' en PHP un concats deux cordes)

1 => $roman[$level][1] 
2 => $roman[$level][1].$roman[$level][1] 
3 => $roman[$level][1].$roman[$level][1].$roman[$level][1] 
4 => $roman[$level][1].$roman[$level][5] 
5 => $roman[$level][5] 
6 => $roman[$level][5].$roman[$level][1] 
7 => $roman[$level][5].$roman[$level][1].$roman[$level][1] 
8 => $roman[$level][5].$roman[$level][1].$roman[$level][1].$roman[$level][1] 
9 => $roman[$level][1].$roman[$level][10] 

Exemple: 1945

5 => $roman[0][5] = "V" 
4 => $roman[1][1].$roman[1][5] = "XL" 
9 => $roman[2][1].$roman[2][10] = "CM" 
1 => $roman[3][1] = "M" 

ainsi, le nombre est traduit « MCMXLV »

Désolé, ce pourrait ne pas bien répondre à votre question, mais j'espère que cela aide de quelque façon ..

2

Ensuite est la grammaire pour représenter la syntaxe de traduction dirigée d'un nombre au format 1xxx en chiffres romains.

nombre = OneThile digit3 chiffre2 chiffre1 | nzdigit3 chiffre2 chiffre1 | nzdigit2 digit1 | nzdigit1

OneThousand -> 1 {print ('M')}

digit3 -> 0 digit3 -> nzdigit3

nzdigit3 -> 1 print ('C') nzdigit3 -> 2 print ('CC') nzdigit3 -> 3 imprimer ('CCC') nzdigit3 -> 4 imprimer ('CCCC') nzdigit3 -> 5 imprimer ('D') nzdigit3 -> 6 imprimer ('DC') nzdigit3 - > 7 print ('DCC') nzdigit3 -> 8 print ('DCCC') nzdigit3 -> 9 print ('DCCCc')

De la même manière écrire la définition pour les chiffres en 2 et 1 et vous aurez besoin de traduction.

Questions connexes