Codificación aprenderaprogramar.com: CU00330A
EJERCICIO Nº 1 EJEMPLO RESUELTO LEER FICHERO EN VISUAL BASIC.
Crear el código que dé respuesta al siguiente problema planteado: Un operario de una fábrica recibe cada cierto tiempo un depósito cilíndrico de dimensiones variables, que debe llenar de aceite a través de una toma con cierto caudal disponible. Se desea crear un programa que le indique cuánto tiempo transcurrirá hasta el llenado del depósito.
El caudal disponible se considera estable para los tiempos que tardan los llenados de depósitos y se encuentra almacenado en un archivo del ordenador, figurando el dato en litros por minuto.
Nota: considerar que el caudal disponible se encuentra en el archivo caudal.dat. Suponer que el archivo caudal.dat se encuentra en la unidad de disco C: (o en aquella ruta que se prefiera), y que el valor de caudal disponible en litros por minuto que proporciona es 112.
SOLUCIÓN
Antes de ejecutar el programa habremos creado el archivo caudal.dat que contendrá un número que representa el valor de caudal.
El código a plantear será diferente según la versión de Visual Basic que estemos utilizando:
a) Para versiones menos recientes de Visual Basic: usaremos la gestión de ficheros basada en las instrucciones Open, Write, Freefile, Write#, Input#, etc.
b) Para las versiones más recientes de Visual Basic usaremos la gestión de ficheros basada en StreamReader, StreamWriter, Write, Read, WriteLine y ReadLine.
Nosotros vamos a exponer el código necesario tanto para versiones menos recientes como para versiones más recientes de Visual Basic (aunque dependiendo de la versión de Visual Basic que estés utilizando es posible que necesites hacer pequeñas adaptaciones).
Comenzaremos creando un nuevo proyecto al que añadiremos tres labels (los dos primeros para indicar un mensaje de petición de datos de diámetro y altura y el tercero para mostrar resultados), dos textbox para que el usuario introduzca los datos de diámetro y altura, y finalmente un botón que el usuario deberá pulsar una vez introducidos los datos para obtener los resultados.
Código para versiones menos recientes de Visual Basic:
Rem Curso Visual Basic aprenderaprogramar.com Option Explicit Const Pi As Single = 3.141592654 Dim D!, R!, H!, V!, Vlitros!, tminutos As Single Dim Canal% Dim Q As Single Private Sub Form_Load() Form1.Caption = "Tiempo de llenado" CommandCalcular.Caption = "Determinar tiempo" Label1 = "Introduzca aquí el diámetro del depósito, en metros" Label2 = "Introduzca aquí la altura del depósito, en metros" '[Extracción de dato de caudal del archivo] Canal = FreeFile Open "C:\caudal.dat" For Input As Canal Input #Canal, Q Close Canal End Sub Private Sub CommandCalcular_Click() D = Val(Text1) H = Val(Text2) R = D / 2 V = Pi * (R ^ 2) * H Vlitros = V * 1000 tminutos = Vlitros / Q Label3.Alignment = 2 Label3.FontBold = True Label3 = vbCrLf & "El tiempo que transcurrirá hasta el" & _ " llenado del depósito es de " & tminutos & " minutos" End Sub |
Gráficamente el resultado será similar a este:
Código para versiones más recientes de Visual Basic:
REM Curso Visual Basic aprenderaprogramar.com Option Explicit On Public Class Form1 Const Pi As Single = 3.141592654 Dim D, R, H, V, Vlitros, tminutos As Single Dim Q As Single Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "Tiempo de llenado" CommandCalcular.Text = "Determinar tiempo" Label1.Text = "Introduzca aquí el diámetro del depósito, en metros" Label2.Text = "Introduzca aquí la altura del depósito, en metros" '[Extracción de dato de caudal del archivo] Dim myFileToRead As New System.IO.StreamReader("C:\Users\Toshiba\Desktop\caudal.dat", False) Q = myFileToRead.ReadLine() myFileToRead.Close() End Sub Private Sub CommandCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CommandCalcular.Click D = Val(TextBox1.Text) H = Val(TextBox2.Text) R = D / 2 V = Pi * (R ^ 2) * H Vlitros = V * 1000 tminutos = Vlitros / Q Label3.Font = New Font("Arial", 10, FontStyle.Bold) Label3.TextAlign = ContentAlignment.MiddleCenter Label3.Text = vbCrLf & "El tiempo que transcurrirá hasta el" & _ " llenado del depósito es de " & tminutos & " minutos" End Sub End Class |
Gráficamente el resultado será similar a este:
EJERCICIO Nº 2 EJEMPLO CON LECTURA DE DATOS DE FICHERO Y USO DE BUCLES FOR Y CONDICIONALES IF THEN
Crear el código correspondiente a este problema. Se ha procedido a realizar un conteo de los coches que han pasado por una vía durante 24 horas. Los resultados se encuentran almacenados en un archivo, en un array definido como cocheshora(1), cocheshora(2)... hasta cocheshora(24) indicando el localizador la hora del día y el contenido de la variable la cantidad de coches que pasaron a esa hora. Se desea desarrollar el pseudocódigo y el diagrama de flujo para un programa que determine:
a) El total de coches que pasaron durante el día.
b) Cuántas horas de tránsito cero hubo y cuáles fueron.
c) Cuál fue la hora de máximo tránsito y qué número de coches pasaron.
d) Cuál fue la última hora a la que pasó un coche y qué número de coches pasaron.
Para simular los datos contenidos en el archivo desde el que ha de leer el programa, crearemos un archivo (usando Visual Basic o manualmente) en la ruta C:\coches1523.dat, ó en aquella ruta que deseemos, cuyo contenido será el siguiente:
SOLUCIÓN AL EJERCICIO
Código para versiones menos recientes de Visual Basic:
Rem Curso Visual Basic aprenderaprogramar.com Option Explicit Dim Canal%, i As Integer Dim cocheshora(24) As Integer Dim Cochestotal%, Transitocero%, Maxtransito%, Horamaxtran As Integer Dim Ultimahora%, Cochesultima As Integer Private Sub Form_Load() Form1.Caption = "Coches" CommandCalcular.Caption = "Leer archivo" End Sub Private Sub CommandCalcular_Click() LabelResultados.Alignment = 2 LabelResultados.FontBold = True '[Apertura del archivo] Canal = FreeFile Open "C:\coches1523.dat" For Input As Canal For i = 1 To 24 '[Lectura de datos desde archivo] Input #Canal, cocheshora(i) Cochestotal = Cochestotal + cocheshora(i) If cocheshora(i) = 0 Then Transitocero = Transitocero + 1 LabelResultados = LabelResultados & "La hora " & i & " hubo tránsito cero" & vbCrLf & vbCrLf End If If cocheshora(i) > Maxtransito Then Maxtransito = cocheshora(i) Horamaxtran = i End If If cocheshora(i) > 0 Then Ultimahora = i Cochesultima = cocheshora(i) End If Next i Close Canal '[Cerramos el archivo] LabelResultados = LabelResultados & "El total de coches que" _ & " pasaron durante el día fueron " & Cochestotal & vbCrLf LabelResultados = LabelResultados & vbCrLf & "Las horas de tránsito cero fueron " & _ Transitocero & vbCrLf LabelResultados = LabelResultados & vbCrLf & "La hora de máximo tránsito fue la " & _ Horamaxtran & " registrándose el paso de " & Maxtransito & " coches" & vbCrLf LabelResultados = LabelResultados & vbCrLf & "La última hora a la que pasó un coche" & _ " fue la " & Ultimahora & " registrándose el paso de " & Cochesultima & " coches" End Sub |
Código para versiones más recientes de Visual Basic:
REM Curso Visual Basic aprenderaprogramar.com Option Explicit On Public Class Form1 Dim cocheshora(24) As Integer Dim Cochestotal, Transitocero, Maxtransito, Horamaxtran As Integer Dim Ultimahora, Cochesultima As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "Coches" CommandCalcular.Text = "Leer archivo" End Sub Private Sub CommandCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CommandCalcular.Click Dim contador As Integer LabelResultados.Font = New Font("Arial", 10, FontStyle.Bold) LabelResultados.TextAlign = ContentAlignment.MiddleCenter '[Apertura del archivo] Dim myFileToRead As New System.IO.StreamReader("C:\Users\Toshiba\Desktop\coches1523.dat", False) For contador = 1 To 24 '[Lectura de datos desde archivo] cocheshora(contador) = myFileToRead.ReadLine() Cochestotal = Cochestotal + cocheshora(contador) If cocheshora(contador) = 0 Then Transitocero = Transitocero + 1 LabelResultados.Text = LabelResultados.Text & "La hora " & contador & " hubo tránsito cero" & vbCrLf & vbCrLf End If If cocheshora(contador) > Maxtransito Then Maxtransito = cocheshora(contador) Horamaxtran = contador End If If cocheshora(contador) > 0 Then Ultimahora = contador Cochesultima = cocheshora(contador) End If Next contador myFileToRead.Close() LabelResultados.Text = LabelResultados.Text & "El total de coches que" _ & " pasaron durante el día fueron " & Cochestotal & vbCrLf LabelResultados.Text = LabelResultados.Text & vbCrLf & "Las horas de tránsito cero fueron " & _ Transitocero & vbCrLf LabelResultados.Text = LabelResultados.Text & vbCrLf & "La hora de máximo tránsito fue la " & _ Horamaxtran & " registrándose el paso de " & Maxtransito & " coches" & vbCrLf LabelResultados.Text = LabelResultados.Text &vbCrLf&"La última hora a la que pasó un coche" & _ " fue la " & Ultimahora & " registrándose el paso de " & Cochesultima & " coches" End Sub End Class |
Comentarios: en relación a la lógica del programa, es preferible realizar la apertura y cierre del archivo una sola vez, fuera del bucle, a proceder a abrir y cerrar el archivo 24 veces disponiendo el código de apertura y cierre dentro del bucle. El resultado gráfico sería del tipo: