viernes, 30 de diciembre de 2011

Estructuras de control

Las estructuras de control nos permiten modificar el flujo de ejecución de las instrucciones de un programa.

En C# estas estructuras son básicamente las mismas que encuentras en C/C++.

En cuanto a las estructuras de selección son exactamente las mismas que las que conoces. A excepción de la estructura switch que tiene una restricción adicional: "A jump statement such as a break is required after each case block, including the last block whether it is a case statement or a default statement."

Las estructuras de iteración son todas iguales excepto foreach que es nueva. Esta estructura la veremos junto con las colecciones.

Las estructuras de salto tienen algunas que tal vez no conozcas, como yield, y throw las cuales también veremos más adelante.

Para empezar nos bastará con saber usar if, for, while y switch.

La instrucción if se compone de:
if(<condición>)
{
    instrucciones...
}
[else
{
     instrucciones...
}]

La condición debe ser un resultado booleano, esto es, que su valor sea true o false (a diferencia de C/C++ donde la condición puede ser un entero donde 0 es falso y cualquier otra cosa es verdadero).
La parte del else es opcional y las llaves {} de los bloques también son opcionales cuando el bloque se compone de una sola instrucción pero es recomendado como buena práctica siempre usarlos.

La instrucción for se compone de:

for([inicialización]; [condición de paro]; [aumento])
{
     instrucciones...
}

Todas las partes son opcionales. Si no asignas una condición de paro, el for será un ciclo infinito (que se puede romper con una sentencia de salto como break). Al igual que en el if, el bloque delimitado por las llaves {} es opcional si es solo una instrucción, pero es mejor siempre usarlo.
El formato más común de for es el clásico:

for(int i=0; i<5; i++)
{
}

La instrucción while tiene la forma:

while(<condición de continuación>)
{
}

Al igual que en el if, el bloque delimitado por las llaves {} es opcional si es solo una instrucción, pero es mejor siempre usarlo; y la condición debe ser obligatoriamente un booleano.

Ejercicios

Ahora a usar lo aprendido hasta ahorita:

1.- Hacer un programa que lea de consola dos enteros separados por un espacio y escriba de regreso el menor de ellos.

A diferencia de la función scanf de C/C++, Console.ReadLine siempre lee cadenas de caracteres (string) por lo que la entrada deberá ser convertida a entero. Esto puede ser hecho con el método Parse de Int32 (también se puede escribir como int.Parse(datos[0]); pero yo prefiero usar la clase Int32).

Cada tipo de datos básico tiene su función Parse que convierte de una cadena a el tipo especificado, por ejemplo, puedes convertir a un booleano con Boolean.Parse("True"), o a un double con Double.Parse("3.1416");

En los comentarios en la imagen, dice que la comparación también se puede hacer usando el operador ternario ?:

2.- Escribir un programa que imprima las tablas de multiplicar (del 2 al 10)


En este código de ejemplo puedes ver que el método WriteLine acepta una cadena de formato. Esto es, escribes la cadena con ciertos contenedores donde se escribirá el valor de una variable. Estos contenedores se delimitan entre llaves {} y contienen la posición de la variable (empezando en 0) que irá en ese lugar. Las variables que se declaran después de la cadena, separadas por comas. En este caso la variable 0 es i, la 1 es j y la 2 es i*j. El orden en que escribas los contenedores en la cadena de formato no importa, por ejemplo, podríamos haber escrito:

Console.WriteLine("{2} = {0} x {1}", i, j, i * j);

Existen varios modificadores que se pueden usar en la cadena de formato. Los puedes revisar aquí.

Tareas:

1.- Escribe un programa que lea de consola 5 números separados por un espacio y los escriba en orden en otra linea.

2.- BizzBuzz
Escribe una aplicación que escriba el resultado de jugar BizzBuzz hasta el número 1000.

3.- Escribe un programa que escriba "par" si el segundo actual es par e "impar" si el segundo actual es impar. (para conocer el segundo actual puedes usar int actual = DateTime.Now.Second;)

4.- Escribe una aplicación que lea un entero de la consola y escriba un triángulo de *'s con una base de tamaño n (como se muestra en la figura).

Puedes escribir cadenas en la misma linea usando el método Console.Write

5.- Escribe un programa que escriba en consola la suma de la hora mas el minuto mas el segundo actuales hasta que esta suma sea un múltiplo de 13.

jueves, 29 de diciembre de 2011

Primeros pasos

Las variables en C# se declaran basicamente igual que en C/C++:
tipo nombre [, nombres] [= inicialización]

C# es un lenguaje de tipos estáticos y sus tipos los puedes consultar en la siguiente tabla.

Algunos ejemplos de como declarar variables:
int i;
long a, b;
string nombre = "Limo Wan Kenobi";

Existe una estructura que aunque no es un tipo de C# es muy usada: DateTime, que como su nombre lo indica, nos sirve para manejar fechas y horas.

Esta estructura tiene una propiedad que nos da la fecha y hora actuales: DateTime.Now y algunos constructores interesantes, por ejemplo el que construye una nueva fecha recibiendo como parámetros varios enteros indicando el año, mes, día, hora, minuto y segundo.

DateTime actual = DateTime.Now;
DateTime fecha = new DateTime(2011, 05, 05, 11, 45, 00);

Para el caso de las cadenas (string literals), existe un tipo especial que son las que se declaran con una @ antes de la cadena:

string path = @"c:\folder1\folder2\file.txt";

En una cadena normal (i.e: "cadena") el carácter '\' se llama carácter de escape y sirve para declarar que se usará un carácter especial. Los más comunes son:

\n .- Salto de linea
\" .- Comillas dentro de la cadena (")
\\ .- diagonal invertida (backslash \)

En el caso de las cadenas que llevan el prefijo @, el carácter '\' no funciona como carácter de escape sino como lo que es, una diagonal invertida.

Puedes revisar este link con varias cosas especiales de los strings. Un método muy comúnmente usado en los string es "Split" el cual sirve para separar una cadena en varias tomando un (o unos) carácter(es) como separadores (el mas común el espacio ' ').

string input = "1 2 3 hola adiós";
string[] separado = input.Split(' ');

Resultará en 5 cadenas: "1", "2", "3", "hola", "adiós"

Los operadores en C# son también bastante comunes y parecidos a los de C/C++. aunque hay algunos especiales que iremos viendo poco a poco.





miércoles, 28 de diciembre de 2011

Hola Mundo

Para variar, lo primero que haremos será un "Hola Mundo" para aprender a crear proyectos en Visual Studio y compilar y esas cosas.

Primero abrir Visual Studio y en la primer pantalla, dar click en Crear Nuevo Proyecto:


Y aparecerá un Wizard con muchas opciones.
Empezaremos creando aplicaciones de Consola:


Al dar Ok, generará un nuevo proyecto de Consola. (La consola es una pantalla negra de solo texto. Es el tipo más sencillo de aplicación que se puede ejecutar).


Al generar el proyecto, deberás ver una pestaña con el código y otra pestaña con el Explorador de Soluciones:

Una Solución es un contenedor de proyectos. Esto es, puede haber muchos proyectos en una misma solución. Un proyecto es un contenedor de archivos de código que se compila en un Assembly o Ensamblado (en español).

Recomiendo leer el link acerca de los ensamblados para saber de que estamos hablando, pero en resumen, una aplicación está compuesta por uno o más Ensamblados; algunos son Librerías Dinámicas (DLL's) y otros son ejecutables (.Exe). Cada ensamblado contiene el resultado de compilar el código que escribiste.

A diferencia de compilar en C/C++, en C# (en .Net en general), la compilación no genera código máquina sino que genera código en Intermediate Language (IL), esta diferencia no es importante en este momento.

La sintaxis de C# está basada en la de C/C++ por lo que verás que el código se ve muy parecido.

Dentro del código autogenerado por Visual Studio vemos varias partes:

  1. Varias líneas que comienzan con using. Esta sección la revisaremos mas adelante. Deberemos obviarla de momento. Basta decir que cada sentencia using está seguida de un namespace.
  2. Una línea que comienza con namespace. Esta linea indica en que "Espacio de nombres" nos encontramos (Ver link).
  3. Las llaves (parentesis curvos) { } indican bloques de código. ¿Cómo leer los bloques?
  4. Dentro del bloque del namespace se encuentra una declaración de una clase con la sentencia class. Las clases son un concepto básico de la programación en C# por lo que lo estaremos viendo todo el tiempo. En este momento basta saber que todo el código que escribiremos pertenece a la clase Program.
  5. Dentro del bloque de código que corresponde a la clase Program, encontramos un método llamado Main. Este método empieza con el modificador static, es de tipo "vacío" (void) y recibe un parámetro llamado args. Todo esto lo puedes obviar en este momento. Lo importante en este momento es que toda aplicación de consola necesita de un "método de entrada" o de inicio llamado Main. Este es el método que se ejecutará en cuanto la aplicación inicie.

Todo el código que estaremos escribiendo en esta primera parte irá dentro del bloque del método Main.

El código generado por Visual Studio es un programa completo. Que no hace nada. Pero a final de cuentas es un programa. Para ejecutarlo buscas el Menú Debug->Start Debugging (La tecla rápida es F5 en general).

Verás como se abre una nueva ventana con fondo negro y como desaparece inmediatamente. Esa fue una aplicación de consola que se inició, se ejecutó y se cerró (sin hacer absolutamente nada).

El primer objeto que aprenderemos a usar será Console. De este objeto nos van a interesar (en este momento) dos métodos: WriteLine y ReadLine que como su nombre lo indica, sirven para escribir una línea y para leer una línea respectivamente. Son los equivalentes a printf y scanf de C++.

Dentro del bloque del método Main, escribe las siguientes instrucciones:

Console.WriteLine("Hola Mundo");
Console.ReadLine();

Las cadenas de texto en C# se escriben entre comillas " ", el método WriteLine escribe la cadena de texto tal cual la colocas.

Las llamadas a métodos en C# (al igual que en C/C++) terminan con punto y coma ;.

Si ejecutas la aplicación (F5) deberás ver algo así:


Y esta vez la ventana de la consola no se cerrará. Esto es debido a la instrucción Console.ReadLine(); que esta esperando a leer lo que el usuario escriba. Para que la ejecución continúe, deberás presionar Enter (en cuyo caso, la ejecución continuará y la aplicación se cerrará).



Inicio

En este blog iré escribiendo un mini cursito de C# para Ale y chance para el Mario. Y cualquier otra persona que le interese.

Como Ale ya conoce un poco de C/C++ asumiré muchas veces que el lector ya tiene idea de que es programar y como se hace. 

Además, estoy asumiendo que ya se tiene Visual Studio 2010 instalado.
Si no lo tienen, se puede descargar una versión gratuita: Express Edition