Ingeniero Técnico en Informática de Sistemas


FoxPRO


Capitulo 1

Descripción:

FoxPRO es el más popular y completo programa de gestión de bases de datos (DBMS o Data Base Management System), combinando un potente motor con la facilidad de uso de los entornos gráficos, además de un gran numero de herramientas.

FoxPRO es además, un potente lenguaje de programación modular y de procedimientos orientado a eventos y no a menús jerárquicos y anidados (como FoxBASE, Clipper y dBASE). Esta filosofía le da nítidas ventajas, en el diseño de cualquier tipo de aplicación.

Versión de FoxPRO a ejecutar:

Los usuarios de FoxPRO 2.6 que tengan un procesador 386 SX o superior pueden elegir entre usar la versión Estándar o la versión Extendida de FoxPRO. En algunas ocasiones es mejor usar una versión en lugar de la otra, pero también hay otros casos en los que la elección no está tan clara.

Antes de decidir qué versión debe ejecutar, lea estas notas acerca del uso de memoria para las dos versiones:

Uso de la memoria en la versión Estándar

La versión Estándar se presenta en dos partes: una parte raíz (contenida físicamente en el archivo .EXE) y una serie de segmentos de código (contenida físicamente en el archivo .OVL).

Al iniciar el programa, se carga en la memoria la parte raíz y se realizan algunas asignaciones adicionales de memoria de tamaño fijo. Estas asignaciones añaden unos 290 KB de memoria. El conjunto de segmentos de código ocupa 1,1 MB aproximadamente.

Una vez cargada la parte raíz, el saldo de memoria por debajo de 640 KB, más los Bloques de memoria superior (UMB) disponibles más 64 KB de memoria EMS (si cargo EMM386) quedará a disposición de FoxPRO como pila de memoria de uso general para todos los datos de los usuarios y del sistema (variables de memoria, ventanas, BROWSE, consultas, segmentos de código, etc.), el resto de la memoria EMS se usa para los búferes de E/S y para el almacenamiento de segmentos de código inactivo.

Los segmentos de código se cargan bajo petición y flotan libremente por toda la memoria disponible, tanto en la memoria general como en la pila de memoria EMS. Los segmentos de código inactivo se descargan siguiendo el método del menos usado recientemente, según sea necesario con el fin de liberar memoria para otros fines. Si cuando se solicita un segmento de código necesario éste no está disponible, deberá cargarse desde el disco.

Puesto que el segmento raíz es relativamente pequeño, la versión

Estándar se ejecutará realmente en menos de 400 KB. Sin embargo, para la mayoría de las aplicaciones, un tamaño mínimo de memoria más realista es 512 KB. Por supuesto, una cantidad mayor de memoria puede mejorar considerablemente la velocidad de ejecución: cuanta más memoria, mejor.

Uso de la memoria en la versión Extendida

Primer MegaByte:

  • Se usan 80 KB para una parte del Extender.

  • Si DOSMEM=ON, el saldo de los primeros 640 KB se reasignará y quedará disponible como memoria extendida.

  • Si DOSMEM=nnK, la cantidad especificada de memoria se conservará para su uso posterior mientras se reasigna el saldo de memoria y mientras queda disponible como memoria extendida.

NOTA: Si especifica un valor demasiado alto para DOSMEM=nnK y reduce el tamaño de este búfer o lo elimina completamente, quizá se degrade el rendimiento de E/S.

  • De la memoria restante se asigna un búfer de 60 KB como máximo, dependiendo de la cantidad de memoria disponible. Cuando ejecute el comando RUN (!), se desasignará este búfer de forma que el programa que se ejecuta mediante RUN disponga de más memoria.

  • No se usan los bloques de memoria superior (UMB).

Memoria extendida (EMS):

Todo el código para la versión Extendida, junto con el resto del Extender, se carga en la memoria y permanece residente y se hacen ciertas asignaciones de memoria fija. Para ello se requiere un total de unos 1,450 KB de memoria extendida.

Una vez realizadas estas asignaciones, el saldo de la memoria extendida quedará disponible para uso general; puede usarse para cualquier fin cuando sea necesario.

Puesto que la versión Extendida es realmente un producto a 32 bits, algunas estructuras internas de datos (variables de memoria, ventanas, etc.) requieren algo más de memoria en la versión Extendida que en la versión Estándar. Por tanto, los programas necesitarán normalmente más memoria para poder ejecutarse en la versión Extendida que en la versión Estándar.

Pros y contras:

  • Con la versión Estándar, los segmentos de código FoxPRO no tienen por qué estar residentes en la memoria; se pueden cargar bajo petición. Por supuesto, no existe código del Extender. Esto significa que, para una cantidad determinada de memoria, habrá unos 1,1 MB más de memoria para búferes de E/S en la versión Estándar que en la versión Extendida.

  • Pero, no todos los 1.1 MB pueden estar realmente disponibles para búferes. En aquellas situaciones reales donde hay aplicaciones grandes, se necesitaría gran parte de esa memoria para almacenar segmentos de código de FoxPRO y otros datos.

  • Puesto que la velocidad de las operaciones de E/S puede depender en gran medida de la cantidad de memoria disponible, los programas que realizan muchas operaciones de E/S pueden verse enormemente beneficiados por esta memoria adicional. Obviamente, en un sistema de 3 MB sería MUY significativo un MB adicional de memoria para búferes; esto significa que, en estos sistemas menores, la versión Estándar probablemente superaría a la versión Extendida en las pruebas de E/S. Sin embargo, la ventaja marginal que proporciona esta memoria adicional para búferes se hace inapreciable a medida que se dispone de más memoria.

  • Por otra parte, si su aplicación está dedicada principalmente a la entrada de datos y necesita la máxima sensibilidad de la interfaz cuando se usan muchas características nuevas, la versión Extendida será la mejor elección incluso en sistemas pequeños. Esto se debe a que en la versión Extendida todo el código de FoxPRO está residente y no hay sobrecargas al cargar el segmento.

  • Además, en la versión Extendida, el tamaño de los programas, el número de ventanas, la longitud de las cadenas, el número de variables de memoria, etc. sólo están limitados realmente por la cantidad de memoria de su sistema. Tenemos sistemas en los que hay más de 30 MB de memoria disponible para la versión Extendida. Por el contrario, en la versión Estándar no puede acceder realmente a más de unos 460 KB de memoria libre total para uso general. Así, en el caso de aplicaciones complejas o de bases de datos muy grandes (especialmente cuando se usa el SQL), será obligatorio usar la versión Extendida.

Qué versión debes usar ?

  • Si tu sistema tiene 4 MB o más de memoria, casi siempre será mejor usar la versión Extendida. No obstante, recuerde que independientemente de la cantidad de memoria que tenga, la versión Estándar puede tener más memoria disponible para búferes que la versión Extendida. Teniendo esto en cuenta, a veces es posible realizar pruebas de E/S en las que ganará la versión Estándar. Sin embargo con más de 4 MB, la versión Extendida casi siempre obtendrá mejores resultados en dichas pruebas.

  • Entre 3 y 4 MB de memoria total, se produce un empate y lo recomendable es que pruebe ambas versiones y elija la versión más adecuada para su situación concreta.

  • Si tiene 3 MB o menos, definitivamente deberá usar la versión Estándar.

Algunos limites mas saltantes:

  • Máximo 1,000'000,000 de registros por tabla

  • Máximo 255 campos por tabla

  • Máximo 255 caracteres por campo

  • Máximo 65,500 caracteres por registro

Simbología:

La simbología usada en esta separaba es la adoptada en la mayoría de los textos de FoxPRO.

<> Indica que el ítem encerrado deberá ser suministrado por el usuario al momento de usar el comando o función. Los símbolos <> no deberán ser incluidos.

[ ] Indican que el ítem encerrado es opcional. Los corchetes no son parte del comando.

| indica que se debe escoger una entre dos o mas opciones.

Capitulo 2

Programación en FoxPRO

Un programa FoxPRO es una secuencia de código contenido en un archivo de texto ASCII puro con la extensión PRG al que se le llama código fuente, que puede ser generado por cualquier procesador de textos.

Si opta por usar el editor incluido en FoxPRO, desde la ventana de comandos escriba: MODIFY COMMAND <archivo>, con lo cual si existe un archivo con ese nombre y extensión PRG se abre una nueva ventana donde se podrá editar su contenido. De no existir aún el archivo, se abre una ventana vacía.

Un vez terminado de escribir el programa, puedes hacer <Ctrl><O> desde el mismo editor, lo que hace que el compilador del FoxPRO verifique la sintaxis y si esta es correcta compilara el programa fuente generando el programa objeto, usando el mismo nombre y la extensión FXP.

También puedes ejecutar un programa desde:

1. La ventana de comandos con la orden: DO <archivo>

2. El prompt de DOS con: FOX <archivo> (versión iterativa)

3. El prompt de DOS con: FOXR <archivo> (versión runtime)

Nota: En las dos primeras opciones si la fecha del programa fuente (PRG) difiere de la del objeto (FXP) automáticamente se recompila la fuente generando un nuevo objeto. La opción 3 se limita a ejecutarla versión objeto si existe.

El compilador detecta cualquier error de sintaxis que exista en el archivo fuente. Los mensajes de error de compilación se guardan en un archivo de texto con el mismo nombre y extensión ERR.

Un lenguaje de programación esta fundamentado en tres soportes básicos:

  • Secuencias: Comandos que se sitúan uno tras otro sin posibilidad de repetición cíclica alguna.

  • Selección: Comandos que se ejecutan según cierta condición con los comandos: IF...ELSE...ENDIF o DO CASE...ENDCASE.

  • Bucles: Comandos que se ejecutan un cierto numero de veces con los comandos: DO WHILE...ENDDO o FOR...ENDFOR.

Hay ciertos comandos básicos en FoxPRO como son:

HELP [<comando>]= Solicita ayuda. También se pueda llamar con <F1>.

SET STAT ON/OFF = Activa o desactiva la barra de estado.

CLEAR = Limpia la pantalla

SET DEFA TO ... = Define el disco y ruta de trabajo

SET PATH TO ... = Al trabajar con varias rutas, es posible definir las rutas alternativas

DIR = Muestra el contenido del directorio de trabajo.

RUN <comando> = Ejecuta un comando directamente en el DOS

RUN COMMAND = Sale temporalmente al DOS.

* comentario en una línea

&& Comentario a continuación de un comando

Capitulo 3

Mostrar datos en pantalla

? | ?? <dato1>|<var1> [,<dato2>|<var2>...] [PICTURE <formato>] [FUNCTION <formato>] [AT <n>]

? y ?? evalúan expresiones y envían los resultados al escritorio.

? Un solo signo de interrogación envía un retorno de carro y un avance de línea antes de los resultados de la expresión. Los resultados se muestran en la siguiente línea del escritorio o la ventana activa definida por el usuario.

Si se omiten las expresiones, se imprime una línea en blanco.

Cuando se incluyen múltiples expresiones, se inserta un espacio entre los resultados de las expresiones.

?? Dos signos de interrogación muestran los resultados de la expresión en la línea y columna actual en el escritorio o la ventana activa definida por el usuario; no se envía retorno de carro ni avance de línea antes de los resultados.

Si está presente la cláusula PICTURE, la salida de <dato>|<var> se muestra de acuerdo con el formato especificado en <formato>, se puede incluir códigos de función anteponiendo el símbolo @, códigos PICTURE o una combinación de ambos. Es posible poner varios código de función juntos pero se deberá poner un espacio al final de los códigos de función, para diferenciarlos de los códigos picture.

Los códigos de función afectan de forma global a <dato>|<var>; los códigos PICTURE actúan solo sobre elementos (caracteres o dígitos) individuales del resultado.

AT se usa para especificar el numero de columna <n> donde se mostrará la salida. Esta opción permite alinear la salida en columnas para crear una tabla.

Códigos Function:

B

Justifica los números a la izquierda

C

Pone CR después de los números positivos (Crédito)

D

Usa el formato de fecha actual según SET DATE

E

Usa el formato de fecha BRITISH

T

Elimina los espacios blancos delante y detraes

X

Pone DB en los números negativos (Débito)

Z

Presenta blanco en lugar de cero. Solo para números

(

Encierra los valores negativos entre ()

!

Convierte a mayúsculas. Solo para caracteres

^

Muestra datos numéricos usando notación científica. Solo puede usarse con datos numéricos.

$

Muestra datos en formato de moneda. El símbolo de moneda aparece antes o después del valor dependiendo de SET CURRENCY. Si CURRENCY esta en LEFT no podrá usarse el código de función $. Solo para números.

Códigos Picture:

X

Cualquier carácter

Y

Solo valores lógicos "Y", "y", "N" y "n".

!

Convierte a mayúsculas. Solo caracteres

9

Dígitos o signos

*

Muestra asteriscos a la izquierda de números.

.

Separador decimal

,

Separador de miles

$

Muestra el símbolo de moneda especificado por SET CURRENCY. Como opción predeterminada, el símbolo se sita inmediatamente antes o después del campo. Sin embargo, es posible cambiar el símbolo de moneda y su ubicación (SET CURRENCY), el carácter separador (SET SEPARATOR) y el carácter decimal (SET POINT).

Ejemplos:

? DATE()

? 15*(10+10)

? 'Bienvenido a ' PICT '@!'

?? 'FoxPRO'

? 'Hola',xnombre,'como estas ?'

SET DECIMALS TO [<n>]

Especifica el numero mínimo de lugares o dígitos decimales que se usaran para mostrar resultados de operaciones matemáticas, trigonométricas, financieras, etc...

<n> puede tomar un valor entre 0 y 18. El valor predeterminado es dos (2).

SET FIXED ON|OFF

Especifica si el numero de decimales usado a; mostrar datos numéricos, es fijo o no. De forma predeterminada esta en OFF.

NOTA: El numero de dígitos de precisión en los cálculos es de 16.

SET DECI TO 18

? 1000000/3

333333.333333333300000000

? 1000/3

333.333333333333300000

? 1/3

0.333333333333333300

? PI()

3.141592653589793000

Capitulo 4

VARIABLES DE MEMORIA

FoxPRO maneja cuatro tipos de variable:

  • Públicas: Son las definidas en el programa principal y pueden ser usadas en cualquier subprograma o procedimiento.

  • Privadas: Son las definidas en un subprograma o usando la orden PRIVATE y solo están disponibles en dicho subprograma o procedimiento.

  • De Sistema: Son variables públicas incorporadas automáticamente por FoxPRO, no es necesario definir.

  • Arreglos, matrices o arrays: Son variables especiales que contiene una serie de valores, en un arreglo unidireccional o bidirección. Las variables se identifican con un nombre y sus elementos con subíndices. Pueden ser públicas o privadas.

Los nombres de variables pueden contener hasta 10 caracteres significativos, formados por letras, números y subrayados, aunque es obligatorio que la primera sea una letra. Tenga en cuenta que para FoxPRO estas variables son las mismas:

xApellido_Paterno

xApellido_Materno

El número máximo de variables de memoria que puede crear es de 1,024, pero en caso necesario este límite puede aumentarse (hasta 3,600 para la versión estándar o a 65,000 para la extendida) mediante la variable del sistema _MVCOUNT en el archivo de configuración FoxPRO.

Las variables de memoria deben ser definidas antes de ser usadas, así:

<var>=<dato>

Donde:

<var> nombre de variable conteniendo letras, números o subrayados.

<dato> FoxPRO permite cuatro tipo de valores: carácter (cadena entre comillas), numéricas, de fecha (fecha entre llaves) y lógica (entre puntos ej: .T.)

DISPLAY MEMORY [LIKE <estructura>]

Muestra el nombre, tipo, contenido y estado de todas las variables y matrices de memoria definidas actualmente, incluso del sistema. Además muestra el número de variables de memoria definidas, el número de bytes usados y el número de variables de memoria disponibles.

LIKE <estructura>

Puede mostrar información de forma selectiva sobre variables y matrices de memoria incluyendo la cláusula LIKE. Si incluye LIKE <estructura>,

FoxPRO mostrará  únicamente el contenido de variables y matrices de memoria que cumplan con la <estructura>. La estructura de archivo <estructura> admite caracteres comodín. Por ejemplo, para mostrar todas las variables de memoria que comiencen por la letra A, utilice:

DISPLAY MEMORY LIKE A*

En este ejemplo, se crean varias variables de memoria y se les asigna valores. DISPLAY MEMORY muestra primero todas las variables de memoria que comienzan con "mue" y luego muestra todas las variables de memoria que tienen seis letras y terminan con "salir".

muestra1='Adiós'

muestra2='Hola'

xsalir=.T.

msalir=.F.

DISPLAY MEMORY LIKE mue*

DISPLAY MEMORY LIKE ?salir

CLEAR MEMORY

Libera de la memoria todas las variables y matrices, tanto públicas como privadas. Las variables del sistema no se liberan.

RELEASE <lista>

Libera de la memoria las variables y matrices cuyos nombres están contenidos en la <lista>. Separe los nombre de la lista de variables y matrices mediante comas.

SAVE TO <archivo> [ALL LIKE | EXCEPT <estructura>]

Guarda las variables y matrices en un archivo con el nombre especificado en <archivo> y de extensión MEM.

Incluya la cláusula ALL LIKE para guardar todas las variables y matrices que coincidan con la <estructura>. La estructura puede contener los caracteres comodines al estilo DOS ? y *.

Incluya la cláusula ALL EXCEPT para guardar todas las variables y matrices excepto las que coinciden con la <estructura>. La estructura puede contener los caracteres comodines al estilo de DOS ? y *.

RESTORE FROM <archivo> [ADDITIVE]

Restaura variables y matrices guardadas en un archivo de extensión MEM y las pone en la memoria.

Todas las variables y matrices se restauran como privadas cuando se usa RESTORE desde un programa y como públicas si se emite RESTORE desde la ventana de Comandos.

Cuando se emite RESTORE FROM, todas las variables o matrices que están actualmente en memoria se borrarán a menos que se incluya la palabra clave ADDITIVE. Este comando no afecta a las variables del sistema.

Si el numero de variables y matrices que se esta añadiendo con ADDITIVE, mas el numero de las variables y matrices actualmente en memoria excede el limite, se traerán a la memoria tantas variables y matrices como sea posible.

Si restaura una variable que tiene el mismo nombre que una existente, el valor de la variable de memoria existente es reemplazado por el valor de la variable restaurada.

Ejemplo:

val1=50

val2='Hola'

SAVE TO temp

CLEAR MEMORY

val3=DATE()

RESTORE FROM temp ADDITIVE

DISPLAY MEMORY LIKE val?

Elementos de la matriz:

El tamaño de una matriz determina cuántos elementos podrá  contener. Cada elemento de la matriz puede almacenar una pieza sencilla de información.

Subíndices

Los elementos de una matriz se referencian mediante sus subíndices. Cada elemento de la matriz tiene un subíndice numérico único que lo identifica. Si la matriz es unidimensional, el subíndice de un elemento es igual que su número de fila. Por ejemplo, el subíndice del elemento de la tercera fila de una matriz unidimensional es 3. Los elementos de las matrices bidimensionales se referencian mediante dos subíndices:

El primer subíndice indica la fila y el segundo indica la columna en la que se encuentra el elemento. Por ejemplo, los subíndices del elemento que está en la tercera fila y en la cuarta columna de una matriz bidimensional son 3,4.

El subíndice o los subíndices del primer elemento de una matriz empiezan siempre con 1.

Redimensionar matrices

Puede cambiar el tamaño y las dimensiones de una matriz emitiendo otra vez DIMENSION. El tamaño de la matriz puede aumentarse o disminuirse, las matrices unidimensionales pueden convertirse en bidimensionales y las matrices bidimensionales pueden reducirse a una dimensión.

Si el número de elementos de una matriz se incrementa, se copiará  el contenido de todos los elementos de la matriz original a la matriz que se acaba de Redimensionar. El resto de los elementos de la matriz se inicializarán con el valor falso .F.

DIMENSION <matriz1> (<filas1>[,<columnas1>])

[,<matriz2> (<filas2>[,<colimnas2>])] ...

Crea o redimensiona una o más matrices.

El nombre de la matriz que se crea se especifica con <matriz1>. Pueden crearse múltiples matrices con una sola instrucción DIMENSION incluyendo nombres adicionales de matrices (<matriz2>, <matriz3> y así sucesivamente).

Tras especificar el nombre de la matriz a crear, debe especificar el tamaño de la matriz con <filas> y <columnas>. Si incluyes solamente <filas>, se creará  una matriz de una sola dimensión.

Por ejemplo, el comando siguiente crea una matriz unidimensional llamada MATRIZUNO que contiene diez filas y una sola columna:

DIMENSION matrizuno(10)

Para crear una matriz de dos dimensiones, incluya las dos expresiones: <filas> y <columnas>. El ejemplo siguiente crea una matriz bidimensional llamada MATRIZDOS que contiene dos filas y cuatro columnas.

DIMENSION matrizdos(2,4)

También es posible crear varias matrices en el mismo comando así:

DIMENSION matrizuno(10), matrizdos(2,4), matriztres(3,3)

Para enmarcar las expresiones en DIMENSION o DECLARE puede usar tanto paréntesis como corchetes. Por ejemplo, los siguientes dos comandos crean matrices idénticas:

DIME matrizuno(10), matrizdos(2,4), matriztres(3,3)

DIME matrizuno[10], matrizdos[2,4], matriztres[3,3]

Para determinar cuántos elementos contiene una matriz y cuánta información puede almacenar, multiplique el número de <filas> por el número de <columnas> de la matriz.

Los elementos de la matriz pueden contener cualquier tipo de dato y se inicializan a falso (.F.) cuando se crea la matriz por primera vez.

Puede inicializar todos los elementos de una matriz con el mismo valor mediante asi:

DIME y[10,3]

y='inicial'

DIME matriz[6]

STORE 'A' TO matriz(1),matriz(2),matriz(3)

STORE 'B' TO matriz(4),matriz(5),matriz(6)

Si se disminuye el numero de elementos de una matriz, se borrarán los elementos y cualquier dato que contengan.

Cuando se redimensiona una matriz unidimensional a dos dimensiones, el contenido de la matriz unidimensional original se copia a la nueva matriz en el orden “un elemento por fila”.

En el ejemplo siguiente, una matriz unidimensional se convierte en una matriz bidimensional. El contenido de los elementos de la matriz unidimensional se copia a la primera fila de la matriz nueva, siguiendo por la segunda fila y así sucesivamente. Los elementos restantes se inicializan con el valor falso (.F.).

DIME matrizuno(4)

matrizuno(1)= 'E'

matrizuno(2)= 'F'

matrizuno(3)= 'G'

matrizuno(4)= 'H'

Cuando una matriz bidimensional se convierte en unidimensional, el contenido de la matriz bidimensional original se copia a la nueva matriz en el orden “fila a elemento”: el primer elemento de la primera fila se convierte en el primer elemento de la matriz unidimensional, el segundo elemento de la primera fila se convierte en el segundo elemento y así sucesivamente.

Ejemplo:

En este ejemplo, se crea una matriz bidimensional y se carga con datos. Se muestran los elementos de la matriz y los datos que contienen.

DIME muestra(2,3)

muestra(1,2)= 'Adiós'

muestra(2,2)= 'Hola'

muestra(6)=99

muestra(1)=.T.

DISP MEMO LIKE muestra

Algunas funciones para matrices son:

Función

Descripción

ACOPY()

Copia elementos de una matriz a otra

ADEL()

Borra filas o columnas de una matriz

ADIR()

Captura nombre, tamaño, fecha, hora y atributos de archivo en ruta de trabajo en una matriz

AELEMENT()

Muestra valor de un elemento de matriz

AFIELDS()

Captura la estructura de una tabla en una matriz

AINS()

Inserta filas o columnas a una matriz

ALENS()

Muestra el numero de elementos de matriz

ASCAN()

Busca una expresión en una matriz

ASORT()

Ordena una matriz ascendente o descendente

ASUBSCRIPT()

Transforma # de elemento en fila y columna

Algunos comandos de matriz son:

SCATTER FROM ARRAY = Copia campos a una matriz

GATHER FROM ARRAY = Copia la matriz a los campos

APPE FROM ARRAY = Añade registros a una tabla desde una matriz

COPY TO ARRAY = Copia registros desde una tabla a una matriz

Capitulo 5

Operadores

Aritméticos:

Relacionales:

+

Suma

=

Igual

-

Resta

>

Mayor que

*

Multiplicación

<

Menor que

/

División

>=

Mayor o igual que

^ o **

Potencia

<=

Menor o igual que

%

Modulo o residuo

# o <>

Diferente

Lógicos:

Caracteres:

.NOT. o !

Negación

+

Concatenación

.OR.

Unión

-

Concatena sin espacios.

.AND.

Intersección

=

Igual

==

Exacto

$

Incluido

# o <>

Diferente

Prioridad de operación:

Grupos

()

1

Potencia

^ o **

2

Multiplicación y división

* y /

3

Suma y resta

+ y -

4

Operadores relacionales

=, >, <, #, $...

5

Operadores lógicos

! o .NOT., .OR. y .AND.

6

Ejercicio 1: Dadas las variables A=3, B=7 y C=1 determinar:

Valor ?

verdadera o falsa ?

A+B*C

A > 3

2*C+14/B

7 > B-1

1/(2*A-3*C)

11 = A+B+C

C*(A+B)

C/C^B+3 >= A

A*C+B*C-2

2*A+B = 20

2*C*(A+3*B)

A*B-C < A^A-B

B+(A-1)^A-1

3*(A^3-2*C)/7 # B-4

B^A+B^C

“a” $ “123”

(2*B+C)/A-6

“a” $ “12ab345”

2^A+2^B+2^C

“a21” $ “12ab345”

Ejercicio 2: Dadas las variables, A=5, B=8, C=2 y D=7, determinar el valor de las siguientes expresiones:

verdadera o falsa ?

A^C>B

4-A>C-B

D#A+C

5*A>=A+B+C+D

.NOT. A>2

! A#D-C

A-3#4 .AND. 2*C<=4

2*C=A .AND. B/C+2<D-C

A>0 .OR. B<0 .OR. C>0

3<B .OR. (A<=5 .AND. C#7 )

(A#4*C .AND. 5>=A) .OR. (1-C>B-2*A)

(A>=D+1 .OR. ! B<C) .AND. (B>C-1 .OR. C#B*2)

Ejercicio 3: Dadas las variables,

A=`javier `

B=`hola'

C=`vi'

D=`JA'

Determinar el valor de las siguientes expresiones:

A + B

C $ A

B + A

D $ A

A - B

A > D

A = C

A + B = A - B

A = D

D !$ A

C = A

? A FUNC `!'

D = A

? A PICT `!'

A == D

? A PICT `!XXXXXXXX'

Capitulo 6

CONTROL DEL FLUJO DE UN PROGRAMA

Es la lógica de un programa y la faceta mas importante de cualquier lenguaje de programación. Las sentencias <cond>icionales que cambian la dirección del flujo y la iterativas (bucles o lazos) que repiten un grupo de <comandos> un cierto numero de veces, son las herramientas que nos permiten crear programas útiles.

FoxPRO fue diseñado para que el programador dirija el flujo de control de una forma estructurada y racional, de modo que los programas resultantes sean fáciles de entender y modificar cuando sea necesario.

Es costumbre sangrar (indentar) usando la tecla Tab para ayudar a captar visualmente la estructura de anidamiento, aunque esto es ignorado por el compilador.

Condicional simple:

IF <cond>

<comandos>

[ELSE

<comandos>]

ENDIF

1

Ejecuta condicionalmente un conjunto de comandos dependiendo del resultado de una expresión lógica.

Si <cond> da como resultado verdadero (.T.), se ejecutarán todas las instrucciones comprendidas entre el IF y ELSE o ENDIF (de no existir ELSE).

Si <cond> es falsa (.F.) y se incluye ELSE, se ejecutarán todas las instrucciones comprendidas entre ELSE y ENDIF. De no existir ELSE, se ignorarán todas las instrucciones entre IF y ENDIF, continuando el programa en la línea siguiente a ENDIF.

Se puede anidar un bloque IF...ENDIF dentro de otro bloque IF...ENDIF.

Ejemplo 1: Crear un programa que dado un numero, determine si este es mayo que 5 o no.

IF x>5

? 'x es mayor que 5'

ELSE

? 'x es menos o igual a 5'

ENDIF

Ejemplo 2: Crear un programa que dado un numero, determine si este es positivo, negativo o cero.

IF x>0

? 'el numero es positivo'

ELSE

IF x<0

? 'el numero es negativo'

ELSE

? 'el numero es cero'

ENDIF

ENDIF

Ejemplo 3: Crear un programa que dada una nota, responda si es aprobatoria, desaprobatoria o invalida.

IF nota<0 .OR. nota>20

? `Esa nota no en valida'

ELSE

IF nota>=10.5

? `Aprobado'

ELSE

? `Desaprobado'

ENDIF

ENDIF

Condicional múltiple:

DO CASE

CASE <cond1>

<comandos>

[CASE <cond2>

<comandos>

...

CASE <condN>

<comandos>]

[OTHERWISE

<comandos>]

ENDCASE

2

Ejecuta el primer bloque de instrucciones entre DO CASE y END CASE cuya instrucción condicional asociada tenga el valor verdadero (.T.).

DO CASE se usa para ejecutar un conjunto de comandos dependiendo del resultado de una condición lógica. Cuando se ejecuta DO CASE, se evalúan cada uno de los casos lógicos; el resultado de la evaluación determina el conjunto de comandos que se ejecutar .

Cuando se encuentre la primera cláusula CASE cuyo valor sea verdadero (.T.), se ejecutarán las instrucciones que haya a continuación y luego salta en busca de la cláusula ENDCASE, reanudando la ejecución en el comando que hay inmediatamente a continuación de ENDCASE.

Se ejecuta una y sola una, instrucción CASE (la primera <cond> que dé resultado verdadero) y ni siquiera serán evaluados los próximos CASE.

Si todas las instrucciones CASE resultan falsas (.F.), se ejecutaran los comandos entre OTHERWISE y ENDCASE.

Si se omite OTHERWISE, la ejecución saltar  al primer comando a continuación de ENDCASE.

Ejemplo 1: Crear un programa que dado un numero determine si este es positivo, negativo o cero.

DO CASE

CASE x>0

? 'el numero es positivo'

CASE x<0

? 'el numero es negativo'

OTHERWISE

? 'el numero es cero'

ENDCASE

Ejemplo 2: Crear un programa que dada una nota, responda si es aprobatoria, desaprobatoria o invalida.

DO CASE

CASE nota>20

? `Esa nota no en valida'

CASE nota>=10.5

? `Aprobado'

CASE nota>=0

? `Desaprobado'

OTHER

? `Esa nota no en valida'

ENDCASE

Condicional repetitiva:

DO WHILE <cond>

<comandos>

[LOOP]

[EXIT]

ENDDO

3

Ejecuta un bloque de instrucciones dentro de un bucle condicional un numero de veces dependiente del estado de una condición..

Un conjunto de comandos situados entre DO WHILE y ENDDO se ejecuta mientras que el resultado de la expresión lógica <cond> sea verdadero (.T.). Una instrucción DO WHILE debe tener su correspondiente instrucción ENDDO.

<cond> es una expresión lógica y las instrucciones situadas entre DO WHILE y ENDDO se ejecutarán mientras que dicha condición sea verdadera (.T.).

LOOP puede situarse en cualquier parte entre DO WHILE y ENDDO, devuelve el control del programa directamente a la instrucción DO WHILE, así que se vuelve a evaluar <cond>.

EXIT transfiere el control del programa desde el interior del bucle DO WHILE al primer comando a continuación de ENDDO. EXIT puede situarse en cualquier parte entre DO WHILE y ENDDO.

Ejemplo 1: Crear un programa que muestre los números en orden ascendente, del 1 al 10 inclusive.

x=0

DO WHILE x<10

x=x+1

? x

ENDDO

Ejemplo 2: Crear un programa que muestre el cuadrado de los 100 primeros números, con pausas de 10 segundos para cada pantalla.

x=100

y=1

DO WHILE x>0

? x PICT `999','al cuadrado es',x^2 PICT `99,999'

IF x<20

y=y+1

ELSE

WAIT WIND 'Una tecla para continuar' TIME 10

CLEAR

y=1

ENDIF

x=x-1

ENDDO

Estructura repetitiva:

FOR <var>=<exp1> TO <exp2> [STEP <exp3>]

<comandos>

[EXIT]

[LOOP]

ENDFOR | NEXT

4

Ejecuta los comandos que hay entre FOR y ENDFOR un numero concreto de veces.

FOR ... ENDFOR ejecuta un conjunto de instrucciones dentro de un bucle un numero especificado de veces. Se utiliza una variable de memoria o un elemento de matriz como contador para especificar cuantas veces se ejecutan las instrucciones que hay dentro del bucle.

Las instrucciones de programa que hay a continuación de FOR se ejecutan hasta que se llegue a ENDFOR o NEXT. Entonces se incrementa <var> con el valor de <exp3>. Si se omite la cláusula STEP, el contador se incrementa en 1. Entonces se compara el contador con el valor final <exp2>. Si el contador es inferior o igual al valor final <exp2>, volverán a ejecutarse las instrucciones que siguen a la cláusula FOR.

Si el contador es mayor que el valor final <exp2>, la ejecución del programa bifurca fuera del bucle FOR ... ENDFOR y continua en la siguiente línea después de ENDFOR o NEXT.

Precauciones:

  • Los valores de <exp1>, <exp2> y <exp3> se leen únicamente al inicio.

  • Si cambias el valor del contador <var> dentro del bucle, afectaras  al numero de veces que se ejecuta el bucle.

  • Si el valor de <exp3> es negativo y el valor inicial <exp1> es mayor que el valor final <exp2>, el contador disminuirá cada vez que pase el bucle.

<var> es una variable o un elemento de matriz que actúa como contador, que no es necesario que exista antes de ejecutar FOR ... ENDFOR.

<exp1> es el valor inicial del contador y <exp2> es el valor final.

<exp3> es la cantidad de incremento o decremento (si es negativa) del contador. Si se omite el contador se incrementar  en 1.

<comandos> son los comandos FoxPRO a ejecutar.

EXIT transfiere el control desde dentro del bucle FOR ... ENDFOR al comando que sigue inmediatamente a la palabra clave ENDFOR. Puede situar EXIT en cualquier parte entre FOR y ENDFOR.

LOOP puede situarse en cualquier parte entre FOR y ENDFOR. La inclusión de LOOP devolverá el control directamente a la cláusula FOR sin ejecutar las instrucciones que haya entre LOOP y ENDFOR. El contador se incrementará o decrementará como si se hubiera llegado a ENDFOR.

Ejemplo 1: Mostrar todos los numero del 1 al 20.

FOR i=1 TO 20

? i

ENDFOR

Ejemplo 2: Mostrar los números pares hasta el 10 en forma descendente. Toma los valores desde variables

A= 10

B= 1

C= - 2

FOR i=A TO B STEP C

? i

ENDFOR

Ejemplo 3: Mostrar el cubo de los impares hasta el 10 en forma ascendente.

FOR n=1 TO 10 STEP 2

? n^3

ENDFOR

Capitulo 7

CONTROL SAY/GET

@ <fila>,<columna> [SAY <exp>] [GET <var>/<campo>] [FUNC <formato> / PICT <formato>] [DEFA <exp>] [MESS <exp>] [Size 1,n] [RANGE <min,max>] [VALID <cond> [ERROR <exp> ] ] [WHEN <cond>] [COLOR <pares>]

SAY visualiza la expresión en las coordenadas indicadas

GET asigna a la variable o campo el valor tecleado

La lectura se hace cuando se encuentra el comando READ.

FUNCTION/ PICTURE <formato>

Con <formato> se define el formato de presentación según la tabla siguiente.

Códigos Function:

A

Solo caracteres alfabéticos, no espacios ni símbolos

B

Justifica los números a la izquierda

D

Usa el formato de fecha activo según SET DATE

E

Usa el formato de fecha BRITISH

I

Centra texto

J

Justifica texto a la derecha

K

Selecciona para edición un campo entero cuando el cursor se desplaza al campo.

L

Muestra ceros a la izquierda. Solo para números

M

<list>

Crea múltiples opciones predefinidas. La lista es un conjunto de elementos delimitados por comas. Los elementos individuales que aparecen dentro de la lista no pueden tener comas incrustadas. Si <var> o <campo> no contiene inicialmente uno de los elementos de la lista cuando se emite READ, se mostrará el primer elemento de la lista. Para desplazarse por la lista, presione la barra espaciadora o escriba la primera letra de un elemento. Para elegir uno de los elementos y desplazarse al siguiente control, presione <Enter> . Sólo puede usarse con datos alfanuméricos.

R

Muestra una mascara que no será grabada

S<n>

Limita el ancho a n caracteres, aunque puedes poner mas.

T

Elimina los espacios en blanco iniciales y finales.

X

Cualquier carácter

Z

Presenta blanco en lugar de cero. Solo para números

!

Convierte a mayúsculas. Solo para caracteres

,

Muestra datos numéricos usando notación científica. Solo puede usarse con datos numéricos.

$

Muestra datos en formato de moneda. El símbolo de moneda aparece antes o después del valor dependiendo de SET CURRENCY. Si CURRENCY esta en LEFT no podrá usarse el código de función $. Solo para números.

Códigos Picture:

A

Solo permite caracteres alfabéticos

L

Solo permite datos lógicos

N

Solo permite letras o dígitos

X

Permite cualquier carácter

Y

Solo permite valores lógicos "Y", "y", "N" y "n".

!

Convierte a mayúsculas. Solo caracteres

9

Solo permite dígitos o signos

#

Solo permite dígitos, blanco o signo

*

Muestra asteriscos a la izquierda de números.

.

Separador decimal

,

Separador de miles

$

Muestra el símbolo de moneda especificado por SET CURRENCY. Como opción predeterminada, el símbolo se sita inmediatamente antes o después del campo. Sin embargo, es posible cambiar el símbolo de moneda y su ubicación (SET CURRENCY), el carácter separador (SET SEPARATOR) y el carácter decimal (SET POINT).

Las expresiones de FUNCTION pueden ser introducidas en PICTURE con un símbolo @. Se puede poner varias condiciones solo hay que separarlas por ;

DEFAULT <Exp>

Si no existe esta cláusula deberá ser definida previamente la variable usada en el GET u obtendrás un error. En caso de ya existir la variable, esta cláusula es ignorada.

MESSAGE <Exp>

Muestra <Exp> como un mensaje sobre la línea 24. Este mensaje podría ser presentado en otra línea con SET MESS TO

SIZE <1>,<n>

Con <n> puedes manejar el ancho (# de columnas) de <var>/<campo>. Si no usas esta cláusula el ancho lo determina la cláusula PICTURE. Si tampoco se uso esta cláusula el ancho queda definido por el contenido actual de la variable o campo. Solo en FoxPRO para Windows será posible también definir el alto (# de filas).

RANGE <min>,<max>

Solo se usa para datos numéricos o de tipo fecha y es el rango en el cual deberá estar contenido el dato. Esta condición solo se evalúa cuando se cambia de valor y no cuando solo aceptas el valor inicial vía <Enter>. En caso de error se presenta un mensaje de error indicando el rango valido impidiendo que se abandone el GET. Es decir es una post-condicion.

VALID <Cond>

Es una Post-condicion es decir que una vez ingresado un valor y se intente salir del GET se evaluara <Cond>. Si esta es verdadera, permitirá la salida, pero si es falsa se devuelve un mensaje de error estándar o la <Exp> de la cláusula ERROR impidiendo que se abandone el GET. Nota que se puede salir del GET con <Esc>, pero no aceptara el cambio.

Es posible devolver un numero en lugar de un valor lógico, si es 0 el curso no avanzara, quedándose en el mismo objeto, si el numero es positivo avanzara y si es negativo retrocederá según el numero.

ERROR <Exp>

Si se añade esta cláusula junto con VALID se mostrara <Exp> en lugar del mensaje estándar de FoxPRO.

WHEN <Cond>

Solo permitirá editar la <var>/<campo> si <Cond> es verdadera antes de entrar a dicho GET. Es decir es una pre-condicion.

COLOR

Permite determinar una serie de pares de color, que afectan a diversas partes según la siguiente tabla:

Colores

Atributos

N

Negro

0

+

Mas intenso primer plano

W

Blanco

7

*

Aclarar color de fondo

R

Rojo

4

G

Verde

2

Monocromáticos

B

Azul

1

N

Negro

RB

Magenta

5

W

Blanco

BR

Cyan

3

U

Subrayado

GR

Marrón

6

I

Vídeo inverso

GR+

Amarillo

6+

+

Mas intenso primer plano

X

Invisible

*

Parpadeante

Pares de color

1

Expresión de SAY

2

Región de edición del GET

5

Texto de mensaje

Ejemplos: Los cuatro siguientes ejemplo ponen Nombre en color rojo con fondo azul y un campo para el GET azul intenso sobre rojo.

@ 5,5 SAY `Nombre:' GET xNOM COLO R/B,B+/R

@ 5,5 SAY `Nombre:' GET xNOM COLO 4/B,1+/R

@ 5,5 SAY `Nombre:' GET xNOM COLO 4/1,1+/4

Capitulo 8

@ <f1,c1> [CLEAR / CLEAR TO <f2,c2>]

Limpia parte de la pantalla, desde la esquina superior izquierda definida con <f1,c1>.

Si se emite solo @ <f1,c1> se limpia solamente la fila hasta el final, es decir desde: <f1,c1> hasta <f1,79>.

Si se emite solo @ <f1,c1> CLEAR se limpia un rectángulo compuesto por la esquina superior izquierda en <f1,c1> y la esquina inferior derecha en <24,79>

Si se emite la cláusula completa ósea: @ <f1,c1> CLEAR TO <f2,c2> se limpiara un rectángulo con la esquina superior izquierda en <f1,c1> y la esquina inferior derecha en <f2,c2>.

@ <f1,c1> TO <f2,c2> [DOUBLE / PANEL / <Exp>] [COLOR <par>]

Dibuja una línea o rectángulo en la pantalla entre las coordenadas especificadas.

Si unamos la cláusula DOUBLE se dibuja un rectángulo de línea doble, con PANEL se dibuja un rectángulo de línea grueso y con <Exp> se puede definir el carácter que se quiere usar.

@ <f1,c1,f2,c2> BOX [<lista>]

Construye una caja entre las coordenadas indicadas y con los códigos ASCII indicados en la <lista> en orden horario, ósea en el siguiente orden:

#

Descripción

1

Esquina superior izquierda

2

Línea horizontal superior

3

Esquina superior derecha

4

Línea vertical derecha

5

Esquina inferior derecha

6

Línea horizontal inferior

7

Esquina inferior izquierda

8

Línea vertical izquierda

9

Carácter de relleno

Capitulo 9

Funciones

1. Caracteres

ALLTRIM()

Suprime los espacios blancos antes y después de la cadena.

ASC(exp)

Retorna el código ASCII del carácter mas a la izquierda de <exp>

AT(<Exp1>, <Exp2> [, <N>])

Devuelve un numero que corresponde a la posición que ocupa el primer carácter de Exp2 dentro de Exp1, contando desde el carácter más a la izquierda. Si la expresión de carácter no se encuentra, se devuelve 0.

La búsqueda distingue mayúsculas de minúsculas.

Si se incluye N, se buscará la N ava ocurrencia de Exp2 dentro de Exp1. De forma predeterminada, se busca la primera ocurrencia.

cadena='Esta es la hora de los hombres buenos'

cad_búsq='es la'

? AT(cad_búsq,cadena)

cadena='ABABAB'

cad_búsq='AB'

? AT(cad_búsq,cadena,2)

cad_búsq='ES'

? AT(cad_búsq,cadena)

USE partes

cadena='Tuerca'

LIST ALL códpart,descripc FOR AT(cadena,descrip) > 0

ATC(ExpC1,ExpC2)

Muestra la posición de una subcadera ExpC1 en otra cadena ExpC2.

ATCLINE()

Muestra el numero de línea del primer carácter de una subcadena en una cadena. No es sensible a mayúsculas / minúsculas.

ATLINE()

Muestra el numero de línea del primer carácter de una subcadena en una cadena.

CHR(n)

Carácter que corresponde al numero ASCII n

COL()

Devuelve el numero de la columna donde se encuentra el cursor.

@ 5,10 SAY `A'

? COL() --> 10

EMPTY(Exp)

Determina si Exp esta vacía o blanco

LEFT(<Exp>, <N>)

Extrae los N caracteres más a la izquierda de la cadena Exp.

Si N es mayor que la longitud de ExpC, se devolverán todos los caracteres de la expresión. Si N es negativa o 0, se devolverá la cadena nula.

? LEFT('Redmond, WA', 7)

LEN(<exp>)

Nos devuelve la longitud de la cadena <exp>

LTRIM()

Elimina espacios a la izquierda de la cadena <exp>

LOWER(<Exp>)

Convierte la cadena Exp en minúsculas.

nombre='FOX'

? LOWER(nombre)

ISLOWER(<exp>)

Devuelve .T. si el primer carácter de <exp> es una letra minúscula.

ISUPPER(<exp>)

Devuelve .T. si el primer carácter de <exp> es una letra mayúscula.

INLIST()

Determina si una cadena esta o no en una lista del mismo tipo

OCCURS()

Retorna el numero de veces que una cadena esta dentro de otra.

PADL(<Exp>, <N> [, <C>])

PADR(<Exp>, <N> [, <C>])

PADC(<Exp>, <N> [, <C>])

Devuelve Exp (que puede ser cadena, numero o fecha) rellenándola por la izquierda (PADL), la derecha (PADR), o por ambos lados (PADC) hasta llegar a la longitud especificada por N.

C es usado para el relleno. Si se omite se usan espacios.

cadena='Titulo'

? PADL(cadena, 40, '=')

? PADR(cadena, 40, '=')

? PADC(cadena, 40, '=')

RAT()

Busca la ultima ocurrencia de una cadena en otra o en un campo MEMO

REPLICATE(<exp>,n)

Repite n veces la cadena

RIGHT(<Exp>, <n>)

Extrae los n caracteres más a la derecha de la cadena Exp.

Si N es mayor que la longitud de ExpC, se devolverán todos los caracteres de la expresión. Si N es negativa o 0, se devolverá la cadena nula.

? RIGHT('Redmond, WA', 2)

ROW()

Devuelve la fila actual en que se encuentra el cursor actualmente

STR(<n> [, <n1> [, <n2>]])

Convierte el numero n en una cadena de caracteres. Por omisión será de 10 caracteres de ancho o si se especifica una longitud de n1 caracteres y con n2 el número de lugares decimales. Si se especifica una longitud mayor que el numero de dígitos la cadera tendrá espacios en blanco antes del numérica con espacios al principio si especifica una longitud mayor que el número de a la izquierda de la coma decimal.

SPACE(n)

Devuelve una cadena de n espacios

SUBSTR(<Exp>, <n1> [, <n2>])

Extrae de la cadena Exp comenzando en la posición especificada por n1 y continuando por tantos caracteres como especifiques en n2.

El primer carácter de ExpC es la posición 1. Si se omite N2, los caracteres se extraerán hasta llegar al final de la cadena.

micadena='abcdefghijklm'

? SUBSTR(micadena, 1, 5)

? SUBSTR(micadena, 6)

STR(<exp>,n1,n2)

Convierte a formato de cadena un numero <exp> con una longitud n1 y una cantidad de decimales n2

STUFF(<exp1>,n1,n2,<exp2>)

Reemplaza desde la posición n1 de <exp1>, n2 posiciones usando <exp2>

a=`José'

b=`Antonio'

? STUFF(a,2,5,b) --> JAnton

STRTRAN()

Busca una cadena sobre otra, y reemplaza esta con una tercera expresión

TRANSFORM(<n>, <formato>)

Formatea el numero n usando el códigos de PICTURE y FUNCTION.

precio=15.89

? TRANS(Precio, '$$$$.99')

UPPER(<Exp>)

Convierte la cadena Exp en mayúsculas.

? UPPER('abcdefgh')

2. Numéricas

ABS(n)

Muestra el valor absoluto del numero n

BETWEEN(<Exp1>, <Exp2>, <Exp3>)

Determina si el valor de Exp1 (que puede ser caracteres, números o fechas) cae dentro de los valores de otras dos expresiones del mismo tipo.

Se devuelve verdadero (.T.) si Exp1 es mayor o igual que Exp2 y menor o igual que Exp3; en caso contrario se devuelve falso (.F.).

CLOSE DATABASES

USE facturas

SCAN FOR BETWEEN(códfac,1250,1260 )

? 'Impfac de ' + ALLTRIM(STR(códfac)) + ' es ' + ;

ALLTRIM(STR(impfac))

ENDSCAN

CEILING(<N>)

Devuelve el entero más próximo que es mayor o igual que la expresión numérica especificada. Es decir redondea un los números positivos con parte fraccional hasta el próximo entero mayor y los número negativo con una parte fraccional hasta la parte entera del número.

núm1=10.1

núm2=-10.9

núm3=10

núm4=-10

? CEILING(núm1)

? CEILING(núm2)

? CEILING(núm3)

? CEILING(núm4)

EXP(n)

Muestra e a la potencia n

FLOOR(<expN>)

Devuelve el entero más próximo que sea menor o igual que la expresión numérica especificada. Es decir redondea un número positivo con parte decimal reduciéndolo a la parte entera del número y redondea un número negativo con parte fraccional reduciéndolo al siguiente entero inferior.

núm1=10.1

núm2=-10.9

núm3=10

núm4=-10

? FLOOR(núm1)

? FLOOR(núm2)

? FLOOR(núm3)

? FLOOR(núm4)

WAIT WIND STR(FLOOR(núm1+núm3)) NOWA

@ 5,0 SAY FLOOR (18.1)

INT(<n>)

Devuelve la parte entera de una expresión numérica.

? INT(12.5)

? INT(6.25 * 2)

? INT(-12.5)

número=-12.5

? INT(número)

LOG(n)

Devuelve el logaritmo natural (base e) de <n>. Solo admite valore mayores que cero.

LOG10(n)

Muestra el logaritmo común (base 10) de <n>.

MAX(<Expr1>, <Expr2> [, <Expr3> ...])

Evalúa un conjunto de expresiones y devuelve la expresión con el mayor valor ASCII o numérico o la fecha más reciente de una lista de expresiones alfanuméricas, numéricas o de fecha. Todas las expresiones deben ser del mismo tipo (caracteres, números o fechas).

? MAX(54, 39, 40)

? MAX(2^8, 10*12, PI())

? MAX({14-07-98},DATE())

MIN(<expr1>, <expr2> [, <expr3> ...])

Evalúa un conjunto de expresiones y devuelve la expresión con el menor valor ASCII o numérico o la fecha más antigua de una lista de expresiones alfanuméricas, numéricas o de fecha. Todas las expresiones deben ser del mismo tipo (caracteres, números o fechas).

? MIN(54, 39, 40)

? MIN(2^8, 10*12, PI())

? MIN({14-07-55},DATE())

? MIN('a','abc')

? MIN('a','XYZ')

MOD(<N1>, <N2>)

Divide una expresión numérica por otra expresión numérica y devuelve el resto.

? MOD(36, 10)

? MOD(4*9, 90/9)

? MOD(25.250, 5.0)

ROUND(<Exp>, <N>)

Devuelve una expresión numérica redondeada a un número especificado de lugares decimales. SET DECIMALS se ignora.

Si N es negativo, se devuelve un número entero que contiene N ceros a la izquierda del separador decimal. Por ejemplo, si N es -2, los dígitos de las decenas y centenas serán cero.

SET DECIMALS TO 4

SET FIXED ON

? ROUND(1234.1962, 3)

? ROUND(1234.1962, 2)

? ROUND(1234.1962, 0)

? ROUND(1234.1962, -1)

? ROUND(1234.1962, -2)

? ROUND(1234.1962, -3)

SET FIXED OFF

SET DECIMALS TO 2

SQRT(n)

Raíz cuadrada del numero n

VAL(n)

Convierte una cadena en numero

SIN(n) --> Seno del ángulo n en radianes

COS(n) --> Coseno del ángulo n en radianes

TAN(n) --> Tangente del ángulo n en radianes

ASIN (n) --> Calcula el ángulo en radianes del arco cuyo seno es n

ACOS(n) --> Calcula el ángulo en radianes del arco cuyo coseno es n

ATAN(n) --> Calcula el ángulo en radianes del arco cuyo tangente es n

ATN2() -->

DTOR(n) --> Convierte grados a radianes

RTOD(n) --> Convierte radianes a grados

PI() --> 3.14159

SIGN(n) --> Devuelve -1 si n es negativo, 1 si es positivo o 0

FV()

PV()

PAYMENT()

3. Fechas

DATE() --> Muestra la fecha del sistema

TIME() --> Muestra la hora del sistema

SECONDS() --> Muestra los segundos transcurridos desde medianoche

DAY(Fecha) --> Muestra el numero del día de la fecha

DOW(fecha) --> Muestra el día de la semana (1=domingo)

CDOW(Fecha) --> Muestra el día de la semana en palabras

MONTH(Fecha) --> Muestra el numero del mes de la fecha

CMONTH(Fecha) --> Muestra el mes en palabras

YEAR(Fecha) --> Muestra el año de la fecha

DMY(Fecha) --> Convierte fecha en cadena formato dd mes aa

DTOC(Fecha) --> Convierte fecha en cadena formato dd-mm-aa

DTOS(Fecha) --> Convierte fecha en cadena formato aaaammdd

CTOD(Exp) --> Convierte cadena en fecha

GOMONTH() --> Retorna el día que es unos meses antes o después de cierta fecha.

4. Otros

TYPE(var) --> Muestra el tipo de dato de Var (numérico, carácter, lógico, fecha, memo, indefinido)

DISKSPACE(<Exp>)

Devuelve el espacio libre en bytes, que queda en la unidad especificada.

FILE(<archivo>)

Devuelve .T. o .F. dependiendo de que exista o el archivo indicado.

GETENV(<exp>)

Captura el valor actual de una variable DOS.

ISCOLOR()

Devuelve .T. si nuestra PC tiene monitor a color.

PCOL()

Devuelve el numero de la columna en que esta detenido el cabezal de la impresora.

PROW()

Devuelve el numero de la fila en que esta detenido el cabezal de la impresora.

RAND([<n>])

Devuelve un número aleatorio entre 0 y 1.

Por omisión se usa en valor semilla 100001, pero n permite especificar el valor semilla a usar con la función.

Si especificas un valor positivo para n en la primera función RAND() que emita y ninguno en las subsecuentes, devuelve siempre la misma secuencia de números aleatorios.

Si n es negativo en la primera función RAND() que emita, se creará un valor semilla a partir del reloj del sistema que es una serie más aleatoria.

Ejemplos:

1. Generar el número aleatorio semilla (hacer esto únicamente una vez) y muestra números aleatorios distribuidos uniformemente entre 0 y 1.

= RAND(-1)

FOR i=1 TO 100

? RAND()

ENDFOR

2. Genera números reales distribuidos uniformemente entre a y b

FOR i=1 TO 100

? (b-a)*RAND()+a

ENDFOR

3. Genera números entero distribuido uniformemente entre a y b

FOR i=1 TO 100

? INT((b-a+1)*RAND()+a)

ENDFOR

4. Función que devuelve un valor que simula el lanzamiento de un par de dados. Requiere la función `aleaent'. Esto no es lo mismo que 'aleaent(12)' que tiene una distribución de probabilidad bastante distinta.

FUNC dados

RETURN aleaent(1,6)+aleaent(1,6)

5. Devuelve un número aleatorio de n dígitos. Requiere la función `aleaent'

FUNC dígitos

PARA n

y = aleaent(0, 10^n -1) + 10^n

RETURN SUBS(STR(y,n+1),2)

6. Generar valores distribuidos exponencialmente de media 'a'

a=10

FOR i=1 TO 100

? -a*LOG(RAND())

ENDFOR

7. Función para devolver un valor distribuido normalmente con media 'm' y desviación estándar 'std'. Requiere la subrutina 'x_p'. Su error es < (4.5E-4 * std)

FUNC ndist

PARA m, std

x = x_p(RAND())

RETURN x * std + m

FUNC x_p

PARA p

IF p < 0 .OR. p > 1

RETURN 0

ENDIF

IF p < .5

adjust = .T.

ELSE

p = 1 - p

adjust = .F.

ENDIF

t = SQRT(LOG(1/(p*p)))

x = t -((t * 0.010328 + 0.802853) ;

* t + 2.515517) ;

/ (((t * 0.001308 + 0.189269) ;

* t + 1.432788) * t + 1)

RETURN IIF(adjust, -x, x)

8. Función que devuelve la zona bajo la curva normal con media 'm' y desviación estándar 'Std' desde -infinito a x. Su error es < (7.5E-8 * Std)

FUNC normal

PARA x, m, std

RETURN p((x-m)/std)

FUNC p

PARA x

IF x < 0

ajuste = .T.

x = -x

ELSE

ajuste = .F.

ENDIF

t = 1 / (1 + 0.2316419 * x)

poli = ((((1.330274429 ;

* t - 1.821255978) ;

* t + 1.781477937) ;

* t - 0.356563782) ;

* t + 0.319381530) * t

res = 1 - 0.398942280401432678 ;

* EXP(-x*x/2) * poli

RETURN IIF(ajuste, 1-res, res)

SYS(n)

Devuelve una cadena de caracteres con la información de la función correspondiente a n.

n

0

Nombre y numero del PC en la red LAN

1

Fecha del sistema en juliano

2

Segundos transcurridos desde medianoche

3

Función aleatoria para producir nombres

5

Disco por emisión

12

Memoria RAM libre

TYPE()

Devuelve el tipo de expresión: Cadena Numérico, Date, Lógico, Memo o una U si es indeterminado.

a=`Hola como estas'

? TYPE(`a')

UPDATE()

Devuelve .T. cuando el ultimo READ ha cambiado de datos en sus GETs asociados.

Capitulo 9

Ejemplo 1: Crear una matriz de 60 elementos que contenga los resultados de las tablas de multiplicar del 1 al 5.

CLEAR

DIME tabla(12,5)

FOR f=1 TO 12

FOR c=1 TO 5

tabla(f,c)=f*c

ENDFOR

ENDFOR

O también:

CLEAR

DIME tabla(12,5)

f=1

c=1

DO WHILE f<=12

DO WHILE c<=5

tabla(f,c)=f*c

c=c+1

ENDDO

f=f+1

ENDDO

Ejemplo 2: Mostrar en pantalla el resultado de la función: a2+3a-4 para valores de la variable a entre 5 y 12

CLEAR

FOR a=5 TO 12

? a^2+3*a-4

ENDFOR

También puedes hacer:

a=5

DO WHILE a<=12

? a^2+3*a-4

a=a+1

ENDDO

Ejemplo 3: Mostrar en bloques de solo una pantalla a la vez, los resultados de la función: x2+x para valores de x del 1 al 100.

CLEAR

y=1

FOR x=1 TO 100

? x^(2+x)

IF y>20

WAIT

CLEAR

y=1

ELSE

y=y+1

ENDIF

ENDFOR

Ejemplo 4: Mostrar los cuadrados de los 10 primeros números.

xNum=1

DO WHILE xNum<=10

? `El cuadrado de ',xNum,' es ',xNum^2

xNum=xNum+1

ENDDO

O también:

xNum=1

DO WHILE .T.

? `El cuadrado de ',xNum,' es ',xNum^2

IF xNum=10

EXIT

ENDIF

xNum=xNum+1

ENDDO

Ejemplo 5: Mostrar los cuadrados de los 10 primeros números impares.

FOR xNum=1 TO 19 STEP 2

? `El cuadrado de ',xNum,' es ',xNum^2

ENDDO

O también:

xNum=1

DO WHILE xNum<20

? `El cuadrado de ',xNum PICT `99',' es ',xNum^2

xNum=xNum+2

ENDDO

Ejemplo 6: Mostrar el resultado de la función 2a2+3 para los números impares y de la función 3a2+2 para los pares, para valores de a entre 1 y 10.

FOR a=1 TO 10 STEP 2

? `Para ',a PICT `99',' la función es',2*a^2+3

? `Para ',a+1 PICT `99',' la función es',3*a^2+2

ENDFOR

Ejemplo 7: Mostrar los números cuyo resultado de la función x2-2x este entre 50 y 100

x=1

DO WHILE x<100

IF x^2-2*x>=50 .AND. x^2-2*x<=100

? `El numero ',x,' cumple la condición'

ENDIF

ENDDO

Ejemplo 8: Buscar si existe algún valor de x entero entre -100 y 100 que cumpla la siguiente ecuación x2-2x+10=0

FOR x=-100 TO 100

IF x^2-2*x+10=0

? `El numero ',x,' cumple la ecuación'

ENDIF

ENDFOR

Capitulo 10

Problemas propuestos 1º practica:

  • Mostrar en bloques de una sola pantalla los resultados de la función 3X2+7 para valores entre 0 y 100

  • Determinar y mostrar los 20 primeros numero de la serie: 1/2, 1/5, 1/8... (como fracción) y luego la suma total de ellos.

  • Determinar los valores de x para los que la función X2+4x-8 tiene valores entre 50 y 100, mostrando de color rojo los negativos y de color verde los positivos.

  • Crear un programa que dada una edad valida (mayor a cero) y sexo de una persona, responda con alguna de las siguientes palabras: BEBE, NIÑO o NIÑA, JOVEN, ADULTO o ADULTA, TIO o TIA, ABUELO o ABUELA, según el caso: Inventa tus propios rangos de edad para cada palabra, pero toma en cuenta el sexo.

  • Crear un programa que dada una nota valida (entre 0 y 20) de cierto alumno, responda con alguna de las siguientes palabras: EXCELENTE, MUY BUENO, BUENO, REGULAR, MALO, MUY MALO o PESIMO, según el caso. Inventa tus propios rangos de notas para cada palabra. La nota puede ser con decimales.

  • Crear un programa que luego de pedirte tu fecha de nacimiento determine el signo del zodiaco (Aries, Tauro, Géminis, Cansen, Leo, Virgo, Libra, Escorpio, Sagitario, Capricornio, Acuario o Piscis) a que perteneces y el grupo (Tierra, Fuego, Aire o Agua) al que pertenece dicho signo. Je: Aries 21-03 al 22-04

  • Crear un programa que realice una animación de una cadena de caracteres en la pantalla (la desplace hacia un lado por ejemplo). Toma en cuenta que la pantalla es 25 x 80

  • Crear un programa que devuelva el elemento mayor / menor de una matriz de n1 x n2 elementos.

  • Crear un programa que almacene una matriz en un archivo y luego la pueda recuperar a voluntad nuevamente.

  • Crear una matriz de n x n la cual deberá tener el numero 1 en cada una de sus diagonales y cero en los demás elementos y luego mostrar dicha matriz en pantalla, haciendo que los números 0 sean de color negro y los números 1 de color rojo.

  • Crear un programa que dado un sueldo base desde la ventana de comando, determine el aumento en %, aumento neto y nuevo sueldo según la siguiente tabla:

  • Hasta 200

    25%

    entre 201 y 500

    20%

    entre 501 y 800

    15%

    entre 801 y 1000

    10%

    mas de 1000

    5%

  • Crear un programa que determine los factores de cada uno de los números entre 10 y 20 inclusive.

  • Crear un programa que halle los números primos que hay entre los números 10 y 25 inclusive.

  • Crear un programa que dado un numero, examine si se trata de un numero primo, de ser cierto expresarlo, de lo contrario mostrar en orden descendente todos sus factores.

  • Crear un programa que halle los primeros 30 números capicúa. Nota: Un numero capicúa es el que se puede leer igual de derecha a izquierda o viceversa. Ejemplos: 11, 44, 101, 838, 5445, 12321, 981189 etc...

  • Hallar todos los factores primos de cada uno de los numero entre 12 y 25.

  • Crear un programa que basado en dos variables que se creen desde la ventana de comandos, una con el monto a cobrar y la otra con el monto de dinero entregado al cajero, determine el vuelto en soles y el numero de monedas y billetes que deberá entregar. Considerar billetes de 200, 100, 50, 20 y 10, monedas de 5, 2, 1, 0.50, 0.20 y 0.10

  • Problemas propuestos 2º practica:

  • Crear un programa que pida ingresar la producción correspondiente a cada uno de los 12 meses del año y luego determine el mes de máxima y mínima producción, indicando el nombre del mes y su producción.

  • Crear un programa que luego de solicitar se ingrese la venta de cada mes del año en números relativos entre 0 y 100, los muestre ordenadamente de forma ascendente (o descendente).

  • Crear un programa que permita elegir una forma entre: triángulo, rectángulo y circulo, luego pregunte si se quiere el arrea y/o perímetro y según dichas respuestas pregunte por los datos pertinentes (base y altura, lados o radio) y de las respuestas solicitadas.

  • Crear un programa que solicite se ingrese los valores a cada uno de los 9 elementos de dos matrices 3 x 3, luego las sume (reste, multiplique o divida) y muestre la matriz resultante en pantalla.

  • Crear un programa que después de preguntar el tamaño de una matriz (a x b) y la operación que se quiera hacer (suma o resta), pida se ingrese cada elemento de ambas matrices y luego muestre el resultado (de sumar o restar) en pantalla.

  • Crear un programa que convierta metros a pies, kilos a libras y litros en galones y viceversa.

  • Crear un programa que después de pedir se ingrese un numero de tres dígitos sin decimales, calcule y muestre dicho numero en binario, octal y hexadecimal.

  • Crear un programa que permita ingresar los últimos dos dígitos del año y su producción total en Kg, de un cierto numero de años (el cliente ingresara la cantidad de datos que desee) y luego se ordene en orden ascendente (o descendente) dicha producción. Ojo no impongas ningún limite al numero de datos deja eso completamente libre.

  • Bibliografía:

    Programación en base a eventos

    - Cesar A. Bustamante Gutiérrez - UNI

    FoxPRO 2.6 para DOS y Windows a su alcance

    - José Javier García Badell - McGraw Hill

    Programación básica con FoxPRO

    - Ramón M. Chordá - Rama

    Al día en una hora en FoxPRO 2.6

    - José Carlos Corrales - Anaya Multimedia

    Guía practica FoxPRO 2.6

    - Alejandro Domínguez - Anaya Multimedia

    Diseño de programas: 200 algoritmos y un proyectos

    - Julio Vasquez Paragulla - Editorial San Marcos

    Microsoft FoxPRO for DOS and Windows, lenguage reference

    - Microsoft Press

    Lenguaje de Programación 3 - FoxPRO 2.6 inicial

    - 44 -




    Descargar
    Enviado por:Jose Vidal
    Idioma: castellano
    País: España

    Te va a interesar