Sin título de diapositiva

Anuncio
Algoritmos y Programación
Clase 7
„
TDU (Tipos de datos Definidos por el Usuario)
„
Manejo de Archivos
1
Repaso: Tipos de Datos
„
„
„
Las variables son marcadores de posición que se
utilizan para almacenar valores; tienen un nombre
y un tipo de dato.
El tipo de dato determina la clase de datos que
pueden almacenar las variables: numéricos (Byte,
Integer, Long, Single, Double, Currency),
alfanuméricos (String), lógicos (Boolean), otros
(Variant, Date, Object, etc.).
Una variable Variant es capaz de almacenar
todos los tipos de datos definidos en el sistema. 2
Clase 7
Repaso: Tipos de Datos
„
„
„
De forma predeterminada, si no se proporciona un
tipo de dato o no se declara, la variable toma el
tipo de dato Variant.
Variant
El valor por defecto de una variable del tipo
Variant es Empty
Las variables de tipo String pueden ser de
longitud variable o de longitud fija:
„
„
Dim variable As String
Î Longitud variable
Dim variable As String*tamaño Î Longitud fija
3
Clase 7
Repaso: Tipos de Datos
„
„
Para evitar problemas al equivocarse de nombre
en las variables, puede estipular que Visual Basic
le avise siempre que encuentre un nombre que no
se haya declarado explícitamente como una
variable incluyendo en la sección Declaraciones
del módulo de formulario o estándar la
instrucción:
Option Explicit
Es este caso, VB generará un error cuando
encuentre una variable no declarada.
4
Clase 7
Repaso: Tipos de Datos
„
„
La asignación de datos a variables se realiza
mediante el operador de asignación (=):
Dim A As Integer
A = 20
Si la variable es un objeto, se debe anteponer la
palabra clave Set antes de la asignación:
Dim txt As TextBox
Text1 es un
Set txt = Text1
objeto en la
Clase 7
interfaz
gráfica
5
Crear tipos de datos: TDU
„
Se pueden combinar variables de varios tipos
diferentes para crear tipos definidos por el usuario
(conocidos como TDU).
„
Los tipos definidos por el usuario son útiles si se
quiere crear una única variable que registre varias
unidades de información relacionadas.
Para crear un TDU se utiliza la instrucción Type
en la sección Declaraciones del módulo.
„
6
Clase 7
Crear tipos de datos: TDU
„
La sintaxis de la instrucción Type es:
Alcance Type NombreTDU
Elemento1 As Tipo
Elemento2 As Tipo
...
ElementoN As Tipo
End Type
„
Alcance: Opcional. Es el alcance del tipo de dato. Puede
ser Private o Public.
Public Si no se especifica se asume
Public.
Public
7
Clase 7
Crear tipos de datos: TDU
„
NombreTDU: Requerido. Es el nombre del tipo de dato.
„
Elemento1, Elemento2, …, ElementoN: Son los nombres de
los elementos del TDU. Debe existir al menos uno.
„
Tipo: Corresponde a un tipo de dato del sistema u otro
TDU previamente definido.
„
Si un TDU tiene un alcance privado (Private),
Private sólo se
puede utilizar en el módulo donde está definido.
8
Clase 7
Crear tipos de datos: TDU
„
Si un TDU tiene un alcance público (Public),
Public se puede
utilizar en cualquier parte.
„
Los módulos de formulario (archivos *.frm) sólo pueden
tener declaraciones TDU y variables TDU privadas.
„
Los módulos estándar (archivos *.bas) pueden tener
declaraciones TDU y variables TDU privadas o públicas.
„
Los elementos del TDU pueden ser “variables normales”,
arreglos u otro TDU.
9
Clase 7
Crear tipos de datos: TDU
„
Para acceder a un elemento de un TDU se usa el
operador punto:
variableTDU.elemento
„
Asignar y recuperar los valores de los elementos
de una variable TDU es similar a establecer y
obtener propiedades:
variableTDU.elemento = valor
„
También puede asignar una variable a otra si
ambas son del mismo TDU:
variable1TDU = variable2TDU
Clase 7
10
Crear tipos de datos: TDU
„
Una vez que se define un TDU, éste entra a
formar parte de los tipos de datos disponibles en
el proyecto:
11
Clase 7
Ejemplo 1
„
Para un conjunto de puntos (x, y), contar
cuántos están sobre el origen, el eje x, el
eje y, el primer cuadrante, el segundo
cuadrante, el tercer cuadrante y el cuarto
cuadrante.
12
Clase 7
Ejemplo 1:
Definición de variables
„
Datos de entrada:
„
„
„
N Î Número de puntos
Pi Î Elemento i-ésimo del vector de puntos.
Cada punto tiene un valor X y un valor Y
Datos de salida:
„
„
„
Origen Î Número de puntos sobre el origen
EjeX Î Número de puntos sobre el eje X
EjeY Î Número de puntos sobre el eje Y
13
Clase 7
Ejemplo 1:
Definición de variables
„
„
„
„
Cuad1 Î Número de puntos sobre el primer
cuadrante
Cuad2 Î Número de puntos sobre el
segundo cuadrante
Cuad3 Î Número de puntos sobre el tercer
cuadrante
Cuad4 Î Número de puntos sobre el cuarto
cuadrante
14
Clase 7
Ejemplo 1: Código fuente
'(en General-Declaraciones)
Option Explicit 'Requerir declaración de variables
'Declaración del TDU Punto
Private Type Punto
X As Single
Y As Single
End Type
'Declaración de variables
Dim N As Integer, P() As Punto
Dim I As Integer, Origen As Integer
Dim EjeX As Integer, EjeY As Integer
Dim Cuad1 As Integer, Cuad2 As Integer
Dim Cuad3 As Integer, Cuad4 As Integer
15
Clase 7
Ejemplo 1: Código fuente
'(en el evento Click de un CommandButton)
'Inicialización de variables
Origen = 0
EjeX = 0: EjeY = 0
Cuad1 = 0: Cuad2 = 0
Cuad3 = 0: Cuad4 = 0
'Lectura de datos
N = Val(InputBox("Ingrese el número de Puntos:"))
ReDim P(1 To N)
For I = 1 To N
P(I).X = Val(InputBox("X(" & I & ") ="))
P(I).Y = Val(InputBox("Y(" & I & ") ="))
Next I
16
Clase 7
Ejemplo 1: Código fuente
'Cálculos
For I = 1 To N
If P(I).X = 0 And P(I).Y = 0
Origen = Origen + 1
ElseIf P(I).Y = 0 Then
EjeX = EjeX + 1
ElseIf P(I).X = 0 Then
EjeY = EjeY + 1
ElseIf P(I).X > 0 And P(I).Y
Cuad1 = Cuad1 + 1
ElseIf P(I).X < 0 And P(I).Y
Cuad2 = Cuad2 + 1
ElseIf P(I).X < 0 And P(I).Y
Cuad3 = Cuad3 + 1
Else
Cuad4 = Cuad4 + 1
End If
Next I
Then
> 0 Then
> 0 Then
< 0 Then
Clase 7
17
Ejemplo 1: Código fuente
'Mostrar resultados
Dim Aux As String
Aux = Aux & "Origen = " & Origen & vbCrLf
Aux = Aux & "EjeX = " & EjeX & vbCrLf
Aux = Aux & "EjeY = " & EjeY & vbCrLf
Aux = Aux & "Cuad1 = " & Cuad1 & vbCrLf
Aux = Aux & "Cuad2 = " & Cuad2 & vbCrLf
Aux = Aux & "Cuad3 = " & Cuad3 & vbCrLf
Aux = Aux & "Cuad4 = " & Cuad4 & vbCrLf
Text1.Text = Aux
18
Clase 7
Manejo de Archivos
„
„
Un archivo es un conjunto de datos relacionados
ubicados en un disco.
Dependiendo del tipo de datos que contiene el
archivo, se usa el tipo de acceso apropiado. En
VB hay tres tipos de acceso a archivos:
„
„
„
Secuencial:
Secuencial para leer y escribir archivos de texto en
bloques continuos.
Aleatorio:
Aleatorio para leer y escribir archivos binarios de texto
o estructurados como registros de longitud fija.
Binario:
Binario para leer y escribir archivos estructurados de
forma arbitraria.
19
Clase 7
Manejo de Archivos
„
„
„
El tipo de acceso a archivos que se utilizará en
este curso es el tipo de acceso secuencial.
secuencial
El acceso secuencial está diseñado para usarlo
con archivos de texto normales como los archivos
creados con un editor de textos típico (como el
Bloc de Notas).
Un archivo abierto para acceso secuencial permite:
„
„
„
Leer datos desde el archivo (Input)
Escribir datos en el archivo (Output)
Anexar datos en el archivo (Append)
20
Clase 7
Instrucción Open
„
Para abrir un archivo para acceso secuencial, se usa la
instrucción Open.
Open
„
Sintaxis:
Open archivo For modo As #numArchivo
archivo:
archivo Requerido. Expresión de cadena que especifica
un nombre de archivo; puede incluir el directorio o carpeta
y la unidad de disco.
modo:
modo Requerido. Palabra clave que especifica el modo de
archivo: Input (Lectura), Output (Escritura), Append
(Escritura, agregando datos)
„
„
21
Clase 7
Instrucción Open
„
#numArchivo:
#numArchivo Requerido. Un número de archivo válido
entre 1 y 511 inclusive. El carácter # es opcional. Para
obtener el siguiente número de archivo disponible se
utiliza la función FreeFile.
FreeFile
„
Si la ruta del archivo no se incluye en archivo,
archivo VB
buscará el archivo en el directorio actual.
El directorio actual, inicialmente, es la carpeta desde
donde se ejecuta la aplicación.
Para cambiar el directorio actual se utiliza la instrucción
ChDir.
ChDir
„
„
22
Clase 7
Instrucción Open
„
Cuando se abre un archivo secuencial en modo Input,
Input el
archivo ya debe existir; de lo contrario se produce un error.
„
Cuando se abre un archivo que no existe en modo
Output o Append,
Append la instrucción Open primero crea el
archivo y luego lo abre.
„
Para cerrar un archivo abierto con la instrucción Open se
utiliza la instrucción Close.
Close
23
Clase 7
Función FreeFile
„
Devuelve un tipo Integer que indica el siguiente número de
archivo disponible para su uso en la instrucción Open.
Open
„
Sintaxis:
„
FreeFile(numIntervalo)
numIntervalo:
numIntervalo Opcional. Un valor entero 0 o 1.
„
„
Si numIntervalo es 0 (predeterminado), FreeFile
devuelve un número de archivo entre 1 y 255, inclusive.
Si numIntervalo es 1, FreeFile devuelve un número
de archivo entre 256 y 511.
24
Clase 7
Instrucción Close
„
„
„
„
Cierra un archivo secuencial abierto con la instrucción
Open.
Open
Sintaxis:
Close #numArchivo
#numArchivo:
#numArchivo Opcional. Es cualquier número de archivo
válido. El carácter # es opcional. Si se omite, Close cierra
todos los archivos abiertos con la instrucción Open.
Open
Se pueden cerrar varios archivos separando cada numero
de archivo con una coma en la misma instrucción Close.
Close
25
Clase 7
Instrucción ChDir
„
„
„
„
Cambia el directorio o carpeta actual.
Sintaxis:
ChDir ruta
ruta:
ruta Requerido. Un String que identifica el directorio o
carpeta que va a ser el nuevo directorio o carpeta actual.
Si no existe se genera un error.
La ruta puede incluir la unidad de disco. Si no se
especifica la unidad, la instrucción ChDir cambia el
directorio de la unidad actual.
26
Clase 7
Instrucción ChDrive
„
„
„
„
„
Cambia la unidad de disco actual.
Sintaxis:
ChDrive unidad
unidad:
unidad Requerido. Un String que especifica una unidad
de disco existente.
Si unidad es una cadena de longitud cero (""), la unidad
de disco actual no cambia.
Si unidad no existe se genera un error.
27
Clase 7
App.Path
„
„
„
La propiedad Path del objeto App (objeto global que
guarda información de la aplicación) devuelve un String
con la ruta de acceso desde donde se está ejecutando la
aplicación.
App.Path especifica la ruta de acceso del archivo .vbp de
proyecto cuando se ejecuta la aplicación desde el entorno
de desarrollo, o la ruta de acceso del archivo .exe cuando
se ejecuta la aplicación como un archivo ejecutable.
Utilice la instrucción ChDir App.Path para cambiar la
carpeta actual al directorio de ejecución de la aplicación.
28
Clase 7
Lectura y escritura de datos
„
Para leer datos desde un archivo secuencial se
puede utilizar:
„
„
„
„
La instrucción Input #
La instrucción Line Input #
La función Input()
Para escribir datos en un archivo secuencial se
puede utilizar:
„
„
La instrucción Print #
La instrucción Write #
29
Clase 7
Instrucción Input #
„
„
„
„
Lee datos de un archivo secuencial abierto y asigna esos
datos a variables.
Sintaxis:
Input #numArchivo, listaVariables
numArchivo:
numArchivo Requerido. Cualquier número de archivo
válido.
listaVariables:
listaVariables Requerido. Lista de variables
delimitada por comas que se le asignan los valores que se
leen del archivo.
30
Clase 7
Instrucción Input #
„
Las variables a leer con la instrucción Input # no pueden
ser una matriz o una variable de objeto. Sin embargo, es
posible usar variables que describen elementos de una
matriz o de un tipo definido por el usuario.
„
Los elementos de 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.
31
Clase 7
Instrucción Input #
„
„
„
„
Si una variable es numérica y los datos no lo son, se
asigna un valor cero a esa variable.
Si se llega al fin del archivo cuando se está leyendo un
elemento de datos, se da por terminada la entrada y se
produce un error.
La instrucción Input # ignora las comillas dobles ("") en
la entrada de datos.
Esta instrucción reconoce como separador válido de datos
a la coma (,) y al Enter. Otro separador puede producir
resultados inesperados.
32
Clase 7
Función EOF
„
„
„
„
Devuelve un tipo Boolean que indica si se llegó al final de
un archivo abierto.
Sintaxis:
EOF(numArchivo)
numArchivo:
numArchivo Requerido. Un número de archivo válido.
La función EOF devuelve True cuando se llega al final del
archivo en caso contrario devuelve False.
False
33
Clase 7
Instrucción Print #
„
„
„
„
„
Escribe datos en un archivo secuencial.
Sintaxis:
Print #numArchivo, exp poscar
#numArchivo:
#numArchivo Requerido. Un número de archivo válido.
El carácter # es obligatorio.
exp:
exp Opcional. La expresión a escribir en el archivo.
poscar:
poscar Opcional. Especifica el punto de inserción del
carácter siguiente. Si se omite, el siguiente carácter se
imprime en la línea siguiente.
34
Clase 7
Instrucción Print #
„
Utilice un punto y coma (;) en poscar para situar el punto
de inserción inmediatamente a continuación del último
carácter mostrado. Utilice una coma (,) ó Tab para situar
el punto de inserción al principio de la siguiente zona de
impresión.
„
La instrucción Print # no escribe comillas dobles
alrededor de una expresión de tipo String.
35
Clase 7
Ejemplo 2
El archivo “Datos.txt” contiene varios registros con los
siguientes datos de estudiantes: sexo (“M”, “F”), edad
([14, 35]), código de la comuna donde vive ([1, 16]).
Elaborar un programa en VB que efectúe los siguientes
procesos:
„ Leer todos los registros de datos.
„ Calcular el total y el porcentaje de mujeres y de
hombres.
„ Calcular el total y el porcentaje de los mayores de
edad y de los menores de edad.
„ Determinar el porcentaje de los estudiantes que viven
en las comunas de código impar pero distinto de 3.
36
Clase 7
Ejemplo 2:
Definición de variables
„
Datos de entrada:
„
„
Ei Î Registro i-ésimo de un estudiante.
Cada registro tiene:
- Un elemento Sexo de tipo String
- Un elemento Edad de tipo Integer
- Un elemento CodComuna de tipo Integer
Datos de salida:
„
„
„
„
NumH Î Número total de Hombres
NumM Î Número total de Mujeres
PorcH Î Porcentaje de Hombres
PorcM Î Porcentaje de Mujeres
37
Clase 7
Ejemplo 2:
Definición de variables
„
„
„
„
„
„
MenE Î Número de menores de edad
MayE Î Número de mayores de edad
PorcMenE Î Porcentaje de menores de edad
PorcMayE Î Porcentaje de mayores de edad
PorcImpar Î Porcentaje de estudiantes que viven en
comunas de código impar y distinto de 3.
Variables auxiliares:
„
„
N Î Contador de estudiantes
NumImpar Î Número de estudiantes que viven en
comunas de código impar y distinto de 3.
38
Clase 7
Ejemplo 2: Código fuente
'(en un módulo estándar)
'Requerir declaración de variables
Option Explicit
'Declaración del TDU Estudiante
Public Type Estudiante
Sexo As String * 1
Edad As Integer
CodComuna As Integer
End Type
'Declaración de variables globales
Dim N As Integer, E() As Estudiante, NumH As Integer
Dim NumM As Integer, PorcH As Single, PorcM As Single
Dim MenE As Integer, MayE As Integer
Dim PorcMenE As Single, PorcMayE As Single
39
Dim PorcImpar As Single, NumImpar As Integer
Clase 7
Ejemplo 2: Código fuente
'(en el evento Click de un CommandButton)
ChDrive App.Path
'Cambiamos el drive actual
ChDir App.Path
'Cambiamos el directorio actual
'Abrimos el archivo
Dim NumArch As Integer
NumArch = FreeFile()
Open "Datos.txt" For Input As #NumArch
'Leer datos mientras no sea el final del archivo
N = 0
Do While Not EOF(NumArch)
N = N + 1
ReDim Preserve E(1 To N)
Input #NumArch, E(N).Sexo, E(N).Edad, E(N).CodComuna
Loop
40
Close #NumArch
Clase 7
Ejemplo 2: Código fuente
'Cálculos
NumH = 0: NumM = 0: MenE = 0: MayE = 0: NumImpar = 0
Dim I As Integer
For I = 1 To N
If E(I).Sexo = "M" Then: NumH = NumH + 1
Else: NumM = NumM + 1: End If
If E(I).Edad < 18 Then: MenE = MenE + 1
Else: MayE = MayE + 1: End If
If E(I).CodComuna Mod 2 = 1 And _
E(I).CodComuna <> 3 Then NumImpar = NumImpar + 1
Next I
PorcH = NumH / N: PorcM = NumM / N
PorcMenE = MenE / N: PorcMayE = MayE / N
PorcImpar = NumImpar / N
41
Clase 7
Ejemplo 2: Código fuente
'Mostrar resultados
Dim Aux As String
Aux = Aux & "NumH = " & NumH & vbCrLf
Aux = Aux & "NumM = " & NumM & vbCrLf
Aux = Aux & "PorcH = " & PorcH & vbCrLf
Aux = Aux & "PorcM = " & PorcM & vbCrLf
Aux = Aux & "MenE = " & MenE & vbCrLf
Aux = Aux & "MayE = " & MayE & vbCrLf
Aux = Aux & "PorcMenE = " & PorcMenE & vbCrLf
Aux = Aux & "PorcMayE = " & PorcMayE & vbCrLf
Aux = Aux & "PorcImpar = " & PorcImpar & vbCrLf
I = FreeFile()
Open "Resultados.txt" For Output As #I
Print #I, Aux
Close #I
42
Clase 7
Tarea
„
Tomar el primer punto del parcial pasado,
realizar el algoritmo usando TDU y
programarlo, utilizando un conjunto de datos
creados por ustedes.
43
Clase 7
Algoritmos y Programación
Clase 7
„
TDU (Tipos de datos Definidos por el Usuario)
„
Manejo de Archivos
44
Instrucción Line Input #
„
Lee una línea de un archivo secuencial abierto y la asigna
a una variable String.
„
Sintaxis:
Line Input #numArchivo, variable
„
numArchivo:
numArchivo Requerido. Cualquier número de archivo
válido. El carácter # es obligatorio.
„
variable:
variable Requerido. Una variable de tipo String.
45
Clase 7
Instrucción Line Input #
„
La instrucción Line Input # lee un carácter en el archivo
hasta que encuentra un retorno de carro (ASCII 13) o una
secuencia retorno de carro-avance de línea (ASCII 13 –
ASCII 10) y luego almacena en variable los caracteres
leídos.
„
Las secuencias de retorno de carro-avance de línea no se
tienen en cuenta y no se añaden a la cadena de
caracteres.
46
Clase 7
Función Input
„
Devuelve un tipo String que contiene caracteres de un
archivo abierto en modo Input.
Input
„
Sintaxis:
Input(numCar, #numArchivo)
„
numCar:
numCar Requerido. Un entero correspondiente al número
de caracteres a leer.
„
#numArchivo:
#numArchivo Requerido. Un número de archivo válido.
El carácter # es opcional.
47
Clase 7
Función Input
„
„
„
A diferencia de la instrucción Input #, la función Input
devuelve todos los caracteres que lee, incluyendo puntos
y coma, retornos de carro, avances de línea, comillas y
espacios iniciales.
Para leer todo el contenido del archivo, utilice la función
LOF para determinar el número de caracteres que tiene el
archivo.
LOF(numArchivo)
numArchivo Î Devuelve un tipo Long que indica
el número de caracteres de un archivo abierto mediante la
instrucción Open.
Open
48
Clase 7
Instrucción Write #
„
„
„
„
Escribe datos en un archivo secuencial.
Sintaxis:
Write #numArchivo, listaExp poscar
#numArchivo:
#numArchivo Requerido. Un número de archivo válido.
El carácter # es obligatorio.
listaExp:
listaExp Opcional. Una o varias expresiones
delimitadas por comas, espacios o puntos y comas (;) que
se desean escribir en el archivo. La instrucción Write #
imprime una coma en el archivo por cada expresión que
se escriba en el archivo y comillas dobles alrededor de
expresiones de tipo String.
49
Clase 7
Instrucción Write #
„
poscar:
poscar Opcional. Especifica el punto de inserción del
carácter siguiente. Puede ser una coma (,) o un punto y
coma (;). Si se omite, el siguiente carácter se imprime en
la línea siguiente.
„
poscar igual a una coma (,) tiene el mismo efecto que
poscar igual a un punto y coma (;): situar el punto de
inserción inmediatamente a continuación del último
carácter mostrado, separando los datos por una coma en
el archivo.
50
Clase 7
Descargar