Universidad Autónoma de Baja California
Facultadad de Química e Ingeniería
ISyTE
Lenguaje C
Unidad 4: Funciones
Concepto 2
Para resolver problemas complejos o de gran tamaño es conveniente
utilizar el concepto de reducción de problemas
Concepto 3
Lo anterior quiere decir que el problemase descompone en
subproblemas, los cuales a su vez pueden descomponerse en
sub-subproblemas, y así continuar hasta que el problema original queda
reducido a un conjunto de actividades básicas, que no se pueden o no
conviene volver a descomponer.
Concepto 4
En el lenguaje de programación C la solución de un problema se
expresa por medio de un programa pero la solución de un
subproblema, por medio de una función
Concepto 5
El uso de funciones tiene múltiples ventajas:
■ facilitan la lectura del programa al programador.
■ facilitan la escritura del programa.
■ permite el trabajo en paralelo.
■ permite la reutilización de código, al escribir la función e utilizarla
cuando sea necesaria.
■ facilita el mantenimiento de los programas.
Concepto 6
De esta manera, un programa en C está constituido por un
programa principal y un conjunto de funciones.
El programa principal consta generalmente de pocas líneas, las cuales
pueden ser llamadas a funciones.
Principio SOLID 7
SOLID Es un principio que se recomienda que se lleve acabo al momento
de desarrollar sistemas o software complejos, para facilitar las etapas del
análisis e implementación
■ Facilita que el código sea más manteniente.
■ Facilita que el Software sea Extendible.
■ Facilita que el Software sea Modificable.
Principio SOLID 8
Para este curso solo se llevará acabo la S del acrónimo ya que C es un
lenguaje estructurado y los demás principios es para diferentes
paradigmas de programación.
S ingle Responsability Principle (SRP)
O pen-Close Principle (OCP)
L iskov Substitution Principle (LSP)
I nterface Segregation Principle (ISP)
D ependency Inversion Principle (DIP)
SRP 9
(Single Responsability Principle) se refiere a que, todo modulo, clase o
función solo debe tener una responsabilidad dentro de la
funcionalidad de un programa.
SRP 10
ServicioMensajes
Add Mensaje Delete Mensaje Validar Mensaje Log
Enviar Mail
SRP 11
ServicioMensajes ServicioValidación
Add Mensaje Delete Mensaje Validar Mensaje
ServicioLog ServicioMail
Log Enviar Mail
Funciones 12
Función
Parámetros Salida
Proceso
Funciones 13
Una función Consta de tres partes
■ La parte de la definición(prototipo).
■ La parte de la implementación.
■ La parte de la llamada de la función (la utilización)
Definición e implementación 14
La definición o Prototipo, se refiere a que debemos definir que tipo de
dato va tener la salida y cuales parámetros debe tener como entrada la
función. Esta definición se hace antes de la función main o en un
archivo.h
La implementación se refiere a el código de la función y normalmente
se hace después de la función main o en un archivo.c diferente al
programa principal.
Definición e implementación 15
Sintaxis definición
Tipo_Dato n o m b r e _ f u n c i o n ( Tipo_Dato p a r a m e t r o s ) ;
Sintaxis implementación
Tipo_Dato n o m b r e _ f u n c i o n ( Tipo_Dato p a r a m e t r o s )
{
/∗ p r o c e d i m i e n t o s ∗/
return v a l o r ;
}
Definición e implementación 16
nombre de función
int nombre_funcion (int a, int b);
retorno de función
(int,void,float,int*,void*,etc) parámetros
Una función no puede tener como retorno un arreglo (int [] char [], etc),
por lo que se regresa un apuntador (asignado en memoria dinámica.)
Funciones 17
Las funciones las vamos a manejar en archivos separados, en donde los
prototipos los ponemos en los archivos de cabecera los .h y las
implementaciones en el los .c
Ejemplo Definición e implementación 18
MisFunciones.h
#pragma once // bandera de que no se r e p i t a a l i n c l u i r
// p r o t o t i p o de l a f u n c i o n
f l o a t sumar ( f l o a t a , f l o a t b ) ;
MisFunciones.c
#include " M i s F u n c i o n e s . h "
// implementacion
f l o a t sumar ( f l o a t a , f l o a t b )
{
r e t u r n a+b ;
}
Llamada de función 19
La llamada de la función se refiere, que literalmente la tenemos que
llamarla o invocarla en el código para poder utilizarla, y para poder
llamarla es poner el nombre de la función y llenar sus parámetros
de entrada con el tipo de dato correspondiente.
Al llamar a la función, se ejecuta el código de la implementación y nos
regresa un valor (si su tipo de dato de la función es diferente a void) o
nada ( si el tipo de dato de la función es void).
Sintaxis de la llamada
nombre_funcion ( valor_parametro ) ;
Ejemplo llamada de función 20
Considerando los archivos MisFunciones.h y MisFunciones.c el
programa quedaría de la siguiente manera para llamar la función hecha
en esos archivos..
Programa.c
#include " M i s F u n c i o n e s . h "
#include < s t d i o . h>
i n t main ( v o i d )
{
f l o a t x =10;
f l o a t y =20;
f l o a t r e s u l t a d o = sumar ( x , y ) ;
p r i n t f ( "%d+%d = %d " , x , y , r e s u l t a d o ) ;
return 0;
}
Ejemplo llamada de función 21
Para compilar el programa se debe de incluir todos los archivos.c
Terminal
folder / ejemplo > gcc -Wall -Werror -pedantic -std=c99 MisFunciones.c programa.c
Variables locales 22
Son variables definidas dentro del bloque de código de una función tal
como la función main u otras funciones y su alcance está limitado
solamente a la función en la cual están definidas, al momento que la
función termina su ejecución estas variables dejan de existir en
memoria.
Variables globales 23
Son variables definidasantes del inicio del programa principal y su
alcance es muy amplio ya que cualquiera tiene acceso a ellas, en el
programa principal o cualquier otra las función.
Variables estáticas 24
Son similares a las variables locales, pero conservan su valor durante la
ejecución del programa o función. Es decir, comienzan a existir cuando
se llama a la función y conservan su valor aun cuando termina su
ejecución.
Parámetros por valor 25
Los parámetros por valor permiten pasar datos entre el programa
principal y las funciones, e incluso entre las mismas funciones.
En el parámetro se escribe una copia de la variable original. Si el
parámetro sufre una alteración en la función que lo recibe, la
variable original no se ve afectada
Parámetros por referencia 26
Los parámetros por referencia también permiten la comunicación entre el
programa principal y las funciones, o entre las mismas funciones.
Sin embargo, en este caso, en lugar de escribir una copia de la
variable en el parámetro se escribe la dirección de la misma. Si el
parámetro sufre una alteración en la función que lo recibe, la
variable original también se ve afectada.
Parámetros por referencia 27
Por ejemplo queremos hacer una función que intercambia los valores de
dos variables sin importar el tipo de dato que sean
funciones.h
#pragma once
void i n t e r c a m b i a r ( i n t ∗ a , i n t ∗ b ) ;
funciones.c
#include " f u n c i o n e s . h "
// Como son parametros por r e f e r e n c i a
// se u t i l i z a n como s i f u e r a n apuntadores
v o i d i n t e r c a m b i a r ( i n t ∗a , i n t ∗b )
{
i n t temp = ∗ a ;
∗ a = ∗b ;
∗b = temp ;
}
Parámetros por referencia 28
programa.c
#include < s t d i o . h>
#include " f u n c i o n e s . h "
i n t main ( v o i d )
{
i n t x = 10 , y = 20;
p r i n t f ( " x=%d , y=%d\n " , x , y ) ;
i n t e r c a m b i a r (&x , &y ) ;
p r i n t f ( " x=%d , y=%d\n " , x , y ) ;
return 0;
}
Parámetros por referencia 29
En C no existe la sobre escritura de funciones, por lo que las
funciones se deben de llamar de diferente nombre.
Por ejemplo hagamos una función de intercambio de valores
generalizada
funciones.h
#pragma once
#include < s t d l i b . h>
void i n t e r c a m b i a r ( i n t ∗ a , i n t ∗ b ) ;
v o i d i n t e r c a m b i a r g e n ( v o i d ∗ a , v o i d ∗ b , s i z e _ t tam ) ;
Parámetros por referencia 30
Para generalizarla simplemente compiamos lo que hay en memoria y la
pasamos a la otra variable.
funciones.c
#include " f u n c i o n e s . h "
#include < s t r i n g . h>
v o i d i n t e r c a m b i a r ( i n t ∗a , i n t ∗b )
{
i n t temp= ∗ a ;
∗ a = ∗b ;
∗b=temp ;
}
v o i d i n t e r c a m b i a r g e n ( v o i d ∗a , v o i d ∗b , s i z e _ t tam )
{
v o i d ∗ temp = m a l l o c ( tam ) ;
memcpy ( temp , a , tam ) ;
memcpy ( a , b , tam ) ;
memcpy ( b , temp , tam ) ;
f r e e ( temp ) ;
}
Parámetros por referencia 31
Utilizamos las funciones en nuestro programa principal
programa.c
#include < s t d i o . h>
#include " f u n c i o n e s . h "
i n t main ( v o i d )
{
i n t x = 10 , y = 20;
char a= ’ a ’ , b= ’ b ’ ;
f l o a t e =0.1 f , f =1.5 f ;
p r i n t f ( " x=%d , y=%d\n " , x , y ) ;
i n t e r c a m b i a r (&x , &y ) ;
p r i n t f ( " x=%d , y=%d\n " , x , y ) ;
p r i n t f ( " a=%c , b=%c \n " , a , b ) ;
i n t e r c a m b i a r g e n (&a , &b , s i z e o f ( char ) ) ;
p r i n t f ( " a=%c , b=%c \n " , a , b ) ;
p r i n t f ( " e=%f , f=%f \n " , e , f ) ;
i n t e r c a m b i a r g e n (&e , &f , s i z e o f ( f l o a t ) ) ;
p r i n t f ( " e=%f , f=%f \n " , e , f ) ;
return 0;
}
Parámetros por referencia 32
para compilar se compilan todos los archivos.c
compilar
g c c −Wa ll −Werror −p e d a n t i c −s t d=c99 programa . c f u n c i o n e s . c −o e j e m p l o . e x e
Paso de función por parámetro 33
En la práctica encontramos problemas cuyas soluciones se podrían
formular fácilmente si pudiéramos pasar funciones como parámetros.
Es decir, pasar una función a otra función como parámetro por referencia
(en el parámetro se escribe la dirección de la función)
Las llamadas por referencia se llevan a cabo por medio de apuntadores,
y un apuntador no es más que una variable que contiene la dirección de
otra variable o de una función y se representa por medio de los
operadores de dirección (&) e indirección (*)
A este tipo de función se le conoce como una función CALLBACK
Paso de función por parámetro 34
Parámetro como función
Tipo_Dato n o m b r e _ f u n c i o n ( Tipo_Dato ( ∗ f u n c i o n _ u s a r ) ( Tipo_Dato p a r a m e t r o s ) , Tipo_Dato p a r a m e t r o s ) ;
Por ejemplo
f l o a t b i s e c c i o n ( f l o a t ( ∗ f x ) ( f l o a t x ) , f l o a t x i , f l o a t xu , i n t i t e r , f l o a t t o l ) ;
Paso de función por parámetro 35
MisFunciones.h
#pragma once
i n t sumar ( i n t a , i n t b ) ;
int resta ( int a , int b ) ;
i n t operacion ( i n t (∗ f u n c i o n ) ( int , i n t ) , i n t a , i n t b ) ;
MisFunciones.c
#include " M i s F u n c i o n e s . h "
i n t sumar ( i n t a , i n t b )
{
r e t u r n a+b ;
}
int resta ( int a , int b)
{
r e t u r n a−b ;
}
i n t operacion ( i n t (∗ f u n c i o n ) ( int , i n t ) , i n t a , i n t b )
{
i n t r e s u l t a d o = (∗ f u n c i o n ) ( a , b ) ;
return r e s u l t a d o ;
}
Paso de función por parámetro 36
programa.c
#include< s t d i o . h>
#include " M i s F u n c i o n e s . h "
i n t main ( v o i d )
{
i n t x = 10 , y = 20;
p r i n t f ( "%d + %d = %d\n " , x , y , o p e r a c i o n ( sumar , x , y ) ) ;
p r i n t f ( "%d − %d = %d\n " , x , y , o p e r a c i o n ( r e s t a , x , y ) ) ;
return 0;
}
Paso de función por parámetro 37
Para compilar el programa se debe de incluir todos los archivos.c
Terminal
folder / ejemplo > gcc -Wall -Werror -pedantic -std=c99 MisFunciones.c programa.c