Lectura de datos del usuario en consola con Console.ReadLine
Resumen
¿Cómo leer datos de los usuarios en un programa interactivo?
Incorporar la interacción con los usuarios es fundamental para crear programas dinámicos y eficientes. En esta lección, exploraremos cómo puedes recoger datos directamente desde la consola, mejorando así la interactividad de tus aplicaciones. Empezaremos utilizando el método Console.ReadLine en C# para permitir la entrada de datos por parte de los usuarios. Este método leerá una línea de la consola y nos servirá para asignar valores introducidos por los usuarios a variables que posteriormente podremos utilizar en nuestro programa.
¿Cómo se utiliza Console.ReadLine?
El principal propósito de Console.ReadLine es capturar las entradas del usuario por consola. Este método no requiere parámetros y devuelve un string que representa la entrada del usuario.
string input = Console.ReadLine();
Asegúrate de manejar correctamente las conversiones de datos, especialmente si planeas utilizar el dato como un tipo diferente del string capturado.
¿Cómo convertir datos de consola a tipos numéricos?
El input del usuario a menudo necesita conversiones, especialmente si estás manejando números. Aquí reside la importancia de entender cómo convertir tipos de datos en C#:
Para convertir un string a un número flotante, se usa float.Parse.
string input = Console.ReadLine();float number =float.Parse(input);
Este fragmento de código toma un string introducido por el usuario, lo convierte a un float y lo guarda en una variable.
¿Cómo mejorar la interacción con mensajes?
Asegúrate de guiar al usuario a través del proceso de ingreso de datos con mensajes claros. Puedes utilizar Console.WriteLine para imprimir instrucciones o aclaraciones en la consola. A continuación un ejemplo:
Console.WriteLine("Por favor ingresa el lado A del rectángulo. Puedes usar decimales:");string input = Console.ReadLine();float ladoA =float.Parse(input);
Este código no solo solicita la entrada, sino que también le proporciona al usuario una guía clara sobre cómo proceder.
¿Qué hacer ante errores comunes en la consola?
Cuando se trabaja con entradas de usuario, es crucial manejar posibles errores de sintaxis o formato. Visual Studio proporciona alertas automáticas en caso de sintaxis incorrecta como la omisión de un punto y coma. Siempre verifica los errores desplegados en la parte inferior del editor y corrígelos para asegurar un desarrollo más ágil y eficaz.
¿Cómo afecta la configuración regional a la entrada de datos?
Ten en cuenta que la notación de números, como el uso de puntos o comas como separadores decimales, puede variar según la configuración regional de tu computadora. Por ejemplo, en algunos países de habla hispana, el uso de comas es común mientras que en otros se utiliza el punto. Por lo tanto, adapta tu programa según el contexto cultural del usuario para asegurar una experiencia de usuario intuitiva y sin errores:
Console.WriteLine("Ingresa el lado B del rectángulo utilizando comas para decimales:");string input = Console.ReadLine();float ladoB =float.Parse(input);
Esta práctica mejora la experiencia del usuario y garantiza que los resultados sean precisos sin importar la configuración regional.
Al permitir la entrada de datos del usuario y manejarlos adecuadamente, estás enriqueciendo la funcionalidad y la interacción de tus programas. ¡Sigue practicando y no dudes en experimentar con diferentes tipos de datos y configuraciones!
Durante la clase vimos dos tipos de conversión, pero 🤔, ¿Cuál es la diferencia entre ambas?
🥊 Convert VS. Parse 🥊
Ambas se pueden usar para convertir datos de un tipo a otro.
Convert pude manejar valores NULL retornando un 0.
Parse no puede manejar valores NULL y muestra un error (ArgumentNullException).
✅ Ejemplo:
En la variable number2 convertiremos un valor NULL en FLOAT, como sabemos nos retornara 0, por ende, el resultado de la operación es igual a 0.
😉 Puedes comprobar lo que retorna Convert imprimiéndolo por pantalla.
float number1 =10.555f;float number2 =Convert.ToSingle(null);float result = number1 * number2;Console.WriteLine($"El resultado es igual a {result}");
Dato: Para usar Convert para un tipo de dato FLOAT puede realizarse atreves del método .ToSingle()
Trataremos de realizar la misma conversión, pero ahora usando Parse. Cuando ejecutemos nos mostrara un error 🥲.
Console.WriteLine("Please enter the side A of the rectangle, you can use decimals");float sideA= float.Parse(Console.ReadLine());Console.WriteLine("Please enter the side B of the rectangle, you can use decimals");float sideB = float.Parse(Console.ReadLine());//rectangle areafloat area = sideA * sideB;Console.WriteLine("The rectangle area is: "+ area);
Hola! el siguiente aporte es para intentar aclarar un poco la clase ya que se corta, inicia de nuevo la explicación pero con otro método de conversión.
Al implementar el Convert.ToDecimal seguía apareciendo el error de conversión implícita ya que float y decimal son tipos de datos diferentes, Decimal tiene una precisión mucho más grande. Adjunto documentación para notar todas sus diferencias.
Asi quedo mi mini calculadora de area de rectangulos:
Adjunto el codigo, aunque la logica es la misma que la del profe:
float sideA =0; float sideB =0;Console.WriteLine(" RENCTANGLE AREA CALCULATOR\n\n");Console.WriteLine(" Lenght ");Console.WriteLine(" *****************");Console.WriteLine(" * *");Console.WriteLine(" Width* *");Console.WriteLine(" * *");Console.WriteLine(" *****************\n\n");Console.WriteLine("Insert the lenght of the rectangle:"); sideA = float.Parse(Console.ReadLine());Console.WriteLine("Insert the width of the rectangle:"); sideB = float.Parse(Console.ReadLine());//Renctangle area formula is a*b float area = sideA * sideB;Console.WriteLine("The rectangle area is: "+ area);
Logré hacer mi propia calculadora de áreas de 4 figuras distintas (2 de ellas son cuadriláteros). La hice a prueba de errores de sintaxis, por eso tiene muchos if elses. Tal vez alguien me podría decir si es que se puede compactar aún más el código, sin tener que quitar esos textos anti errores.
Console.WriteLine("This program calculates the area of the following figures: triangle, rectangle, trapeze, circle. Type the figure from which you want to calculate its area.");string figure =Console.ReadLine();if(figure =="triangle"){Console.WriteLine("Please type the height:"); decimal height =Convert.ToDecimal(Console.ReadLine());Console.WriteLine("Now type the base's length:"); decimal figureBase =Convert.ToDecimal(Console.ReadLine()); decimal result = height * figureBase /2;if(height !=0&& figureBase !=0){Console.WriteLine("The area of a triangle with a base of "+ figureBase +" and a height of "+ height +" is "+ result);}else{if(height ==0&& figureBase !=0){Console.WriteLine("A triangle cannot have a height that measures 0");}else{if(height !=0&& figureBase ==0){Console.WriteLine("A triangle cannot have a side that measures 0");}else{if(height ==0&& figureBase ==0){Console.WriteLine("A triangle cannot have a height nor a side that measures 0");}}}}}else{if(figure =="rectangle"){Console.WriteLine("Please type the height:"); decimal height =Convert.ToDecimal(Console.ReadLine());Console.WriteLine("Now type the base's length:"); decimal figureBase =Convert.ToDecimal(Console.ReadLine()); decimal result = height * figureBase;if(height !=0&& figureBase !=0){if(height == figureBase){Console.WriteLine("The area of a square with a base of "+ figureBase +" and a height of "+ height +" is "+ result);}else{Console.WriteLine("The area of a rectangle with a base of "+ figureBase +" and a height of "+ height +" is "+ result);}}else{Console.WriteLine("A rectangle cannot have a side that measures 0");}}else{if(figure =="trapeze"){Console.WriteLine("Please type the height:"); decimal height =Convert.ToDecimal(Console.ReadLine());Console.WriteLine("Now type the smallest base's length:"); decimal trapezeBase1 =Convert.ToDecimal(Console.ReadLine());Console.WriteLine("And now type the largest base's length:"); decimal trapezeBase2 =Convert.ToDecimal(Console.ReadLine()); decimal result = height *(trapezeBase1 + trapezeBase2)/2;if(height !=0&& trapezeBase1 !=0&& trapezeBase2 !=0){if(trapezeBase1 > trapezeBase2){Console.WriteLine("You were supposed to write the smallest base's length when it was asked to type the smallest base's length, but you typed the largest one's. Anyways, the answer is "+ result);}else{if(trapezeBase1 == trapezeBase2){if(trapezeBase1 == height){Console.WriteLine("This is a square, not a trapeze. Anyways, the answer is "+ result);}else{Console.WriteLine("This is a rectangle, not a trapeze. Anyways, the answer is "+ result);}}else{Console.WriteLine("The area of a trapeze with a height of "+ height +", a smaller base of "+ trapezeBase1 +" and a larger base of "+ trapezeBase2 +" is "+ result);}}}else{if(height ==0&& trapezeBase1 !=0&& trapezeBase2 !=0){Console.WriteLine("A trapeze cannot have a height of 0");}else{if(height !=0){if(trapezeBase1 ==0|| trapezeBase2 ==0){Console.WriteLine("A trapeze cannot have a base of 0");}}else{Console.WriteLine("A trapeze cannot have a height nor a base of 0");}}}}else{if(figure =="circle"){Console.WriteLine("Please type the radius:"); decimal radius =Convert.ToDecimal(Console.ReadLine()); decimal Pi=3.14159265358979323846M; decimal result = radius * radius *Pi;if(radius !=0){Console.WriteLine("The area of a circle with a radius of "+ radius +", considering the first 20 decimal digits of Pi, is "+ result);}else{Console.WriteLine("A circle cannot have a radius of 0");}}}}}
En México utilizamos en punto(.) para realizar la separación de los números enteros y números decimales.
staticvoidMain(string[] args){//rectangle area calc.//rectangle valuesConsole.Write("Please enter the side A of the rectangle, you can use decimals: "); double sideA = double.Parse(Console.ReadLine());Console.Write("Please enter the side B of the rectangle, you can use decimals: "); double sideB = double.Parse(Console.ReadLine());//rectangle area formula is a*b double area = sideA * sideB;Console.WriteLine("The rectangle area is: "+ area);}
using System;namespace _13_LeerDatosDeUnUsuario
{classProgram{staticvoidMain(){/* *** Leer datos *** */Console.WriteLine("*** Area de un rectangulo ***");Console.WriteLine("★ Ingresa el lado A: "); float sideA = float.Parse(Console.ReadLine()!);Console.WriteLine("★ Ingresa el lado B: "); float sideB = float.Parse(Console.ReadLine()!);Console.WriteLine($"El area es: { sideA * sideB }");}}}
Y el resultado en consola:
***Area de un rectangulo ***★ Ingresa el lado A:10★ Ingresa el lado B:20El area es:200
Console.WriteLine("Write the magnintud of the side A(You can use decimals, the separator is ,):");float sideA1 = float.Parse(Console.ReadLine());Console.WriteLine("Write the magnintud of the side B(You can use decimals, the separator is ,):");float sideB1 = float.Parse(Console.ReadLine());float area1 = sideA1 * sideB1;Console.WriteLine("The area of the rectangule is :"+ area1 +"\n Side A: "+ sideA1 +"\n Side B: "+ sideB1);
Mi teoria es que estos errores son por presion de cambiar de visual code a visual normal, se ve que uno fue grabado con code y otro con visual, tambien he visto cambios de visual 2019 a 2022 en varios cursos.
Alguien me podria ayudar con lo del separador decimal y como se puede cambiar de coma a punto, lo que pasa es que estuve haciendo un proyecto y cuando el usuario ingresa punto el programa retorna un valor muy diferente y cuando ingresa coma ahi si muestra el valor real
Hola Luis Miguel, ¿Requieres cambiarlo en la configuración de Visual Studio o en código? Si es en código te dejo un pequeño ejemplo:
Console.WriteLine("Hi! Please introduce a number with decimals, please");string myInput =Console.ReadLine();Console.WriteLine($"The original input: {myInput}");Console.WriteLine($"The modified input: {myInput.Replace('.', ',')}");float myInput2 = float.Parse(myInput);// The next code here...
¿Hay alguna forma de poder ingresar un dato float con punto en lugar de la coma?, o es algo propio del lenguaje el uso de la coma en el ingreso de datos flotantes
Claro que sí, puedes usar el método Replace() de los strings, puedes encontrar algunos ejemplos acá, pero también te dejo un ejemplo acá:
Console.WriteLine("Hi! Please introduce a number with decimals, please");string myInput =Console.ReadLine();Console.WriteLine($"The original input: {myInput}");Console.WriteLine($"The modified input: {myInput.Replace('.', ',')}");float myInput2 = float.Parse(myInput);// The next code here...