MPO n°66 - Convertisseur en chiffres romains

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 429
Inscription : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

MPO n°66 - Convertisseur en chiffres romains

Message par caloubugs » 31 juil. 2015 10:13

Je suis tombé sur cette page : p26-MS
Tirée du n°8 de Micro-Systèmes (nov 1979 quand même), et en voyant le programme proposé, je me suis bien dit qu'il y avait matière à optimisation. :slime:

Et que ça pourrait faire un MPO qui combine manipulation de nombres et de caractères.

D'autant plus que là, je trouve la solution plutôt tortueuse... 8O

J'ai fait un programme sur TI74 que je mettrai en ligne un peu plus tard.

Pour les règles, il faut suivre celles de la page mise en ligne qui respectent l'orthodoxie en la matière : on traite les chiffres un à un sans faire de raccourci.
Par exemple : 999 s'écrit CMXCIX et non IM qui est une simplification alternative qui n'a pas toujours été appliquée, et plutôt tardivement (voir aussi Wikipedia).

Et pour les plus téméraires, pourquoi pas faire un programme qui fasse la traduction inverse (pas sûr que l'on arrive alors dans du petit programme).

Bon amusement !

Sommaire des MPO
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...

Avatar de l’utilisateur
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 450
Inscription : 13 janv. 2013 20:44
Localisation : Toulon-ouest

Re: MPO n°66 - Convertisseur en chiffres romains

Message par babaorhum » 01 août 2015 09:59

Bonjour,

Bricolé sur ma TI92 :

Code : Tout sélectionner

Romain(n)
prgm
 Local rm,dc,k,i,j,res
 ClrIO
 {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"} -> rm
 {1000,900,500,400,100,90,50,40,10,9,5,4,1} -> dc
 "" -> res
 For k,1,dim(rm)
  int(n/(dc[k])) -> j
  n-j*dc[k] -> n
  If j>0 Then
   For i,1,j
    res & rm[k] -> res
   EndFor 
  EndIf
 EndFor
 Disp res
EndPrgm
Avec les listes c'est vrai que c'est plus facile ... 310 octets me dit VARLINK, sans compter les variables locales forcément ...
Il me semble qu'il y avait un pgm de ce type dans l'OP (j'ai des souvenirs de l'avoir adapté à mon ex 602P). Il faudra que je recherche ...
Au suivant !
EDIT : je n'ai pas précisé l'utilisation ... pas très compliqué une fois le programme entré ; dans "Home", entrer "Romain(1997)" par exemple puis return et MCMXCVII apparaît à l'affichage.
Dernière édition par babaorhum le 01 août 2015 17:52, édité 3 fois.
BaBaoRhum
HP J728,200LX,1000CX,75C,71B, 48GX,42s,41CX,35s,32E,32Sii,28S,22s,21,16C,11C,12Cp
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74&92 ; Canon X-07 ; Panasonic HHC RL-H1400 ; TANDY EC-4026

Avatar de l’utilisateur
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7181
Inscription : 12 févr. 2007 19:36
Localisation : Pas très loin de Lyon
Contact :

Re: MPO n°66 - Convertisseur en chiffres romains

Message par badaze » 01 août 2015 15:17

400 ce serait pas CD plutôt que ID ?
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer :(
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.

Avatar de l’utilisateur
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 450
Inscription : 13 janv. 2013 20:44
Localisation : Toulon-ouest

Re: MPO n°66 - Convertisseur en chiffres romains

Message par babaorhum » 01 août 2015 16:48

Oups,
oui, bien sûr badaze !
Je corrige. :oops:
BaBaoRhum
HP J728,200LX,1000CX,75C,71B, 48GX,42s,41CX,35s,32E,32Sii,28S,22s,21,16C,11C,12Cp
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74&92 ; Canon X-07 ; Panasonic HHC RL-H1400 ; TANDY EC-4026

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2286
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO n°66 - Convertisseur en chiffres romains

Message par C.Ret » 01 août 2015 18:00

J'ai du mal à compter comme un romain.

ID cela est-il possible ? Si oui, est-ce une réponse correcte pour 499 ?
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator | HP-15C | CASIO fx-602p + FA-1. .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

Avatar de l’utilisateur
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 450
Inscription : 13 janv. 2013 20:44
Localisation : Toulon-ouest

Re: MPO n°66 - Convertisseur en chiffres romains

Message par babaorhum » 01 août 2015 18:16

Les règles sont bien expliquées sur cette page
pour 499, les romains écrivaient CDXCIX si je comprends bien, pas évident pour nous ...
BaBaoRhum
HP J728,200LX,1000CX,75C,71B, 48GX,42s,41CX,35s,32E,32Sii,28S,22s,21,16C,11C,12Cp
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74&92 ; Canon X-07 ; Panasonic HHC RL-H1400 ; TANDY EC-4026

Avatar de l’utilisateur
meridian
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 877
Inscription : 29 oct. 2014 06:08
Localisation : Seine-Saint-Denis

Re: MPO n°66 - Convertisseur en chiffres romains

Message par meridian » 01 août 2015 18:44

euh, sur la page, le DIX ne ferait pas plutôt 509 que 511 ?

caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 429
Inscription : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: MPO n°66 - Convertisseur en chiffres romains

Message par caloubugs » 01 août 2015 22:28

Sympa ton pgm Babaorhum ! Pas de listes de mon côté :

Code : Tout sélectionner

10 INPUT "N:";N
20 M=INT(N/1000):N=N-M*1000:IF M>9 THEN 10
30 W$=RPT$("M",M)
40 M=INT(N/100):N=N-M*100:X$="CDCM":GOSUB 80
50 M=INT(N/10):N=N-N*10:X$="XLXC":GOSUB 80
60 M=INT(N):X$="IVIX":GOSUB 80
70 PRINT W$:PAUSE:END
80 IF M=9 THEN W$=W$&SEG$(X$,3,2):RETURN
90 IF M=4 THEN W$=W$&SEG$(X$,1,2):RETURN
100 IF M>4 THEN W$=W$&SEG$(X$,2,1):M=M-5
110 W$=W$&RPT$(SEG$(X$,1,1),M):RETURN
357 octets utilisés.

Je bénéficie d'une fonction de la ti74 (RPT$) qui permet facilement de copier plusieurs instances d'une chaine.
A voir sur d'autres bécanes...
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...

Avatar de l’utilisateur
jojo
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 336
Inscription : 28 juin 2006 21:28
Localisation : Entre la France, la Suisse et l'Italie ... au pays du bien décolleté.

Re: MPO n°66 - Convertisseur en chiffres romains

Message par jojo » 01 août 2015 23:22

meridian a écrit :euh, sur la page, le DIX ne ferait pas plutôt 509 que 511 ?
Je pense aussi ! 511 devrait s'écrire DXI ... enfin c'est comme cela que je l'aurais fait écrire à mes élèves si j'étais encore en activité ! :wink:

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2286
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: MPO n°66 - Convertisseur en chiffres romains

Message par C.Ret » 02 août 2015 09:49

babaorhum a écrit :Les règles sont bien expliquées sur cette page
pour 499, les romains écrivaient CDXCIX si je comprends bien, pas évident pour nous ...

Merci babaorum, ces explications sont exactement ce dont j'avais besion. Les codes, très courts, que j'ai composés sont donc aussi très faux. J'avais misé trop petit. Me reste donc à corriger cela et optimiser.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator | HP-15C | CASIO fx-602p + FA-1. .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 429
Inscription : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: MPO n°66 - Convertisseur en chiffres romains

Message par caloubugs » 03 août 2015 11:37

Une première version en C dans une casio Z-1Gr (sans les listes... :roll: )

Code : Tout sélectionner

char *sch(m,u,c,d)
char m,u,c,d;
{
char sch[5];char i,j=0;
if(m%5==4)
 {
 sch[0]=u;
 if(m==4)sch[1]=c;
  else sch[1]=d;
 sch[2]=0;
 }
else
 {
 if(m>4)
  {
  sch[0]=c;m-=5;j=1;
  }
 for(i=0;i<m;i++)sch[i+j]=u;
 sch[j+m]=0;
 }
return(sch);
}

main()
{
int n;char m,i,res[25];
clrscr();printf("n:");
scanf("%d",&n);res[0]=0;
m=(int)n/1e3;n=n%1000;
if(m<10)
 {
 for(i=0;i<m;i++)
  strcat(res,"M");
 m=(int)n/100;n=n%100;
 strcat(res,sch(m,67,68,77));
 m=(int)n/10;n=n%10;
 strcat(res,sch(m,88,76,67));
 strcat(res,sch(n,73,86,88));
 printf("%s",res);
 }
}
Je vais essayer de m'inspirer du code de Babaorhum... C'est quand même long ici.
Le C c'est pas génial sur les manipulations de caractères...
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...

caloubugs
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 429
Inscription : 05 juin 2014 22:23
Localisation : Dans le Gâtinais avec les abeilles, près de Fontainebleau

Re: MPO n°66 - Convertisseur en chiffres romains

Message par caloubugs » 03 août 2015 16:25

Une version en C plus courte...
J'ai l'immense plaisir de me replonger dans ce langage (ça m'aura rajeuni de 25 ans tiens), et la Z-1Gr a quelques subtilités qui rendent le programme un peu lourd sur la partie initialisation des données (on ne peut pas initialiser directement un tableau, il faut le faire élément par élément, contraire aux règles ANSI C).

Code : Tout sélectionner

main(){
char *rm[14],res[25],i,j,k;int n,dc[13];
rm[0]="M";rm[1]="CM";rm[2]="D";
rm[3]="CD";rm[4]="C";rm[5]="XC";
rm[6]="L";rm[7]="XL";rm[8]="X";
rm[9]="IX";rm[10]="V";rm[11]="IV";rm[12]="I";
dc[0]=1e3;dc[1]=900;dc[2]=500;dc[3]=400;
dc[4]=100;dc[5]=90;dc[6]=50;dc[7]=40;
dc[8]=10;dc[9]=9;dc[10]=5;dc[11]=4;dc[12]=1;
printf ("n:");scanf ("%d",&n);
for(i=0;i<13;i++){
 j=(int) n/dc[i];n=n%dc[i];
 for(k=0;k<j;k++)strcat(res,rm[i]);}
printf("%s",res);}
Dommage, le coeur du pgm est vraiment court du coup.
S'il y a des experts pour améliorer l'initialisation, je suis preneur...

En tout cas, j'étais à mille lieues de trouver cette idée... Merci pour le tuyau... :wink:
RetroGeek, mais pas que...
HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...

Avatar de l’utilisateur
jvernet
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7817
Inscription : 24 mai 2002 09:57
Localisation : France 69
Contact :

Re: MPO n°66 - Convertisseur en chiffres romains

Message par jvernet » 03 août 2015 16:48

Si

Code : Tout sélectionner

char *rm[14]={"M","CM",...,"I"};
ne marche pas, je vois pas trop. A part stocker les valeurs dans un fichier externe...

JV
"l'ordinateur et l'homme sont les deux opposés les plus intégraux qui existent. L'homme est lent, peu rigoureux et très intuitif. L'ordinateur est super rapide, très rigoureux et complètement con."

cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2208
Inscription : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: MPO n°66 - Convertisseur en chiffres romains

Message par cgh » 03 août 2015 19:59

Yo !

Sur HP-41C de base (sans module, ni extra) en 167 octets (avec le END et le label), et sans aucun registre

Code : Tout sélectionner

 01*LBL "ROMAIN"
 02 CF 00
 03 CF 01
 04 CF 02
 05 SF 03
 06 CLA
 07*LBL 14
 08 ENTER^
 09 FS? 03
 10 1 E3
 11 FS? 02
 12 100
 13 FS? 01
 14 10
 15 FS? 00
 16 1
 17 X>Y?
 18 GTO 13
 19 MOD
 20 X<>Y
 21 LASTX
 22 /
 23 XEQ IND X
 24*LBL 13
 25 RDN
 26 FS?C 01
 27 SF 00
 28 FS?C 02
 29 SF 01
 30 FS?C 03
 31 SF 02
 32 FS? 00
 33 XEQ IND X
 34 FC?C 00
 35 GTO 14
 36*LBL 00
 37 AVIEW
 38 RTN
 39*LBL 11
 40 FS? 00
 41 "`I"
 42 FS? 01
 43 "`X"
 44 FS? 02
 45 "`C"
 46 FS? 03
 47 "`M"
 48 RTN
 49*LBL 12
 50 FS? 00
 51 "`V"
 52 FS? 01
 53 "`L"
 54 FS? 02
 55 "`D"
 56 RTN
 57*LBL 03
 58 XEQ 11
 59*LBL 02
 60 XEQ 11
 61*LBL 01
 62 XEQ 11
 63 RTN
 64*LBL 04
 65 XEQ 11
 66 FS? 03
 67 GTO 03
 68*LBL 05
 69 GTO 12
 70*LBL 08
 71*LBL 07
 72*LBL 06
 73 XEQ 12
 74 5
 75 -
 76 GTO IND X
 77*LBL 09
 78 FS? 00
 79 "`IX"
 80 FS? 01
 81 "`XC"
 82 FS? 02
 83 "`CM"
 84 END
Note: Le caractere ` est le signe ALPHA-APPEND (SHIFT ASN)

Mettre le nombre a convertir en X puis XEQ [ALPHA]ROMAIN[ALPHA] et le nombre romain est affiche et est stocke en ALPHA.

Par exemple, 1999 XEQ [ALPHA]ROMAIN[ALPHA] renverra MCMXCIX

Edit: Mise a jour - J'avais oublie le cas des milliers avec le 4 !
Mais qu'importe la fin du Monde, c'est juste un changement de décor. - Adamo "Rendez-vous sur Gliese"
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque

Avatar de l’utilisateur
babaorhum
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 450
Inscription : 13 janv. 2013 20:44
Localisation : Toulon-ouest

Re: MPO n°66 - Convertisseur en chiffres romains

Message par babaorhum » 03 août 2015 22:23

Hello,
@Caloubugs, je ne connais pas bien le C, mais en simple basic, on peut faire des DATAs - par exemple, sur mon tout petit PC-1245 (et ca doit marcher sur tous les autres) :

Code : Tout sélectionner

1 INPUT N : RESTORE 7 : DIM R$(0)*15
2 FOR K = 1 TO 13 : READ L : U = INT(L/N) : IF U>=1 THEN GOSUB 4
3 NEXT K : PRINT R$(0) : CLEAR : END
4 RESTORE 6 : FOR I=1 TO K : READ T$ : NEXT I : FOR I=1 TO U : R$(0)=R$(0)+T$
5 N = N-L : NEXT I : RESTORE 7 : FOR I = 1 TO K : READ L : NEXT I : RETURN
6 DATA "M","CM","D","CD","C","XC","L","XL","X","IX,"V","IV","I"
7 DATA 1000,900,500,400,100,90,50,40,10,9,5,4,1
... en 239 octets - à améliorer certainement du côté des boucles - mais hélas, avec création d'une variable R$(0) de 15 caractères pour empiler le résultat - on ne peut pas le faire directement à l'affichage sur ce pocket ("PRINT T$;" n'est pas accepté ... dommage ...)

@cgh, tu peux nous guider un peu sur le fonctionnement de ton pgm stp ? je nage !
BaBaoRhum
HP J728,200LX,1000CX,75C,71B, 48GX,42s,41CX,35s,32E,32Sii,28S,22s,21,16C,11C,12Cp
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74&92 ; Canon X-07 ; Panasonic HHC RL-H1400 ; TANDY EC-4026

Répondre

Revenir vers « Tous les Pockets »