Hola a todxs de nuevo, hacía tiempo que no escribía nada por aquí pero esta ocasión lo merece, debido a que puede ayudar a mucha gente, en esta ocasión os traigo el código de shell script (Bash) para un convertor de numeros decimales a romanos y viceversa, espero que os sea útil ya bien sea en clase o fuera de ella, saludos y al lio!
#!/bin/bash
#SCRIPT CONVERSOR DECIMAL-ROMANO
#-----------------------------------------------------------------
#Descomentar la siguiente línea para ver por terminal la ejecución del script paso a paso
#set -x
#Definimos vectores que nos facilitarán la tarea
dec=( 1000 900 500 400 100 90 50 40 10 9 5 4 1 )
rom=( M CM D CD C XC L XL X IX V IV I )
#Función que pasa un número romano a decimal
function toDec (){
pos=`expr ${#num} - 1`
prev=0
result=0
while [ $pos -ge 0 ];do
case "${num:$pos:1}" in
M) factor=1000 ;;
D) factor=500 ;;
C) factor=100 ;;
L) factor=50 ;;
X) factor=10 ;;
V) factor=5 ;;
I) factor=1 ;;
esac
if [ $factor -lt $prev ];then
result=`expr $result - $factor`
else
result=`expr $result + $factor`
fi
prev=$factor
pos=`expr $pos - 1`
done
echo "El equivalente en decimal al año romano $num es $result"
}
#Función que pasa un número decimal a Romano
function toRom (){
aux=$num
pos=0
for item in ${dec[@]};do
valor=`expr $aux / $item`
resto=`expr $aux % $item`
cont=0
while [ $cont -lt $valor ];do
result=`echo $result${rom[$pos]}`
cont=`expr $cont + 1`
done
pos=`expr $pos + 1`
aux=$resto
done
echo "El equivalente en números romanos al año decimal $num es $result"
}
#Comprueba que se reciba el parámetro
if [[ -n $1 ]]; then
echo "Parámetro recibido"
num=$1
#Comprueba si es un número decimal
validate='^-?[0-9]+([.][0-9]+)?$'
if [[ $num =~ $validate ]]; then
echo Es entero
#Si es un número entero comprobamos que esté entre el rango solicitado
if [[ ($num -ge 1) && (num -le 1999) ]]; then
echo El número está dentro del rango 0-1999
toRom
else
echo El número está fuera del rango 0-1999. No se realiza conversión
fi
else
echo No es un entero.
#Si no es un número entero comprobamos que sea un número romano
if [ ${num:0:1} == "M" ] || [ ${num:0:1} == "D" ] || [ ${num:0:1} == "C" ] || [ ${num:0:1} == "V" ] || [ ${num:0:1} == "X" ] || [ ${num:0:1} == "I" ];then
echo Es un número romano
#LLamamos a la función para convertir a número decimal
toDec
else
echo No es un número romano bien formado
fi
fi
else
echo "No se ha recibido ningún parámetro válido"
fi
Espero os sirva tanto como a mi en su momento y si os gusta ya sabeis, compartid, que es gratis!