Documente Academic
Documente Profesional
Documente Cultură
DrawWidth = 1
' Ejes Y
For i = 0 To 100 Step 2
CurrentY = i
Line (-2, i)-(0, i), RGB(0, 0, 150)
INFORMÁTICA II
CurrentX = -14
CurrentY = i + 2
ForeColor = QBColor(2)
Print Format(i /20, "0.0")
ForeColor = QBColor(0)
End If
(Incluye parte de Informática III)
Line (150, i)-(152, i), RGB(0, 0, 150)
If i Mod 10 = 0 Then
PRELIMINAR Setiembre 2001
Line (150, i)-(153, i), RGB(0, 0, 150)
If i <> 0 And i <> 100 Then
DrawStyle = 2
Line (1, i)-(149, i), QBColor(7)
DrawStyle = 0
End If
CurrentX = 153
CurrentY = i + 2
ForeColor = QBColor(2) Ing. Juan Carlos Ansaldi
Print Format(i / 20, "0.0")
ForeColor = QBColor(0)
End If
Next i
' Eje X
For i = 0 To 150 Step 2
CurrentX = i
Line (i, -2)-(i, 0), RGB(0, 0, 150)
If i Mod 10 = 0 Or i = 0 Then
Line (i, -3)-(i, 0), RGB(0, 0, 150)
UADER
If i <> 0 And i <> 150 Then
DrawStyle = 2
Line (i, 1)-(i, 100), QBColor(7)
DrawStyle = 0
End If
CurrentY = -4
CurrentX = i - 3
Print i / 10
End If
Next i
ForeColor = QBColor(1)
CurrentY = -4: CurrentX = 155: Print "t [Seg]"
ForeColor = QBColor(0)
' Origen de Coordenadas (0;0) de las curvas a representar
Año 2001
Facultad de Ciencias y Tecnología
Informática II UADER
INDICE
Introducción
Veamos el siguiente problema cuyo enunciado es el siguiente:
Tenemos un mazo de cartas y deseamos encontrar el “ancho de espadas”. Cuál sería la “forma
lógica” de hacerlo?
Como estamos hablando de una forma lógica, tendríamos que describir una secuencia de pasos que
nos permita llegar al resultado deseado. Esto es lo que haremos a continuación:
1 Comenzar
2 Contar que haya 40 cartas en el mazo
3 Decidir si hay cartas a sacar
Si la respuesta es SI, ir a 4
Si la respuesta es NO, mostrar que no se encontró la carta e ir a 6.
4 Tomar una carta
5 Decidir si es el ancho de espadas
Si la respuesta es SI, mostrar la carta e ir a 6
Si la respuesta es NO, restar 1 a la cantidad de cartas e ir a 3
6 Fin
Lo que tenemos en los 6 pasos anteriores es la solución del problema en forma de un algoritmo, el
cual ha sido descrito de manera narrada que es una de las formas más antiguas y de más fácil
redacción, dado que no requiere mayor entrenamiento previo. Sin embargo, el lenguaje natural es
impreciso, y puede dar lugar a confusiones, sobre todo por la capacidad de síntesis y de
“organización mental” que pueda o no tener quien confecciona tal descripción.
Por lo tanto, hay otro tipo de herramienta que nos permite resolver el mismo problema pero ahora
en forma gráfica y que es el diagrama de flujo.
El diagrama de flujo o de lógica muestra a través de símbolos gráficos, el desarrollo lógico de un
algoritmo. Esta forma permite representar información y operaciones; y su visualización y
seguimiento con mayor facilidad.
A continuación se representa en la Figura 1 el algoritmo narrado en los seis pasos anteriores, por
medio de un diagrama de flujo.
A la derecha, encerrados entre círculos, se indican los pasos que corresponden, numerados del 1 al
6, a la “receta” narrada anteriormente.
Vemos que ahora nos independizamos de la características propias que tiene cada uno de nosotros
para expresar los pasos a seguir y “normalizamos” la representación por medio de símbolos
gráficos.
Otra manera de representación de un algoritmo, es por medio de pseudocódigo, que lo podríamos
definir como una descripción narrada normalizada, en la cual estaríamos utilizando siempre las
mismas palabras claves para representar las operaciones de acción y/o decisión.
Numero
2
de Cartas = 40
Hay más
cartas para
No sacar ?
4 Si
Tomar
una
No salió carta Numero de
el ancho Cartas <- Nro de
de espada Cartas - 1
No
Es el ancho
5 de
espadas ?
Si
Mostrar la
carta
6 Fin
Descripción narrada
Es una de las formas más antiguas y de más fácil redacción, dado que no requiere mayor
entrenamiento previo. Sin embargo, el lenguaje natural es impreciso, pues quien lo ejerce presume
que aquel que está capacitado para interpretar el sentido del texto que se transmite a través de la
narración y que en caso de duda, sabrá utilizar su capacidad de raciocinio y encontrar la magnitud
o el término preciso a aplicar.
La forma de descripción narrada, en razón de las imprecisiones señaladas en el párrafo anterior,
genera el peligro de mal interpretación o de omisión de información, todo lo cual concluye en
errores en el momento de la programación.
1- Lograr mayor claridad expositiva, principalmente cuando los algoritmos a los cuales representa
gráficamente poseen cierto grado de complejidad.
2- Habilitar al programador para desarrollar la solución de un problema en forma ordenada, paso a
paso, secuencialmente.
3- Trazar un plan para la instrucción de la computadora y para facilitar la comunicación de dicho
plan a las personas.
4- Disponer de un panorama total de la solución del problema que se intentó resolver.
5- Verificar si han sido completadas, al diseñar el diagrama, todas las alternativas de posible
presentación.
6- Posibilitar el análisis (prueba de escritorio) y detectar errores de lógica.
7- Servir de elemento fundamental de apoyo para efectuar la codificación de las instrucciones. Así
como un arquitecto diseña un plano antes de iniciar la construcción de un edificio, un programador
dibuja un diagrama de flujo antes de codificar las instrucciones de un programa.
8- Integrar la carpeta de documentación de programas para consultas en caso de modificaciones o
correcciones de los mismos.
Los bloques pueden representar acción o decisión. Los bloques de acción representan una
actividad: efectuar una operación aritmética entre dos números, convertir un valor en cero, etc.
Su descripción implica siempre un verbo (hacer algo): sumar, transferir, borrar, etc.
Un bloque de decisión es una forma de expresar una consulta acerca del cumplimiento o no de una
determinada condición o alternativa. Según sea la respuesta que se dé a dicha consulta (cierto o
falso) se seguirán diferentes caminos.
Un diagrama de flujo para programación se lee de arriba hacia abajo; sin embargo, esa dirección
puede alterarse cuando se representa una decisión, la que podría provocar un cambio en la
secuencia.
Proceso predefinido: representa un proceso que consiste en una o más operaciones o pasos de
programa que se especifican en otro lugar. Puede estar en la forma de procedimiento, función
definida por el usuario, subrutina, etc.
Operación Manual: representa cualquier proceso fuera de línea realizado a la velocidad del
operador.
Almacenamiento en línea: Representa una función de entrada / salida que utiliza información
almacenada que se encuentra bajo el control directo de la unidad de procesamiento.
Disco magnético: Representa una función de entrada salida en la cual el medio es un disco
magnético.
Operación auxiliar: Representa una operación fuera de línea, realizada con equipos que no se
encuentran bajo el control de la unidad de procesamiento central.
Proceso (Operación
Entrada Manua
Proceso Predefinido
(Procedimiento, función
subrutina)
Conecto
Operación manual
realizada fuera de líne
Proceso de Ordenamien
Almacenamiento en líne
Operación Auxilia
Figura 2 - Simbología para la diagramación
1. Todo problema se presenta a través de la exposición de un planteo. Leer todo el planteo, desde
el principio hasta el final.
2. Interpretar con precisión que es lo que se pretende como resultado: en cuanto a salidas impresas,
grabadas, etc. y en cuanto a procesamiento aritmético y lógico.
3. Detectar la existencia de omisiones o contradicciones notorias. Subsanar esas falencias.
4. Identificar todos los elementos que constituyen salidas.
5. Identificar todos los elementos que constituyen entradas (datos variables).
6. Identificar todos los elementos que constituyen datos fijos de entrada: aquellos que figuran
como constantes en el planteo del problema.
7. Identificar y analizar procedimientos y fórmulas a través de los cuales se intenta la
transformación de las variables y constantes intervinientes en el planteo en salidas.
8. Verificar que todos los elementos de salida sean obtenibles a partir de los registros de entrada o
de los archivos y de los datos fijos o constantes de entrada.
9. Ubicar el planteo del problema dentro del módulo correspondiente según el esquema
metodológico presentado en el texto, a fin de facilitar la elección del curso de acción a seguir para
alcanzar su resolución.
10. Definir si es necesario establecer uno o más campos en el almacenamiento interno para
utilizarlos como contadores y/o acumuladores.
11. Agrupar las funciones que se realizan por única ves al comienzo del proceso. Por ejemplo:
lectura de parámetros, puesta a cero de acumuladores y contadores, etc.
12. Agrupar las funciones que se realizan por única ves al final del proceso. Por ejemplo: calcular
totales finales, impresión de resultados, etc.
13. Agrupar las funciones que constituyen un ciclo principal, el o los elementos que establecen la
cantidad de veces que deberá ejecutarse.
14. Agrupar las funciones que constituyen ciclos secundarios, definiendo el o lo elementos que
establecen la cantidad de veces que deberán ejecutarse.
15. Ordenar las funciones de una secuencia lógica.
16. Verificar que todos los conectores o líneas de unión de símbolos se encuentran debidamente
sincronizados.
17. Efectuar la prueba de escritorio. Verificar que el diagrama realizado cumple con lo solicitado
en el planteo, utilizando para ello datos de prueba. Analizar cómo van evolucionando los
contadores y acumuladores a medida que se computan los datos de prueba.
18. Verificar que se han contemplado, en el desarrollo, todas las alternativas posibles de datos de
entrada, sin olvidar excepciones.
Prueba de Escritorio
Los puntos 17 y 18 de la metodología anterior, están basados en la prueba de escritorio.
Luego de finalizado el diagrama de flujo, existe una manera, sin utilizar la computadora, de
determinar si el mismo es correcto o si adolece de errores de lógica u omisión de alternativas de
posible representación, y que no fueron contempladas en el diagrama: la prueba de escritorio.
Esta prueba consiste en simular un proceso utilizando el diagrama formulado, sobre el cual se
aplican sucesivamente diferentes datos y comprobamos las transformaciones que se realizan sobre
ellos, verificando los resultados obtenidos.
1
Comienzo
menor
medio
mayor
iNro1<-
iNro2<-
iNro3<-
Fin
F
iNro1<iNro2?
V F
iNro2<iNro3?
F
iNro1<iNro3? menor<-iNro3
V medio<-iNor2
mayor<-iNro1
V menor<-iNro3
medio<-iNor1
mayor<-iNro2 1
1
F
F
iNro2<iNro3?
iNro1<iNro3?
menor<-iNro2
V menor<-iNro1 medio<-iNor3
medio<-iNor3 V mayor<-iNro1
mayor<-iNro2
menor<-iNro1 menor<-iNro2
medio<-iNor2 medio<-iNor1 1
mayor<-iNro3 mayor<-iNro3
1
Figura 3 - Diagrama de flujo del ejemplo
Los conectores 1 se han utilizado en el diagrama para obtener una presentación más
ordenada y menos confusa.
El diagrama de la figura 3, es una de las opciones de resolución al problema planteado. Veremos
ahora si funciona utilizando la denominada prueba de escritorio. Utilizaremos tres números
enteros 1, 2 y 3 y los probaremos en las 6 combinaciones posibles.
En este caso, la prueba de escritorio resulta muy sencilla, ya que a no existir variables intermedias,
ciclos ni operaciones, solamente se debe recorrer uno de los caminos posibles y comprobar la
salida.
Ejercicios
Realizar los algoritmos que nos permitan resolver los problemas planteados en los enunciados que
se dan a continuación. Realizar la prueba de escritorio para comprobar el funcionamiento del
algoritmo planteado.
1- Ingresar un número natural y clasificarlo como par o impar.
2- Ingresar veinte números naturales. Contar cuantos son pares, cuál es el mayor valor ingresado y
en que posición se ingreso.
3- Crear una tabla de conversión de grados Fahrenheit a grados Centígrados que incluya
temperaturas negativas.
4- Realizar un algoritmo que muestre todos los números divisibles comprendidos entre cero y un
número de tres cifras que se debe ingresar.
5- Escribir un algoritmo que calcule el factorial de un número. Evaluar posibles errores del
operador.
6- Ingresar un número natural y mostrar en forma creciente todos los anteriores a él.
7- Escribir un algoritmo que obtenga los números pares hasta el dos mil inclusive.
8- Escribir un algoritmo que muestre todos los números divisibles por trece entre cero y un número
de tres cifras a ingresar por el teclado.
9- Representar el algoritmo de Euclides por medio de un diagrama de flujo. Comprobarlo
realizando la prueba de escritorio para determinar el mcd(8069,5209) y el mcd(1651,2353).
Introducción
Desde los inicios de la informática a gran escala, cuando las primeras computadoras personales
ingresaron en la vida de las universidades, empresas y algunos hogares, el acceso a este mundo
estuvo vedado a la gran mayoría de la gente común. Hace poco más de 15 años comenzamos a ver
la aparición de computadoras de distintas marcas y tipos, Sinclair Spectrum, TK, TI-99,
Commodore y muchas otras, entre ellas la PC de IBM. De la mano de IBM llegó Microsoft, cuyo
sistema operativo Windows, corriendo sobre una PC, se ha transformado en el estándar indiscutido
del mercado. La combinación PC + Windows permitió el ingreso de la informática a todos los
hogares y escuelas, convirtiendo a un artículo de lujo en una necesidad.
Aún así, hasta hace pocos años, existió una clara división entre la gente que utilizaba una
computadora: Por un lado estaban los programadores, y por el otro, los usuarios; unos haciendo
programas que los otros utilizaban. La división fue clara desde el principio y el desarrollo de
aplicaciones estuvo siempre vedado a los usuarios, dado que siempre requirió una gran experiencia
y mucho tiempo de trabajo arduo.
Pero la historia volvió a cambiar, y lo hizo nuevamente de la mano de Microsoft. A comienzos de
los 90 apareció Visual Basic (desde ahora, VB), un nuevo tipo de lenguaje de programación. Se le
llamó Desarrollo Visual, o Ambiente de Desarrollo Visual para bautizar un estilo de programación
desconocido hasta entonces, consistente más que nada en arrastrar y soltar, configurar y... bueno sí,
también tipear algo de código. Inmediatamente esta nueva filosofía ganó adeptos, no sólo entre el
público sino en el mercado de herramientas de desarrollo, y así aparecieron varios Ambientes de
Desarrollo que emularon la fórmula del éxito.
Gracias a estas nuevas herramientas, cualquier persona sin experiencia en programación está en
condiciones de crear aplicaciones vistosas y potentes en cuestión de horas.
Desarrollo de aplicaciones en VB
Construir la primera aplicación en VB toma sólo unos minutos. El procedimiento para el desarrollo
de aplicaciones se resume siempre en estos tres pasos:
❏ Desarrollo de la interfase gráfica, casi siempre sólo arrastrando y soltando o “dibujando” con
el mouse. En esta etapa se incorporan los objetos (controles) que se utilizarán en la aplicación.
❏ Configuración de propiedades de los objetos, que definen su apariencia y comportamiento.
❏ Programación de los eventos de la aplicación, que le permiten a la interfase gráfica responder
al usuario y a otros tipos de sucesos.
Una vez concluido el desarrollo de la aplicación el último paso consiste en compilarla; el resultado
es esta operación es un archivo .EXE en el cual está contenido todo el programa. Este archivo
ejecutable, junto a muy pocos archivos auxiliares (DLL, OCX y otros) es lo que se debe distribuir
en caso de que se desee entregar la aplicación a otra persona.
Antes de continuar conviene aclarar algunos conceptos que se utilizan permanentemente y que
definen la filosofía de programación dentro de VB:
Controles: Los controles que se observan en la “caja de herramientas” son componentes que se
disponen sobre los formularios para diseñar la interfase de usuario y llevar a cabo las tareas
propias de la aplicación. Existen dos clases de controles: controles estándar y controles
personalizados. Los controles estándar proveen los servicios básicos que son utilizados
normalmente por cualquier aplicación; no pueden ser removidos de la caja de herramientas y se
dice que “pertenecen” al AD. Los controles personalizados se agregan al AD (incorporándolos a la
caja de herramientas) para realizar tareas más específicas y de cierta complejidad. Estos controles
son normalmente de formato ActiveX y se los puede ver almacenados en el disco rígido como
archivos con extensión .OCX. La posibilidad de los AD de utilizar objetos estándar de tipo
ActiveX que ofrecen una funcionalidad bien definida con sólo incorporarlos en un formulario es lo
que permite al desarrollador completar aplicaciones vistosas y potentes en cuestión de días.
Objetos: Todos los elementos que componen una aplicación de VB pueden ser vistos como
objetos. Esto es válido tanto para los formularios como para los controles estándar y
personalizados. Los objetos tienen una funcionalidad bien definida, pueden verse como “cajas
negras” que se comunican entre sí por medio de tres caminos o interfases: propiedades, métodos y
eventos.
Métodos: Los métodos sirven para “ordenarle” al objeto que ejecute determinadas tareas. Estos
“disparadores” sólo se utilizan en tiempo de ejecución y deben ser incluidos en la aplicación como
código Basic. Un método de uso frecuente en varios tipos de objetos es “SetFocus”; que transfiere
el foco a ese objeto:
Command1.SetFocus
Eventos: Los eventos son el camino utilizado por los objetos para notificar a la aplicación sobre la
ocurrencia de algún suceso en particular. Cualquier acción del usuario puede desencadenar un
Subrutinas y funciones: Las subrutinas y funciones, al igual que los eventos, son subtipos de una
categoría más global llamada procedimientos. Todo el código de una aplicación está contenido en
procedimientos; se dice también que se encuentra segmentado en procedimientos. Cada uno de
estos procedimientos se programa para realizar una tarea concreta de manera que cuando la
aplicación necesita ejecutar dicha tarea, lo que debe hacer es disparar el procedimiento correcto.
La estructura de los procedimientos está formada por dos instrucciones que identifican el
comienzo y el final del procedimiento y un conjunto de instrucciones contenidas entre las dos
primeras, que se denominan cuerpo del procedimiento. En el ejemplo de evento citado
anteriormente, las instrucciones de comienzo y final del procedimiento son las siguientes:
Private Sub Command1_Click()
End Sub
... en tanto que el cuerpo del procedimiento es la instrucción:
Beep
A continuación se explican las diferencias entre los tipos de procedimientos:
1. Crear la interfase
2. Configurar las propiedades
3. Escribir el código
Para ver cómo se hace esto, crearemos a continuación una aplicación sencilla: una calculadora
capaz de realizar las cuatro operaciones fundamentales sobre dos operandos. Durante el desarrollo
de este ejemplo se introducirán algunos conceptos adicionales que deberán ser tomados como guía
al desarrollar todo tipo de aplicaciones, sobre todo si son grandes o complejas.
1. Crear la Interfase
El primer paso para generar una aplicación de Visual Basic consiste en crear los formularios que
van a ser la base de la interfase de su aplicación. Puede usar formularios para agregar ventanas y
cuadros de diálogo a la aplicación.
Si se comienza desde la opción
de menú Archivo - Nuevo
Proyecto, se crea por defecto un
formulario vacío llamado
Form1. En caso de necesitar
más adelante formularios
adicionales, se los puede
incorporar utilizando la opción
de menú Proyecto – Agregar
Formulario o haciendo click
sobre el icono correspondiente
en la barra de herramientas.
Figura 6 -Formulario vacío en Visual Basic
Es posible observar los archivos que componen la aplicación en la ventana de proyecto: en ella
están listados todos los formularios y módulos incluidos en el proyecto (por el momento, sólo
existe el formulario principal):
Ahora está en condiciones de dibujar los objetos que van a componer la interfase en el formulario
que ha creado. Para esta primera aplicación, usará tres controles del cuadro de herramientas.
Incorpore dos cajas de texto, cuatro botones y una etiqueta al formulario para que aparezca como
se observa en la Figura 9:
La imagen del formulario que se muestra fue obtenida modificando las propiedades mencionadas
de acuerdo a la siguiente tabla:
Las propiedades Text y Caption pueden ser modificadas durante la ejecución de la aplicación
mediante instrucciones en código Basic. De hecho, la propiedad Caption de la etiqueta Label1 es la
que se utilizará en esta aplicación para mostrar el resultado de las operaciones matemáticas. La
sintaxis para acceder a las propiedades de los objetos desde el código es la siguiente:
NombreDeObjeto.NombreDePropiedad = NuevoValor
...en donde se observan los elementos que componen la instrucción (el punto actúa como un
separador de elementos):
En la figura de la ventana de propiedades se observa la propiedad Name; esta propiedad debe
modificarse siempre en todos los controles. Los nombres de los controles son únicos y no pueden
repetirse en la aplicación. VB le asigna a cada control un nombre por defecto asociado al tipo de
control, por ejemplo Form1, Form2 para los formularios o Command1, Command2 para los
botones, etc. Cuando el proyecto comienza a crecer estos nombres se tornan confusos y es difícil
determinar quién es quién.
Por lo tanto, cada vez que agregue un objeto a su aplicación, modifique su nombre en base a algún
criterio claro y fácil de entender.
Siguiendo el criterio de la sugerencia, los nombres de los controles incorporados en la aplicación
quedan como se indica en la tabla a continuación:
3. Escribir el Código
Si en este momento ejecutamos la aplicación, presionando el botón o F5 el programa comienza a
correr, con botones que, aún cuando no hacen nada, tienen la inteligencia suficiente para responder
al click del mouse hundiéndose y elevándose.
Para detener la aplicación presione la cruz de cerrar ventana o terminar en la barra de
herramientas.
❏ Caja de objetos: Muestra el nombre del objeto seleccionado. Haciendo click en la flecha a la
derecha de la caja se descuelga la lista de todos los objetos asociados al formulario.
❏ Caja de procedimientos: Lista todos los procedimientos de eventos disponibles para el objeto
seleccionado. En la figura el evento seleccionado es el evento Click. Todos los controles
brindan una gran cantidad de eventos de los cuales normalmente se utilizan pocos. En nuestro
caso, necesitamos que los botones sean sensibles al “Click” del usuario.
Como ya se aclaró con anterioridad, el código de una aplicación VB se divide en pequeños bloques
denominados procedimientos. Un procedimiento de evento, o sencillamente evento, como el que
Luego de llenar los cuatro eventos con el código correcto, guarde y ejecute la aplicación
presionando F5 o el botón Iniciar. Al momento de probarla, utilice números en las cajas de texto,
ya que si introduce texto que no pueda ser interpretado como números, el resultado probablemente
no será el esperado.
De hecho, el primer resultado “inesperado” que obtendrá está relacionado con la operación de
suma. Como puede observar, el operador de suma (+) interpreta que, dado que está trabajando con
datos de tipo string, intenta concatenarlos. La solución para este problema consiste en obtener el
valor numérico de la cadena de texto contenida en la propiedad Text de las cajas de texto; esto se
hace aplicándoles el operador Val(), a partir de lo cual pueden ser consideradas como números
válidos.
El programa que se acaba de realizar no es todavía todo lo bueno que puede ser. No posee la
inteligencia suficiente para darse cuenta de que no debe dividir en cero y tampoco se dá cuenta si
en lugar de números el usuario ingresó letras.
Ejercicios
Codificar los algoritmos realizados en el Trabajo Práctico anterior, generando aplicaciones en
Visual Basic.
Las variables en Visual Basic no necesitan ser declaradas, en el momento en que se precisan se
pueden incluir en el código. Sin embargo, puede ser útil el exigir la declaración de todas las
variables que aparezcan en el código, que es lo que nosostros haremos. Para ello, se utilizará la
instrucción:
Option Explicit
en la sección de declaraciones del formulario. Una vez procesada esta instrucción, no se permitirán
variables no declaradas. Para declarar una variable la instrucción adecuada es:
Dim Nombre_Variable [As Tipo]
Intrínsecas o definidas por el sistema, proporcionadas por Visual Basic o cualquier otra aplicación
que provee una librería de objetos. Para ver una lista de estas constantes, se accederá a
Ver/Examinador de Objetos. En la lista desplegable superior, se seleccionará VB-Objects and
Procedures. De la lista de la izquierda se hará doble clic en cualquier opción acabada en Constants.
Simbólicas o definidas por el usuario. Es una buena idea el declarar las constantes simbólicas con
el prefijo con, p.e. Const conPi = 3,141592
❏ Las variables declaradas con Dim o utilizadas directamente en un procedimiento, son variables
locales, es decir, accesibles solamente desde el procedimiento que las declara.
❏ Si las variables se declaran en la sección de declaraciones del formulario o del módulo, son
variables a nivel de formulario o de módulo. Una variable declarada a nivel de formulario es
accesible desde cualquier procedimiento del formulario y lo mismo para las variables a nivel de
Ejemplo
Crear un formulario con dos botones de comando (cmdInicio y cmdParada), tres etiquetas
(lblHInicio; lblHParada y lblTTranscurrido) y, tres cajas de texto (txtHInicio, txtHParada,
txtTTranscurrido). Inicialmente, el botón cmdParada estará desactivado. Se pretende que, cuando
el usuario pulse el botón cmdInicio, en la caja de texto asociada a la etiqueta lblHInicio, aparezca
la hora actual y, al mismo tiempo, se active el botón cmdParada y se desactive el de cmdInicio. Al
pulsar el botón cmdParada, se mostrará la hora de parada, el tiempo transcurrido, se desactivará el
botón de cmdParada y, se habilitará el de cmdInicio.
El código asociado será:
En este ejemplo se deben declarar las variables timeInicio, timeParada y timeTiempo como
variables a nivel de formulario (en la sección de declaraciones del formulario) para que sean
accedidas desde cualquier procedimiento asociado al formulario. Por tanto, el ámbito de una
variable determina qué procedimientos podrán acceder a esa variable. Cualquier sentencia Dim
declarada en cualquier procedimiento tiene preferencia con respecto a variables declaradas a nivel
de módulo.
Siempre que una variable aparece por primera vez, es inicializada al valor por defecto (0 para
variables numéricas y cadena vacía para tipo String) Para que una variable mantenga el valor en
cada ejecución del procedimiento donde se utiliza, se debe declarar con la instrucción:
Nota: Se mantiene la palabra reservada Global por compatibilidad de la versión 3.0, pero es
preferible utilizar la palabra reservada equivalente: Public.
Una vez definido un tipo de datos, se pueden declarar variables del mismo tipo.
Para refererirse a un determinado campo del registro, se utiliza la notación variable.campo (Por ej.
Alumno.Nombre). Un tipo definido por el usuario no puede contener un array dinámico, pero sí
estático.
Funciones y Procedimientos
Para evitar duplicar código en los procedimientos de evento, se deben utilizar los procedimientos
generales. Estos deben escribirse como un procedimiento Sub o como una función Function.
Las funciones en Visual Basic son declaradas en los módulos o en la sección de declaraciones de
un formulario y devuelven un valor al procedimiento que la invocó. La sintaxis empleada es la
siguiente:
Los procedimientos generales necesitan ser invocados explícitamente para poder ser ejecutados.
No devuelven ningún valor. La sintaxis para declarar procedimientos generales es:
donde:
Public indica que el procedimiento es accesible desde otros procedimientos en cualquier módulo.
Si se utiliza en un módulo privado, no estará disponible fuera del proyecto.
Private indica que el procedimiento solo es accesible desde los procedimientos del módulo en que
está declarado.
Static indica que las variables locales al procedimiento mantendrán el valor entra llamadas al
procedimiento.
donde:
Optional indica que el argumento no se necesita. Todos los argumentos opcionales deben ser de
tipo Variant.
Paso de Parámetros
Por defecto, los argumentos son pasados por referencia; de este modo cualquier cambio de valor
que sufra un parámetro en el cuerpo de la función o del procedimiento también se produce en el
argumento correspondiente de la llamada a la función o procedimiento.
Ejercicios
1. Crear una aplicación que permita calcular el factorial de un número. Utilizar funciones o
procedimientos.
2. Crear un procedimiento que permita separar en palabras una frase dada.
3. Crear un procedimiento que, dada una frase, permita devolver la misma frase invertida.
4. Obtener un procedimiento capaz de determinar si una palabra es palíndroma (capicúa).
5. Diseñar una aplicación que permita al usuario introducir valores en una lista desplegable y,
obtenga la suma de dichos valores.
En las secciones siguientes se explica cada una de estas áreas y se dan ejemplos de su uso correcto.
Las convenciones de codificación correctas dan como resultado un código fuente preciso, legible y
sin ambigüedad, que es coherente con otras convenciones del lenguaje y lo más intuitivo posible.
El objetivo es hacer que el programa sea fácil de leer y de entender sin obstruir la creatividad
natural del programador con imposiciones excesivas y restricciones arbitrarias.
Por tanto, las convenciones sugeridas en este apunte son breves y sugerentes. No muestran todos
los objetos y controles posibles, ni especifican todos los tipos de comentarios informativos que
podrían ser útiles. Dependiendo del proyecto y de las necesidades específicas de la organización,
quizás desee ampliar estas instrucciones para que incluyan elementos adicionales como:
❏ Convenciones para objetos específicos y componentes desarrollados internamente o comprados
a otros proveedores.
❏ Variables que describan las actividades comerciales o instalaciones de la organización.
❏ Cualquier otro elemento que el proyecto o la empresa considere importante para conseguir
mayor claridad y legibilidad.
El cometido de la variable
Para qué se utiliza la variable?. Se la utiliza como un manejador, un banderín boleano, un banderín
de bits (un array de bits), un índice, un contador, un ordinal, una cadena de caracteres, un
identificador, etc.? Normalmente esta es la información más útil, que se puede proporcionar y es
independiente del lenguaje.
El contexto de la variable
Generalmente esto significa usar un modificador que indique que la variable es una array o
colección. Los lenguajes que soportan punteros, requieren un modificador para distinguir un
puntero a una variable de la variable en sí. Se puede usar un modificador para indicar un contador
de variables. Por ejemplo, si el modificador es h, para manejador, (handle), a para array, p para
puntero y c para contador, entonces se podría tener un ah (array de manejadores), un ph (un
puntero a un manejador) o un ch (un contador de manejadores).
El ámbito de la variable
Algunos convenios distinguen claramente entre variables que son locales, globales o cualquier otro
ámbito intermedio. Normalmente se asume local, y no requiere modificador, y se utiliza g como
prefijo para indicar una variable global.
A medida que aumenta el tamaño del proyecto, también aumenta la utilidad de reconocer
rápidamente el alcance de las variables. Esto se consigue escribiendo un prefijo de alcance de una
letra delante del tipo de prefijo, sin aumentar demasiado la longitud del nombre de las variables.
En la siguiente tabla se resumen los prefijos que utilizaremos a lo largo del desarrollo de la cátedra
para distinguir el ámbito de una variable.
Se debe tener en cuenta que algunos prefijos modifican a otros prefijos. Por ejemplo, acmd es un
array de botones, mientras que ccmd es un contador de botones y ncmd una colección de botones.
Los convenios de denominación de variables son una cosa, los convenios de denominación de
tipos son otra.
Se pueden definir varias clases de tipos: formularios, clases, colecciones, tipos definidos por el
usuario, etc.
Los objetos deben llevar nombres con un prefijo coherente que facilite la identificación del tipo de
objeto.
A continuación se ofrece una lista de convenciones recomendadas para algunos de los objetos
permitidos por Visual Basic.
❏ Variables.
❏ Objetos.
❏ Propiedades, métodos y eventos.
Utilice palabras o sílabas completas siempre que sea posible. Es más fácil recordar palabras
completas que recordar si ha abreviado Window como Wind, Wn o Wnd.
Evite los acentos. Bajo ninguna condición incluya acentos en los nombres de los controles o las
variables; su uso puede llevar a condiciones de funcionamiento impredecibles.
Los argumentos que se pasan a un procedimiento se deben describir cuando sus funciones no sean
obvias y cuando el procedimiento espera que los argumentos estén en un intervalo específico.
También hay que describir, al principio de cada procedimiento, los valores de retorno de funciones
y las variables globales que modifica el procedimiento, en especial los modificados a través de
argumentos de referencia.
Los bloques del comentario de encabezado del procedimiento deben incluir los siguientes
encabezados de sección. En la sección siguiente, “Dar formato al código”, hay algunos ejemplos.
❏ Cada declaración de variable importante debe incluir un comentario de línea que describa el
uso de la variable que se está declarando.
❏ Las variables, controles y procedimientos deben tener un nombre bastante claro para que los
comentarios de línea sólo sean necesarios en los detalles de implementación complejos.
❏ Al principio del módulo .bas que contiene las declaraciones de constantes genéricas de Visual
Basic del proyecto, debe incluir un resumen que describa la aplicación, enumerando los
principales objetos de datos, procedimientos, algoritmos, cuadros de diálogo, bases de datos y
dependencias del sistema. Algunas veces puede ser útil un pseudocódigo que describa el
algoritmo.
❏ Los bloques anidados estándar, separados por tabuladores, deben llevar una sangría de cuatro
espacios (predeterminado).
❏ El comentario del esquema funcional de un procedimiento debe llevar una sangría de un
espacio. Las instrucciones de nivel superior que siguen al comentario del esquema deben llevar
una sangría de un tabulador, con cada bloque anidado separado por una sangría de un tabulador
adicional. Por ejemplo:
'************************************************************
' Finalidad:Ubica el primer caso encontrado de un
' usuario especificado en la matriz
' ListaUsuario.
' Entradas:
' strListaUsuario(): lista de usuarios para buscar.
' strUsuarioDest: nombre del usuario buscado.
' Resultados: Índice del primer caso de rsUsuarioDest
' encontrado en la matriz rasListaUsuario.
' Si no se encuentra el usuario de destino, devuelve -1.
'************************************************************
Function intBuscarUsuario (strListaUsuario() As String, strUsuarioDest As _
String)As Integer
Dim i As Integer ' Contador de bucle.
Dim blnEncontrado As Integer ' Indicador de
' destino encontrado.
intBuscarUsuario = -1
i = 0
While i <= Ubound(strListaUsuario) and Not blnEncontrado
If strListaUsuario(i) = strUsuarioDest Then
blnEncontrado = True
intBuscarUsuario = i
End If
Wend
End Function
Este tipo de estructura de control permite tomar decisiones, ejecutando condicionalmene una o más
sentencias.
If condición_1 Then
Falso sentencias1(s)
Condición1
[Else
sentencia2(s)]
Verdadero End If
Verdadero
Falso
Condición2
Verdadero
Falso
Condición3
Verdadero
If condición_1 Then
sentencia1(s)
[ElseIf condición_2 Then
sentencia2(s)]
[ElseIf condición_3 Then
sentencia3(s)]
.........................................
[Else
sentencian (s)]
End If
Select Case
Esta estructura de control permite ejecutar ina de varias acciones en función del valor de una
expresión.
expr-test es una expresión numérica o alfanumérica, y lista-1, lista-2, .... rerpesenta una lista que
puede tener una de las siguientes formas.
expresión [,expresión]...
Cuando se utiliza la forma expresión To expresión, el valor más pequeño debe aparecer en primer
lugar.
Al ejecutarse una sentencia Select Case, se evalúa expr-test y se busca el primer Case que incluya
el valor evaluado, ejecutando a continuación el correspondiente bloque de sentencias. Si no existe
un valor igual a expr-test, entonces se ejecutan las sentencias a conmtinuación de Case Else. En
cualquier caso, el control pasa a la siguiente sentencia a End Select.
Introducción
Supongamos que deseamos ejecutar repetidamente un proceso, es decir, deseamos indicar la
ejecución de un proceso iterativo, que finalizará al cumplirse una condición. Este tipo de estructura
se llama repetitiva o iterativa.
Las estructuras repetitivas, junto con las selectivas, constituyen las estructuras de control que
permiten la resolución de los problemas con computadora.
La programación estructurada, como ya sabemos, es un método para resolver problemas por
computadora que exige el uso de las estructuras secuenciales, selectivas y repetitivas.
El teorema de la programación estructurada de Böhm y Jacopini, dice que todo programa propio
puede ser siempre definido por estructuras secuenciales, selectivas y repetitivas.
Un algoritmo para resolver un problema, requiere con frecuencia que una sentencia o grupo de
sentencias se repita un número determinado de veces. Una estructura de control que permita la
repetición de un conjunto determinado de sentencias se denomina bucle.
Un Bucle o ciclo, repite una secuencia de sentencias mientras o hasta que se cumpla que una
condición determinada es verdadera o falsa. Las condiciones se representan mediante expresiones
booleanas dado que toman solo dos valores posibles, verdadero o falso.
V
Proceso o cuerpo
del bucle
Vemos que una estructura repetitiva tiene dos componentes: una acción que se ejecuta
repetidamente y un medio de decidir cuando se deben detener las acciones iterativas.
Las estructuras repetitivas se diferencian unas de otras en la localización del punto donde se decide
la detención del bucle, es decir, la terminación o salida del bucle.
La decisión o comprobación de la condición se puede verificar antes, entre o después de la
ejecución de las sentencias que componen el cuerpo del bucle.
Condición Condición
F F
Proceso o cuerpo
del bucle
V V
V
Proceso o cuerpo Proceso o cuerpo
del bucle del bucle
Condición
F
Esta estructura es la más utilizada. Es una estructura repetitiva en la que la condición de salida se
sitúa al principio del bucle.
Permite la repetición de una serie de sentencias, mientras una condición o expresión lógica sea
verdadera.
Mientras Pseudocódigo
Condición F
mientras condición
Sentencia_1;
V Sentencia_2;
Proceso o cuerpo .....................
del bucle fin mientras
Reglas de funcionamiento:
1- La condición puede ser cualquier expresión lógica o relacional.
2- Como la condición se evalúa al principio del bucle, si la condición es inicialmente falsa, las
sentencias en el interior del bucle no se ejecutarán nunca.
3- Mientras la condición sea verdadera, el bucle se ejecutará. Lo que significa que el bucle se
ejecutará indefinidamente a menos que algo dentro del mismo modifique la condición.
Esta situación, conocida como bucle infinito, es anómala, y normalmente se debe evitar.
A continuación podemos ver la forma que tienen los bucles controlados por contador:
←1
Cuenta←
Mientras Pseudocódigo
Cuenta <=100
Cuenta=1
mientras cuenta <=100
Sentencias
Sentencia_1
Cuenta ← Cuenta+1 Sentencia_2
...................
Cuenta=Cuenta+1
fin mientras
←
Centinela←
Mientras
Centinela <>-999
Pseudocódigo
Sentencias ingresar Centinela
←
Centinela← mientras Centinela <>-999
Sentencia_1
Sentencia_2
ingresar Centinela
fin mientras
La bandera (Flag) es una variable que se utiliza para conservar el estado verdadero o falso de una
condición. Generalmente, Verdadero se representa con -1 (1) y Falso con 0.
Es una estructura de control de bucles en la que se realizan las sentencias del interior hasta que se
cumpla una condición, es decir, la condición es verdadera.
Proceso o cuerpo
del bucle Pseudocódigo
F
repetir
Sentencia_1
Repetir hasta Sentencia_2
V ...................
(Expresión lógica)
hasta que condición
Reglas de funcionamiento
1- El bucle realiza siempre una iteración antes de evaluar la expresión.
2- El bucle 1-n evalúa la condición después de realizar la ejecución del cuerpo del proceso.
←1
Numero←
Pseudocódigo
←0
Suma←
inicializar Número en 1
inicializar Suma en 0
Suma ← Suma +Número repetir
hacer Suma←Suma+Número
Número ← Número +1 hacer Número←Número+1
F hasta que Número >10
escribir Suma
Repetir hasta
V
Número >10
Este tipo de bucle es controlado por contador ya que existe una variable numérica que actúa
como contador y que se incrementa en un valor constante a partir del valor inicial después de cada
iteración del bucle. Se utilizan para repetir una tarea un número fijo de veces.
Repetir desde
i hasta f F
Pseudocódigo
V
Proceso o cuerpo repetir desde v= i hasta v= f
del bucle Sentencia_1
Sentencia_2
....................
fin repetir
Figura 24 - Ciclo Exacto
Reglas de funcionamiento:
← N*N
Cuadrado← repetir desde N←1 hasta N←10
Cuadrado ← N * N
Cuadrado
Escribir N
fin repetir
Ejercicios
2) Realizar un algoritmo que calcule e imprima la suma de los números enteros impares menores o
iguales a n, siendo n un número a ingresar.
3) Escribir un algoritmo que obtenga la suma de los números pares hasta 20.000 inclusive.
5) Escribir un algoritmo que sume los cuadrados de los n primeros enteros pares, donde n se
ingresa con anterioridad.
6) Escribir un algoritmo que muestre todos los números divisibles por trece comprendidos entre un
número de tres cifras a ingresar y cero.
7) En una fábrica existen 10 máquinas, cada una de ellas con un código diferente. Se quiere
calcular el rendimiento de cada una de ellas, sabiendo el número de orden de producción, la
cantidad de unidades programadas y la cantidad de unidades producidas por cada máquina.
8) En una empresa se desea controlar el stock de productos para lo cuál se deben dar de alta los
códigos, el stock actual, el mínimo y el máximo de cada uno de ellos, y verificar cuáles están por
debajo del stock mínimo y cuáles por encima del máximo.
Los datos pueden organizarse en diferentes formas: el modelo matemático o lógico de una
organización particular de datos recibe el nombre de estructura de datos. Una estructura de datos
es, en esencia una colección de datos. La forma en que están relacionados unos con otros
determina el tipo de estructura. El valor de la estructura de datos se determina por:
listas
dinámicas colas
árboles
grafos
Estructuras estáticas son aquellas en las que la dimensión ocupada en memoria se declara
previamente y no es posible modificarla. Las estructuras dinámicas, como su nombre indica, no
tienen un tamaño fijo de memoria y mediante variables denominadas punteros es posible modificar
su tamaño en memoria.
Un array es una colección o conjunto de posiciones de memoria que tienen el mismo nombre de
variable, es decir, un conjunto de datos numéricos ó de cadena que tienen el mismo nombre.
Los vectores individuales de un array son elementos. Como un array es referenciado por un
nombre de variable, los elementos de los arrays son también variables y se pueden utilizar en
cualquier sentencia o función.
Tipos de Arrays
Los arrays se clasifican atendiendo a sus dimensiones en:
Cada valor de un array se denomina elemento del array. Para acceder a los elementos de un array
se utilizan subíndices numéricos que identifican la posición de un valor dado en el array.
Se pueden definir array de cualquier tipo, numéricos, de caracteres y de registros (tipos de datos
definidos por el usuario). Los arrays numéricos pueden ser de cualquier tipo numérico: enteros,
enteros largos, simple precisión o doble precisión.
al , a2 , a3 , . . . , an
A(1) , A(2) , A(3) , . . . , A(n)
A[1] , A[2] , A[3] , . . . , A[n]
donde A es el nombre del vector y l, 2, 3, . n es el subíndice o índice de cada elemento del vector.
Una variable de subíndice tiene el formato general:
variable (subíndice)
Así pues, en general, las características de un vector en cualquier lenguaje de programación son:
Vector A:
Índice 1 2 3 4 5 6 7 8 9
Valor 4 51 32 -14 25 6 9 14 23
A partir de ahora, el paréntesis (o corchetes) después del nombre de una variable estará indicando
que se está refiriendo a un vector en lugar de a una variable ordinaria. Es decir, A() es el vector
llamado A.
Lectura/Salida de Datos
A continuación veremos como se realiza la lectura de los datos de un vector. La salida se realizará
en una forma similar.
V ←
A(i)←
A(v)
Mientras F
A(i) <>-999
V
← i+1
i←
A(i) ←
Repetir desde
f← pf hasta f← uf F Figura 27 - Diagrama de la lectura de datos de una matriz
V
Repetir desde
c← pc hasta c← uc F
V
A(f, c)
Arrays multidimensionales
En general, los lenguajes de programación permiten declarar arrays con un número elevado de
dimensiones, pero es difícil tener que declarar array con más de 3 dimensiones.
Una matriz de tres dimensiones A(I,J,K) se puede representar por un cubo o paralelepípedo. Así,
por ejemplo, la matriz T(3,2,5).
La mayoría de las aplicaciones no utilizan arrays con más de tres dimensiones, posiblemente
porque visualizar más de tres dimensiones parece demasiado abstracto.
Array Estáticos
Para declarar un array estático, formado por un número fijo de elementos, Visual Basic utiliza una
sintaxis parecida a la declaración de variables. Veamos algunos ejemplos:
Dim Array_A(19) As String
declara un array unidimensional de 20 elementos: Array_A(0), Array_A(1)...
Array Dinámicos
Para declarar un array dinámico, formado por un número variable de elementos, Visual Basic
utiliza una sintaxis parecida a la declaración anterior. El espacio necesario para un array dinámico
será asignado durante la ejecución del programa. Un array dinámico puede ser redimensionado en
cualquier momento durante la ejecución. Para redimensionarlos se utiliza la sentencia ReDim. Esta
sentencia puede aparecer solamente en un procedimiento y permite cambiar el número de
elementos del array, no el número de dimensiones. Por ejemplo:
Cada vez que se ejecuta la sentencia ReDim, todos los valores en el array se pierden. Cuando
interese conservar los valores del array, se utilizará la sentencia ReDim Preserve. Sólo se puede
cambiar el límite superior de la última dimensión.
Métodos de Ordenamiento
La ordenación y búsqueda de la información son de las tareas más realizadas en los procesos de
manejo de datos. Consideremos, por ejemplo, el hecho de encontrar una palabra en un diccionario
o un nombre en una guía telefónica. La búsqueda del elemento particular se simplifica
considerablemente por el hecho de que las palabras del diccionario y los nombre de la guía
telefónica están ordenados o clasificados en orden alfabético.
A continuación veremos la terminología básica a aplicar y desarrollaremos uno de los más
sencillos métodos de ordenación, ya que estos se verán en detalle en materias posteriores.
En el caso de las listas pequeñas, los métodos directos se demuestran eficaces y relativamente
eficientes, ya que la codificación de los algoritmos correspondientes no es muy compleja.
Sin embargo, en array grandes estas ordenaciones directas pueden ser muy ineficaces y se
necesitan métodos de ordenación avanzados.
1 2 3 4 5 6 7 8
68 24 57 79 11 13 46 35
Buscamos el menor elemento, en este caso A(5)=11 y lo colocamos en el primer lugar, pasando
A(1)=68 al quinto lugar.
Para ello procedemos de la siguiente manera:
Utilizamos una variable temporal Ind. El valor dado es Ind=i=1, por lo que A(Ind)=68 y
comparamos este valor con los restantes elementos.
Como A(Ind)>A(2)=24, guardamos ahora en Ind el valor 2, con lo que A(Ind)=24,. Comparamos
con A(3)=57 que es mayor que A(Ind)=24, con lo que pasamos a comparar con A(4)=79, también
mayor que A(Ind).
Ahora comparamos con A(5)=11 < A(Ind), por lo que lo guardamos en Ind = 5, con lo que
A(Ind)=11, y mantiene su valor pues es el menor elemento. Posteriormente intercambiamos A(Ind)
= A(5) con A(1), quedando:
1 2 3 4 5 6 7 8
11 24 57 79 68 13 46 35
Posteriormente hacemos lo mismo pero comenzando ahora con el segundo elemento: A(2)= 24,
con lo que quedará:
1 2 3 4 5 6 7 8
11 13 57 79 68 24 46 35
Diagrama de Flujo
Repetir desde
j= i+1 hasta j=N F
A(Ind)>A(j)
←J
Ind←
← A(i)
Temp←
← A(Ind)
A(i)←
← Temp
A(Ind)←
CLS
DIM a(9) FOR i = 1 TO N - 1
N = 8 Ind = i
a(1) = 11 FOR J = (i + 1) TO N
a(2) = 24 IF a(Ind) > a(J) THEN
a(3) = 57 Ind = J
a(4) = 59 END IF
a(5) = 68 NEXT J
a(6) = 13 Temp = a(i)
a(7) = 46 a(i) = a(Ind)
a(8) = 35 a(Ind) = Temp
NEXT i
FOR t = 1 TO N
PRINT a(t); FOR t = 1 TO N
NEXT t PRINT a(t);
PRINT NEXT t
Ejercicios
1- Realizar un algoritmo que permita cargar un vector de no menos de 10 elementos, con el cual se
realizarán los siguientes pasos:
a) Presentar por separado los elementos pares e impares del mismo.
b) Determinar cuál es el mayor elemento del vector y en que posición está ubicado.
c) Hallar todos los múltiplos de N en el vector siendo N un número a ingresar.
d) A partir del vector original A(), generar un nuevo vector B() tal que el primer elemento del
vector A() sea el último del B() y así sucesivamente.
3- Realizar un algoritmo que permita cargar una matriz de 5 filas por 4 columnas y calcular:
a- La suma de las filas 2, 3, 4 y 5.
b- El mayor elemento de las tres últimas columnas.
c- Presentar la matriz y los resultados obtenidos.
4- Realizar un algoritmo que permita leer un número natural N, y a continuación los valores de una
matriz de N por N elementos. Luego imprimir los elementos de la diagonal principal y de la
contradiagonal.
5- Realizar un algoritmo que permita cargar una matriz de 40 por 30 elementos, y obtener un
vector de 40 elementos formado por los mínimos de cada fila.
6- Crear un algoritmo que permita cargar un vector con no menos de 10 elementos con valores
enteros de 2 cifras y luego ordenarlos en forma creciente y decreciente. Imprimiendo los resultados
obtenidos.
7- Modificar el algoritmo anterior para crear a partir del primero, dos nuevos vectores con los
valores ordenados.
8 - Crear una aplicación que permita crear un cuadrado mágico. Un cuadrado mágico es aquel en
el que todas las filas, columnas y diagonales principales suman lo mismo. Para resolver el ejercicio
se utilizará el argumento de Loubère, que funciona solo con cuadrados mágicos impares:
Colocar 1 en el centro de la primera fila.
Los números se colocan en orden moviéndose hacia arriba en diagonal hacia la derecha.
Si se sale por la parte superior se sustituye por el lugar correspondiente de la fila inferior.
Si se sale por la derecha se sigue en la posición correspondiente de la columna izquierda.
Si se llena el cuadrado o se alcanza la esquina superior derecha, desplazarse hacia abajo y
continuar con las reglas.
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
9- Crear una aplicación que permita obtener el elemento mayor de una matriz cuadrada de
dimensión cualquiera. Los elementos de la matriz serán números entre el 1 y el 1000 introducidos
aleatoriamente.
10- Realizar un algoritmo que permita implementar un filtro promedio móvil a los valores leidos
en un vector a partir de una adquisición de .
240.00
220.00
200.00
180.00
160.00
140.00
120.00
100.00
8:00:00 9:12:00 10:24:00 11:36:00 12:48:00 14:00:00 15:12:00 16:24:00 17:36:00 18:48:00
Comienzo
Repeitr desde 1
hasta TotalMediciones
iContador <-0
fAcumulador <-0
iContador ++
iTemporal1<-Ent((iPeriodos / 2))
Si iBucle
<=
iTemporal1
iTemporal2<-(TotalMediciones - Ent(iPeriodos / 2) - 1)
Si iBucle <
iTemporal2
Si iBucle >=
iTemporal3 Y
<=TotalMediciones
Fin
Introducción
Muchas aplicaciones requieren almacenar y recupera datos de una sesión a otra. Los archivos de
datos permiten almacenar información en un archivo separado en el disco, esto es un archivo
independiente de los archivos que almacena la aplicación.
Una archivo de datos está compuesto por registros, los cuales a su ves se encuentran separados en
campos. Para clarificar, supongamos que deseamos guardar los siguientes datos personales de un
grupo de personas:
Cada uno de los anteriores datos representa un campo, y el conjunto de estos campos un registro
para una determinada persona.
Si lo representáramos en un formato de tabla, los campos corresponderían a las colúmnas, y los
registros a las filas.
Archivo secuencial: Se lee una línea cada vez. Cada línea podrá ser tan larga como quiera.
Cuando se empieza a leer un archivo secuencial, se empieza por la primera línea y se continúa con
la siguiente hasta llegar al final. En este tipo de archivos para acceder a un registro determinado se
deben primero leer los registros anteriores. Ejemplos: archivos TXT
Archivo aleatorio: El contenido de los registros puede ser leído y escrito en el orden que se
necesite, ya que se puede acceder a cualquir registro sin necesidad de leer los ateriores
Está formado por un conjunto de registros de la misma longitud. Cada registro individual se
identifica con un único número y puede ser leído, escrito o actualizado en cualquier orden, siempre
y cuando se conzca el número del registro al cual se desea acceder. Ejemplos: archivos que
simulen bases de datos.
Los pasos anteriores son los que desarrollaremos a continuación, en los casos particulares de
archivos secuenciales y aleatorios.
La siguiente tabla muestra las instrucciones habitualmente usadas al escribir y al leer datos en
archivos de acuerdo al tipo del mismo.
donde Input indica si se quiere leer del archivo, Output si se quiere escribir de él, Append si se
quiere añadir información al final del fichero y, NumeroDeArchivo es un número entre 1 y 255.
Si se trata de abrir para lectura un archivo que no existe, se producirá un error. Si se abre para
escritura Visual Basic creará un nuevo archivo, reemplazando cualquier archivo con ese nombre.
Si no se sabe qué número de archivo está libre, se utilizará el siguiente código:
NumArchivo = FreeFile
Open NomArch For {Input | Output} As #NumArchivo
Close #NúmeroDeArchivo
Si la intrucción Close se utiliza sin poner NumeroDeArchivo, se cerrarán todos los ficheros
abiertos.
donde la última instrucción, permite leer un número determinado de caracteres y, está limitado a
ficheros de 32.767 bytes máximo.
La función EOF (Fin De Fichero) indica cuándo se acaba un archivo. A esta función hay que
facilitarle el número de archivo correspondiente y, devolverá True si se ha leído toda la
información del archivo. La función LOF (Longitud De Archivo) indica la longitud de un archivo.
Por tanto, para leer de un archivo de acceso secuencial se seguirán los pasos:
Abrir el fichero para lectura con: Open NombreDeArchivo For Input As #NúmeroDeArchivo
En este ejemplo se utiliza la instrucción Input # para leer datos de la tabla 1 un archivo y ponerlos
en
variables.
Open "Datos.Dat" For Input As #1 ' Abre archivo para recibir datos.
Do While Not EOF(1) ' Repite el bucle hasta fin archivo.
Input #1 ,Nombre, Direccion, Localidad, CP, Prov, Tel, Edad, Peso,
Altura ‘Ponen los datos en las variables.
Loop
Close #1 ' Cierra el archivo.
En un archivo de acceso aleatorio, se puede leer o escribir sin tener que cerrar cada vez.. Se debe
facilitar el número de bytes que se deben leer o escribir. Para cerrar un archivo aleatorio, se
utilizará Close como si fuera un archivo secuencial.
Get lee del archivo y almacena los datos en la variable, mientras que Put escribe el contenido de la
variable en el archivo.
Por tanto, para leer / escribir en un archivo de acceso aleatorio, se seguirán los pasos:
Abrir el fichero para acceso aleatorio con: Open NombreDeArchivo For Random As
#NúmeroDeArchivo Len = LongitudRegistro
En este ejemplo se utiliza la instrucción Put para escribir datos en un archivo del disco. Se
escriben cinco registros del tipo definido por el usuario Registro.
1. Open (Instrucción)
Activa operaciones de entrada/salida (E/S) con un archivo.
Sintaxis:
Parte Descripción
nombreruta Expresión de cadena que especifica un nombre de archivo
nombrearchivo puede incluir el directorio o carpeta y la unidad de disco.
modo Palabra clave que especifica el modo de archivo: Append, Binary, Input, Output o
Random.
acceso Palabra clave que especifica las operaciones permitidas en el archivo abierto: Read,
Write o Read Write.
bloquear Palabra clave que especifica las operaciones permitidas en el archivo abierto por
otros procesos: Shared, Lock Read, Lock Write y Lock Read Write.
númeroarchivo Un número de archivo en el intervalo 1 a 511 inclusive. Para obtener el número del
siguiente archivo disponible se utiliza la función FreeFile.
longitudregistro Número igual o inferior a 32,767 (bytes). En archivos abiertos para acceso
aleatorio, este número es la longitud del registro. Para archivos secuenciales, este
valor es el número de caracteres colocados en el área de memoria intermedia.
Observaciones
Antes de poder ejecutar una operación de E/S en un archivo, éste debe estar abierto. Open asigna
un área de memoria intermedia para operaciones de E/S con el archivo y determina el modo de
acceso que se debe utilizar con el área de memoria intermedia.
Si el archivo especificado con nombreruta no existe, se crea al abrir un archivo en los modos
Append, Binary, Output o Random. Si el archivo ya ha sido abierto por otro proceso y no se
permite el tipo de acceso especificado, la operación Open fracasa y se produce un error.
Importante En los modos Binary, Input y Random se puede abrir un archivo utilizando un número
de archivo distinto sin necesidad de cerrarlo antes. En los modos Append y Output se debe cerrar
el archivo para poder abrirlo con un número de archivo distinto.
Ejemplos de la instrucción Open
Se ilustran varios usos de Open para habilitar operaciones de entrada/salida a un archivo.
Se abre el archivo en modo de acceso aleatorio. El archivo contiene registros del tipo definido por el usuario Record.
Type Registro ' Define un tipo definido por el usuario.
ID As Integer
Nombre As String * 20
End Type
2. Close (Instrucción)
Termina las operaciones de entrada/salida en un archivo abierto con la instrucción Open.
El argumento listadenúmerosdearchivo puede estar constituido por uno o más números de archivo,
donde númerodearchivo es cualquier número de archivo válido y tiene la siguiente sintaxis:
[[#]númerodearchivo][, [#]númerodearchivo] . . .
Observaciones
Si se omite la listadenúmerosdearchivo, se cierran todos los archivos activos abiertos con la
instrucción Open.
Parte Descripción
númeroarchivo Cualquier número de archivo válido.
listasalida Expresión o lista de expresiones a imprimir.
Configuración
El argumento listasalida tiene la configuración siguiente:
[{Spc(n) | Tab[(n)]}][expresión][poscarácter]
Parte Descripción
Spc(n) Se utiliza para insertar caracteres de espacio en la salida, donde n es el número de
caracteres de espacio a insertar.
Tab(n) Se utiliza para colocar el punto de inserción en una número de columna absoluta, donde n
es el número de columna. Se utiliza Tab sin argumento para colocar el punto de inserción
al comienzo de la siguiente zona de impresión.
expresión Expresión numérica o de cadena a imprimir.
poscarácter Especifica el punto de inserción del carácter siguiente. Se utiliza un punto y coma (;) para
especificar que el punto de inserción debe estar inmediatamente después del último
carácter que se ha mostrado. Se usa Tab(n) para colocar el punto de inserción en un
número de columna absoluta. Se usa Tab sin argumentos para colocar el punto de inserción
al comienzo de la siguiente zona de impresión. Si se omite PosCarácter, el siguiente
carácter se imprime en la línea siguiente.
Observaciones
Si se omite listasalida y se incluye sólo un separador de listas después de númeroarchivo, se
imprime una línea en blanco en el archivo. Se pueden separar varias expresiones por medio de un
espacio o de una punto y coma (;). El espacio tiene el mismo efecto que el punto y coma.
Todos los datos escritos en el archivo por medio de Print # están internacionalizados; es decir,
tienen el formato apropiado (con el separador decimal correcto) y las palabras clave se imprimen
en el formato apropiado de la información local especificada en el sistema. En el caso de datos del
Dado que Print # escribe una imagen de los datos en el archivo, se deben delimitar los datos para
que se impriman correctamente. Si se utiliza Tab sin argumentos para colocar la posición de
impresión en la siguiente zona de impresión, Print # también escribe en el archivo los espacios
entre campos de impresión.
Nota: Si, en el futuro, se necesita leer por medio de la instrucción Input # los datos contenidos en
un archivo, se debe utilizar la instrucción Write # en vez de la instrucción Print # para escribir los
datos en el archivo. La utilización de Write # asegura la integridad de cada campo de datos
separado, al delimitarlo adecuadamente, de modo que pueda ser leído otra vez utilizando Input #.
La utilización de Write # asegura también que los datos puedan ser leídos correctamente en
cualquier información local.
Ejemplo de la instrucción Print #
En este ejemplo se utiliza la instrucción Print # para escribir datos en un archivo.
Parte Descripción
numarchivo Cualquier número de archivo válido.
listasalida Una o varias expresiones de cadena o numéricas delimitadas por comas que se
desea escribir en un archivo.
Observaciones
Si se omite listasalida y se incluye un punto y coma después de númerofila, se imprime una línea
en blanco en el archivo. Se pueden separar múltiples expresiones con un espacio, un punto y coma
(;) o una coma. Un espacio tiene el mismo efecto que un punto y coma.
Cuando se utiliza Write # para introducir información en un archivo, se siguen distintas
convenciones universales, de modo que los datos pueden ser siempre leídos e interpretados
correctamente mediante la ejecución de Input #, independientemente de la información local con la
que esté trabajando:
❏ Los datos numéricos son siempre introducidos utilizando la coma (,) como separador decimal.
❏ Para datos de tipo Boolean se imprime #TRUE# o #FALSE#. Las palabras clave True y False
no son traducidas, independientemente de la información local con la que esté trabajando.
❏ Las fechas son escritas en el archivo con el formato de fecha universal. Si el componente
correspondiente a la fecha o a la hora falta o es igual a cero, sólo se escribe en el archivo la
parte suministrada.
60 Juan Carlos Ansaldi - Sept. 2001
Facultad de Ciencias y Tecnología
Informática II UADER
❏ Si los datos de listasalida son de tipo Empty, no se escribe nada en el archivo. Sin embargo, en
el caso de datos Null, la salida es #NULL#.
❏ Para datos de Error, la salida aparece en el formato #ERROR códigoerror#. La palabra clave
Error no se traduce, independientemente de la información local con la que esté trabajando.
A diferencia de la instrucción Print #, la instrucción Write # inserta puntos y coma entre elementos
y comillas alrededor de cadenas de caracteres, cuando se escriben en el archivo. No es necesario
colocar delimitadores en la lista. Write # inserta un carácter de línea siguiente, que es un retorno
de carro (Chr(13)) o continuación de línea (Chr(13) + Chr (10)), después de que se ha escrito el
último carácter de listasalida en el archivo.
Ejemplo de la instrucción Write #
En este ejemplo se utiliza la instrucción Write # para escribir datos no procesados en un archivo
secuencial.
Parte Descripción
númarchivo Cualquier número de archivo válido.
listavariables Lista de variables delimitadas por puntos y coma a las que se asignan valores que se
leen de un archivo no pueden ser matrices ni variable objeto. Sin embargo, se
pueden utilizar variables que describen un elemento de una matriz y tipos definidos
por el usuario.
Observaciones
Utilice esta instrucción únicamente con archivos abiertos en los modos Input o Binary.
Cuando se leen datos numéricos o cadenas estándar, se asignan tal y como son a variables.
Se ignoran las comillas dobles (") en la entrada de datos.
Los elementos de los datos de un archivo deben aparecer en el mismo orden que tienen las
variables en listavariables y deben coincidir con variables del mismo tipo de datos. Si una variable
es numérica y los datos no lo son, se asigna cero a esa variable.
Si se llega al fin del archivo cuando se está introduciendo un elemento de los datos, se da por
terminada la entrada y se emite un error.
Nota Para introducir correctamente en variables los datos leídos de un archivo, se debe utilizar
siempre la instrucción Write #, en lugar de Print #, para grabar la información en los archivos. La
utilización de Write # garantiza que cada campo de datos separado se delimite correctamente.
Open "PRUEBA" For Input As #1 ' Abre el archivo para recibir los datos.
Do While Not EOF(1) ' Repite el bucle hasta fin de archivo.
Input #1, MiCadena, MiNumero ' Ponen los datos en las variables.
Debug.Print MiCadena, MiNumero ' Muestran los datos en la
ventana Depuración.
Loop
Close #1 ' Cierra el archivo.
Parte Descripción
númeroarchivo Cualquier número de archivo válido.
nombrevariable Nombre de variable de cadena de caracteres válido.
Observaciones
La instrucción Line Input # lee un carácter cada vez en un archivo hasta que encuentra un retorno
de carro (Chr(13)) o una secuencia retorno de carro-continuación de línea (Chr(13) + Chr(10)).
Ejemplo de la instrucción Line Input #
En este ejemplo se utiliza la instrucción Line Input # para leer una línea de un archivo secuencial
y asignarla a una variable. Se supone que PRUEBA es un archivo de texto con unas pocas líneas
de datos de muestra..
Parte Descripción
númeroarchivo Cualquier número de archivo válido.
númeroregistro Número de registro (archivos en modo Random) o número de byte (archivos en
modo Binary) en el cual se comienza a imprimir.
nombrevariable Nombre de la variable que contiene la información a escribir en el disco.
Observaciones
El primer registro/byte de un archivo se encuentra en la posición 1, el segundo en la posición 2 y
así sucesivamente. Si se omite NúmeroRegistro , se escribe el siguiente registro o byte (el que se
encuentra después de la última instrucción Get o Put o aquél al que la última función Seek). Se
deben incluir puntos y coma de delimitación, por ejemplo:
62 Juan Carlos Ansaldi - Sept. 2001
Facultad de Ciencias y Tecnología
Informática II UADER
Put #4,,BuferArchivo
❏ Aunque la longitud de los datos escritos sea menor que la especificada en la cláusula Len de la
instrucción Open, Put escribe los registros siguientes según los límites de longitud de registro y
llena el espacio entre el fin de un registro y el comienzo del siguiente con el contenido del área
de memoria intermedia del archivo. Dado que la cantidad de datos de llenado no puede ser
determinada con certeza, se considera una buena práctica que el registro tenga la misma
longitud que los datos que se escriben. Si la longitud de los datos que se escriben es mayor que
la especificada en la cláusula Len de la instrucción Open, ocurre un error.
❏ Si la variable que se va a incorporar es una Variant de tipo numérico, la instrucción Put escribe
2 bytes para identificar el VarType de la Variant y luego la variable. Por ejemplo, al escribir
una Variant de tipo VarType 3, Put escribe 6 bytes: 2 bytes para identificar la Variant que sea
del tipo VarType 3 (Long) y 4 bytes que contienen los datos del tipo Long. La longitud del
registro, especificada por la cláusula Len en la instrucción Open debe ser por lo menos 2 bytes
mayor que el número efectivo de bytes requerido para almacenar la variable.
Nota Puede utilizar la instrucción Put para escribir una matriz Variant en disco, pero no puede
emplear Put para escribir en disco una Variant escalar que contiene una matriz. Tampoco puede
utilizar Put para escribir objetos en disco.
❏ Si la variable escrita es una variante del tipo String Variant (VarType 8), Put escribe 2 bytes
para identificar el VarType, 2 bytes para indicar la longitud de la cadena y luego la cadena en
sí. La longitud del registro, especificada por la cláusula Len en la instrucción Open, debe ser
por lo menos 4 bytes mayor que la longitud efectiva de la cadena.
❏ Si la variable escrita es una matriz dinámica, Put escribe un descriptor cuya longitud equivale a
2 más 8 veces el número de dimensiones, es decir, 2 + 8 * NúmeroDeDimensiones. La longitud
del registro, especificada por la cláusula Len en la instrucción Open debe ser mayor o igual que
la longitud de los datos que se escriban. Por ejemplo, la siguiente declaración de matriz
requiere 118 bytes cuando la matriz se escribe en disco.
Dim MiMatriz(1 To 5,1 To 10) As Integer
Los 118 bytes se distribuyen de la siguiente forma: 18 bytes para el descriptor (2 + 8 * 2) y 100
bytes para los datos (5 * 10 * 2).
❏ Si la variable escrita es una matriz de tamaño fijo, Put solamente escribe los datos. No se
escribe en disco ningún descriptor.
❏ Si la variable que se escribe es de cualquier otro tipo (ni una cadena de longitud variable ni una
Variant), Put escribe solamente los datos de la variable. La longitud del registro especificada
por la cláusula Len en la instrucción Open debe ser mayor o igual que la longitud de los datos
escritos.
❏ Put escribe elementos de tipos definidos por el usuario como si escribiera cada uno por
separado, pero no coloca los datos de llenado entre elementos. En el disco, una matriz dinámica
en un tipo definido por el usuario escrita con Put incluye como prefijo un descriptor cuya
longitud es igual a 2 más 8 veces el número de dimensiones, es decir, 2 + 8 *
63 Juan Carlos Ansaldi - Sept. 2001
Facultad de Ciencias y Tecnología
Informática II UADER
NúmeroDeDimensiones. La longitud del registro especificada por la cláusula Len en la
instrucción Open debe ser mayor o igual que la suma de todos los bytes necesarios para leer los
elementos por separado, incluyendo algunas matrices y sus descriptores.
Para archivos abiertos en modo Binary, tienen vigencia todas las reglas del modo Random, con las
siguientes excepciones:
❏ La cláusula Len de la instrucción Open no tiene efecto. Put escribe todas las variables en el
disco en forma contigua, es decir sin llenado entre registros.
❏ Para una matriz distinta de la indicada en un tipo definido por el usuario, Put escribe solamente
los datos. No escribe ningún descriptor.
❏ Put escribe las cadenas de caracteres de longitud variable que no son elementos de tipos
definidos por el usuario sin el descriptor de longitud de 2 bytes. El número de bytes que se
escribe es igual al número de caracteres de la cadena. Por ejemplo, en las siguientes
instrucciones se escribe 10 bytes en el archivo número 1:
Parte Descripción
númeroarchivo Cualquier número de archivo válido.
númeroregistro El número de registro (en archivos de modo Random) o el número de byte (en
archivos de modo Binary) desde el que se comienza la lectura.
nombrevariable Nombre de una variable válida en la que se colocan los datos.
Observaciones
El primer registro/byte de un archivo se encuentra en la posición 1, el segundo en la posición 2 y
así sucesivamente. Si se omite númeroregistro, se lee el siguiente registro o byte (el que se
❏ Aunque la longitud de la información que se lee sea menor que la especificada en la cláusula
Len en la instrucción Open, Get lee los registros siguientes según los límites de longitud de
registro. El espacio comprendido entre el final de un registro y el principio del siguiente se
llena con el contenido del área de memoria del archivo. Dado que la cantidad de la información
de llenado no puede ser determinada con certeza, es una buena práctica hacer que el registro
tenga la misma longitud que la información que se lee.
❏ Si la variable que se va a leer es una Variant de tipo numérico, Get lee 2 bytes que identifican el
VarType de la Variant y luego los datos que van en la variable. Por ejemplo, cuando se lee una
Variant de VarType 3, Get lee 6 bytes: 2 bytes que identifican la Variant del VarType 3 (Long)
y 4 bytes que contienen los datos del tipo Long. La longitud del registro, especificada por la
cláusula Len en la instrucción Open, debe ser por lo menos 2 bytes mayor que el número
efectivo de bytes requerido para almacenar la variable.
Nota Puede utilizar la instrucción Get para leer una matriz Variant del disco, pero no puede
emplear Get para leer una Variant escalar que contenga una matriz. Tampoco podrá utilizar Get
para leer objetos del disco.
❏ Si la variable que se va a leer es una String Variant (VarType 8), Get lee 2 bytes que identifican
el VarType, 2 bytes que indican la longitud de la cadena de caracteres y luego la propia cadena.
La longitud del registro especificada por la cláusula Len en la instrucción Open debe ser por lo
menos 4 bytes mayor que la longitud efectiva de la cadena.
❏ Si la variante que va a leer es una matriz dinámica, Get lee un descriptor cuya longitud equivale
a 2 más 8 veces el número de dimensiones, es decir, 2 + 8 * NúmeroDeDimensiones. La
longitud del registro especificada por la cláusula Len en la instrucción Open, debe ser mayor o
igual que la suma de todos los bytes necesarios para leer los elementos por separado. Por
ejemplo, la siguiente declaración de matriz requiere 118 bytes cuando la matriz se escribe en
disco.
Los 118 bytes se distribuyen de la siguiente forma: 18 bytes para el descriptor (2 + 8 * 2) y 100
bytes para los datos (5 * 10 * 2).
Si la variable que va a leer es una matriz de tamaño fijo, Get lee solamente los datos. No lee
ningún descriptor.
❏ Si la variable que va a leer es cualquier otro tipo de variable (no una cadena de longitud
variable ni una Variant), Get lee solamente los datos variables. La longitud del registro
especificada por la cláusula Len en la instrucción Open debe ser mayor o igual que la longitud
de los datos que está leyendo.
❏ La longitud del registro especificada por la cláusula Len en la instrucción Open debe ser mayor
o igual que la suma de todos los bytes necesarios para leer cada uno de los elementos,
incluyendo las matrices y sus descriptores.
Ejemplo de la instrucción Get
En este ejemplo se utiliza la instrucción Get para leer datos de un archivo de disco y ponerlos en
una variable. Se supone que PRUEBA es un archivo que contiene cinco registros del tipo definido
por el usuario Record.
Sintaxis: Seek(númeroArchivo)
Para los archivos abiertos en modo de aleatorio, Seek devuelve el número del siguiente registro.
En archivos abiertos en modos distintos del modo aleatorio, Seek devuelve la posición del byte en
la que se ejecuta la siguiente operación. Se presupone que PRUEBA es un archivo que contiene
unas pocas líneas de texto.
Parte Descripción
númeroarchivo Cualquier número de archivo válido.
posición Un número en el intervalo 1 a 2,147,483,647 inclusive, que indica la posición en la
que se debe ejecutar la próxima operación de lectura o escritura.
Observaciones
Si se ejecuta una operación de escritura de archivo después de una instrucción Seek más allá del
fin de un archivo, se extiende el archivo. Si se intenta ejecutar una instrucción Seek en una
posición negativa o cero, se produce un error.
Ejemplo de la instrucción Seek
En este ejemplo se utiliza la instrucción Seek para establecer la posición de la próxima operación
de lectura o escritura a ejecutar en un archivo. Este ejemplo supone que PRUEBA es un archivo
que contiene registros del tipo definido por el usuario Registro.
En archivos abiertos en modo aleatorio, Seek devuelve el número del registro siguiente.
Dim MiRegistro As Record ' Declara una variable.
' Se abre un archivo en modo aleatorio.
Open "PRUEBA" For Random As #1 Len = Len(MiRegistro)
MaxTam = LOF(1) \ Len(MiRegistro) ' Obtiene el número de registros del
archivo.
' Se leen todos los registros empezando con el último.
For NumeroRegistro = MaxTam To 1 Step - 1
Seek #1, NumeroRegistro ' Establece la posición.
Get #1, , MiRegistro ' Lee el registro.
Next NumeroRegistro
Close #1 ' Cierra el archivo.
En archivos abiertos en modos distintos del aleatorio, Seek devuelve la posición de byte en la que
se ejecuta la siguiente operación. Se supone que PRUEBA es un archivo que contiene unas pocas
líneas de texto.
Sintaxis: LOF(númeroarchivo)
El argumento con nombre númeroarchivo es cualquier número de archivo válido.
Observaciones
Para obtener la longitud de un archivo que no está abierto utilice la función FileLen.
Sintaxis: FileLen(nombreRuta)
El argumento con nombre nombreRuta es una expresión de cadena que especifica un nombre de
archivo se puede incluir el directorio o carpeta y la unidad de disco.
Comentarios
Si el archivo especificado está abierto cuando se llama la función FileLen, el valor devuelto
representa el último tamaño de ese archivo cuando se guardó la ultima vez en el disco.
Para obtener la longitud de un archivo abierto, utilice la función LOF.
Sintaxis: EOF(númeroArchivo)
Observaciones
Se utiliza EOF para evitar producir un error al intentar obtener información más allá del fin de un
archivo.La función EOF devuelve False a menos que se haya llegado al fin del archivo; en cuyo
caso devuelve True.
El Control Datos
Utilizando un control Data, podremos comunicarnos con una base de datos para editar, visualizar y
actualizar uno o más registros. Visual Basic permite comunicarse con bases de datos creadas con
Microsoft Access, Microsoft Fox Pro, Borland Paradox, Borland dBase.
Los métodos que se pueden utilizar con un control de datos son: MoveFirst, para posicionarse en
el primer registro. MovePrevious, para posicionarse en el registro anterior. MoveLast, para
posicionarse en el último registro. MoveNext, para posicionarse en el registro siguiente. Refresh,
la base de datos se abre para ser utilizada o, se cierra y se vuelve a abrir si ya estaba abierta.
AddNew, añadir un nuevo registro. Update, se escriben todos los campos editados en la base de
datos. Delete, elimina el registro actual.
Cada vez que se cambie el valor de una propiedad, debe ejecutarse el método Refresh. Otras
propiedades que se podrán consultar son: BOF (comienzo del archivo) esta propiedad es True si el
registro actual es el primero. EOF (final del archivo) que estará a True cuando el registro actual
sea el último.
Un objeto Dynaset es un conjunto dinámico de registros. Cada conjunto de registros tiene asignado
una colección Fields por defecto (conjunto de objetos Field, cada uno de los cuales define un
campo de la base de datos). La propiedad por defecto para un objeto Field, es Value, que contiene
el valor del campo que representa para el registro actual. Para acceder a un miembro individual de
una colección, puede hacerlo a través de un índice o utilizando el nombre del campo. P.e. la
sentencia Print Data1.RecordSet(0) es equivalente, suponiendo que el campo 0 es Título, a las
sentencias:
Print Data1.RecordSet.Fields(0)
Print Data1.RecordSet.Fields(">
¡Transferencia interrumpida!
Data1.RecordSet.Fields("Título").Value
También tiene asociada una propiedad Count que dice cuántos objetos están contenidos en el
objeto Dynaset.
Para poder realizar modificaciones en una base de datos, ésta tiene que ser actualizable, es decir, la
propiedad ReadOnly tiene que estar establecida a False y la propiedad Updatable a True.
La propiedad Attributes indica los atributos de un campo. Para saber si un campo tiene un
determinado atributo, se hará un And con el valor del atributo a verificar. Las constantes DB_...
están definidas en el fichero ...\vb\dataconstant.txt
Reposition. Se produce después de que un determinado registro pase a ser el registro actual. Su
sintaxis es Sub Data1_Reposition()
Validate. Se produce justo antes de que un determinado registro pase a ser el registro actual.
Ocurre antes de una operación Update, Delete o Close. Su sintaxis es Sub Data1_Validate(Action
As Integer, Save As Integer). Para saber la causa que originó el suceso Validate, habrá que
examinar el parámetro Action. Este parámetro se corresponde con el tipo de operación que causó
este suceso. Los valores que puede tomar se pueden localizar en el fichero ...\vb\constant.txt y
empiezan por DATA_ACTION... El parámetro Save toma el valor True si cualquier control ligado
al control de datos cambia. Para saber qué control ha cambiado, habrá que evaluar la propiedad
DataChanged de cada uno de ellos. Durante este suceso, no se podrán utilizar los métodos Move....
En su lugar se utilizará el parámetro Action.
Utilidades Adicionales
Las utilidades adicionales que se pueden utilizar en aplicaciones complejas son:
Control de transacciones. Una transacción es una serie de cambios que se quieren hacer sobre
una base de datos con la posibilidad de deshacerlos. Las tres sentencias de Visual Basic para
BeginTrans
Criterio = "Título Like ‘*1ª Edición*’"
Data1.Recorset.FindFirst Criterio
Do While Not Data1.Recordset.NoMatch
If Not Data1.Recordset.NoMatch Then
Data1.Recordset.Delete ‘Borrar registro
RegsBorrados = RegsBorrados + 1
End If
Data1.Recorset.FindNext Criterio
Loop
If RegsBorrados = 0 Then
RollBack
Exit Sub
End If
Msg = "¿Está seguro que desea borrar " & RegsBorrados & "
registros?"
If MsgBox(Msg, 17, "¿Borrar registros?") <>1 Then
RollBack ‘Deshacer los cambios
Else
CommitTrans ‘Borrar Registros
End If
Métodos UpdateRecord, que guarda valores contenidos en los controles ligados correspondientes
al registro actual. Su ejecución no provoca el suceso Update. Y UpdateControls, que actualiza los
controles ligados con los valores del registro actual. Ambos métodos ejecutan sus acciones sin
cambiar de registro actual.
Suceso Error, que se produce si ocurre un error en tiempo de ejecución. Útil para controlar los
errores. Su sintaxis es: Sub Data1_Error(DataErr As Integer, Response As Integer), donde
DataErr es el nº de error y Response es la respuesta que se desea tomar: 0 continuar, 1 visualizar
mensaje (valor por defecto)
Cada aplicación que puede actuar de fuente DDE tiene un nombre único. Normalmente es el
nombre del fichero ejecutable sin la extensión. Antes de poder establecer una conversación DDE,
es necesario que las dos aplicaciones se estén ejecutando.
Cada vez que la fuente DDE actualiza la información de un control de Visual Basic que actúa
como destino DDE, se genera el evento Change.
El valor de esta propiedad identifica el dato que realmente se va a pasar desde la fuente al destino,
un registro, una hoja de cálculo, una celda, un marcador en Word, etc.
Si ahora se accede a la ventana de Excel y, se introduce un valor en la celda A1, el valor aparecerá
en la caja de texto de Visual Basic.
LinkPoke (introducir)
Es la única forma que tiene un destino DDE de enviar datos a la fuente. Se puede usar para
transferir el contenido de un control destino DDE a la fuente. La sintaxis es:
NombreControl.LinkPoke
LinkRequest (petición)
Se emplea para pedir a la fuente DDE que envíe la información al control, que la actualice. Solo es
necesario si se ha puesto la propiedad LinkMode a 2. Su sintaxis es:
NombreControl.LinkRequest
LinkSend (enviar)
Se emplea cuando se tiene un formulario como fuente DDE y se quiere enviar el contenido de una
caja de figuras a la aplicación destino. La sintaxis es:
NombreCajaFiguras.LinkSend
Terminología OLE
Objeto OLE: Es cualquier dato con el que un control OLE pueda trabajar.
Unidad de datos suministrada por una aplicación Windows que soporta OLE.
Puede ser texto, hojas de cálculo, celdas de una hoja de cálculo, gráficos,... Un control OLE puede
contener solo un objeto cada vez.
Clase OLE: Es la aplicación que produce el objeto OLE. Toda aplicación que soporta OLE, tiene
un único nombre de clase OLE.
Aplicación Cliente o Aplicación Contenedora: Contiene el objeto creado por otra aplicación (el
objeto OLE).
Servidor OLE: Es la aplicación original que ha permitido crear el objeto OLE. A veces se llama
Aplicación Fuente.
ObjetoVinculado: Los datos de un objeto pueden ser vinculados a una aplicación, es decir, pueden
ser añadidos de forma que cuando se modifique el objeto original, se actualizará en todas las
aplicaciones en las que haya sido vinculado ya que sólo existe la copia original de los datos. A este
tipo de objeto también se le suele llamar Enlazado. Un enlace ocupa menos espacio, pero tiene la
desventaja de la potencial pérdida del enlace. Por tanto, solo se mantiene una referencia al objeto.
Objeto Incrustado: Los datos de un objeto pueden incrustarse en una aplicación, de forma que si
cambian en la fuente, el destino no sufrirá ningún cambio. En este caso, cada aplicación tiene una
copia de los datos, independiente del original.
Algunas propiedades del control OLE son: DisplayType (tipo de presentación) permite mostrar la
infomación como un icono. SizeMode (modo de tamaño) permite cambiar la forma en que
aparecerán los datos durante la ejecución. Si su valor es 0 (vbOLESizeClip), se recortarán los
datos. Si se quieren estirar los datos para que ocupen el tamaño actual del control OLE, el valor
será 1 (vbOLESizeStretch). Si se quiere que el control modifique automáticamente de tamaño, el
valor será 2 (vbOLESizeAutoSize). El valor 3 (vbOLESizeZoom) permite que el objeto cambie de
tamaño para rellenar el control contenedor OLE tanto como fuera posible manteniendo las
proporciones. Class, especifica la aplicación que contiene los datos, para un objeto incrustado.
OleType devuelve el estado del objeto (vinculado o incrustado). SourceDoc (documento fuente)
proporciona el nombre del objeto enlazado o el archivo a emplear para los objetos incrustados.
SourceItem (elemento fuente) se emplea en los objetos enlazados para especificar qué parte del
documento enlazado puede trabajar con la aplicación en Visual Basic. Action (acción) especifica
qué se quiere hacer exactamente con el objeto OLE. El control OLE opera de manera similar al
control CommonDialog, en tanto a que la asignación de ciertos valores a esta propiedad produce
que se ejecuten las operaciones asociadas. Se recomienda utilizar los métodos equivalentes, p.e.
CreateLink, CreateEmbed, etc.
Crearemos un nuevo proyecto al que se añadirá un control OLE al formulario. En caja de diálogo
Insertar Objeto, seleccionaremos como tipo de datos a incluir, "Hoja de cálculo de Microsoft
Excel". A continuación, si se ejecutara la aplicación y se hiciera doble clic sobre el objeto OLE,
Excel se arrancaría para poder realizar las modificaciones pertinentes.
Para que al hacer doble clic sobre un objeto contenedor OLE, aparezca el menú de la aplicación
Visual Basic, es necesario definirlo en tiempo de diseño y establecer el valor de la propiedad
NegotiatePosition del menú, a la opción adecuada.
Introducción
Estamos ahora en condiciones de desarrollar un ejemplo en el cual aplicaremos los conocimientos
que hemos adquirido hasta el momento e incorporaremos algunos nuevos que necesitamos para
poder completarlo.
Este ejemplo pretende ser la base para el trabajo final que se desarrollará en la cátedra.
Desarrollo de la aplicación
Comenzaremos creando un nuevo proyecto, el que constará en esta primera etapa de un formulario
y de un módulo.
Lo primero que haremos en nuestro proyecto es presentar en pantalla el valor de una entrada
analógica de una placa de adquisición, el algoritmo de lectura de un valor analógico es
básicamente el siguiente:
Por último, escribimos el código que nos permitirá realizar la adquisición de un valor a través de
los registros de las placa de adquisición
Out pDireccionRegistroControl, 1
Do
bStatus = Inp(pDireccionRegistroStatus)
Loop Until bStatus = 1
Do
bStatus = Inp(pDireccionRegistroStatus)
Loop Until bStatus = 0
Out pDireccionRegistroControl, 1
bByteBajo = Inp(pDireccionByteBajo)
bByteAlto = Inp(pDireccionByteAlto)
bByteAlto = bByteAlto And &HF
iValorLeido = bByteAlto * 256 + bByteBajo
fValorDeTension= iValorLeido * iGanancia/4095
Ahora tenemos el código de nuestro algoritmo en basic, y veremos a continuación como ese código
lo incorporamos a nuestro proyecto en Visual Basic.
1. Crear la interfase
2. Configurar las propiedades
3. Escribir el código
1. Crear la Interfaz
El primer paso para generar una aplicación de Visual Basic consiste en crear los formularios que
van a ser la base de la interfase de su aplicación. Usaremos formularios para agregar ventanas y
cuadros de diálogo a la aplicación.
Nuestra interfase tendrá:
1. Una ventana principal.
2. Un elemento que nos permita presentar el resultado en la pantalla.
3. Un lugar, dentro de nuestro proyecto, en donde “pegar” el código anterior.
4. Un par de funciones que el Vbasic desgraciadamente no trae...
Ahora está en condiciones de dibujar los objetos que van a componer la interfase en el formulario
que ha creado. Para esta primera aplicación, usará tres controles del cuadro de herramientas.
Empezaremos por incorporar una etiqueta (Label) y dos botones (CommandButton) al formulario.
De este modo, con sólo mirar un control sobre el formulario, se está en condiciones de deducir
su nombre.
3. Escribir el código
Si en este momento ejecutamos la aplicación, presionando el botón o F5 el programa comienza a
correr. Vemos que sin haber introducido ni una sola línea de código, tenemos una aplicación
ejecutándose, con una ventana que podemos minimizar o cambiar de tamaño, con cajas de texto
que son sensibles al teclado y a Ctrl+Ins o Shift+Ins y con botones que, aún cuando no hacen
nada, tienen la inteligencia suficiente para responder al click del mouse hundiéndose y elevándose.
Para detener la aplicación presione la cruz de cerrar ventana o terminar en la barra de
herramientas.
Bien, justamente lo que deseamos es que esos botones sí estén en condiciones de responder al click
del mouse ejecutando la tarea que corresponda. Para que esto suceda debemos elegir entre los
eventos que ofrece el objeto botón aquél que mejor se adapta a la tarea que debe ejecutarse, e
incorporar dentro de ese evento nuestras instrucciones en código Basic. Ha llegado el momento de
escribir algunas líneas de programa.
La ventana de código es donde usted escribe el código Basic para su aplicación. Para abrir la
ventana de código, haga doble-click sobre el botón de la aplicación que indica “Adquirir”, o en la
Como se verá, al listado de código original, se le agregó al finalizar una nueva línea:
lblTension.Caption= fValordeTension
Esta nueva línea es la que nos permite ver el valor de la variable fValordeTension en la etiqueta
(label) lblTension.
Si en este momento ejecutamos la aplicación, presionando el botón o F5, nos encontraremos con
un pequeño problema. En Visual Basic, las funciones Out e Inp, que son las que nos permiten leer
y escribir valores en los puertos de I/O de una PC no están implementadas, por lo que deberemos
incorporárcelas.
Por suerte para nosotros no tendremos que escribir estas funciones, pues alguien ya se ha
encargado de ello, solamente tendremos que incorporarlas a nuestro proyecto.
Estas funciones están disponibles en forma de una Librería Dinámica (DLL “Dynamic Link
Library”). Qué es una librería dinámica? Una DLL es un fichero ejecutable de funciones, o
simplemente recursos, tales como bitmap o recursos de fuentes, que puede ser llamada por
cualquier aplicación Windows. La utilización de DLL trae algunas ventajas, como ser la reducción
del código de la aplicación, su actualización independiente de la aplicación, y por sobre todo, la
posibilidad de poder incorporar en nuestra aplicación funciones que nos demandarían una
enormidad de tiempo implementarlas y que ya alguien se encargo de hacerlas. Como
inconveniente, podemos destacar la necesidad de que deben estar presentes en tiempo de
ejecución.
Para incorporar una DLL a nuestra aplicación, lo que debemos hacer es declararla. Esta
declaración la debemos hacer a nivel de módulo, es decir que primeramente agregaremos un nuevo
módulo a nuestra aplicación, el cual llamaremos modPrinc.Bas y incluiremos el siguiente
segmento de código dentro de la sección declaraciones de dicho módulo. Este módulo también nos
servirá para incluir varios procedimientos que crearemos a lo largo de este trabajo.
Nuestra aplicación nos presenta en la pantalla un solo valor de tensión, lo cual no es muy
representativo, por lo que la modificaremos para que nos indique el valor medido en forma
continua.
Para ello, le agregaremos un bucle, de manera de realizar la lectura en forma continua:
Public Sub Adquirir()
Do
Out pDireccionRegistroControl, 1
............................................................
lblTension.Caption=fValordeTension
DoEvents
Loop
End Sub
El problema, es que al agregar este bucle, se realizará continuamente la tarea de leer la placa de
adquisición, no pudiendo realizarse, mientras tanto, ninguna otra tarea.
Es por esta razón, que dentro del bucle hemos agregado la función DoEvents, que cede el control
de la ejecución al sistema operativo, para que éste pueda procesar otros eventos.
Pero, no es más atractivo ver el valor que estamos adquiriendo por medio de un instrumento
virtual? Seguramente que si, por lo tanto, agregemos a nuestra aplicación dicho instrumento...
y listo...
Para implementar esta nueva característica en nuestro sistema, utilizaremos Botones de Opción,
en una estructura llamada matriz (array) de controles.
Tenemos varias formas de incorporar a nuestra aplicación una alarma configurable. Podríamos
ingresar los valores utilizando cuadros de texto, podríamos utilizar botones de opción , lo cual no
sería muy cómodo por la cantidad de botones a crear, y también podíamos utilizar un
“SpinButton”, que es lo que utilizaremos.
Agregemos a nuestro formulario los siguientes controles:
En los eventos SpinDown y SpinUp de los SpinButton debemos escribirle el código que permita
aumentar y disminuir los valores máximos y mínimos de la alarma:
Vemos que estamos ante una situación en la cual se repite el código de los controles utilizados, por
lo que es un caso en el cual deberíamos incluir en nuestra aplicación “array de controles”.
(Para información sobre los parámetros de esta función leer el archivo de ayuda de VBasic).
Control ON-OFF
Desarrollaremos un sencillo control ON-OFF para, por ejemplo, mantener la temperatura de un
líquido utilizando una resistencia.
Si bien nuestra aplicación original incorpora un control del tipo PID, la teoría de control en la cual
se trata este tema, se desarrollará el próximo año, por lo que no lo incorporaremos a nuestra
aplicación. Lo que si queremos rescatar, que su implementación es fácilmente realizable.
La manera en la cual se le
asignaran los valores a estas
variables es similar a la
fTempActual>= utilizada en el caso de las
fSetPoint
+fHisteresis ? alarmas de mx y min., por lo
tanto, el desarrollo de este
Apagar
Calentador punto queda para que ustedes
lo realicen.
Con estas propiedades se puede crear una escala de coordenadas personalizada para dibujar o
imprimir. Por ejemplo, la instrucción ScaleHeight = 100 define la altura interior de como 100
unidades, o la unidad como 1/100 de la altura.
También se puede utilizar la propiedad ScaleMode para definir una escala basada en una unidad de
medida estándar, como twips, puntos, píxels, caracteres, pulgadas, milímetros o centímetros.
Utilizando estas propiedades y las relacionadas ScaleLeft y ScaleTop, puede configurar un sistema
de coordenadas completo, con coordenadas positivas y negativas. Estas cuatro propiedades de
escala se relacionan con la propiedad ScaleMode de la siguiente forma:
Al establecer un valor en cualquier otra propiedad de escala, en ScaleMode se establece
automáticamente 0. Al establecer en ScaleMode un número mayor que 0, ScaleHeight y
ScaleWidth cambian a la nueva unidad de medida, y en ScaleLeft y ScaleTop se establece 0.
Ubicaremos en el formulario los ejes del gráfico cartesiano. Para ello, graficaremos un rectángulo
lleno de color blanco con un borde de color negro, y un ancho de línea de dos puntos.
Para dibujar líneas se utiliza el método Line, cuya sintaxis es:
Hemos representado en
xAnterior<-0 particular este diagrama de flujo,
yAnterior<-0 pues el procedimiento principal
xActual<-1 de graficación de la(s) curvas.
Las variables:
xActual, xAnterior, yAnterior
xActual > deben ser variables de tipo real
Ancho simple y locales.
Gráfico?
La variable fTempActual es
xActual<-0
xAnteriorl<-0 también del tipo real simple pero
es una variable global, ya que
este valor se actualiza en el
Redibujar ejes procedimiento de lectura de la
placa de ADQ.
A continuación codificaremos el
Dibuja Linea desde procedimiento descrito en el
(xAnterior, yAnterior) a
(xActual, fTempActual) diagrama de flujo.
Un archivo esta básicamente compuesto por un número variable de registros formados por un
número constante de campos, los cuales contienen igual tipo de datos.
Veamos la estructura de un registro:
Ahora creemos un “tipo de datos definido por el usuario”. Qué es un tipo definido por el usuario?
Se pueden definir tipos por parte del usuario para crear registros (structs en C, Record en Pascal).
Un registro puede definirse como una colección de datos de diferentes tipos relacionados entre sí.
Para crear un registro se necesita la sentencia Type ... End Type. Esta sentencia solo puede
aparecer en la sección de declaraciones de un módulo estándar y pueden ser declarados como
Private o Public. En nuestro caso lo definiremos de la siguiente manera:
Type tipoParametros
fTempMx as Single
fTempMin as Single
iDireccionBase as Integer
fSentPoint as Single
fHisteresis as Single
End Type
Una vez definido un tipo de datos, se declara la variable con la instrucción Public, teniendo en
cuenta que “las variables que se declaran usando la instrucción Public a nivel de módulo están
disponibles para todos los procedimientos de todos los módulos en todas las aplicaciones”.
En este caso, estamos utilizando un archivo de acceso aleatorio de un solo registro, el cual abrimos
con el comando Open, escribimos con el comando Put y cerramos con el comando Close.
Para leer los valores de los parámetros guardados en el archivo, utilizamos el siguiente segmento
de código.
Los segmentos de código anteriores, los incorporamos a dos nuevos procedimientos llamados:
GrabarParametros y LeerParametros, los cuales creamos dentro del módulo modPrinc, de
manera de poder acceder a ellos desde cualquier parte de la aplicación.
Type tipoDatos
dateHisto As Date
timeHisto as Date
fTempHisto as Single
End Type
En este caso no se trata de un solo registro como vimos anteriormente para guardar los parámetros
de configuración , sino que tendremos un registro por cada valor de temperatura que deseemos
guardar, con lo que el código a escribir no será tan sencillo como en el caso anterior, pero tampoco
muy complicado.
Para generar el archivo y guardar los datos en el, primero actualizaremos los valores de los
campos:
Para poder agregar un nuevo registro al archivo, debemos saber la cantidad de registros que tiene
el mismo. Esto se obtiene dividiendo la cantidad de bytes del archivo por la longitud en bytes del
registro. Para poder hacer esto, primero debemos abrir el archivo, luego calculamos la cantidad de
registros y le sumamos uno. Este número corresponde al número del nuevo registro.
A continuación se representa el código necesario para poder leer los datos del archivo y asignarlos
al vector tduDatosHistoricos()
Una vez que los valores están asignados a dicho vector, se debería completar la aplicación
diseñando la manera de poder ver dichos valores utilizando un nuevo formulario.
También se podría diseñar un nuevo formulario que permita graficar en pantalla los valores de
temperatura históricos ordenados por fecha y hora.
Como verán, las opciones que de ahora en más podemos adicionar son variadas, y en general, las
mismas están basadas en las modificaciones de los procedimientos anteriores.
En la figura 33 vemos el formulario frmAdquisicion en una etapa intermedia del desarrollo de la
aplicación.
Introducción
El control Communications permite agregar tanto una funcionalidad sencilla de comunicaciones
de puerto serie como una funcionalidad avanzada para crear una herramienta de comunicaciones
completa controlada por eventos.
El control Communications proporciona una interfaz con un conjunto estándar de comandos de
comunicaciones. Permite establecer una conexión con un puerto serie, conectar con otro
dispositivo de comunicaciones (por ejemplo, un módem), emitir comandos, intercambiar datos, y
supervisar y responder a varios eventos y errores que pueden producirse durante una conexión
serie.
Propiedades Descripción
CommPort Establece y devuelve el número del puerto de comunicaciones.
Settings Establece y devuelve la velocidad en baudios, la paridad, los bits de datos y los bits
de parada como una cadena.
PortOpen Establece y devuelve el estado de un puerto de comunicaciones. También abre y
cierra un puerto.
El búfer de recepción
Se deb utilizar la propiedad Input para almacenar datos en el búfer de recepción y también para
obtenerlos de él. Por ejemplo, si se desea recuperar datos del búfer de recepción y mostrarlos en un
cuadro de texto, se puede utilizar código como el siguiente:
TxtDisplay.Text = MSComm1.Input
El búfer de transmisión
Se debe utilizar la propiedad Output para enviar comandos y datos al búfer de transmisión.
Al igual que con la propiedad Input, se pueden transmitir los datos como texto o como datos
binarios. Sin embargo, la propiedad Output debe transmitir el texto o los datos binarios mediante
la especificación de una cadena o de un tipo Variant de matriz de bytes.
Como se mencionó anteriormente, las líneas de transmisión deben terminar con un carácter de
retorno de carro (vbCr).
Se pueden controlar el número de bytes del búfer de transmisión mediante la propiedad
OutBufferCount. También se puede borrar el contenido del búfer de transmisión si establece esta
propiedad a 0.
Protocolo
Una de las tareas de la administración de los búferes de recepción y transmisión es asegurar que el
tráfico de datos tenga éxito; por ejemplo, que la velocidad con la que se reciben los datos no
desborde los límites del búfer.
El término protocolo hace referencia al protocolo de comunicaciones interno por el cual se
transfieren los datos del puerto hardware al búfer de recepción. Cuando llega un carácter de datos
al puerto serie, el dispositivo de comunicaciones tiene que llevarlo al búfer de recepción para que
el programa pueda leerlo. Un protocolo de comunicaciones asegura que los datos no se perderán
por un desbordamiento del búfer, lo que puede ocurrir cuando los datos llegan al puerto tan rápido
que el dispositivo de comunicaciones no puede llevarlos al búfer de recepción.
Se puede establecer la propiedad Handshaking para especificar el protocolo de comunicación que
va a utilizar la aplicación. De forma predeterminada, está establecida a comNone (ninguno). Sin
embargo, se puede especificar cualquiera de los protocolos siguientes: