Entonces, estoy creando una calculadora simple para comenzar a programar en C # y hasta ahora he tenido dos problemas que no he podido resolver.

El primero es que, por alguna razón, de todos los operadores / símbolos, no me permite agregar el operador / símbolo "-" junto a una cadena. Solo me permite tener el operador "-" solo con mis variables. (Intenté usar doble en lugar de decimal pero obtuve el mismo error).

El segundo (y más importante) es que estoy tratando de tener una declaración if que dé un mensaje (y ejecute otro método) cuando el usuario ingrese el tipo de datos incorrecto. ¿Alguna forma de resolver esto (o al menos encontrar una solución alternativa)?

¡Gracias!

Aquí hay una muestra del código que contiene ambos problemas:

    static void Calc()
        {
            Console.Write("\n\nPlease enter a number here: ");
            decimal num1 = Convert.ToDecimal(Console.ReadLine());

            Console.Write("Please Specify an operator: ");
            string op = Console.ReadLine();

            Console.Write("Please enter another number: ");
            decimal num2 = Convert.ToDecimal(Console.ReadLine());

            if (op == "+")
            {
                Console.WriteLine("The answer is: " + num1 + num2);
            }
            else if (op == "-")
            {
                Console.WriteLine("The answer is: " + num1 - num2);
            }
            else if (op == "*")
            {
                Console.WriteLine("The answer is: " + num1 * num2);
            }
            else if (op == "/")
            {
                Console.WriteLine("The answer is: " + num1 / num2);
            }
            else
            {
                OpElse();
            }

            if (num1 || num2 != Decimal)
            {
                Console.WriteLine("You must input a number");
                Else();
            }
0
Clandestinity 27 abr. 2020 a las 21:49

4 respuestas

La mejor respuesta

En la linea:

Console.WriteLine("The answer is: " + num1 - num2);

Primero agregará num1 a string, y luego intentará restar el número de la cadena, que no es válido. Use paréntesis "some string" + (num1 - num2) También se producirá el mismo error con la adición, por ejemplo: "a" + 5 + 2 dará como resultado: a52

Para verificar si los datos ingresados son incorrectos, se puede usar TryParse o el mismo Convert.ToDecimal pero con try catch

    Console.Write("\n\nPlease enter a number here: ");
    decimal num2 = 0; // Assigning default value so compiler doesn't comlain
    try 
    {
        num2 = Convert.ToDecimal(Console.ReadLine());
    }
    catch (FormatException e)
    {
        //do something else
    }
0
Justas G 27 abr. 2020 a las 19:39

Num1 y num2 siempre serán de tipo decimal, por lo que es innecesario verificar si su tipo es decimal. Si desea mostrar un mensaje cuando falla el análisis, considere el uso de decimal#TryParse() que devolverá verdadero si se analizó correctamente, falso si no.

En cuanto a su problema de firma. No estoy muy seguro de lo que quieres decir, pero supongo que estás tratando de hacer algo como -"some string" que es un código C # no válido. Decimal podría convertir números negativos muy bien cuando se escribe, suponiendo que no ponga un espacio entre el menos y el número en sí.

O si está intentando hacer algo como "num1 - num2" que no funcionará a menos que use la interpolación de cadenas $"{num1+num2}" como ejemplo

0
li223 27 abr. 2020 a las 19:00

Usted señaló correctamente dos problemas:

1. Falla del operador

Los operadores + - * /. Recuerde el orden de las operaciones, * / son primero, + - son segundos, luego de izquierda a derecha en grupos de igual orden. Entonces, en las declaraciones de escritura, se ejecuta * / antes que +. Como resultado string + decimal, y dado que hay un convertidor implícito de decimal a cadena, el operador + actúa como una concatenación.

En el caso de - el orden es string + decimal - decimal, que de izquierda a derecha significa que el primer + concatena dos cadenas. Sin embargo, - no es un operador en string y, por lo tanto, falla.

Intente usar la sintaxis $"Answer is: {num1 + num2}" para cada caso (cambiando el operador según sea necesario).

2. Falla lógica

Está convirtiendo y lanzando una excepción de tiempo de ejecución en el método Parse antes de las pruebas y la salida. Como se sugiere, use TryParse y coloque el caso de error en la parte superior.

0
THBBFT 27 abr. 2020 a las 19:46

Estoy tratando de tener una declaración if que dé un mensaje (y ejecute otro método) cuando el usuario ingrese el tipo de datos incorrecto. ¿Alguna forma de resolver esto (o al menos encontrar una solución alternativa)?

Puede probar el {{X0} }, que intentará analizar una cadena a un decimal, pero no arrojará una excepción si falla. Se vería algo así:

if (!Decimal.TryParse(Console.ReadLine(), out decimal num1)) 
{
    Console.WriteLine("No no my friend. You have to enter a valid number.");
}

..de todos los operadores / símbolos, no me permitirá agregar el operador / símbolo "-" junto a una cadena. Solo me permite tener el operador "-" solo con mis variables. (Intenté usar doble en lugar de decimal pero obtuve el mismo error).

Eso tiene que ver con precedencia del operador . De hecho, aunque menos es el único que se queja en tiempo de compilación, la adición le da un resultado incorrecto en tiempo de ejecución. El problema es solo que la (primera) + se está evaluando antes que la -. Eso da como resultado que se agregue el primer número a la cadena, antes de hacer el cálculo. Para solucionar esto, simplemente envuelva la parte de cálculo entre paréntesis:

Console.WriteLine("The answer is: " + (num1 - num2));

O mover el cálculo fuera de la concatenación de cadenas:

var result = num1 + num2;
Console.WriteLine("The answer is: " + result);
1
MAV 27 abr. 2020 a las 19:10