Visual basic: Leer una suma por el teclado

Hola, estoy haciendo un programa con visual basic, leer dos números y sumar-los, si lo hago de la siguiente manera no tengo ningún problema.

Module Module1
    Sub Main()
        Dim a As Integer, b As Integer
        Console.Write("Primer número: ")
        a = Console.ReadLine()
        Console.Write("Segundo número: ")
        b = Console.ReadLine()
        Console.Write("Resultado: " & a & " + " & b & " = " & a + b)
        Console.ReadLine()
    End Sub
End Module

yo lo que quiero hacer es escribir en una linea número + número, por ejemplo en C lo haría así.

int main()
{
    int a,b;
    char w;
    printf ("Introduce una suma: ");
    scanf ("%d %c %d",&a,&w,&b);
    printf("%d %c %d = %d",a,w,b,a+b);
    return 0;
}


El problema que tengo es para poder escribir en la terminal: 4+2, porque no tengo ningún problema en leer un número después de otro.

Si hago esto e introduzco por el teclado: 4+2, me sale el error: "Conversion from string "4+2" to type 'Integer' is not valid."

Module Module1
    Sub Main()
        Dim w As Char
        Dim a As Integer, b As Integer, c As Integer
        Console.Write("Introduce una suma: ")
        a = Console.ReadLine()
        w = Console.ReadLine()
        b = Console.ReadLine()
        c = a + b
        Console.Write("Resultado: " & a & " + " & b & " = " & c)
        Console.ReadLine()
    End Sub
End Module


Si hago esto, no me da error, pero el resultado no es nada bueno
Module Module1
    Sub Main()
        Dim w As Char
        Dim a As Integer, b As Integer, c As Integer
        Console.Write("Introduce una suma: ")
        a = Console.Read()
        w = Console.ReadLine()
        b = Console.Read()
        c = a + b
        Console.Write("Resultado: " & a & " + " & b & " = " & c)
        Console.ReadLine()
        Console.ReadLine()
    End Sub
End Module


Introduce una suma: 5+3

Resultado: 53 + 13 = 66
Evidentemente no puedes utilizar el texto como si fuera una linea con sumatorios y demás...
Tienes que tener en mente que es como si almacenaras en un buffer (que puede ser una variable, un campo de texto o lo que quieras, depende si es más visual o no, es indiferente).

Si lo haces así, como parece una práctica académica, una de las formas sería leer carácter a carácter y cuando llegues a algo que no sea un numero, haces en consecuencia. Algo del estilo...
-Lees cada carácter, y te quedas con el index de los que son operandos.
-De inicio hasta el primero... (numero al canto)
-Si indice de operando es +... aplicas suma
-Vas siguiendo hasta que llegues al fin de la cadena, y cuando ésto ocurra, ejecutas.


Si fuera algo más visual en plan calculadora podrías:
-Crear string de almacenaje temporal
-Cada numero pulsado... concatenas en el string
-Si lo que se pulsa es el + (o lo que sea), creas un float en el que metes el string temporal pasado a ese tipo, y recuerdas el sumatorio
...repetir...
cuando se pulse la tecla igual, lees todas esas variables float que puedes ir añadiendo en un array a medida que se van creando, y aplicas.

Hay varias formas de hacerlo. Como creo que los tiros van por el tema de aprendizaje de manejarse con los inputs y tal, creo que son buenas pistas lo que te comento.
Si no es para aprender y necesitas implementarlo para alguna app, busca por string expression evaluator. Pero ahí ya te saldrías de lo que ofrece el lenguaje por defecto con añadidos/material de terceros. De cualquier forma es simple de hacer desde cero con lo que te he comentado, como te he comentado o de otras maneras... hay varias formas de hacerlo.
Hola, gracias por responder, el problema era para un ejercicio y con tus pistas lo he podido solucionar [beer]

Un programa pedirá una entrada por parte del usuario en el formato "<número> + <número>".
El programa mostrará un resultado con el siguiente formato: "<número> + <número> = <resultat>".
Por ejemplo, si el usuario escribe "312 +21", la salida del programa debe ser "312 + 21 = 333"


Module Module1
    Sub Main()
        Dim ok As Boolean
        Dim a As Integer, b As Integer, i As Integer
        Dim op As String, uno As String, dos As String
        Console.Write("Introduce una suma: ")
        op = Console.ReadLine()
        ok = True
        For i = 0 To Len(op) - 1
            If op(i) = "+" Then
                ok = False
            End If
            If ok = True And op(i) <> "+" Then
                uno = uno & op(i)
            ElseIf op(i) <> "+" Then
                dos = dos & op(i)
            End If
        Next
        a = Integer.Parse(uno)
        b = Integer.Parse(dos)
        Console.Write("Resultado: " & a & " + " & b & " = " & a + b)
        Console.ReadLine()
    End Sub
End Module
Buenas te das cuenta que si no introduces el tipo de operación o un operando el código sigue ejecutándose y te dará error.

No es mejor hacer como una calculadora, pedir un operando comprobar que es un numero, pedir que operación es y comprobar que es de las admitidas y pedir el segundo operando.
El programa no es para hacer una calculadora, simplemente:
Un programa pedirá una entrada por parte del usuario en el formato "<número> + <número>".
El programa mostrará un resultado con el siguiente formato: "<número> + <número> = <resultat>".
Por ejemplo, si el usuario escribe "312 +21", la salida del programa debe ser "312 + 21 = 333"
ok
Para que es el ultimo Console.ReadLine() para hacer una espera????
¿Y con eval no funcionaría? Es decir dejas que introduzca por teclado lo que sea "56+89" y esa cadena la pasas a la función eval() y te debería devolver el resultado.

Te hablo sin saber demasiado de Visual Basic eh. A todo esto, habría que controlar posibles errores introducidos en la cadena claro.
RC9 escribió:¿Y con eval no funcionaría? Es decir dejas que introduzca por teclado lo que sea "56+89" y esa cadena la pasas a la función eval() y te debería devolver el resultado.

Te hablo sin saber demasiado de Visual Basic eh. A todo esto, habría que controlar posibles errores introducidos en la cadena claro.

Es lo que le comenté, que si es para aprender a manejarse como intuía, se suele hacer con lo básico para ver como gestionar entradas, como leer por caracteres etc.

Sí que funciona el evaluate en VB, pero ya es una referencia a ScriptControl. Que para una app, perfecto, pero para aprender no creo sea lo que buscaban al proponer el enunciado.
7 respuestas