jueves, 4 de septiembre de 2008

Funciones

Las funciones son bloques de código utilizados para dividir un programa en partes más pequeñas, cada una de las cuáles tendrá una tarea determinada.
     Su sintaxis es:


tipo_función nombre_función (tipo y nombre de argumentos)
{
bloque de sentencias
}


tipo_función: puede ser de cualquier tipo de los que conocemos. El valor devuelto por la función será de este tipo. Por defecto, es decir, si no indicamos el tipo, la función devolverá un valor de tipo entero ( int ). Si no queremos que retorne ningún valor deberemos indicar el tipo vacío ( void ).


nombre_función: es el nombre que le daremos a la función.


tipo y nombre de argumentos: son los parámetros que recibe la función. Los argumentos de una función no son más que variables locales que reciben un valor. Este valor se lo enviamos al hacer la llamada a la función. Pueden existir funciones que no reciban argumentos.


bloque de sentencias: es el conjunto de sentencias que serán ejecutadas cuando se realice la llamada a la función.


     Las funciones pueden ser llamadas desde la función main o desde otras funciones. Nunca se debe llamar a la función main desde otro lugar del programa. Por último recalcar que los argumentos de la función y sus variables locales se destruirán al finalizar la ejecución de la misma.



Paso de parámetros a una función


     Como ya hemos visto, las funciones pueden retornar un valor. Esto se hace mediante la instrucción return, que finaliza la ejecución de la función, devolviendo o no un valor.


     En una misma función podemos tener más de una instrucción return. La forma de retornar un valor es la siguiente:




return ( valor o expresión );


     El valor devuelto por la función debe asignarse a una variable. De lo contrario, el valor se perderá.

    



Existen dos formas de enviar parámetros a una función:

Por valor: cualquier cambio que se realice dentro de la función en el argumento enviado, NO afectará al valor original de las variables utilizadas en la llamada. Es como si trabajaramos con una copia, no con el original. No es posible enviar por valor arrays, deberemos hacerlo por referencia.


Por referencia: lo que hacemos es enviar a la función la dirección de memoria donde se encuentra la variable o dato. Cualquier modificación SI afectará a las variables utilizadas en la llamada. Trabajamos directamente con el original.



 



Para enviar un valor por referencia se utiliza el símbolo & ( ampersand ) delante de la variable enviada. Esto le indica al compilador que la función que se ejecutará tendra que obtener la dirección de memoria en que se encuentra la variable.


     Vamos a fijarnos en los ejemplos. En el ejemplo anterior podrás comprobar que antes y después de la llamada, las variables mantienen su valor. Solamente se modifica en la función intercambio ( paso por valor ).


     En el siguiente ejemplo podrás ver como las variables intercambian su valor tras la llamada de la función ( paso por referencia ).


     Las variables con un * son conocidas como punteros, el único dato en 'C' que puede almacenar una dirección de memoria.

Bucles

Los bucles son estructuras que permiten ejecutar partes del código de forma repetida mientras se cumpla una condición.
     Esta condición puede ser simple o compuesta de otras condiciones unidas por operadores lógicos.
Sentencia WHILE
     Su sintaxis es:


while (condición) sentencia;


     Con esta sentencia se controla la condición antes de entrar en el bucle. Si ésta no se cumple, el programa no entrará en el bucle.

     Naturalmente, si en el interior del bucle hay más de una sentencia, éstas deberán ir entre llaves para que se ejecuten como un bloque.



Sentencia DO...WHILE


     Su sintaxis es:




do{
sentencia1;
sentencia2;
}while (condición);


     Con esta sentencia se controla la condición al final del bucle. Si ésta se cumple, el programa vuelve a ejecutar las sentencias del bucle.

     La única diferencia entre las sentencias while y do...while es que con la segunda el cuerpo del bucle se ejecutará por lo menos una vez.



Sentencia FOR


     Su sintaxis es:




for (inicialización;condición;incremento){
sentencia1;
sentencia2;
}
      La inicialización indica una variable (variable de control) que condiciona la repetición del bucle. Si hay más, van separadas por comas:


for (a=1,b=100;a!=b;a++,b- -){


Sentencia BREAK


     Esta sentencia se utiliza para terminar la ejecución de un bucle o salir de una sentencia SWITCH.


Sentencia CONTINUE


     Se utiliza dentro de un bucle. Cuando el programa llega a una sentencia CONTINUE no ejecuta las líneas de código que hay a continuación y salta a la siguiente iteración del bucle.

Operadores Lógicos

Los operadores lógicos básicos son tres:

	&&	AND
|| OR
! NOT (El valor contrario)


     Estos operadores actúan sobre expresiones lógicas. Permiten unir expresiones lógicas simples formando otras más complejas.

Sentencia Condicionales

Este tipo de sentencias permiten variar el flujo del programa en base a unas determinadas condiciones.
     Existen varias estructuras diferentes:
Estructura IF...ELSE
     Sintaxis:


if (condición) sentencia;
      La sentencia solo se ejecuta si se cumple la condición. En caso contrario el programa sigue su curso sin ejecutar la sentencia.


     Otro formato:


if (condición) sentencia1;
else sentencia2;


     Si se cumple la condición ejecutará la sentencia1, sinó ejecutará la sentencia2. En cualquier caso, el programa continuará a partir de la sentencia2.



Estructura SWITCH


     Esta estructura se suele utilizar en los menús, de manera que según la opción seleccionada se ejecuten una serie de sentencias.


     Su sintaxis es:




switch (variable){
case contenido_variable1:
sentencias;
break;
case contenido_variable2:
sentencias;
break;
default:
sentencias;
}
      Cada case puede incluir una o más sentencias sin necesidad de ir entre llaves, ya que se ejecutan todas hasta que se encuentra la sentencia BREAK. La variable evaluada sólo puede ser de tipo entero o caracter. default ejecutará las sentencias que incluya, en caso de que la opción escogida no exista.

Operadores Relacionales

Los operadores relacionales se utilizan para comparar el contenido de dos variables.
     En C existen seis operadores relacionales básicos:

	>	Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
== Igual que
!= Distinto que
      El resultado que devuelven estos operadores es 1 para Verdadero y 0 para Falso.


     Si hay más de un operador se evalúan de izquierda a derecha. Además los operadores == y != están por debajo del resto en cuanto al orden de precedencia.

Sentencia scanf( )

     La rutina scanf permite entrar datos en la memoria del ordenador a través del teclado.
     El prototipo de la sentencia scanf es el siguiente:


scanf(control,arg1,arg2...);
      En la cadena de control indicaremos, por regla general, los modificadores que harán referencia al tipo de dato de los argumentos. Al igual que en la sentencia printf los modificadores estarán formados por el caracter % seguido de un caracter de conversión. Los argumentos indicados serán, nuevamente, las variables.


     La principal característica de la sentencia scanf es que necesita saber la posición de la memoria del ordenador en que se encuentra la variable para poder almacenar la información obtenida. Para indicarle esta posición utilizaremos el símbolo ampersand ( & ), que colocaremos delante del nombre de cada variable. ( Esto no será necesario en los arrays ).

Sentencia printf( )

     La rutina printf permite la aparición de valores numéricos, caracteres y cadenas de texto por pantalla.
     El prototipo de la sentencia printf es el siguiente:


printf(control,arg1,arg2...);


     En la cadena de control indicamos la forma en que se mostrarán los argumentos posteriores. También podemos introducir una cadena de texto ( sin necesidad de argumentos ), o combinar ambas posibilidades, así como secuencias de escape.


     En el caso de que utilicemos argumentos deberemos indicar en la cadena de control tantos modificadores como argumentos vayamos a presentar.


     El modificador está compuesto por el caracter % seguido por un caracter de conversión, que indica de que tipo de dato se trata.



 



Los modificadores más utilizados son:



	%c	Un único caracter
%d Un entero con signo, en base decimal
%u Un entero sin signo, en base decimal
%o Un entero en base octal
%x Un entero en base hexadecimal
%e Un número real en coma flotante, con exponente
%f Un número real en coma flotante, sin exponente
%s Una cadena de caracteres
%p Un puntero o dirección de memoria


El formato completo de los modificadores es el siguiente:




% [signo] [longitud] [.precisión] [l/L] conversión




Signo: indicamos si el valor se ajustará a la izquierda, en cuyo caso utilizaremos el signo menos, o a la derecha ( por defecto ).


Longitud: especifica la longitud máxima del valor que aparece por pantalla. Si la longitud es menor que el número de dígitos del valor, éste aparecerá ajustado a la izquierda.


Precisión: indicamos el número máximo de decimales que tendrá el valor.


l/L: utilizamos l cuando se trata de una variable de tipo long y L cuando es de tipo double.