Funciones
Una función es un conjunto de declaraciones, definiciones, expresiones y sentencias que realizan una tarea específica.El formato general de una función en C es
especificador_de_tipo nombre_de_función( lista_de_parámetros )El especificador_de_tipo indica el tipo del valor que la función devolverá mediante el uso de
{
variables locales}
código de la función
return. El valor puede ser de cualquier tipo válido. Si no se específica un valor, entonces la computadora asume por defecto que la función devolverá un resultado entero. No se tienen siempre que incluir parámetros en una función. la lista de parámetros puede estar vacía. Las funciones terminan y regresan automáticamente al procedimiento que las llamó cuando se encuentra la última llave
}, o bien, se puede forzar el regreso antes usando la sentencia return. Ademas del uso señalado la función return se usa para devolver un valor. Se examina a continuación un ejemplo que encuentra el promedio de dos enteros:
float encontprom(int num1, int num2)
{
float promedio;
promedio = (num1 + num2) / 2.0;
return(promedio);
}
main()
{
int a=7, b=10;
float resultado;
resultado = encontprom(a, b);
printf("Promedio=%f\n",resultado);
}
Funciones void
Las funcionesvoid dan una forma de emular, lo que en otros lenguajes se conocen como procedimientos (por ejemplo, en PASCAL). Se usan cuando no requiere regresar un valor. Se muestra un ejemplo que imprime los cuadrados de ciertos números. void cuadrados()
{
int contador;
for( contador=1; contador<10; contador++)
printf("%d\n",contador*contador);
}
main()
{
cuadrados();
}
En la función cuadrados no esta definido ningún parámetro, y por otra parte tampoco se emplea la sentencia return para regresar de la función. Funciones y arreglos
Cuando se usan un arreglo como un argumento a la función, se pasa sólo la dirección del arreglo y no la copia del arreglo entero. Para fines prácticos podemos considerar el nombre del arreglo sin ningún índice como la dirección del arreglo.Considerar el siguiente ejemplo en donde se pasa un arreglo a la función
imp_rev, observar que no es necesario especificar la dimensión del arreglo cuando es un parámetro de la función. void imp_rev(char s[])
{
int t;
for( t=strlen(s)-1; t>=0; t--)
printf("%c",s[t]);
}
main()
{
char nombre[]="Facultad";
imp_rev(nombre);
}
Observar que en la función imp_rev se usa la función strlen para calcular la longitud de la cadena sin incluir el terminador nulo. Por otra parte, la función imp_rev no usa la sentencia return ni para terminar de usar la función, ni para regresar algún valor. Se muestra otro ejemplo,
float enconprom(int tam, float lista[])
{
int i;
float suma = 0.0;
for ( i=0; i<tam; i++)
suma += lista[i];
return(suma/tam);
}
main()
{
float numeros[]={2.3, 8.0, 15.0, 20.2, 44.01, -3.0, -2.9};
printf("El promedio de la lista es %f\n", enconprom(7,numeros) );
}
Para el caso de que se tenga que pasar un arreglo con más de una dimensión, no se indica la primera dimensión pero, el resto de las dimensiones deben señalarse. Se muestra a continuación un ejemplo: void imprtabla(int tamx,int tamy, float tabla[][5])
{
int x,y;
for ( x=0; x<tamx; x++ )
{
for ( y=0; y<tamy; y++ )
printf("t[%d][%d]=%f",x,y,tabla[x][y]);
printf("\n");
}
}
Prototipos de funciones
Antes de usar una función C debe tener conocimiento acerca del tipo de dato que regresará y el tipo de los parámetros que la función espera.El estándar ANSI de C introdujó una nueva (mejor) forma de hacer lo anterior respecto a las versiones previas de C.
La importancia de usar prototipos de funciones es la siguiente:
- Se hace el código más estructurado y por lo tanto, más fácil de leer.
- Se permite al compilador de C revisar la sintaxis de las funciones llamadas.
Si no es así, entonces la función se debe declarar. La declaración simplemente maneja el tipo de dato que la función regresa y el tipo de par^o'ametros usados por la función.
Es una práctica usual y conveniente escribir el prototipo de todas las funciones al principio del programa, sin embargo esto no es estrictamente necesario.
Para declarar un prototipo de una función se indicará el tipo de dato que regresará la función, el nombre de la función y entre paréntesis la lista del tipo de los parámetros de acuerdo al orden que aparecen en la definición de la función. Por ejemplo:
int longcad(char []);Lo anterior declara una función llamada
longcad que regresa un valor entero y acepta una cadena como parámetro. Ejercicios
Desarrollar la siguiente codigo :
Identificar el funcionamiento del siguiente codigo propuestp
#include <stdio.h>
int sumar(int numero1, int numero2); /* prototipo de la función */
int main(void)
{
int suma; /* definimos una variable*/
suma = sumar(5, 3);
/* la variable obtiene el valor retornado de sumar
* puede verse que entre los paréntesis se mandan los valores
* de los números que se desean sumar en este caso 5 y 3
* pueden haberse declarados estos dos números en otras variables
* int dato = 4, valor = 3;
* suma = sumar(dato, valor);
*/
/* imprimimos la suma de los dos números */
printf("La suma es: %d ", suma);
return 0;
}
int sumar(int numero1, int numero2)
{
int retsuma; /* creamos la variable a retornar*/
retsuma = numero1 + numero2; /* asignamos a esa variable la suma de número 1 y 2*/
return retsuma; /* retornamos la suma de los números */
}
2 Desarrollar el siguiente ejemplo de paso de parametros por valor
Paso de Parámetros
Las funciones pueden recibir datos como lo hemos observado, pero existen dos formas importantes de enviar los datos hacia una función por valor y por referencia, con las cuales observarse que son muy diferentes y que una puede ser muy diferente de la otra, haciendo modificaciones en nuestro programa.
Por Valor
El paso por valor envía una copia de los parámetros a la función por lo tanto los cambios que se hagan en ella no son tomados en cuenta dentro de la función main(). Ejemplo:#include <stdio.h> void sumar_valor(int numero); /* prototipo de la función */ main() { int numero = 57; /* definimos numero con valor de 57*/ sumar_valor(numero); /* enviamos numero a la función */ printf("Valor de numero dentro de main() es: %d\n", numero); /* podemos notar que el valor de numero se modifica * sólo dentro de la función sumar_valor pero en la principal * número sigue valiendo 57 */ getchar();
getchar(); } void sumar_valor(int numero) { numero++; /* le sumamos 1 al numero */ /* el valor de número recibido se aumenta en 1 * y se modifica dentro de la función sumar_valor() */ printf("Valor de numero dentro sumar_valor() es: %d\n", numero); return; }
Desarrollar el siguiente codigo de paso de parametros por referencia
Por Referencia
El paso por referencia se hace utilizando apuntadores. Se envía la dirección de memoria de la variable, por lo tanto los cambios que haga la función si afectan el valor de la variable. Ejemplo:
#include <stdio.h> void sumar_referencia(int *numero); /* prototipo de la función */ main() { int numero = 57; /* definimos numero con valor de 57*/ sumar_referencia(&numero); /* enviamos numero a la función */ printf("\nValor de numero dentro de main() es: %d ", numero); /* podemos notar que el valor de numero se modifica * y que ahora dentro de main() también se ha modificado * aunque la función no haya retornado ningún valor. */ getchar(); getchar();
} void sumar_referencia(int *numero) { *numero += 1; /* le sumamos 1 al numero */ /* el valor de numero recibido se aumenta en 1 * y se modifica dentro de la función */ printf("\nValor de numero dentro sumar_referencia() es: %d", *numero); }
Ciclo de ordenamiento dentro de arreglos
Algoritmo
i=0,j=0,N=4
ListaNoOrdenada[5] {5,10,1,3,2}
Para i desde 0 hasta N
Para j desde 0 hasta N
Si No_Ordenados(ListaNoOrdenada[j] > ListaNoOrdenada[j + 1] entonces
variable_temp = ListaNoOrdenada[j]
ListaNoOrdenada[j] = ListaNoOrdenada[j + 1]
ListaNoOrdenada[j + 1] = variable_temp
FinSi
Siguiente i
Fin