¿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!
Lectura de datos del usuario en consola con Console.ReadLine
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 🥲.
¡Muchas gracias!
Excelente información, muy agradecido!. Saludos.
Si entendí bien al buscar la diferencia entre Convert y Parse es lo siguiente:
Ambos realizan la misma función.
Convert.ToInt32() llama a int.Parse() internamente.
Convert.ToInt32() retorna 0 cuando el argumento es nulo, en cambio int.Parse() arroja error de valor nulo.
esto es muy util, gracias.
Que clase tan rara XD
Hola Máximo 🙂
¿puedes compartir qué te ha parecido extraño?
Seguro se refiere a los evidentes errores de edición.
que pasa con la edicion de este curso :(
No es el primero que pasa :c
extendieron el curso como un año, bueno no, como seis meses para presentar estos fallos de edición raro en Platzi, pero maluco igual
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.
Es por esto que después el profesor implementa el float.Parse();
Si me equivoco espero alguien me brinde retroalimentación.
Eso pasa porque el profesor no es un experto en C# y obviamente tiene muchos errores en el dictado del curso, muy mal para ser un curso que uno paga.
En Nicargua el separador decimal es .
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);}
En Perú también se utiliza el punto para separar los enteros de los decimales :).
Les comparto mi codigo:
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
Repasando ando
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.
Este video está mal editado, se repite el inicio casi a la mitad del video y la repetiión de las correcciones de los errores.
Esta clase está mal planeada o simplemente mal editada. 👆
Está muy confusa realmente 🤨
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
Hola Jonathan,
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...
¿Que pasó con está clase?, tiene muchos errores de edición
Ya la arreglaron.
Como le hacen para compilar los proyectos tengo una chromebook y cuando quiero compilar un archivo diferente me compila siempre el anterior
Como actualizar la información de un textbox, para que se refleje en mi programa.