Codificación aprenderaprogramar.com: CU00335A
El objetivo de estos ejercicios es aplicar conocimientos sobre "Herramientas básicas para la programación" a un lenguaje como es Visual Basic. Para su realización debemos tener conocimientos básicos sobre algoritmia, uso de bucles o estructuras iterativas y apertura y cierre de archivos. Usaremos conceptos como bucles Do While y EOF ó Is Nothing para leer datos desde archivos.
FINAL DE ARCHIVO CON VISUAL BASIC. EJEMPLO.
En muchos casos no sabemos el número de datos que existen en un archivo y necesitaremos ir extrayendo datos hasta llegar al final del archivo. Para ello vamos a proponer dos opciones:
a) Para versiones menos recientes de Visual Basic usaremos EOF (End Of File). EOF es un parámetro booleano útil para facilitar el cierre de bucles de extracción de datos desde archivo. En Visual Basic EOF es una función que al ser invocada devuelve un valor tipo Integer/Booleano que es 0 (False) mientras extraemos datos que existen desde un archivo y -1 (True) al llegar al final del archivo.
Si se trata de extraer mayor número de datos del que existen en un archivo aparece el error "La entrada de datos ha sobrepasado el final del archivo". Para evitarlo utilizaremos la función EOF con cualquiera de estas sintaxis:
Do While Not EOF(Canal) |
Do While EOF(Canal) = False |
b) Para versiones más recientes de Visual Basic iremos extrayendo datos hasta que al llegar al final de archivo se produzca que la extracción toma el valor predefinido de Visual Basic “Is Nothing” = true. “Is Nothing” es un indicador booleano de que un valor extraído es vacío o sin contenido. Mientras existen datos en el archivo y se van extrayendo Is Nothing valdrá false. Cuando se llegue al final de archivo Is Nothing tomará valor true. La sintaxis será:
Do While extraccion Is Nothing = False |
Donde extraccion simboliza un nombre de variable donde estamos extrayendo los datos leídos desde el archivo.
Consideremos un archivo libros.dat creado previamente donde tenemos 10 datos numéricos.
La extracción de datos hasta llegar a final de archivo se haría de la siguiente manera:
Código (versiones VB menos recientes) | Código (versiones VB más recientes) |
‘Curso VB aprenderaprogramar.com Option Explicit Dim i%, Canal As Integer Dim Dato(50) as Single Private Sub Form_Load() Show LabelResultado = "Datos extraidos de archivo: " Canal = FreeFile Open "C:\libros.dat" For Input As Canal Do While EOF(Canal) = False i = i + 1 Input #Canal, Dato(i) LabelResultado = LabelResultado & Dato(i) & " , " Loop Close End Sub |
REM Curso Visual Basic aprenderaprogramar.com Option Explicit On Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim Dato(50) As Single Dim lineaExtraida As String LabelResultado.Text = "Datos extraidos de archivo: " Dim myFileToRead As New System.IO.StreamReader("C:\Users\Toshiba\Desktop\libros.dat", False) lineaExtraida = myFileToRead.ReadLine() Do While lineaExtraida Is Nothing = False Dato(i) = lineaExtraida LabelResultado.Text = LabelResultado.Text & Dato(i) & " , " i = i + 1 lineaExtraida = myFileToRead.ReadLine() Loop myFileToRead.Close() End Sub End Class |
EJERCICIO USO DE FINAL DE ARCHIVO
Resolver este problema:
En un fichero tenemos las notas de un grupo de alumnos de una clase en un array Nota(1), Nota(2), …, Nota(n), establecidas entre 0 y 10. Se desea desarrollar un programa que determine la nota media extrayendo todos los datos existentes hasta llegar al final de archivo.
Nota: Considerar que el número de datos es igual o inferior a 50.
Vamos a considerar que el archivo con los datos es notas.dat y que contiene los 35 valores siguientes cada uno en una línea (aquí los escribimos separados por guiones para no ocupar 35 líneas):
6 – 7 – 8 – 5 – 6 – 4 – 7 – 8 – 7 – 10 – 0 – 5 – 6 – 7 – 6 – 5 – 0 – 7 – 8 – 10 – 2 – 3 – 4 – 5 – 6 – – 7 – 6 – 5 – 4 – 10 – 4 – 3 – 2 – 3 – 4
Necesitamos conocer la ruta donde está ubicado el archivo e indicarla correctamente.
SOLUCIÓN
Código (versiones VB menos recientes) | Código (versiones VB más recientes) |
'Curso VB aprenderaprogramar.com '[Media con Fin de Archivo] Option Explicit Dim i%, Canal As Integer Dim Nota(50) As Single Dim Media!, Suma As Single Private Sub Form_Load() Show Form1.Caption = "Media con lectura hasta fin de archivo" Canal = FreeFile Open "C:\notas.dat" For Input As Canal Do While EOF(Canal) = False i = i + 1 Input #Canal, Nota(i) Suma = Suma + Nota(i) Loop Close Media = Suma / i LabelResultado.Alignment = 2 LabelResultado.FontBold = True LabelResultado = "La nota media de la clase es " & Media End Sub |
REM Curso Visual Basic aprenderaprogramar.com Option Explicit On Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim Nota(50) As Single Dim lineaExtraida As String Dim Media, Suma As Single Me.Text = "Media con lectura datos hasta fin de archivo" Dim myFileToRead As New System.IO.StreamReader("C:\Users\Toshiba\Desktop\notas.dat", False) lineaExtraida = myFileToRead.ReadLine() Do While lineaExtraida Is Nothing = False i = i + 1 Nota(i) = lineaExtraida Suma = Suma + Nota(i) lineaExtraida = myFileToRead.ReadLine() Loop myFileToRead.Close() Media = Suma / i LabelResultado.TextAlign = ContentAlignment.MiddleCenter LabelResultado.Font = New Font("Arial", 10, FontStyle.Bold) LabelResultado.Text = "La nota media de la clase es " & Media End Sub End Class |
El resultado del programa: