Documentos de Académico
Documentos de Profesional
Documentos de Cultura
TABLA DE CONTENIDO
PRESENTACION.................................................................................................................................... 1
¿QUÉ ES REXX? .................................................................................................................................... 2
Descargas ........................................................................................................................................ 3
Documentación en Línea................................................................................................................. 3
Tutorial ............................................................................................................................................ 3
REGINA ............................................................................................................................................ 3
PRIMER PROGRAMA REXX .................................................................................................................. 4
Comentarios .................................................................................................................................... 4
Sintaxis ............................................................................................................................................ 4
PAUSE .............................................................................................................................................. 4
Guardar el Programa ....................................................................................................................... 4
VARIABLES ........................................................................................................................................... 5
CARACTERES ESPECIALES .................................................................................................................... 6
ENTRADA Y SALIDA .............................................................................................................................. 7
OPERADORES....................................................................................................................................... 8
OPERADORES ARITMETICOS ........................................................................................................... 8
OPERADORES DE COMPARACION ................................................................................................... 9
OPERADORES LOGICOS ................................................................................................................... 9
CONDICIONALES ................................................................................................................................ 10
Condicional Simple ........................................................................................................................ 10
Condicional Compuesto ................................................................................................................ 11
Condicional Anidado ..................................................................................................................... 11
Bloque de Instrucciones ................................................................................................................ 11
Condicional Estructurado .............................................................................................................. 11
NOP ............................................................................................................................................... 12
CICLOS ............................................................................................................................................... 13
Ciclo DO ......................................................................................................................................... 13
Ciclo DO WHILE ............................................................................................................................. 13
Ciclo DO UNTIL .............................................................................................................................. 14
Ciclo DO estructurado ................................................................................................................... 14
Ciclo Infinito .................................................................................................................................. 15
i
Programación REXX Nivel Básico
Ciclo Anidado................................................................................................................................. 15
GOTO ETIQUETA ................................................................................................................................ 16
SUBRUTINAS ...................................................................................................................................... 17
PROCEDIMIENTOS ............................................................................................................................. 18
FUNCIONES........................................................................................................................................ 19
Argumentos de una función .......................................................................................................... 19
Tipo de Datos ................................................................................................................................ 19
INSTRUCCIONES DE CONTROL .......................................................................................................... 21
RC .................................................................................................................................................. 21
SYSGETERRORTEXT(RC) ................................................................................................................. 21
TRACE ............................................................................................................................................ 22
MANEJO DE CADENAS ....................................................................................................................... 23
LEFT (cadena, longitud, relleno) .................................................................................................... 23
RIGHT (cadena, longitud, relleno) ................................................................................................. 23
LENGTH (cadena)........................................................................................................................... 24
OVERLAY (nueva, cadena, n, l, relleno) ......................................................................................... 24
REVERSE (cadena) ......................................................................................................................... 24
SUBSTR (cadena, n, l, relleno) ....................................................................................................... 25
COMPARE (cadena1, cadena2, relleno) ........................................................................................ 25
VERIFY (cadena, referencia, opción, n) ......................................................................................... 25
COPIES (cadena, n) ........................................................................................................................ 26
DELSTR (cadena, n, l) ..................................................................................................................... 26
INSERT (nueva, cadena, n, l, relleno) ............................................................................................ 26
POS (cadena, original, n) ............................................................................................................... 27
LASTPOS (cadena, original, n) ....................................................................................................... 28
MANEJO DE PALABRAS...................................................................................................................... 29
ABBREV (original, cadena, n) ......................................................................................................... 29
SPACE (cadena, n, relleno) ............................................................................................................ 30
TRASLATE (cadena, nuevos, originales, relleno) ........................................................................... 30
WORDS (cadena) ........................................................................................................................... 31
WORD (cadena, n) ......................................................................................................................... 31
WORDPOS (cadena, texto, n) ........................................................................................................ 31
ii
Programación REXX Nivel Básico
iii
Programación REXX Nivel Básico
PRESENTACION
El presente documento intenta describir los comandos básicos del lenguaje de
programación REXX. Comienza describiendo las características del lenguaje para luego
entrar a la explicación de los comandos y funciones como tal, haciendo uso de ejemplos
sencillos.
Es importante destacar que este documento no es un manual de referencia, muy lejos de
eso, lo que intenta es servir de guía al curso introductorio de REXX. Muchas cosas serán
explicadas por el instructor y no están incluidas en el escrito.
Es importante manifestar que los ejemplos serán ejecutados en un simulador de REXX que
corre bajo Windows instalado para tales fines. No se tiene soporte sobre MVS por lo que no
se utilizará tal sistema operativo para hacer las demostraciones en ningún momento.
Tampoco se tiene soporte sobre Z/OS o cualquier entorno mainframe.
El documento describe el uso de la programación lineal, es decir, la ejecución de
instrucciones que se ejecutan de arriba a abajo. Se incluyen aspectos propios de la
programación estructurada, es decir, se codifican procedimientos, subrutinas y funciones
para la formulación de módulos o segmentos de programas repetitivos. No se tiene soporte
sobre la programación orientada a objetos que es otra de las características resaltantes de
REXX. Este aspecto forma parte de un nuevo curso con objetivos específicos, nuevos
comandos y ejemplos propios sobre este paradigma de la programación.
Como ya se dijo, no guarda relación con los sistemas operativos de mainframe por lo cual
no se explicará la ejecución de comandos en tales entornos operacionales. Nos basaremos
en la ejecución de utilitarios para Windows y DOS. Tampoco haremos referencia a
comandos sobre los demás sistemas operativos donde corre REXX, como MAC OS, LINUX y
otras plataformas.
Esperamos que esta guía cumpla con los objetivos esperados por la audiencia en cuanto al
uso del software como lenguaje de programación. Se explica el uso de las variables, los
distintos operadores: aritméticos, lógicos, de comparación; las instrucciones condicionales,
los diversos ciclos iterativos como MIENTRAS, HASTA QUE y PARA, así como los ciclos
infinitos y ciclos controlados en términos de lógica de programación; las etiquetas y los
saltos GOTO; subrutinas, procedimientos y funciones, el pase de parámetros, funciones con
polimorfismo, la evaluación de los argumentos de las funciones/procedimientos/rutinas; las
funciones de cadenas y de palabras; funciones matemáticas; el manejo de archivos para
lectura y escritura, y el manejo de copiado de archivos y carpetas; para finalizar, se hará un
recorrido por las funciones más importantes de REXX ideales para escribir programas
interesantes que cumplan con los propósitos planteados por el programador.
1
Programación REXX Nivel Básico
¿QUÉ ES REXX?
REXX es la abreviatura de REstructured eXtended eXecutor, un lenguaje de programación
propietario desarrollado por Mike Cowlishaw de IBM entre 1976 y 1982, sin embargo,
existen muchas implementaciones disponibles en código abierto. Es un lenguaje de
programación estructurado de alto nivel fácil de entender. Hay intérpretes de código REXX
comerciales y de código abierto para muchas plataformas, y compiladores para los
mainframes de IBM.
El nombre también se aplica a la familia de lenguajes relacionados con el lenguaje de
programación REXX: el propio REXX −llamado en ese contexto REXX clásico o tradicional− y
otros como Object REXX y NetREXX.
Es esencialmente un lenguaje de formato libre con solamente un tipo de dato primitivo: la
cadena de caracteres. Esta filosofía implica que todos los datos son visibles y que la
depuración y el trazado se simplifican.
La sintaxis de REXX parece similar a la de PL/I, pero tiene menos notaciones; esto hace que
el código sea más difícil de analizar por el intérprete o el compilador pero más fácil de usar
para el programador.
Como lenguaje interpretado, REXX se usa con frecuencia como lenguaje de scripting, donde
el código se guarda en un archivo de texto simple y luego el intérprete lo ejecuta. Por
supuesto, el intérprete también se puede operar como un programa separado, que
proporciona un símbolo del sistema para escribir directamente la sintaxis del lenguaje, lo
que lo hace útil para pruebas y otros comandos y operaciones rápidos del sistema.
REXX sirve bien como un lenguaje adhesivo, entonces, ya que es capaz de juntar funciones
de otros programas en un solo script. Uno de sus mayores puntos fuertes es su diseño como
macrolenguaje. Los desarrolladores de programas pueden simplemente agregar soporte
REXX a su software para que las macros se puedan escribir sin tener que programar su
propio lenguaje de macros en su software.
Otra de las características de REXX es su sintaxis de forma libre, que hace que el lenguaje
sea similar a otros lenguajes de scripting, como Perl. Con esta capacidad, el uso del idioma
se vuelve más simple ya que los requisitos de posicionamiento, como la sangría y los
caracteres de final de línea, son menos estrictos. Además, toda la sintaxis utilizada en el
lenguaje son solo 23 instrucciones específicas. Este pequeño conjunto de instrucciones, con
sus operandos, es capaz de interactuar con prácticamente cualquier cosa, incluidas
interfaces gráficas de usuario (GUI), bases de datos y servidores web. Por esta razón, REXX
se utiliza a veces como un lenguaje de scripting de interfaz de puerta de enlace común (CGI)
en servidores web.
2
Programación REXX Nivel Básico
Otro rasgo algo único del lenguaje es su falta de tipos de datos. REXX usa solo cadenas de
caracteres como tipos de datos. Los significados de las cadenas dependen de su uso, y las
matemáticas se pueden realizar en cualquier cadena que forme un número válido. Esta
capacidad inherente para trabajar con cadenas hace que el lenguaje sea útil para analizar y
procesar texto.
Descargas
Para descargar el intérprete debe visitar el enlace oficial del producto:
http://www.rexxinfo.org/
Para descargar un emulador del intérprete visite el siguiente enlace:
https://sourceforge.net/projects/oorexx/
Documentación en Línea
El siguiente enlace corresponde a la documentación oficial del propietario (IBM):
https://www.ibm.com/docs/en/zos/2.1.0?topic=guide-learning-rexx-language
Tutorial
Este otro enlace nos conduce a un tutorial del lenguaje bastante sencillo pero muy
completo, escrito por un desarrollador en particular:
https://www.tutorialspoint.com/rexx/index.htm
REGINA
Regina es el intérprete de REXX más moderno y popular del mercado. Fue escrito por Anders
Christiansen y actualmente es soportado por Mark Hessling.
Sus características más resaltantes es que es ANSI-compliant, es decir, totalmente
compatible con ANSI (American National Standards Institute es el Instituto Nacional de
Estándares Estadounidense), lo que permite ser compatible con muchos software norte
americanos, y está disponible en muchas plataformas, como UNIX, Windows, Mac OS X, y
muchos otros sistemas operativos.
Es común para los desarrolladores REXX hacer uso de este intérprete, por eso su nombre,
simula el matrimonio del lenguaje rey REXX y su interpretador reina REGINA.
3
Programación REXX Nivel Básico
Sintaxis
Para escribir un programa se debe agregar un comentario en la primera línea del archivo
que le indica al intérprete que se trata de un código escrito en REXX.
/* REXX */
PAUSE
Para ejecutar el programa en ambiente DOS mediante el emulador, tenemos que agregar
la instrucción PAUSE al final del programa. PAUSE es un comando de DOS que ejecuta una
pausa para que el usuario presione una tecla para continuar con la ejecución del programa
o script de comandos.
A partir de este momento nos referiremos al sistema operativo “Disk Operating System”
como DOS.
Guardar el Programa
Para guardar un programa escrito en REXX debe colocar el nombre, preferiblemente sin
espacios en blanco, con la extensión “rex”. Por ejemplo: miprograma1.rex, factorial.rex,
recursivo1.rex, por mencionar cualquiera, donde miprograma1, factorial y recursivo1 son
programas escritos en código REXX.
Se recomienda colocar los programas en una carpeta que sea fácil de reconocer, como por
ejemplo: “misprogramas”, o “programas REXX” dentro del disco de su computador.
4
Programación REXX Nivel Básico
VARIABLES
Para declarar una variable basta con agregar un nombre de variable y asignar un valor. El
valor de la variable siempre será una cadena. Si la cadena está entre comillas dobles se
define un texto pero si no tiene comillas y contiene números enteros o decimales, estará
definiendo variables numéricas.
Los nombres de variables no son sensibles a mayúsculas o minúsculas. Las variables pueden
contener números, underscore o guion bajo, debe comenzar con una letra pero pueden
combinarse con números.
/* textos */
nombre = “Douglas”
apellido = “Barrios”
/* números */
a=5
b = a + 10
sueldo = 1500.55
bono = 3000.0
aCobrar = sueldo + bono
5
Programación REXX Nivel Básico
CARACTERES ESPECIALES
Existen pocos caracteres especiales a incluir en el código lo que hace muy sencillo la
escritura de programas.
Cada instrucción se escribe en una sola línea, sin embargo, si el código es muy extenso se
agrega una coma al final para indicar al intérprete que el comando continúa en la siguiente
línea.
Si se desea agregar muchos comandos en la misma línea se necesita agregar punto y coma
como carácter de cierre de cada comando, lo cual no es recomendable, pues dificulta la
lectura del programa.
/* uso de la coma */
textoLargo = “ esto es ejemplo de un texto largo que ocupa dos líneas de comando. ” ,
|| “Este texto se anexa al final de la variable”
6
Programación REXX Nivel Básico
ENTRADA Y SALIDA
Para imprimir valores por pantalla se usa el comando SAY y para leer un dato por pantalla
se usa PULL.
Para leer un campo sin cambiar a mayúsculas use el comando PARSE.
Para eliminar una variable de memoria se usa el comando DROP.
Para asignar un valor NULO a una variable solo asigne doble comillas.
nombre = “Pedro”
say nombre /* imprime Pedro */
drop direc
say direc /* imprime DIREC como en el ejemplo anterior */
7
Programación REXX Nivel Básico
OPERADORES
OPERADORES ARITMETICOS
A continuación presentamos los operadores numéricos y de texto.
8
Programación REXX Nivel Básico
OPERADORES DE COMPARACION
A continuación presentamos los operadores de comparación también conocidos como
relacionales.
OPERADORES LOGICOS
A continuación presentamos los operadores de lógicos también conocidos como booleanos.
9
Programación REXX Nivel Básico
CONDICIONALES
Instrucciones que permiten bifurcar el flujo del programa a partir de condiciones
particulares.
Condicional Simple
say “ingrese la edad del individuo”
pull edad
if (edad < 18) then
say “el individuo es un menor de edad”
10
Programación REXX Nivel Básico
Condicional Compuesto
if (edad < 18) then
say “el individuo es un menor de edad”
else
say “el individuo es mayor de edad”
Condicional Anidado
If (edad >=0 & edad < 3) then
say “el individuo es un infante”
else
If (edad >=3 & edad < 18) then
say “el individuo es un joven”
else
If (edad >= 18 & edad < 60) then
say “el individuo es un adulto”
else
say “el individuo es un adulto mayor”
Bloque de Instrucciones
If (a // 10 == 0) then
do
say a “ es divisible por 10”
say a “ es par ya que es también divisible por 2”
say a “ es divisible por 5”
contador = contador + 1
end
Condicional Estructurado
say “ingrese la edad del individuo”
pull edad
select
when (edad < 3) then
say “el individuo es un infante”
when (edad < 18) then
say “el individuo es un joven”
when (edad < 60) then
say “el individuo es un adulto”
otherwise
say “el individuo es un adulto mayor”
end
11
Programación REXX Nivel Básico
NOP
/* nop no opera */
if (edad >= 100) then
nop
else
say “eres menor de 100 años”
12
Programación REXX Nivel Básico
CICLOS
Conjunto de instrucciones que se repiten de manera ordenada para efectuar alguna
operación.
Ciclo DO
Ciclo que ejecuta un bloque de instrucciones de manera repetitiva.
do 10
say “este texto se imprimirá de manera repetida”
end
Ciclo DO WHILE
Ciclo que se ejecuta mientras una condición se cumpla. En caso de no cumplirse la condición
no entra en el ciclo.
13
Programación REXX Nivel Básico
/* ejemplo de contador */
a=1
do while (a<11)
say a
a=a+1
end
Ciclo DO UNTIL
Ciclo que ejecuta un bloque de instrucciones al menos una vez, hasta que se cumpla la
condición de parada.
/* contador de 1 al 5 */
j=1
do until (j > 5)
say j
j=j+1
end
Ciclo DO estructurado
Ciclo que ejecuta un bloque de instrucciones de inicio a fin de una variable.
/* ciclo para c de 1 hasta 5 hacer */
do c = 1 to 5
say c
end
/* imprime el valor de c de 1 hasta 5 */
14
Programación REXX Nivel Básico
Ciclo Infinito
Ciclo que se ejecuta infinitamente hasta que una condición del programa ejecute el
comando LEAVE.
do forever
say “ingrese un número menor que 10”
pull num
if num < 10 then
leave
end
Ciclo Anidado
Combinación de ciclos de cualquier tipo.
do oper1 = 1 hasta 5
say “tabla de multiplicar del ” oper1
do oper2 = 1 hasta 10
prod = oper1 * oper2
say oper1 “*” oper2 “=” prod
end oper2
end oper1
15
Programación REXX Nivel Básico
GOTO ETIQUETA
La instrucción CALL ejecuta el goto hacia una etiqueta. Es la instrucción más rápida de todo
lenguaje de programación ya que solo hace un cambio de dirección de memoria en el
Program Counter (PC) del computador –consulte el Modelo de Von Newman o arquitectura
del computador moderno para entender este concepto.
n=5
f=1
cont = 1
ciclo:
f = f * cont
cont = cont + 1
if (cont > n) call salir
call ciclo
salir:
say “el factorial de 5 =” f
En programación estructurada se condiciona el uso del GOTO para que solo se ejecute hacia
abajo y evitar la programación espagueti.
No es una buena práctica hacer uso del GOTO hacia arriba, use ciclos en ese caso.
cont = 1
do 10
say cont
cont = con + 1
if cont = 10 then call salir
end
salir:
exit
16
Programación REXX Nivel Básico
SUBRUTINAS
Bloque de instrucciones que son llamadas a voluntad desde el programa principal para que
ejecute una tarea cualquiera.
a=5
b=2
do forever
say “menu principal”
say “ingrese su opcion (1 al 4), 9 para salir”
pull opt
res = 0
if (opt = 1) then call suma
else
if (opt = 2) then call resta
else
if (opt = 3) then call multiplica
else
if (opt = 4) then call divide
else
if (opt = 9) then call salir
end
/* subrutinas */
suma:
res = a + b
say “resultado = ” res
return
resta:
res = a - b
say “resultado = ” res
return
multiplica:
res = a * b
say “resultado = ” res
return
divide:
res = a / b
say “resultado = ” res
return
salir:
say “hasta luego!! Feliz día”
exit
17
Programación REXX Nivel Básico
PROCEDIMIENTOS
Conjunto de instrucciones que reciben parámetros o no, y retornan un valor. La diferencia
con la subrutina es que no tienen acceso a las variables del cuerpo principal del programa
por lo que su acceso es limitado. Para solventar esto hacemos uso del comando ARG, de
este modo pasamos parámetros. El valor de retorno queda en RESULT.
say “ingrese el valor de a”
pull a
say “ingrese el valor de b”
pull b
call suma a, b
say “resultado de la suma es ” result
exit
/*
Procedimientos
*/
suma: procedure
arg op1, op2
sum = op1 + op2
return sum
18
Programación REXX Nivel Básico
FUNCIONES
Subrutinas y procedimientos se pueden comportar como funciones tal y como sucede con
otros lenguajes de programación. Los valores de retorno pueden asignarse directamente a
variables sin pasar por RESULT.
resultado = suma(10, 20)
say “resultado de la suma es ” resultado
exit
/* Procedimientos */
suma: procedure
arg op1, op2
sum = op1 + op2
return sum
Tipo de Datos
Otro aspecto que podemos considerar en el pase de parámetros es el tipo de dato, esto
puede hacer que la función se comporte de diferentes formas. Por ejemplo, si la función
SUMA recibe parámetros numéricos efectúa la suma, pero si recibe algún parámetro de tipo
texto entonces retorno los parámetros concatenados. Esto se conoce como sobre carga de
operadores. Guarda relación con el polimorfismo, pero este es otro tema a discutir,
interesante por demás.
19
Programación REXX Nivel Básico
El comando DATATYPE (cadena, tipo) permite explorar el tipo de datos de una variable. Si
no se especifica el tipo devuelve “NUM” para cadenas conformadas por números o “CHAR”
para cadenas de texto (combinación de letras y números). Si se especifica el tipo devuelve
1 si se cumple y 0 en caso contrario.
A continuación mostramos las opciones del parámetro tipo:
Comando Descripción
Alfanumérico. Devuelve 1 si "cadena" contiene solo caracteres entre a-
A
z, A-Z o 0-9.
B Binario. Devuelve 1 si "cadena" contiene solo los caracteres 0 o 1.
L Minúsculas. Devuelve 1 si "cadena" contiene solo caracteres entre a-z.
Mayúsculas. Devuelve 1 si "cadena" contiene solo caracteres entre A-
U
Z.
M Mixto. Devuelve 1 si "cadena" contiene solo caracteres entre a-z o A-Z.
N Número. Devuelve 1 si "cadena" contiene sólo números.
Símbolo. Devuelve 1 si "cadena" contiene sólo símbolos de REXX
S
valídos para etiquetas.
W Entero. Devuelve 1 si "cadena" es un número entero.
Hexadecimal. Devuelve 1 si "cadena" contiene sólo caracteres entre a-
X
f, A-F o 0-9.
Ejemplos:
say sum(1,2)
say sum(“casa”,”bonita”)
say sum(200,”casa”)
/*
función con verificación de tipos de parámetros
retorna la suma si ambos parámetros son numéricos, la concatenación de
textos si ambos son texto, o un mensaje en caso de no cumplirse las condiciones anteriores!!
*/
suma: procedure
arg op1 op2
if datatype(op1,n) == 1 & datatype(op2,n) == 1 then
valor = op1 + op2
else
if datatype(op1,a) & datatype(op2,a) then
valor = op1 || “ “ || op2
else
valor = “valores de operandos no definidos para esta funcion”
return valor
20
Programación REXX Nivel Básico
INSTRUCCIONES DE CONTROL
Instrucciones que permiten controlar la ejecución del programa y predecir situaciones
inesperadas.
RC
Código de retorno de un comando del sistema. Por lo general se captura ese código para
manejar el error de retorno.
RC = comando(parámetros)
IF RC <> 0 THEN instrucciones
SYSGETERRORTEXT (RC)
Nos proporciona información sobre un código de error cuando estamos ejecutando un
comando del sistema.
RC = comando(parámetros)
IF RC <> 0 THEN SAY SYSGETERRORTEXT(RC)
Códigos de errores más comunes:
Código Descripción
2 El sistema no puede encontrar el archivo especificado
3 El sistema no puede encontrar la ruta especificada
5 Acceso denegado
123 El nombre de archivo o el nombre de directorio no son correctos
183 No se puede crear un archivo que ya existe
21
Programación REXX Nivel Básico
TRACE
El comando TRACE nos va a permitir activar diferentes trazas o inspecciones en tiempo de
ejecución para ver cómo se va ejecutando el programa, es lo que se conoce como DEBUGIN.
Código Descripción
Muestra cualquier instrucción que genere un error. Esta opción viene
trace
activada por defecto en zOS.
A parte de mostrar los errores, imprime las líneas de código del
trace a
programa a medida que se van ejecutando.
A parte de mostrar los errores, imprime las líneas de código del
programa a medida que se van ejecutando. Además nos muestra el
trace r
valor que va tomando cada variable y el resultado al analizar
condiciones.
Para activar la traza interactiva, es decir, que se vaya parando la
trace ?
ejecución al analizar cada parte deseada esperando nuestra
trace ?a
interacción para seguir, pondremos el signo “?” antes de la opción
trace ?r
deseada.
Desactivamos TRACE con OFF. Podemos desactivarlo cuando ya
trace o
hayamos visto lo que queríamos ver.
Siendo n un número positivo. Desactivamos TRACE en las siguientes n
trace n
líneas.
22
Programación REXX Nivel Básico
MANEJO DE CADENAS
A continuación listamos las funciones para el manejo de cadenas de caracteres o STRINGS.
Función Descripción
left Retorna un número de caracteres de la cadena desde la izquierda
right Retorna un número de caracteres de la cadena desde la derecha
length Retorna el número de caracteres de la cadena
overlay Sobrepone cadenas dentro de otra
reverse Retorna los caracteres en forma invertida
substr Toma una cadena dentro de una más grande
Compara dos cadenas, si son iguales retorna 0. En caso contrario
compare
retorna el número de carácter donde comienza la diferencia
verify Verifica que una cadena esté dentro de otra, si hace match o no
copies Copia una cadena las veces especificadas
delstr Elimina una cadena dentro de otra
insert Inserta cadenas dentro de otras
pos Retorna la posición que ocupa una cadena dentro de otra
delstr Elimina una cadena contenida en otra
23
Programación REXX Nivel Básico
LENGTH (cadena)
Devuelve el número de caracteres que tiene "cadena".
texto1 = “este texto tiene una longitud mediana”
texto2 = “este otro texto tiene muchos caracteres, pondremos palabras como ejemplo, “,
|| “pelota, variable, hombre, mujer, carro, computadora, pantalla, curso”
texto3 = “texto corto”
REVERSE (cadena)
Invierte la cadena.
otra = reverse(“abcdef”)
say otra /* imprime fedcba */
24
Programación REXX Nivel Básico
/* resultados
0
4
2
1
*/
25
Programación REXX Nivel Básico
Las opciones pueden ser N de NOMATCH, que es la que opción por defecto y nos dice la
posición del primer caracter que no coincide, o M de MATCH, que nos dice la posición del
primer caracter que coincide.
Con "n" indicamos en qué posición tiene que empezar a comprobar, por defecto es 1.
texto = “murcielago”
COPIES (cadena, n)
Devuelve "n" repeticiones concatenadas de "cadena".
texto = “texto”
say copies(texto, 10) /* imprime textotextotextotextotextotextotextotextotextotexto */
DELSTR (cadena, n, l)
Devuelve "cadena", habiendo eliminado "l" caracteres empezando en "n". Si "l" no se
específica, eliminará toda la cadena desde "n" hasta el final.
texto = “douglas barrios”
26
Programación REXX Nivel Básico
"n" indica después de que carácter de "cadena" se debe insertar "nueva", el valor por
defecto es 0. Si "n" es mayor que la longitud de "cadena", se insertará en la posición
indicada, rellenando los huecos con lo indicado "relleno", si no se indica nada, se rellenan
con espacios por defecto.
"l" indica el número de caracteres que queremos insertar, por defecto "l" es la longitud de
"nueva", para insertar toda la cadena. Si "l" es menor que la longitud de "nueva", se cogerán
solo los primeros "l" caracteres de "nueva"; si es mayor se rellenará con "relleno" o con
espacios por defecto.
texto = “franco”
t1 = insert(“barrios”, texto)
say t1
t2 = insert(“douglas”, t1)
say t2
texto2 = “123456789”
say insert(“abc”, texto2, 4)
say insert(“abc”, texto2, 4, 6, “.”)
say insert(“abcd”, texto2, , 3)
/* salida esperada
barriosfranco
douglasbarriosfranco
1234abc56789
1234abc...56789
abc123456789
*/
27
Programación REXX Nivel Básico
28
Programación REXX Nivel Básico
MANEJO DE PALABRAS
Funciones para el manejo de palabras.
Función Descripción
Comprueba si una cadena es parte de los caracteres iniciales de la
abbrev
cadena original a manera de abreviatura
Reemplaza los espacios en blanco entre las palabras de una cadena y
space
permite reemplazar el espacio por el caracter de relleno indicado
Reemplaza los caracteres de una cadena por otros, si se omiten estos
translate
parámetros convierte la cadena a mayúsculas
words Devuelve el número de palabras que tiene una cadena
word Devuelve la palabra que esté en la posición "n" dentro de una cadena
Devuelve la posición que ocupa la primera palabra de una cadena entre
wordpos todas las palabras de otra. Se le puede indicar en qué número de
palabra comenzar, por defecto, empieza en la primera palabra
Extraer palabras de una cadena de caracteres. Se puede indicar desde
subword
donde comenzar y el número de palabras a extrater
Devuelve la posición del primer carácter de la palabra que está en la
wordindex
dentro de una cadena
Devuelve el número de caracteres de la palabra que está en una
wordlength
posición de la cadena dada
Permite borrar palabras de una cadena, podemos especificar donde
delword comenzar. Si no se especifica, por defecto borra todas las palabras
empezando en una posición dada
29
Programación REXX Nivel Básico
/* resultados esperados */
la casa roja
la--casa--roja
lacasaroja
/* resultados esperados */
DOUGLAS BARRIOS
doxglys
doxgly$
30
Programación REXX Nivel Básico
WORDS (cadena)
Devuelve el número de palabras que tiene "cadena".
say words(“numero de palabras de la cadena”)
say words(“Douglas Raul Barrios Franco”)
say words(“supercalifragilisticoespialidoso”)
/* resultados esperados */
6
4
1
WORD (cadena, n)
Devuelve la palabra que esté en la posición "n" dentro de "cadena".
say word(“numero de palabras de la cadena”,3)
/* resultados esperados */
palabras
Raul
super
/* resultados esperados */
2
4
0
31
Programación REXX Nivel Básico
SUBWORD (cadena, n, l)
Extrae "l" palabras de "cadena" comenzando en "n". Si no se le indica "l" extraerá todas las
palabras a partir de la palabra que esté en la "n" posición, incluyendo esta palabra.
say subword("Nombre Apellido Telefono Trabajo",3)
/* resultados esperados */
"Telefono Trabajo"
"Apellido Telefono"
WORDINDEX (cadena, n)
Devuelve la posición del primer caracter de la palabra que está en la "n" posición, dentro
de "cadena".
say wordindex("Nombre Apellido Telefono Trabajo",3)
/* resultados esperados */
17
0
WORDLENGTH (cadena, n)
Devuelve el número de caracteres de la palabra de "cadena" que está en la posición "n".
say wordlength("Nombre Apellido Telefono Trabajo",3)
/* resultados esperados */
8
6
32
Programación REXX Nivel Básico
DELWORD (cadena, n, l)
Elimina "l" palabras en "cadena", comenzando en "n". Si "l" no se especifica, por defecto
borra todas las palabras empezando desde "n".
SAY DELWORD("Nombre Apellido Telefono Trabajo",3)
/* resultados esperados */
Nombre Apellido
Nombre Telefono Trabajo
33
Programación REXX Nivel Básico
FUNCIONES MATEMATICAS
Funciones con manejo de valores numéricos.
Función Descripción
abs Retorna el valor absoluto de una cifra dada
sign Devuelve el signo de un número cualquiera
max Retorna el número máximo de una lista de hasta 20 valores
min Retorna el número mínimo de una lista de hasta 20 valores
Devuelve una cadena con todos los caracteres comprendidos entre
xrange
"inicio" y "final"
Devuelve un número aleatorio de acuerdo con el parámetro
random
especificado
trunc Redondea un número con decimales
format Imprime un valor de acuerdo al formato especificado
ABS (número)
Devuelve el número sin signo.
positivo = abs(-5)
say positivo
positivo2 = abs(-10.50)
say positivo2
SIGN (número)
Comprueba el signo de "número". Devuelve 1 si "número" es mayor que 0, devuelve 0 si
"número" es 0, y devuelve -1 si "número" es menor que 0.
say sign(-5) /* retorna -1 */
34
Programación REXX Nivel Básico
XRANGE
Construye la secuencia de caracteres a partir de los valores suministrados.
say xrange("A","Z") /* imprime "ABCDEFG...UVWXYZ" */
say random(10,200)
/* genera un numero entre 10 y 200 */
say random(-15,0)
/* genera un numero entre -15 y 0 */
say random(6)
/* genera un numero entre 0 y 6 */
35
Programación REXX Nivel Básico
TRUNC (número, n)
Trunca el parámetro "número" dejando solo "n" decimales. Por defecto "n" vale 0, es decir,
quita todos los decimales. No realiza el redondeo, el resto de decimales serán descartados
sin redondear. Si "n" es mayor al número de decimales actual, añadirá el número 0 tantas
veces como necesite.
say trunc(25.19)
say trunc(25.19,1)
say trunc(25.19,4)
/* valores esperados */
25
25.1
25.1900
36
Programación REXX Nivel Básico
ARREGLOS
En REXX a los arreglos se les llama STEMS. Son variables que pueden ser referenciadas con
el uso de un índice.
/* recorrer el vector */
do j = 1 to 10
say vector.j
end
37
Programación REXX Nivel Básico
Arreglos Multidimensionales
Al igual que la matriz, es posible crear arreglos de n dimensiones.
/* primera matriz del cubo */
cubo1.1.1 = 0
cubo1.1.2 = 0
cubo1.1.3 = 0
cubo1.1.4 = 0
cubo1.2.1 = 1
cubo1.2.2 = 1
cubo1.2.3 = 1
cubo1.2.4 = 2
38
Programación REXX Nivel Básico
MANEJO DE ARCHIVOS
A continuación se describen las funciones para el manejo de archivos.
Función Descripción
lines Devuelve la cantidad de registros o líneas que contiene el archivo
linein lee el registro o línea de datos del archivo
Escribe en el archivo especificado, también sirve para cerrar el archivo
lineout
de salida
Ejemplos:
/* leer la primera línea del archivo */
line_str = linein(datos.txt)
say line_str
/* creación de un archivo */
do i = 1 to 10
rc = lineout(numeros.txt, i)
if (rc == 0) then say “escribiendo en numeros.txt”
else
do
say “ocurrio un error durante el proceso”
leave
end
endo i
39
Programación REXX Nivel Básico
FUNCIONES DE ARCHIVOS
A continuación se describen las funciones para el tratamiento de archivos.
Función Descripción
SYSFILEEXISTS Comprueba si un archivo existe, devolviendo 1 si existe o 0 si no existe.
Borra un archivo del sistema. Devuelve 0 si el archivo se ha borrado
SYSFILEDELETE
correctamente, u otro código en caso de error.
Copia un archivo de un sitio a otro. Si en el destino no indicamos la
ruta, el archivo será copiado en el directorio donde nos encontramos.
SYSFILECOPY
Devuelve código 0 si es copiado satisfactoriamente, u otro código en
caso de error.
Nos permite mover un archivo de un directorio a otro. Devuelve código
SYSFILEMOVE
0 si es movido satisfactoriamente, u otro código en caso de error.
DIRECTORY Nos devuelve la ruta del directorio o carpeta donde nos encontramos.
SYSFILEEXISTS (archivo)
Comprueba si un archivo existe, devolviendo 1 si existe o 0 si no existe.
RC = SYSFILEEXISTS(file1.txt)
/* Guarda 1 o 0 dentro de RC */
RC = SYSFILEEXISTS("C:\Otra carpeta\file1.txt")
SYSFILEDELETE (archivo)
Borra un fichero del sistema. Devuelve 0 si el archivo se ha borrado correctamente, u otro
código en caso de error.
RC = SYSFILEDELETE(file1.txt)
/* Guarda el código de retorno dentro de RC */
RC = SYSFILEDELETE("C:\Otra carpeta\file1.txt")
40
Programación REXX Nivel Básico
RC = SYSFILECOPY(file1.txt,"C:\Otra carpeta\file1.txt")
RC = SYSFILECOPY("C:\Otra carpeta\file1.txt",file1.txt)
DIRECTORY
Nos devuelve toda la ruta del directorio donde nos encontramos.
SAY DIRECTORY()
41
Programación REXX Nivel Básico
Función Descripción
userid Devuelve el usuario que se ha conectado al sistema
date Retorna la fecha del día con un formato específico
time Retorna la hora del momento con el formato específico
USERID
Esta función va a devolver el nombre de usuario con el que nos hemos conectado al sistema.
No tiene parámetros.
say userid() /* muestra el usuario conectado al sistema */
Opciones Descripción
B Base, el número de días completos desde 1 de Enero del año 1.
D Días transcurridos del año (ddd)
E Europeo, de la forma dd/mm/yy
N Normal, dd mes (con 3 letras y en inglés) yyyy. Opción por defecto
O Ordenada, yy/mm/dd
S Estandar, yyyymmdd
U Estados Unidos, mm/dd/yy
M Mes en inglés
W Día de la semana en inglés
Ejemplos:
say date(M,"01/05/17",E) /* imprime "May" */
42
Programación REXX Nivel Básico
TIME (opción)
Usada para devolver la hora del sistema, u otra información dependiendo de la "opción"
indicada.
Opciones Descripción
C Hora civil: hh:mm am/pm
H Horas desde la media noche
M Minutos transcurridos desde la media noche
S Segundos transcurridos desde la media noche
L Formato largo: hh:mm:ss.microsegundos
N Formato normal: hh:mm:ss
Elapsed time, indica los segundos y microsegundos desde cuando se
E
reinició
R Reset Elapsed time, reinicia el Elapsed time en cero
Ejemplos:
TIME(E)
/* "0" segundos */
TIME(E)
/* X segundos transcurridos desde el primer TIME(E)*/
TIME(R)
/* X segundos transcurridos desde el primer TIME(E)*/
TIME(E)
/* X segundos transcurridos desde TIME(R)*/
43
Programación REXX Nivel Básico
EJERCICIOS
1. Escriba una función que permita contar la cantidad de dígitos de una cifra dada.
Emplee los operadores que calculan el cociente y el residuo de la división entera.
2. Escriba las funciones que conviertan un número de decimal a binario, a octal y a
hexadecimal a partir de divisiones sucesivas por 2, 8 y 16 respectivamente. Haga uso
de los operadores cociente y residuo.
3. Escriba las funciones que conviertan un número de binario, octal y hexadecimal a
decimal.
4. Escriba una función que permita contar los números de inicio a fin en un intervalo
dado. La funcione recibe los parámetros ini, fin y step. El ciclo debe imprimir los
números de ini a fin de step en step. Por ejemplo, ini = 10, fin = 20, step = 2, luego
debe imprimir 10, 12, 14, 16, 18, 20.
5. Dado un vector de números aleatorios de tamaño fijo, realice el programa que
ordene el vector usando el método de La Burbuja.
6. Cree un archivo de 100 números generados de manera aleatoria.
7. Escriba un programa que lea el archivo anterior, lo descargue en un vector para
luego ordenar los números de forma descendente, finalmente, guarde el vector en
un archivo nuevo. Emplee cualquier método de ordenamiento conocido.
8. Codifique la función PRIMO que determine si un número pasado como parámetro
es un número primo.
9. Codifique la función DIVISORES que cuente la cantidad de divisores de un número
cualquiera.
10. Construya un programa que calcule la multiplicación de dos números por sumas
sucesivas.
11. Construya un programa que efectúe la división por restas sucesivas.
12. Haga el programa que despliegue un menú de opciones para ayudar al usuario a
ejecutar las funciones multiplicación y división escritas en los pasos anteriores.
13. Incluya a ese programa la potencia por sumas sucesivas.
14. Escriba una función que calcule la raíz cuadrada aproximada. Hay muchos métodos
sencillos para tal fin.
44
Programación REXX Nivel Básico
Proyectos
1. Escriba las siguientes funciones de manera recursiva: PRIMO, DIVISORES,
MULTIPLICA, COCIENTE, RESIDUO, RAIZ2 y POTENCIA. Guarde este código en un
programa integrado.
2. Escriba un programa de CONVERSIÓN DE MONEDAS. Ingrese la cantidad a convertir
en la moneda local, el factor de conversión a moneda extranjera para que el
programa imprima la cantidad en dicha moneda. Guarde el factor de conversión en
el archivo factor.txt. Si el archivo existe, lea su contenido para mostrar el valor del
factor en las subsiguientes conversiones. Permita guardar los cambios.
3. Escriba un programa que simule EL JUEGO DE DADOS entre usted y la computadora.
El juego consiste en lanzar el dado por parte de cada jugador. Si usted saca un 1
puede volver a tirar. Si la computadora saca 1 pierde automáticamente. Gana aquel
jugador que saque el mayor número de los dos lanzamientos. Lleve el conteo de la
cantidad de juegos ganados y perdidos.
4. Escriba el programa que permita simular el juego de POKERDADO. El juego consiste
en lanzar 5 dados y explorar el resultado. Un PAR resulta de obtener dos números
iguales. Un TRIO resulta de obtener 3, POKER con 4 y SUPERPOKER con 5. El
FULLHOUSE resulta de sacar un TRIO y un PAR. La ESCALERA CHICA resulta de
obtener la secuencia del 1 al 5, y la ESCALERA GRANDE del 2 al 6. Anote la cantidad
de juegos ganados por tipo. Guarde los resultados en el archivo: pokerdado.txt.
5. Efectué los cambios necesarios para jugar POKERDADO con otro jugador. Con 5
jugadores. Incluya el manejo de apuestas. Lleve estadísticas de los ganadores y la
cantidad de apuestas en la moneda que usted decida.
45