[FUNCIONES] * Definición * Declaración * Llamada * vida de una

Anuncio
Introducción
• Estructuración del programa en partes
más pequeñas y sencillas
Modularización
 Propósito único
 Identificable
 Reusable
• Mayor claridad: programación,
depuración, etc.
• Construcción de librerías a medida
Definición de una función.
Encabezado
tipo_valor_retorno nombre_función (argumentos)
{
definición de variables;
Lista de
cuerpo de la función;
declaraciones de
}
variables,
precedidas por
su tipo
separadas por
coma
Declaración de las funciones
tipo_valor_retorno nombre_función (argumentos);
Prototipo de una función
Donde:
Include
Definiciones de constantes
Definiciones de variables globales
Prototipos de funciones
Función principal (main)
Debe coincidir con el encabezado de la función
Llamada
nombre_función (argumentos);
La llamada se ubica dentro de la función principal
en el lugar en donde quiero que se ejecute,
incorporando como argumentos las variables a
enviar a la función sin especificar su tipo.
Recordar que debe haber una congruencia de
cantidad y tipo de datos entre lo que se envía y
recibe la función (encabezado).
Si la función devuelve algún valor, la llamada
debería aparecer dentro de una expresión.
Al enviar una variable a una función, se
envía una COPIA de la misma.
Uso de una función
Una función se invoca proporcionando valores
a los argumentos de la llamada.
–Los argumentos se pasan siempre por valor.
–El valor se devuelve por medio de return().
–Los procedimientos son funciones de tipo void.
–El control del número y tipo de argumentos es mínimo.
–Las funciones en C admiten recursividad.
–No pueden devolverse tablas y solo un dato o nada.
Vida de las variables
• Variables locales: son declaradas dentro
de una función y solo son válidas dentro de
ellas.
• Variables globales: son declaradas antes
de las funciones y se pueden usar en
todas las funciones. Mantienen los valores
que se les asignan en las funciones.
Es mejor hacer uso de variables locales
para evitar efectos secundarios o laterales.
Función sin parámetros
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
void pantalla ( void);
int main ()
{
printf(“ función principal”);
pantalla ( );
}
PROTOTIPO
LLAMADA
void pantalla (void )
DEFINICIÓN
{
system (“cls”);
printf (“La pantalla esta limpia\n”);
}
Función con parámetros por valor
# include <stdio.h>
# include <conio.h>
void compara ( int c, int d);
int main ( )
{
int a,b;
printf (“Ingrese dos números”);
scanf (“ %d %d”, & a, & b);
compara (a,b);
}
void compara (int c, int d)
{
int mayor;
if ( c>d) mayor = c;
else mayor = d;
printf (“ El mayor es %d”,mayor);
}
PROTOTIPO
LLAMADA
DEFINICIÓN
Función con parámetros que
retorna un valor.
# include <stdio.h>
# include <conio.h>
float producto ( float a, float b);
int main ( )
{
float c,d,p;
printf (“Ingrese dos números”);
scanf (“ %f %f”, & c, & d);
p=producto (c,d);
printf(“\n El producto es %4.2f”,p);
}
float producto (float a, float b)
{
float k;
k=a*b
return k;
}
PROTOTIPO
LLAMADA
DEFINICIÓN
Paso de parámetros: referencia (I)
• ¿Devolver más de un valor?
• ¿Modificar los parámetros reales?
• Operador de dirección ( & ) : obtiene la
dirección en memoria de una variable
• Operador de indirección o puntero (*) :
obtiene el dato contenido en una
dirección de memoria
Paso de parámetros: referencia (II)
#include <stdio. h>
void swap( int *x, int *y)
{
int aux;
/* Se asigna a aux el valor referenciado por x */
aux = *x;
/* Se asigna el valor referenciado por y al valor referenciado por x */
*x = *y;
/* El valor referenciado por y pasa a ser el valor de aux */
*y = aux;
}
Int main()
{
int a, b;
scanf( "% d %d", &a, &b );
swap( &a, &b );
printf( "Los nuevos valores son a=% d y b=% d\ n", a, b );
}
Paso de parámetros: resumen
• Paso por valor
Declaración
tipo nombre_ función (tipo1 param1, ... )
Llamada
nombre_ función (variable1, ... )
• Paso por referencia
Declaración
tipo nombre_ función (tipo1 *param1, ... )
Llamada
nombre_ función (& variable1, ... )
Recursividad
•
•
Una función se llama a si misma de forma repetida hasta que se
cumpla alguna condición.
Ejemplo: el factorial de un numero:
•
Función que calcula el factorial de forma recursiva:
long int factorial(int n)
{
if (n <= 1)
return(1);
else
return(n * factorial(n-1));
}
Errores de programación
•
•
•
•
•
•
•
•
•
•
Omitir tipo-valor-retorno en una definición de función es un error de
sintaxis si el prototipo de la función especifica un tipo diferente a int.
Olvidar devolver un valor desde la función cuando se supone que se debe
retornar alguno.
Devolver un valor cuando la función es de tipo void, es un error de
sintaxis.
Especificar los parámetros de la función del mismo tipo como double x,y,
en lugar de hacerlo como double x, double y. En el primer caso y será
tomado como int por defecto.
Colocar un punto y coma después del paréntesis derecho que encierra la
lista de parámetros de la definición de una función.
Definir otra vez un parámetro de función como variable local dentro de la
función, es un error de sintaxis.
Definir una función dentro de otra función es un error de sintaxis.
Olvidar el punto y coma al final del prototipo de la función.
Olvidar el prototipo de una función provoca un error de sintaxis si en el
programa el tipo del valor de retorno no es int y la definición de la función
aparece después de la llamada a la función.
Escribir incorrectamente una función recursiva de manera que no se
converja en un valor. Provocará una recursividad infinita y agotará la
memoria.
Descargar