jueves, 25 de mayo de 2017

LAS FUNCIONES

Definiendo una función[editar] Una función es un conjunto de líneas de código que realizan una tarea específica y puede retornar un valor. Las funcionespueden tomar parámetros que modifiquen su funcionamiento.
Las funciones constan de cinco partes:
modificador tipo Nombre(parámetros)
{
código

Veremos ahora las cinco partes, pero conforme estudiemos a las funciones sabremos cómo son utilizadas. Las funciones pueden regresar información y esta información
puede ser cadena, entero, flotante o cualquier otro tipo. En la sección de tipo tenemos que indicar precisamente la clase de información que regresa. Si la función no regresa ningún valor entonces tenemos que indicar a su tipo como void. Todas las funciones deben identificarse y lo hacemos por medio de su nombre. Las funciones que coloquemos adentro de las clases deben de tener un nombre único. El nombre también es utilizado para invocar o ejecutar a la función.

Las funciones pueden necesitar de datos o información para poder trabajar. Nosotros le damos esta información por medio de sus parámetros. Los parámetros no son otra cosa que una lista de variables que reciben estos datos. Si la función no necesita usar a los parámetros, entonces simplemente podemos dejar los paréntesis vacíos. Nunca debemos olvidar colocar los paréntesis aunque no haya parámetros. El código de la función se sitúa adentro de un bloque de código. En esta sección podemos colocar cualquier código válido de C#, es decir, declaración de variables, ciclos, estructuras selectivas e incluso invocaciones a funciones.
Las funciones al ser declaradas pueden llevar un modificador antes del tipo. Los modificadores cambian la forma como trabaja la función. Nosotros estaremos utilizando un modificador conocido como static. Este modificador nos permite usar a la función sin tener que declarar un objeto de la clase a la que pertenece.
Funciones que ejecutan código
El primer tipo de funciones que vamos a conocer son las que ejecutan código. Estas funciones no reciben datos y no regresan ningún dato. Solamente llevan a cabo alguna operación. Aunque en este momento no parecen muy útiles, sí lo son.
Para poder utilizar la función, debemos declararla. La declaración se debe hacer adentro del bloque de código correspondiente a una clase. Para los ejemplos analizados en este libro, estamos usando la clase denominada Program. Nuestra función Main() se encuentra también adentro de esta clase.
En este momento tomaremos una estrategia de programación, que aún no pertenece a la programación estructurada, en el futuro veremos las técnicas orientadas a objetos. En esta técnica usamos a la función Main() como administradora de la lógica y la mayor parte del proceso se llevará a cabo en las funciones.
Crearemos una aplicación y le colocaremos cada uno de los tipos de funciones que vamos a aprender, dejando a Main() como nuestra administradora del programa. El programa va a ser conceptualmente sencillo, ya que lo que nos interesa es comprender el funcionamiento de las funciones.
El programa simplemente se encargará de preguntarle al usuario el tipo de operación aritmética que queremos llevar a cabo y luego la realizará con los datos dados que le proporcionemos. Este programa ya fue resuelto anteriormente, pero en este caso será implementado agregando el uso de las funciones.
En el diagrama de flujo indicamos a la función por medio de un rectángulo que tiene dos franjas a los lados. Cuando lo veamos, sabemos que tenemos que ir a la función y ejecutar su código. Veamos cómo quedaría el diagrama de flujo de la aplicación.
Funciones que regresan un valor
Nuestro siguiente tipo de función puede regresar un valor. Esto significa que cuando la función es invocada va a llevar a cabo la ejecución de su código. El código va a calcular un valor de alguna manera y este valor calculado por la función será regresado a quien haya invocado a la función. La invocación puede haber sido hecha por la función Main() o algún otra función.
Como la función va a regresar un valor, necesitamos indicar su tipo. El tipo va a depender del valor devuelto. Si el valor es un entero, entonces el tipo de la función es int. Si el valor es un flotante, la función tendrá tipo float y así sucesivamente. La función puede regresar cualquiera de los tipos definidos en el lenguaje y también tipos definidos por el programador y objetos de diferentes clases.

Nuestro siguiente tipo de función puede regresar un valor. Esto significa que cuando la función es invocada va a llevar a cabo la ejecución de su código. El código va a calcular un valor de alguna manera y este valor calculado por la función será regresado a quien haya invocado a la función. La invocación puede haber sido hecha por la función Main() o algún otra función.
Como la función va a regresar un valor, necesitamos indicar su tipo. El tipo va a depender del valor devuelto. Si el valor es un entero, entonces el tipo de la función es int. Si el valor es un flotante, la función tendrá tipo float y así sucesivamente. La función puede regresar cualquiera de los tipos definidos en el lenguaje y también tipos definidos por el programador y objetos de diferentes clases.

Funciones que reciben valores
Hasta el momento las funciones que hemos utilizado piden directamente al usuario los valores que necesitan para trabajar. Sin embargo, las funciones también pueden recibir valores en el momento que son invocadas. De esta forma trabajarán con los valores pasados por el programa en lugar de pedirlos al usuario. Estos valores son conocidos como parámetros. Los parámetros pueden ser de cualquier tipo, ya sea de los tipos nativos de C# como entero, flotante, cadena o de tipos definidos por el programador como clases y estructuras.

Los parámetros deben llevar su tipo y su nombre. El nombre nos permite acceder a los datos que contiene y de hecho van a trabajar como si fueran variables locales a la función. Adentro de la función los usamos como variables normales. Los parámetros se definen en la declaración de la función. Adentro de los paréntesis de la función los listamos. La forma de listarlos es colocando primero en tipo seguido del nombre. Si tenemos más de un parámetro para la función, entonces debemos separarlos por medio de comas.



LAS COLECCIONES MAS IMPORTANTES

Las colecciones son estructuras de datos que nos permiten guardar en su interior cualquier tipo de información. Existen diferentes tipos de colecciones y la forma como se guarda, se accede y se elimina la información en cada una de ellas es distinta. En los arreglos nosotros teníamos que indicar la cantidad de elementos que el arreglo debía tener. En las colecciones esto no es necesario, ya que es posible agregar elementos dinámicamente. Esto quiere decir que cuando el programa se está ejecutando podemos adicionar o borrar sus elementos.
En otros lenguajes de programación cuando se desea tener este tipo de estructuras generalmente es necesario programarlas antes de poder usarlas. Sin embargo C# nos provee de las colecciones más importantes y podemos utilizarlas directamente sin tener que hacer ningún tipo de desarrollo previo.
Las coleccione que aprenderemos en este capítulo son: ArrayList, Hashtable, Queue, y Stack. También aprenderemos un nuevo tipo de ciclo que nos facilitará la utilización de estas colecciones.
El ArrayList
ArrayList en Java, con ejemplos. La clase ArrayList en Java, es una clase que permite almacenar datos en memoria de forma similar a los Arrays, con la ventaja de que el numero de elementos que almacena, lo hace de forma dinámica, es decir, que no es necesario declarar su tamaño como pasa con los Array


La primera colección que aprenderemos se conoce como ArrayList, que guarda la información como si fuera una lista. Y sobre esta lista es posible realizar diferentes actividades con los elementos almacenados. Entendemos al ArrayList como un arreglo que puede cambiar su tamaño según lo necesitemos.
Puede guardar cualquier tipo de dato, por lo que lo podemos usar para enteros, cadenas, flotantes o incluso para tipos definidos por nosotros mismos. ArrayList es una clase en C#, por lo que va a tener métodos o funciones que nos permitirán trabajar con los datos.
El ArrayList tiene una propiedad que llamamos capacidad, que indica el tamaño que ocupa la lista. También tenemos el conteo, el cual nos dice cuántos elementos está guardando en su interior.
Para entender cómo funciona ArrayList crearemos una pequeña aplicación y en ella realizaremos las operaciones más importantes.
Declaración de un ArrayList
En nuestro programa podemos tener tantos ArrayList como sean necesarios, pero es necesario declararlos primero. La declaración se lleva a cabo de la siguiente manera:
Lo primero que necesitamos es indicar ArrayList, ya que éste es el nombre de la clase. Luego colocamos el nombre que va a tener, en nuestro caso es datos. Posteriormente pasamos a la instanciación, la cual se lleva a cabo por medio de new. En este ejemplo el constructor de la clase no recibe ningún parámetro.
Si bien el ArrayList aumenta su tamaño dinámicamente, es posible instanciar el arreglo con algún valor  de capacidad inicial. Esto es útil si sabemos inicialmente cuantos elementos puede contener el ArrayList. para hacerlo simplemente colocamos la capacidad inicial entre los paréntesis de la siguiente forma:
Aquí, datos tiene una capacidad inicial de 32, aunque se encuentre vacío.
Adición de información
Nosotros podemos adicionar cualquier tipo de información al ArrayList. Hacerlo es muy sencillo y requiere que usemos un método conocido como Add().
Para encontrar un elemento
Con los ArrayList es posible saber si un elemento en particular se encuentra adentro de él. Para lograr esto hacemos uso del método IndexOf(). Este método requiere de un solo parámetro que es el objeto a buscar adentro del ArrayList. El método nos regresa un valor entero.
Este valor es el índice donde se encuentra la primera ocurrencia del elemento, esto es debido a que podemos tener el elemento guardado en diferentes posiciones. Si el elemento no se encuentra en el ArrayList, entonces simplemente recibimos el valor de -1.


LA TOMA DE DESICIONES

Las sentencias de decisión o también llamadas de CONTROL DE FLUJO son estructuras de control que realizan una pregunta la cual retorna verdadero o falso (evalúa una condicion) y selecciona la siguiente instrucción a ejecutar dependiendo la respuesta o resultado.
No todos los problemas se resuelven linealmente, a veces es necesario tener que tomar una decisión o ejecutar determinadas acciones cuando una condición se cumple, y otras cuando no lo hace. Supongamos que nuestro problema consiste en mantener la temperatura de un balde con agua tibia. Para hacerlo nosotros podemos agregar agua caliente o agua fría. En este problema necesitaríamos tomar una decisión sobre qué tipo de agua agregar.

necesitamos conocer una condición o tomar una decisión. En C# es sencillo poder lograr esto, ya que el lenguaje nos provee diferentes herramientas para poder lograrlo. Tendremos que utilizar expresiones y éstas se evaluarán. En este caso usaremos expresiones relacionales y expresiones lógicas, que se evaluarán, y dependiendo del resultado de esa evaluación, se llevarán a cabo ciertos pasos del algoritmo u otros. Empecemos por conocer las expresiones que necesitamos.
La ejecución de las instrucciones incluyendo una estructura de control como el condicional funcionan de esta manera:
  • Las instrucciones comienzan a ejecutarse de forma secuencial (en orden) y cuando se llega a una estructura condicional, la cual esta asociada a una condicion, se decide que camino tomar dependiendo siempre del resultado de la condicion siendo esta falsa o verdadera.
Crystal_Clear_app_kedit.png
Expresiones relacionales
Las expresiones relacionales se usan para expresar la relación que existe entre dos valores. Los valores pueden estar contenidos adentro de variables o ser colocados explícitamente. Estas expresiones, al igual que las expresiones aritméticas, tienen sus propios operadores. La expresión será evaluada, pero el resultado de la evaluación tendrá únicamente dos valores posibles: true false.
Ambos valores son de tipo bool true es usado para indicar que la expresión evaluada es verdadera. El valor de false por su parte se utiliza para indicar que la expresión evaluada es falsa.

C# proporciona muchos operadores, que son símbolos que especifican las operaciones (matemáticas, indización, llamada de función, etc.) que se realizan en una expresión. Puede sobrecargar muchos operadores para cambiar su significado al aplicarlos a un tipo definido por el usuario.
Las operaciones de tipos enteros (como ==!=<>& y |) suelen estar permitidas en los tipos de enumeración .
En las secciones se enumeran los operadores de C# desde la precedencia más alta a la más baja. Los operadores de cada sección comparten el mismo nivel de precedencia.

El uso de if
Ya aprendimos a usar las expresiones relacionales y el tipo de valor devuelto. Es el momento de hacer algo práctico con ellas. Este tipo de expresiones se usa en diferentes casos, pero generalmente en las estructuras selectivas o repetitivas.
Las estructuras selectivas serán estudiadas en este capítulo, las repetitivas en un capítulo posterior. Las estructuras selectivas son aquellas que nos permiten hacer una selección entre dos o varias rutas de ejecución posibles. La selección se llevará a cabo según el valor de una expresión. Esta expresión puede ser una expresión relacional.
Nuestra primera estructura selectiva se conoce como if, que es un si condicional. Si tal cosa sucede, entonces haz tal cosa. El uso del if es sencillo:
if(expresión)
Sentencia a ejecutar

El uso de if requiere que coloquemos una expresión a evaluar entre paréntesis. Si el resultado de esta expresión es true, entonces la sentencia a ejecutar se lleva a cabo.
Si el resultado de la evaluación es false, entonces la sentencia a ejecutar nunca se lleva a cabo, o dicho de otra forma, es ignorada.
En el diagrama de flujo if se representa por medio de un rombo. En el interior del rombo colocamos la expresión a evaluar, de las esquinas sacamos una ruta de ejecución en el caso de que sí se cumpla la condición o en el caso de que no se cumpla.

bool condition = true; if (condition) { Console.WriteLine("The variable is set to true."); } else { Console.WriteLine("The variable is set to false.");
}
El uso de else
Con los programas anteriores con los que estuvimos trabajando, donde utilizamos la sentencia if, hemos visto que podemos indicar que determinada sentencia se ejecute cuando deseamos que una condición se cumpla. Sin embargo, puede ocurrir que a veces necesitamos que una sentencia se ejecute cuando se cumple la condición y que otra sentencia se ejecute cuando esa condición no se cumpla. Si nos encontramos en este caso, una forma de resolverlo sería colocar un if con una condición y luego otro if con una condición que sea complemento de la primera. Esto ya lo hemos hecho anteriormente en el programa de los números positivos y negativos. Sin embargo, existe otra forma más sencilla que la utilizada en este programa para hacerlo. Esta forma puede sernos de mucha utilidad para simplificar la lógica y que no nos veamos obligados de tener que colocar tantos if dentro de una sentencia. Para lograr esto haremos uso de else.
Siempre utilizaremos else a continuación de una sentencia if, ya que else no se puede usar sólo. Tenemos que colocar nuestro código de la siguiente forma:
if(condición)
                Sentencia1; 
else
Sentencia2;

la lógica y que no nos veamos obligados de tener que colocar tantos if dentro de una sentencia. Para lograr esto haremos uso de else.
Siempre utilizaremos else a continuación de una sentencia if, ya que else no se puede usar sólo. Tenemos que colocar nuestro código de la siguiente forma:
Si la condición es evaluada como verdadera, entonces  se ejecuta la sentencia 1, en cambio, cuando la condición se evalúa como falsa, se ejecuta la sentencia 2. A continuación analizaremos cómo hacer uso de este caso para simplificar nuestro código. Para esto elegimos para representar este ejemplo el programa de los números positivos y negativos. 



Escalera de if-else
Otra estructura que se puede utilizar es la escalera de if-else. Una de sus funciones principales es optimizar la ejecución del código. Algunas veces son necesarias porque así lo requiere la lógica del programa. Al igual que con los if anidados, no hay que utilizarlos sin planeación, ya que al no programarlos correctamente, nos puede llevar a errores de lógica que pueden resultar difíciles de solucionar.
Ahora aprendamos cómo los podemos usar para que nuestro código se vuelva más eficiente. Si observamos el programa de las operaciones matemáticas, tenemos un if para cada operación. Esto significa que cuando nuestro programa se ejecuta, sin importar si se ha seleccionado la suma o la multiplicación, siempre se tienen que ejecutar al menos cuatro if. Los if pueden ser operaciones costosas ya que se tienen que evaluar expresiones.
La forma de optimizar esto es con una cadena de if-else. El concepto es sencillo y consiste en colocar un if en la sentencia del else. 
if(expresión 1)
Sentencia1;
else
Sentencia2;


Expresiones lógicas
Al igual que las expresiones aritméticas y relacionales, las expresiones lógicas tienen sus propios operadores. Éstos son: y, o y no. En inglés los conocemos como: andor not.


El uso de la conjunción
Empecemos a conocerlos. El primer operador es y, conocido como conjunción. Para usar este operador es necesario tener dos expresiones. Una expresión a la izquierda y la otra a la derecha. Las expresiones se evalúan devolviendo valores true false. Con la conjunción, la expresión se evalúa como verdadera únicamente cuando ambas expresiones son verdaderas. La siguiente es la tabla de verdad para este operador.
El uso de switch
switch(VariableNumerica) /*dentro de los parentesis va la variable numerica que determina la opcion de menu*/
{


case 1: //si la "VariableNumerica" vale "1" se ejecutara esta opcion

{

/*...tus instrucciones aqui....*/

}
case 2: //si la "VariableNumerica" vale "2" se ejecutara esta opcion
{/*..mas instrucciones...*/
break;

}

default:  /*el default es opcional y se ejecuta cuando el valor que recibe el switch no esta incluido dentro de las opciones programadas con "case"*/
{

break;

}

}
En uno de los ejemplos anteriores, en los que realizamos las operaciones matemáticas, hemos observado que para cada operación debemos utilizar un if. Esto es correcto, y en varias ocasiones veremos que es necesario tomar diferentes opciones dependiendo del valor de una variable.
Como esto puede ocurrir frecuentemente, tenemos una estructura selectiva que nos ayuda y nos permite colocar el código para estos casos con facilidad. Esta estructura se conoce como switch. Para ésta necesitamos una variable y varios casos. Por ejemplo, en el programa de las operaciones, cada una de ellas es un caso. El valor de la variable se compara con un valor para cada caso. Si el valor coincide, entonces se empieza a ejecutar el código a partir de esa línea.
Cuando usamos switch es necesario colocar entre paréntesis la variable que utilizaremos para llevar a cabo las comparaciones. Luego tenemos que crear un bloque de código y colocar adentro de él los casos y el código a ejecutar para cada caso. Para indicar un caso, usamos case seguido del valor de comparación y dos puntos.
Existe un caso llamado defaultque podemos utilizar si lo deseamos. Este caso siempre debe ser el último caso definido. Cuando la variable de comparación no ha encontrado su valor en ninguno de los casos, entonces se ejecuta el código del caso defaultEn los casos podemos colocar cualquier código C# que sea válido.
Para indicar dónde termina el código de un caso debemos hacer uso de break, que nos permitirá salir de la ejecución de una estructura selectiva o repetitiva. Esto lo veremos con más detalle en otro capítulo. Si no hacemos uso de break y el caso está vacío, entonces el programa continuará ejecutando el código del próximo caso y así sucesivamente hasta el final del bloque del código que pertenece al switch.
Switch puede ser representado en el diagrama de flujo por medio del rombo. En su interior colocamos la variable de comparación y de las esquinas o los lados podemos sacar las diferentes rutas de ejecución que puede tener. Como ejemplo modificaremos el programa de las operaciones aritméticas para que haga uso del switch