Ir al contenido principal

Entrada y salida de datos por consola

Introducción

La interacción con el usuario es un componente fundamental en cualquier aplicación. En el caso de las aplicaciones de consola, esta interacción se realiza principalmente mediante la entrada y salida de texto por terminal. En C#, el framework .NET proporciona mecanismos sencillos pero potentes para manejar esta comunicación, permitiéndonos mostrar información al usuario y recoger sus respuestas de manera efectiva.

En este artículo aprenderemos a utilizar los métodos de la clase Console para mostrar mensajes en pantalla y solicitar datos al usuario. Estas habilidades son esenciales para desarrollar aplicaciones interactivas en consola y constituyen la base para comprender conceptos más avanzados de interfaz de usuario en el futuro.

Salida de datos por consola

La salida de datos es el proceso mediante el cual nuestro programa muestra información al usuario. En C#, disponemos de varios métodos para este propósito, cada uno con características específicas.

Método Console.Write

El método Console.Write muestra texto en la consola sin añadir un salto de línea al final. Esto significa que el cursor permanece en la misma línea después de la salida.

Console.Write("Esto es un mensaje sin salto de línea. ");
Console.Write("Este texto aparece justo a continuación.");

Al ejecutar este código, obtendremos:

Esto es un mensaje sin salto de línea. Este texto aparece justo a continuación.

Método Console.WriteLine

El método Console.WriteLine muestra texto en la consola y añade un salto de línea al final, lo que coloca el cursor en la siguiente línea.

Console.WriteLine("Este es el primer mensaje.");
Console.WriteLine("Este mensaje aparece en la siguiente línea.");

Al ejecutar este código, obtendremos:

Este es el primer mensaje.
Este mensaje aparece en la siguiente línea.

Formateo de cadenas en la salida

Existen varias formas de dar formato a las cadenas que mostramos por consola:

Concatenación de cadenas

string nombre = "María";
int edad = 28;
Console.WriteLine("Hola, me llamo " + nombre + " y tengo " + edad + " años.");

Interpolación de cadenas (recomendado desde C# 6.0)

string nombre = "María";
int edad = 28;
Console.WriteLine($"Hola, me llamo {nombre} y tengo {edad} años.");

Método String.Format

string nombre = "María";
int edad = 28;
Console.WriteLine(String.Format("Hola, me llamo {0} y tengo {1} años.", nombre, edad));

Todas estas técnicas producen el mismo resultado:

Hola, me llamo María y tengo 28 años.

Formatos numéricos y de fecha

Podemos controlar la forma en que se muestran los números y fechas en la consola:

double precio = 19.99;
Console.WriteLine($"El precio es: {precio:C}"); // Formato de moneda
Console.WriteLine($"El precio con dos decimales: {precio:F2}"); // Formato de número fijo con 2 decimales

DateTime fecha = DateTime.Now;
Console.WriteLine($"Fecha actual: {fecha:d}"); // Formato corto de fecha
Console.WriteLine($"Hora actual: {fecha:t}"); // Formato corto de hora
Console.WriteLine($"Fecha y hora: {fecha:G}"); // Formato largo general

Que podría producir una salida como:

El precio es: 19,99 €
El precio con dos decimales: 19,99
Fecha actual: 01/05/2025
Hora actual: 15:30
Fecha y hora: 01/05/2025 15:30:45

Tabla de especificadores de formato comunes

Especificador Descripción Ejemplo
C o c Formato de moneda 12.5C → 12,50 €
D o d Entero decimal 123D → 123
E o e Notación científica 12345E → 1.234500E+004
F o f Número con punto fijo 12.3F2 → 12,30
G o g General 12.3G → 12,3
N o n Número con separadores 1234.5N → 1.234,50
P o p Porcentaje 0.12P → 12,00 %
X o x Hexadecimal 255X → FF

Entrada de datos por consola

La entrada de datos permite que el usuario proporcione información a nuestro programa. En C#, el método principal para esto es Console.ReadLine().

Método Console.ReadLine

Este método lee una línea completa de texto ingresada por el usuario hasta que presiona Enter. Devuelve la entrada como una cadena.

Console.Write("¿Cómo te llamas? ");
string nombre = Console.ReadLine();
Console.WriteLine($"¡Hola, {nombre}!");

En este ejemplo, el programa pregunta el nombre al usuario, espera a que lo introduzca y lo utiliza para mostrar un saludo.

Conversión de tipos en la entrada

Dado que Console.ReadLine() siempre devuelve una cadena, necesitamos convertir la entrada a otros tipos de datos cuando sea necesario:

Console.Write("Introduce tu edad: ");
string entradaEdad = Console.ReadLine();
int edad = Convert.ToInt32(entradaEdad);
// Alternativa: int edad = int.Parse(entradaEdad);

Console.WriteLine($"El año que viene tendrás {edad + 1} años.");

Manejo de errores en la conversión

Es importante manejar posibles errores cuando convertimos la entrada del usuario:

Console.Write("Introduce un número: ");
string entrada = Console.ReadLine();

try
{
    int numero = Convert.ToInt32(entrada);
    Console.WriteLine($"Has introducido el número {numero}");
}
catch (FormatException)
{
    Console.WriteLine("Error: No has introducido un número válido.");
}
catch (OverflowException)
{
    Console.WriteLine("Error: El número es demasiado grande o pequeño.");
}

Método TryParse para validación

Una alternativa más elegante para convertir y validar la entrada es usar métodos TryParse:

Console.Write("Introduce tu edad: ");
string entradaEdad = Console.ReadLine();

if (int.TryParse(entradaEdad, out int edad))
{
    Console.WriteLine($"El año que viene tendrás {edad + 1} años.");
}
else
{
    Console.WriteLine("No has introducido una edad válida.");
}

Método Console.ReadKey

El método Console.ReadKey() captura una tecla individual presionada por el usuario, sin necesidad de presionar Enter:

Console.WriteLine("Presiona una tecla para continuar...");
ConsoleKeyInfo tecla = Console.ReadKey();
Console.WriteLine($"\nHas presionado: {tecla.KeyChar}");

Este método es útil para pausas o para aplicaciones que requieren interacción inmediata.

Métodos de formateo avanzados

Alineación y ancho de campo

Podemos controlar la alineación y el ancho de los campos en la salida:

// Alineación a la derecha en un campo de 10 caracteres
Console.WriteLine($"{'Nombre',10}: Juan");
// Alineación a la izquierda en un campo de 10 caracteres
Console.WriteLine($"{'Edad',-10}: 25");

Producirá:

    Nombre: Juan
Edad      : 25

Tabulación y caracteres especiales

Podemos usar caracteres especiales para dar formato a la salida:

Console.WriteLine("Nombre\tEdad\tCiudad");
Console.WriteLine("Juan\t25\tMadrid");
Console.WriteLine("María\t28\tBarcelona");
Console.WriteLine("Luis\t32\tValencia");

Que producirá:

Nombre  Edad    Ciudad
Juan    25      Madrid
María   28      Barcelona
Luis    32      Valencia

Ejemplo completo: Calculadora simple

Veamos un ejemplo que integra varios de los conceptos que hemos aprendido:

using System;

class Calculadora
{
    static void Main()
    {
        // Solicitar el primer número
        Console.Write("Introduce el primer número: ");
        if (!double.TryParse(Console.ReadLine(), out double num1))
        {
            Console.WriteLine("Número no válido. Fin del programa.");
            return;
        }

        // Solicitar el segundo número
        Console.Write("Introduce el segundo número: ");
        if (!double.TryParse(Console.ReadLine(), out double num2))
        {
            Console.WriteLine("Número no válido. Fin del programa.");
            return;
        }

        // Mostrar menú de operaciones
        Console.WriteLine("\nSelecciona una operación:");
        Console.WriteLine("1 - Suma");
        Console.WriteLine("2 - Resta");
        Console.WriteLine("3 - Multiplicación");
        Console.WriteLine("4 - División");
        Console.Write("Tu elección: ");

        if (!int.TryParse(Console.ReadLine(), out int opcion) || opcion < 1 || opcion > 4)
        {
            Console.WriteLine("Opción no válida. Fin del programa.");
            return;
        }

        // Realizar la operación seleccionada
        double resultado = 0;
        string operacion = "";

        switch (opcion)
        {
            case 1:
                resultado = num1 + num2;
                operacion = "suma";
                break;
            case 2:
                resultado = num1 - num2;
                operacion = "resta";
                break;
            case 3:
                resultado = num1 * num2;
                operacion = "multiplicación";
                break;
            case 4:
                if (num2 == 0)
                {
                    Console.WriteLine("Error: No se puede dividir por cero.");
                    return;
                }
                resultado = num1 / num2;
                operacion = "división";
                break;
        }

        // Mostrar el resultado
        Console.WriteLine($"\nEl resultado de la {operacion} es: {resultado:F2}");
    }
}

Este ejemplo muestra una calculadora simple que:

  1. Solicita dos números al usuario
  2. Muestra un menú de operaciones
  3. Valida todas las entradas del usuario
  4. Realiza la operación seleccionada
  5. Muestra el resultado con formato

Resumen

En este artículo hemos aprendido a utilizar los métodos principales para la entrada y salida de datos por consola en C#. Hemos visto cómo mostrar información utilizando Console.Write y Console.WriteLine, aplicar diferentes formatos a la salida, y recoger datos del usuario con Console.ReadLine y Console.ReadKey.

Estas herramientas son fundamentales para crear aplicaciones de consola interactivas y constituyen la base para entender conceptos más avanzados de interfaz de usuario. En los próximos temas, aprenderemos a estructurar mejor nuestro código y a implementar lógica más compleja utilizando estructuras de control y funciones.