En la solución de los ejercicios se han utilizado los siguientes módulos:
Module Estructuras
Structure FilRandom ' Tipo de usuario
<VBFixedString(15)> Public Nom As String
<VBFixedString(15)> Public Dire As String
<VBFixedString(15)> Public Pobl As String
<VBFixedString(2)> Public Prov As String
<VBFixedString(9)> Public Tele As String
End Structure
Public Structure FilDatosSec
<VBFixedString(15)> Public Nomb As String
<VBFixedString(15)> Public Ape1 As String
<VBFixedString(15)> Public Ape2 As String
<VBFixedString(30)> Public Domic As String
End Structure
End Module
Module Procedimientos
Public Sub AbreFicheros()
' ABRIR FICHEROS
Canal = FreeFile() ' No se puede hacer en la creación
FileOpen(Canal, NomArchivo, OpenMode.Random, OpenAccess.Default, OpenShare.Shared, Len(Reg))
End Sub
Public Sub CreaFichero()
Dim Reg As FilRandom
Dim X As Integer
' Carga de blancos en los campos
Reg.Dire = Space(15)
Reg.Nom = Space(15)
Reg.Pobl = Space(15)
Reg.Prov = " "
Reg.Tele = Space(9)
' Crear registros en blanco
For X = 1 To 20
FilePut(Canal, Reg, X)
Next
Console.WriteLine("Archivo generado.")
Console.ReadKey()
End Sub
Public Sub Grabacion(ByVal Canal As Integer, _
ByVal Reg As FilRandom, ByRef Codigo As String)
Dim Donde As Integer = Val(Codigo) ' el código nos da la posición
FilePut(Canal, Reg, Donde)
Console.WriteLine("Datos grabados, pulse una tecla para seguir")
Console.ReadKey()
End Sub
End Module
Module Funciones
Public Function Respuesta(ByVal Texto) As Boolean
Dim Resp As String
Do ' pregunta recibida desde el programa,
Console.WriteLine(Texto) ' siempre es del tipo S/N
Resp = Console.ReadLine()
Loop Until UCase(Resp) = "S" Or UCase(Resp) = "N"
Respuesta = UCase(Resp) = "S" ' cierto si es afirmativa
End Function
Public Function Ocupado(ByVal Canal As Integer, _
ByRef Reg As FilRandom, _
ByRef Codigo As String) As Boolean
Dim Donde As Integer = Val(Codigo)
Ocupado = True
Try
FileGet(Canal, Reg, Donde)
' Si no son blancos, está ocupado
Ocupado = Reg.Nom <> Space(15)
Catch ex As ArgumentException
End Try
End Function
End Module
Module Principal
Sub Main()
AbreFicheros()
Dim Cual As String
Do
Console.Clear()
Console.WriteLine("1 Crea archivo ")
Console.WriteLine("2 Inserta registro ")
Console.WriteLine("3 Leer registro ")
Console.WriteLine("4 Mantenimiento ")
Console.WriteLine("5 Copiar archivo secuencial ")
Console.WriteLine("6 Listar archivo ")
Console.WriteLine("7 Final ")
Console.WriteLine("Seleccione opción ")
Do
Cual = Console.ReadLine
Loop Until Cual > "0" And Cual < "8"
Select Case CInt(Cual)
Case 1
CreaFichero()
Case 2
InsertarRegistro()
Case 3
LeerRegistro()
Case 4
ProcesoDos()
Case 5
Copia()
Case 6
Listado()
End Select
Loop Until Cual = "7"
End Sub
End Module
1. Realizar la generación de un archivo random con 20 registros de 56 bytes de longitud cada uno.
Desde el menú principal se llama al procedimiento
Case 1
CreaFichero()
2. A partir del diseño que se indica realizar la inserción de un registro en el archivo.
Structure FilRandom ‘ Tipo de usuario
<VBFixedString(15)> Public Nom As String
<VBFixedString(15)> Public Dire As String
<VBFixedString(15)> Public Pobl As String
<VBFixedString(2)> Public Prov As String
<VBFixedString(9)> Public Tele As String
End Structure
El campo código no se graba, el sistema de direccionamiento se entiende que es campo de código como dirección del registro.
El campo código tendrá un valor entre 1 y 20.
Module Grabar
Public Sub InsertarRegistro()
Dim Codigo As String
Do
Console.Clear()
Console.WriteLine("Grabar datos de los amigos.")
Console.WriteLine("Introduce el código del amigo")
Codigo = Console.ReadLine
Select Case Ocupado(Canal, Reg, Codigo)
Case False
With Reg
If Codigo <> "" Then
Console.WriteLine("Introduce el nombre.")
.Nom = Console.ReadLine()
Console.WriteLine("Introduce la dirección.")
.Dire = Console.ReadLine()
Console.WriteLine("Introduce la población.")
.Pobl = Console.ReadLine()
Console.WriteLine("Introduce la provincia.")
.Prov = Console.ReadLine()
Console.WriteLine("Introduce el Teléfono.")
.Tele = Console.ReadLine()
Select Case Respuesta("Los datos son correctos S/N.")
Case True
Grabacion(Canal, Reg, Codigo)
End Select
End If
End With
Case Else
Console.WriteLine("El código {0} ya está útilizado.", Codigo)
Console.ReadKey()
End Select
Loop Until Codigo = ""
End Sub
End Module
Desde el menú principal se ejecuta:
InsertarRegistro()
3. Realizar la lectura de los datos grabados en el ejercicio anterior.
Module Leer
Public Sub LeerRegistro()
Dim Codigo As String
Console.Clear()
Do
Console.WriteLine("Leer los datos de los amigos.")
Console.WriteLine("Introduce el código del amigo")
Codigo = Console.ReadLine
Console.Clear() ' limpiar pantalla
Select Case Ocupado(Canal, Reg, Codigo)
Case True
With Reg
Console.WriteLine("Nombre {0}", .Nom)
Console.WriteLine("Dirección {0}", .Dire)
Console.WriteLine("Población {0}", .Pobl)
Console.WriteLine("Provincia {0}", .Prov)
Console.WriteLine("Teléfono {0}", .Tele)
End With
Case Else
Console.WriteLine("El código {0} no está útilizado.", Codigo)
Console.ReadKey()
End Select
Loop Until Codigo = ""
End Sub
End Module
Desde el menú principal se ejecuta:
LeerRegistro()
4. Realizar un programa que permita altas, bajas y modificaciones en un solo programa.
Module Mantener
Private Function LeerCodigo() As String
Dim Codigo As String
Console.Clear()
Console.WriteLine("Leer los datos de los amigos.")
Console.WriteLine("Introduce el código del amigo")
Codigo = Console.ReadLine
Console.Clear()
LeerCodigo = Codigo
End Function
Private Sub Accion(ByVal Existe As Boolean, ByVal Codigo As String)
Dim Graba As Boolean = False
Dim Modif As Boolean
With Reg
Select Case Existe
Case True ' si existe se visualiza
Console.WriteLine("Nombre {0}", .Nom)
Console.WriteLine("Dirección {0}", .Dire)
Console.WriteLine("Población {0}", .Pobl)
Console.WriteLine("Provincia {0}", .Prov)
Console.WriteLine("Teléfono {0}", .Tele)
Modif = Respuesta("Desea modificarlos S/N ")
End Select
Select Case (Modif And Existe) Or Not Existe
Case True ' si existe y se quiere modificar, o es nuevo
Console.WriteLine("Introduce el nombre.")
.Nom = Console.ReadLine()
Console.WriteLine("Introduce la dirección.")
.Dire = Console.ReadLine()
Console.WriteLine("Introduce la población.")
.Pobl = Console.ReadLine()
Console.WriteLine("Introduce la provincia.")
.Prov = Console.ReadLine()
Console.WriteLine("Introduce el Teléfono.")
.Tele = Console.ReadLine()
Graba = True ' cualquier acción acaba en grabar
Case Else ' si existe y no modifica, desea borrarlos
Select Case Existe And Not Modif
Case True
If Respuesta("Desea borrarlos S/N ") Then
' se cargan a blancos
Reg.Dire = Space(15)
Reg.Nom = Space(15)
Reg.Pobl = Space(15)
Reg.Prov = " "
Reg.Tele = Space(9)
Graba = True ' cualquier acción acaba en grabar
End If
End Select
End Select
' si es alta, baja o modificación
Select Case Graba
Case True
Grabacion(Canal, Reg, Codigo)
End Select
End With
End Sub
Public Sub Proceso()
Dim Codigo As String
Dim Existe As Boolean
' mientras se introduzca un código
Codigo = LeerCodigo()
While Codigo <> ""
Existe = Ocupado(Canal, Reg, Codigo)
Accion(Existe, Codigo)
Codigo = LeerCodigo()
End While
End Sub
End Module
Desde el menú principal se ejecuta:
Proceso()
La opción utilizada en las soluciones está basada en el uso de la consola, donde los recursos son algo más limitados, mientras que en los ejemplos del tema se han planteado desde un entorno gráfico, lo que facilita la creación del ejemplo.
Si tomamos como punto de partida el ejemplo visto en el tema, podría quedar así el ejercicio.
Module Mantener
Private Sub Visualiza()
With Reg
Console.WriteLine("Nombre {0}", .Nom)
Console.WriteLine("Dirección {0}", .Dire)
Console.WriteLine("Población {0}", .Pobl)
Console.WriteLine("Provincia {0}", .Prov)
Console.WriteLine("Teléfono {0}", .Tele)
End With
End Sub
Private Sub Accion(ByVal Existe As Boolean, ByVal Codigo As String)
Dim Graba As Boolean = False
Dim Modif As Boolean
With Reg
Select Case Existe
Case True ' si existe se visualiza
Modif = Respuesta("Desea modificarlos S/N ")
End Select
Select Case (Modif And Existe) Or Not Existe
Case True ' si existe y se quiere modificar, o es nuevo
Console.WriteLine("Introduce el nombre.")
.Nom = Console.ReadLine()
Console.WriteLine("Introduce la dirección.")
.Dire = Console.ReadLine()
Console.WriteLine("Introduce la población.")
.Pobl = Console.ReadLine()
Console.WriteLine("Introduce la provincia.")
.Prov = Console.ReadLine()
Console.WriteLine("Introduce el Teléfono.")
.Tele = Console.ReadLine()
Graba = True ' cualquier acción acaba en grabar
Case Else ' si existe y no modifica, desea borrarlos
Select Case Existe And Not Modif
Case True
If Respuesta("Desea borrarlos S/N ") Then
' se cargan a blancos
Reg.Dire = Space(15)
Reg.Nom = Space(15)
Reg.Pobl = Space(15)
Reg.Prov = " "
Reg.Tele = Space(9)
Graba = True ' cualquier acción acaba en grabar
End If
End Select
End Select
' si es alta, baja o modificación
Select Case Graba
Case True
Grabacion(Canal, Reg, Codigo)
End Select
End With
End Sub
Private Function Control(ByVal Codigo As String) As Boolean
Dim Posicion As Integer
Control = False
Select Case Codigo <> ""
Case True
Posicion = CLng(Codigo)
Select Case Posicion
Case 1 To 20
FileGet(Canal, Reg, Posicion) ' Lectura
Select Case Reg.Nom <> StrDup(15, " ")
Case True ' Ocupado
Visualiza() ' Visualizar datos y esperar
Control = True
Case Else ' Código libre, dejamos que se continúe
End Select ' Campo siguiente
Case Else ' Código fuera de rango
Console.WriteLine("Código fuera de rango")
End Select
Case Else ' Valor inadecuado
Console.WriteLine("Valor del campo incorrecto")
End Select
End Function
Public Sub Proceso()
Dim Codigo As String
Dim Existe As Boolean
' mientras se introduzca un código
Codigo = LeerCodigo()
While Codigo <> ""
Existe = Control(Codigo)
Accion(Existe, Codigo)
Codigo = LeerCodigo()
End While
End Sub
End Module
Como puede verse, de alguna forma hay que introducir los datos, lo que hace que el código no sea todo lo adecuado que podría ser, sin aumentar el volumen del mismo, para no hacerlo excesivamente largo.
5. Copie el diseño del tema de archivos secuenciales del archivo de Amigos, para un archivo Random.
Public Structure FilDatos
Public Codigo As String
Public Nomb As String
Public Ape1 As String
Public Ape2 As String
Public Domic As String
End Structure
Public Structure FilDatosSec
<VBFixedString(15)> Public Nomb As String
<VBFixedString(15)> Public Ape1 As String
<VBFixedString(15)> Public Ape2 As String
<VBFixedString(30)> Public Domic As String
End Structure
6. Copie los datos del archivo secuencial en uno Random, asignándole como posición el código de cada uno de sus amigos.
Module CopiaSecuencial
Private Sub CreaFichero(ByVal Canal As Integer)
Dim Reg As FilDatosSec
Dim X As Integer
' Carga de blancos en los campos
Reg.Nomb = Space(15)
Reg.Ape1 = Space(15)
Reg.Ape2 = Space(15)
Reg.Domic = Space(30)
' Crear registros en blanco
For X = 1 To 20
FilePut(Canal, Reg, X)
Next
Console.WriteLine("Archivo generado.")
Console.ReadKey()
End Sub
Public Sub Copia()
Dim CanSec As Integer
Dim CanRan As Integer
Dim RegSec As FilDatos
Dim RegRan As FilDatosSec
CanSec = FreeFile()
FileOpen(CanSec, "Amigos.sec", OpenMode.Input)
CanRan = FreeFile()
FileOpen(CanRan, "Amigos.ran", OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Shared, Len(RegRan))
CreaFichero(CanRan)
While Not EOF(CanSec)
With RegSec
' lectura del registro secuencial
Input(CanSec, .Codigo)
Input(CanSec, .Nomb)
Input(CanSec, .Ape1)
Input(CanSec, .Ape2)
Input(CanSec, .Domic)
' Copia si es menor de 21
If CInt(.Codigo) < 21 Then
RegRan.Nomb = .Nomb
RegRan.Ape1 = .Ape1
RegRan.Ape2 = .Ape2
RegRan.Domic = .Domic
FilePut(CanRan, RegRan, CInt(.Codigo))
Else ' incidencia, debería hacerse en un archivo
Console.WriteLine("Código {0} fuera de rango .", .Codigo)
Console.ReadKey()
End If
End With
End While
Console.WriteLine("Proceso finalizado")
Console.ReadKey()
FileClose(CanRan)
FileClose(CanSec)
End Sub
End Module
Desde el menú principal se ejecuta:
Copia()
7. Realizar el listado de esos datos en pantalla.
Module Listar
Private Sub Cabecera()
Console.WriteLine("Código Nombre Apellidos ")
Console.WriteLine("_________________________________")
End Sub
Private Sub LineaDetalle(ByVal Codigo As Integer, ByVal Reg As FilDatosSec)
Console.WriteLine(" {0} {1:18} {2:16} {3:16} ", CStr(Codigo), Reg.Nomb, Reg.Ape1, Reg.Ape2)
End Sub
Private Sub Bucle(ByVal CanRan As Integer, _
ByVal Desde As Integer, ByVal Hasta As Integer)
Dim Posicion As Integer ' contador de lectura
Dim RegRan As FilDatosSec
Dim L As Integer ' contador de líneas
Posicion = Desde ' iniciar contador
Console.Clear()
While Posicion <= Hasta
FileGet(Canran, RegRan, Posicion)
Select Case RegRan.Nomb <> Space(15)
Case True ' registro ocupado
If L = 0 Then Cabecera() ' control de cabcera
LineaDetalle(Posicion, RegRan)
L = L + 1
If L > 50 Then L = 0 ' control de cabcera
End Select
Posicion = Posicion + 1 ' Incremento del contador
End While
Console.WriteLine("Listado finalizado")
Console.ReadKey()
End Sub
Public Sub Listado()
Dim Desde As Integer
Dim Hasta As Integer
Dim CanRan As Integer
Dim RegRan As FilDatosSec
CanRan = FreeFile()
FileOpen(CanRan, "Amigos.ran", OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Shared, Len(RegRan))
Console.WriteLine("Indique desde que valor, 1 a 20")
Desde = CInt(Console.ReadLine)
Console.WriteLine("Indique hasta que valor, {0} a 20", Desde)
Hasta = CInt(Console.ReadLine)
Console.WriteLine("Desea realizar el listado S/N ")
Select Case UCase(Console.ReadKey.KeyChar)
Case "S"
Bucle(CanRan, Desde, Hasta)
End Select
FileClose(CanRan)
End Sub
End Module
Desde el menú principal se ejecuta:
Listado()
Síguenos en: Facebook Sobre aulaClic Política de Cookies