Ya estoy de nuevo por aquí.
Antes de nada muchas gracias por tus respuestas Mario.
Más abajo adjunto el código del ejercicio resuelto. Aunque sigue teniendo algunas pegas:
Para empezar he tenido que recurrir a los métodos IsNumeric() y Len(), para comprobar si hay letras y para contar el número de caracteres (dígitos en este caso). Sin embargo tengo la impresión que este problema podría resolverse (y debería poder resolverse dado el punto del curso en el que se encuentra) utilizando solo if... else y while. Algo como:
Dim contador As Integer
Dim ISBN, digitosISBN As Long
contador = 0
digitosISBN = ISBN
Do while digitosISBN > 0
digitosISBN = digitosISBN / 10
contador = contador + 1 '[contador seria el número de dígitos del número]
Loop
Con esto evitariamos tener que recurrir a cadenas de texto (nos ahorramos comprobar si hay letras) y ahorramos alguna variable. El problema es que los ISBN pueden empezar por cero, y por ello esta solución no es válida, dado que al llegar al primer cero la condición no se cumplirá y saldrá del bucle antes de contar todos los dígitos que quedan, que serían todo ceros claro. ¿Habría alguna forma de hacerlo solo con If... else y while?
Por otro lado, aunque he añadido la comprobación de línea que mencionabas (dicho sea de paso no se si es correcta), si desactivo la comprobación de los 10 dígitos, sigue sin funcionar correctamente. Continua leyendo los datos de los precios como si fueran ISBN. He hecho bastantes comprobaciones pero sigo sin entender porque si nosotros tenemos dato(1) y despues saltamos a dato(4) con i = i + 3, el algoritmo lee dato(2) como ISBN. Si saltamos del 1 al 4, ¿Por qué lee el 2?.
El ejercicio:
Public Class Form1
Dim dato(50) As Single
Dim iISBN As Long
Dim sISBN As String
Dim precio, valorLote As Single
Dim encontrado As Boolean
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Me.Text = "Libreria"
LabelResultado.Text = ""
ButtonBuscar.Text = "Buscar"
ButtonCalcular.Text = "Calcular"
End Sub
Private Sub ButtonBuscar_Click(sender As Object, e As System.EventArgs) Handles ButtonBuscar.Click
Dim i As Integer
Dim digitosISBN As Integer
encontrado = False
sISBN = InputBox("¿Cuál es el ISBN del libro?", "Busqueda Libro")
digitosISBN = Len(sISBN)
Do Until IsNumeric(sISBN) = True And digitosISBN = 10
MsgBox("El ISBN introducido debe tener 10 dígitos" & vbLf & "y solo puede contener números", , "Error ISBN")
sISBN = InputBox("Introduzca un ISBN de 10 dígitos: ", "Busqueda Libro")
digitosISBN = Len(sISBN)
Loop
iISBN = CLng(sISBN)
Dim myFileToRead = New System.IO.StreamReader("C:\Users\Toshiba\Desktop\libros.dat", False)
i = 1
dato(i) = myFileToRead.ReadLine()
Do While dato(i) <> -500
If dato(i) = iISBN And (i - 1) Mod 3 = 0 Then
dato(i + 1) = myFileToRead.ReadLine()
dato(i + 2) = myFileToRead.ReadLine()
precio = dato(i + 1)
If dato(i + 2) = -66 Then
precio = precio - ((precio / 100) * 15)
End If
If dato(i + 2) = -99 Then
precio = precio - ((precio / 100) * 25)
End If
encontrado = True
LabelResultado.Text = "Libro encontrado" & vbLf & "Su precio es: " & precio
End If
i = i + 3
dato(i) = myFileToRead.ReadLine()
Loop
myFileToRead.Close()
If encontrado = False Then
LabelResultado.Text = "Libro no disponible"
End If
End Sub
Private Sub ButtonCalcular_Click(sender As Object, e As System.EventArgs) Handles ButtonCalcular.Click
Dim i As Integer
precio = 0
valorLote = 0
Dim myFileToRead = New System.IO.StreamReader("C:\Users\Toshiba\Desktop\libros.dat", False)
i = 1
dato(i) = myFileToRead.ReadLine()
Do While dato(i) <> -500
dato(i + 1) = myFileToRead.ReadLine()
dato(i + 2) = myFileToRead.ReadLine()
precio = dato(i + 1)
If dato(i + 2) = -66 Then
precio = precio - ((precio / 100) * 15)
End If
If dato(i + 2) = -99 Then
precio = precio - ((precio / 100) * 25)
End If
valorLote = valorLote + precio
i = i + 3
dato(i) = myFileToRead.ReadLine()
Loop
myFileToRead.Close()
LabelResultado.Text = "El valor total del lote es: " & valorLote
End Sub
End Class
Un saludo!