domingo, 10 de julio de 2011

Aplicaciones de Consola en C#

El principal motivo de este post, es que la mayor parte de los que leen este blog no saben como interactuar con el usuario a través de la consola (lo cual es comprensible), y no tienen una forma dinámica de probar sus códigos. Generalmente cuando nos enseñan a programar, parten de la parte de como crear métodos, la sintaxis del lenguaje, las estructuras de control (for, foreach, etc) y se pasan por alto la parte de como crear una aplicación, donde el usuario vea resultados a traves de la consola. Bueno, empecemos desde 0:

Crear una aplicación de Consola:

Para esto, deberemos ir a File->New->Project si usas Visual Studio, pero con cualquier otro IDE debe ser algo parecido. Entonces se mostrará una nueva ventana como la de la figura, seleccionamos C# en el menu izquierdo y luego como tipo de proyecto marcamos “Console Apliccation”, le ponemos un nombre al proyecto y le damos Ok. Ya estaremos listos para empezar con el código.

El principal motivo de este post, es que la mayor parte de los que leen este blog no saben como interactuar con el usuario a través de la consola (lo cual es comprensible), y no tienen una forma dinámica de probar sus códigos. Generalmente cuando nos enseñan a programar, parten de la parte de como crear métodos, la sintaxis del lenguaje, las estructuras de control (for, foreach, etc) y se pasan por alto la parte de como crear una aplicación, donde el usuario vea resultados a traves de la consola. Bueno, empecemos desde 0:



Métodos útiles para trabajar con la consola

Para interactuar con el usuario es que existen algunos métodos básicos cuando trabajamos con la Consola. Veamos los más usados:
1- Console.WriteLine();
Escribe una nueva linea en la consola, es como presionar Enter y escribir una linea. Por ejemplo, podemos hacer:
Console.WriteLine(“Lo que quiera q salga en la consola”);
También podremos imprimir las variables de nuestro programa, para esto hay dos formas, pero veamos mejor dos ejemplos que son lo mismo:
//declaramos dos variables
string nombre = "Invitado";
int edad = 22;
//Imprimimos una linea en la consola de dos formas distintas
Console.WriteLine("Tu nombre es: "+nombre+" y tienes " + edad + " años.");
//En C# se usa el operador + para concatenar cadenas
Console.WriteLine("Tu nombre es {0} y tienes {1} años", nombre, edad);
 
Como ven la segunda vía es mucho más simple, solo debes recordar que el numero que está entre cochetes, es el indice del parámetro que se pasa al final del método.
2- Console.Write()
Hace casi lo mismo que Console.WriteLine() pero sin cambiar de línea, o sea… concatena el texto que le pasemos al método con lo que se haya escrito hasta ese momento en la consola.
3- Console.ReadLine()
Se usa para leer lo que el usuario escribió en la consola, y podemos guardarlo en una variable para despues usarlo en nuestro programa. No hay que pasarle ningún parámetro y el programa solo continuará cuando el usuario teclee alguna línea y presione Enter. Podemos hacer algo como esto:
Console.WriteLine("Escriba su nombre");
string nombre = Console.ReadLine();
Importante: Si lo que queremos es recoger lo que el usuario escriba como un tipo en específico, por ejemplo, un entero, deberemos usar el método estático int.Parse, por ejemplo:
int x = int.Parse(Console.ReadLine();
ya que lo que devuelve Console.ReadLine() es un string.
4-Console.ReadKey()
Este método resulta importante algunas veces, sobre todo cuando queremos darle varias opciones al usuario (a, b, c, d). Aunque se puede utilizar Console.ReadLine(). En este caso, este método lo que devuelve es un objeto de tipo ConsoleKeyInfo, y se puede utilizar de la siguiente forma, por ejemplo:
Console.WriteLine("Presiona una tecla");
ConsoleKeyInfo c = Console.ReadKey();
Console.WriteLine("Presionaste la tecla "+ c.KeyChar);
<="" h3=""> Bueno, estos son algunos de los métodos más importantes. Veamos ahora como está compuesto un proyecto de tipo consola. Lo primero que vemos es el namespace que se llama igual que el proyecto, luego vemos que hay una clase Program, la cual se llama así por defecto y dentro de esta, un método Main() con la siguiente signatura:
static void Main(string[] args)
Este es el punto de entrada de nuestra aplicación, el método se llama así por defecto y no se debe cambiar ni añadir ningún parámetro. Bueno, vamos ya a escribir un poco de código, como ejemplo, vamos a calcular la edad de un usuario pidiendole que nos diga el año de nacimiento. Para esto crearemos otro método estático (dentro de Program) que le pasaremos un año de nacimiento y calcula la edad. Veamos:
public static int DameEdad(int dia, int mes, int año)
{
     //Usamos la clase DateTime y un método estatico para restar fechas
     DateTime fecha_nacimiento = new DateTime(año, mes, dia);
     TimeSpan edad = DateTime.Now.Subtract(fecha_nacimiento);
     return (edad.Days/365);
}
Este método hace uso de la clase DateTime de .Net, que tiene muchas funcionalidades, entre ellas permite restar dos fechas, lo cual sería un algoritmo un poco pesado de programar (no es tan sencillo como restar los años). Cuando hacemos DateTime.Now, accedemos a la fecha actual que tenemos en nuestra PC, por ultimo devolvemos la cantidad de dias que han pasado entre las dos fechas y lo dividimos entre la cantidad de dias que tiene un año.
Ahora veamos como programar el método Main para interactuar con el usuario, pedirle la fecha, y encargarnos que la introduzca correctamente. El código sería algo así:
private static void Main(string[] args)
{
    //Variables que usaremos para la fecha de nacimiento
    int dia_nacimiento, mes_nacimiento, año_nacimiento=0;
 
    Console.WriteLine("Escriba su nombre");
    string nombre = Console.ReadLine();
    Console.WriteLine("Hola {0}, bienvenido a mi aplicacion!",nombre);
    Console.WriteLine("Por favor, introduce tu fecha de nacimiento:");
    //El while solo termina cuando se hace break
    while (true)
    {
        //Pedimos el dia y lo validamos
        Console.Write("Dia de nacimiento: ");
        dia_nacimiento = int.Parse(Console.ReadLine());
        if (dia_nacimiento < 1 || dia_nacimiento > 31)
             Console.WriteLine("Por favor, especifique un dia entre 1 y 31");
        else
             //Si el dia es valido, entonces pasamos a pedir el mes
             break;
    }
 
    while (true)
    {
        //Pedimos el mes y lo validamos
        Console.Write("Mes de nacimiento: ");
        mes_nacimiento = int.Parse(Console.ReadLine());
        if (mes_nacimiento < 1 || mes_nacimiento > 12)
             Console.WriteLine("Por favor, especifique un mes entre 1 y 12");
        else
             break;
    }
    while (true)
    {
        //Pedimos el año y lo validamos
        Console.Write("Año de nacimiento: ");
        año_nacimiento = int.Parse(Console.ReadLine());
        //El año no puede ser posterior a 1900 y anterior al año actual
        if (año_nacimiento < 1900 || año_nacimiento > DateTime.Now.Year)
             Console.WriteLine("Por favor, especifique un año entre 1900 y el {0}", DateTime.Now.Year);
        else
             break;
     }
     //Si llegamos aqui, es porque tenemos una fecha correcta, vamos a calcular la edad con
     //el método DameEdad() que escribimos antes
     int edad = DameEdad(dia_nacimiento, mes_nacimiento,año_nacimiento);
     Console.WriteLine(nombre+", usted tiene " + edad + " años.");
     Console.WriteLine("Presione cualquier tecla para terminar el programa");
     Console.ReadKey();
}
Por supuesto el código se puede hacer más eficiente y mucho más corto, pero quería mostrarte el uso de las funciones mencionadas antes. El código está bastante bien comentado, y espero que con las cosas que expliqué antes se entienda sin problemas. También les dejo el proyecto para que lo descarguen. Cualquier duda o aporte, en los comentarios.
 
Fuente:
http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/