SlideShare una empresa de Scribd logo
1 de 53
Descargar para leer sin conexión
1
05 – Funciones en lenguaje C
Diego Andrés Alvarez Marín
Profesor Asociado
Universidad Nacional de Colombia
Sede Manizales
2
Temario
Programación funcional
Declaración (prototipos) y
definición de funciones
return;
Ambito de las variables
Variables auto
Variables static
Uso de la memoria RAM
Llamada a función (paso de
parámetros por valor y por
referencia)
Funciones recursivas
Funciones inline
Funciones anidadas
La función main()
Las funciones getopt() y
getopt_long()
La función exit()
Funciones variádicas
Llamado de funciones usando
punteros a funciones
3
Divide y vencerás:
la programación funcional
Divida un problema grande en muchos problemas
pequeños
http://en.wikipedia.org/wiki/Comparison_of_programming_paradigms
Encabezado
Inclusión de librerías
Declaración o prototipos
de funciones
Declaración de
constantes y variables
globales
Funcion main()
Definición de las
funciones
5
Declaración de funciones o
prototipos de funciones
La declaración/Los prototipos de funciones son
opcionales, pero se recomienda fuertemente, para
evitar alertas (warnings) en la compilación. Estas
se deben poner antes del primer uso de la función.
tipo_que_retorna nombre_de_funcion(lista_de_parametros);
Si la función no retorna nada entonces el
tipo_que_retorna debe ser void
nombre_de_funcion: puede ser cualquier
identificador válido
lista_de_parametros: pueden ser cero (void) o
más parámetros separados por comas.
6
Declaración de funciones o
prototipos de funciones
Se deben colocar antes del main(), con el objeto que
el programa sepa que las funciones existen. De
hecho los archivos *.h están llenos de prototipos de
funciones, y las funciones como tal están en otros
archivos *.c.
Ejemplo de prototipo:
double area_trapecio(double B, double b, double h);
o simplemente:
double area_trapecio(double, double, double);
7
Declaración de funciones
Ejemplos:
Los nombres de las variables en la declaración no
necesitan ser iguales a aquellos en la definición
(aunque se aconseja por orden).
Cuando se crean librerías, las declaraciones se
ponen en un archivo .h y se llaman utilizando un
#include
8
Que pasa si no se declaran las
funciones:
9
Definición de funciones
La declaración de una función debe ser de la
siguiente forma:
tipo_que_retorna nombre_de_funcion(lista_de_parametros)
{
cuerpo de la función
}
tipo_que_retorna y nombre_de_funcion deben ser
los mismos especificados en el prototipo.
return
Termina la ejecución de una función y retorna el
control a la función que la llamó
return valor_a_retornar;
valor_a_retornar es opcional. Si el tipo de
retorno de la función es void, entonces no se
puede retornar una expresión, pero si se puede
usar el return solo.
Es una mala práctica de programación no
retornar un valor en funciones que se dijo que se
iba a retornar un valor.
11
return
12
Ambito de variables
(variable scope)
El ámbito de una variable determina el rango del código
sobre el cual dicha variable existe y por lo tanto puede
ser utilizada.
Esto sirve para que se pueda volver a definir una
variable con un mismo nombre en diferentes partes del
programa sin que hayan conflictos entre ellos.
Se recomienda que el ámbito de una variable sea tan
pequeño como sea posible, de modo que se reduzca el
número de variables que se tengan que tener presentes
cuando se programe, lo cual redunda en menores
errores de programación.
13
Ambito de variables
(variable scope)
Si una variable es declarada dentro de un bloque
(método/función/procedimiento), ésta será válida solo
dentro de ese bloque y se destruirá al terminar el bloque.
Adicionalmente, la variable no podrá verse ni usarse
fuera del bloque (en el exterior del bloque).
La variable dentro del bloque es una variable local
(variable auto) y solo tiene alcance dentro del bloque que
se creó y sus bloques hijos, pero no en bloques
hermanos ni padres.
Una variable definida fuera de cualquier bloque es una
variable global y cualquier bloque puede acceder a ella y
modificarla.
Ambito de las variables
Las variables se dividen en variables globales y
locales.
Las variables locales sólo existen en el bloque en
el cual se definieron { } y se deben declarar antes
de utilizarlas:
Aquí ya no existe tmp2
Aquí existe tmp y tmp2
Aquí no existe ni tmp ni tmp2
Aquí existe tmp
Ambito de variables por bloques
Las variables (locales) sólo existen en el bloque
en el cual se definieron. Los bloques se definen
por { }
Si aquí se hace una referencia a b, aparecería un
error de compilación
Variables auto
auto es una palabra reservada de C que se
supone que sirve para definir las variables
locales. Como este es el comportamiento
implícito de las variables en una función, dicha
palabra nunca se usa.
Dicha palabra es inútil y existe porque la heredó
el lenguaje C de su predecesor, el lenguaje B.
Variables static
http://en.wikipedia.org/wiki/Static_variable
Las variables static
son locales a la
función en la que se
definieron, pero
existen durante toda
la ejecución del
programa.
Solo se inicializan la
primera vez.
Cuidados con las variables globales
Póngale a las variables globales un nombre con
sentido:
int i; // mal nombre para una variable global
int NUM_MAX_ITERAC; // buen nombre para una variable global
Unicamente declare variables globales cuando
sea estrictamente necesario. Nunca las utilice si
una variable estática podría hacer el mismo
trabajo.
21
Uso de la memoria RAM
● Código del programa, las constantes cadena y las
constantes #define se guardan en el segmento de código
(code segment)
● Variables globales, constantes globales creadas con const y
variables static se crean en el segmento de datos (data
segment); si no se han inicializado se guardan en un
subconjunto del segmento de datos llamado .bss. Cualquier
variable dentro del .bss se inicializa a cero.
● Variables locales (variables auto) (variables creadas en
bloques {}), constantes locales creadas con const y
llamados de funciones se crean en la pila de llamadas (call
stack). La pila tiene un tamaño limitado por el sistema
operativo. Modelo de memoria LIFO.
● Memoria dinámica (malloc) se toma del montón (heap) y se
accede usando punteros.
22
La pila de llamadas (call stack)
http://en.wikipedia.org/wiki/Call_stack
La pila de llamadas o simplemente “la pila” es una estructura dinámica
de datos LIFO, que almacena la información sobre las subrutinas activas
(aquellas que se han llamado pero todavía no han completado su
ejecución) de un programa. La principal razón de su uso, es seguir el
curso del punto al cual cada subrutina activa debe retornar el control
cuando termine de ejecutar.
La pila de llamadas está compuesta por los llamados marcos de pila
(stack frames). Un marco de pila incluye la siguiente información:
● los argumentos (parámetros) pasados a la función;
● la dirección de memoria del código que se debe seguir ejecutándose
una vez se retorne de la función (dirección de memoria que está
dentro del segmento de código correspondiente a la función
llamante);
● espacio para las variables locales de la función.
23
La pila de llamadas (call stack)
http://en.wikipedia.org/wiki/Call_stack
Aquí la DrawLine() está corriendo actualmente, y fue
llamada por DrawSquare()
24
La pila de
llamadas (call
stack)
|
25
Paso de parámetros:
por valor o por referencia
Por valor: se hace una copia local de la
información dentro de la función y por lo tanto el
valor original no cambia.
Por referencia: se transfiere la dirección de
memoria de la variable con un puntero y por lo
tanto cualquier cambio a la variable hecha por la
función se observa en la función invocadora. Se
hace para cambiar el valor de la variable, o
cuando los datos a pasar son muy grandes y se
quiere acelerar los cálculos o conservar la
memoria.
26
x se está pasando por valor
y se está pasando por referencia
z es la salida de la función
Declaración de la función
Definición de la función
Llamado de la función
27
r pasa por valor
p y A pasan por referencia
28
Como hacer una función que
devuelva más de dos variables?
1. Pasando punteros
29
30
Como hacer una función que
devuelva más de dos variables?
2. Retornando una estructura que contiene los
valores deseados:
31
Como hacer una función que
devuelva más de dos variables?
3. Utilizar un híbrido: pasar un puntero a una
estructura, que posteriormente es llenada:
32
Punteros a variables estáticas
Como las variables estáticas se crean en el
segmento de datos, un puntero a una variable
estática siempre será válido incluso después de
haberse salido de la función.
HACER EJEMPLO
33
Variables estáticas cuando se
tienen varios hilos (threads)
El C11 definión la palabra clave _Thread_local:
static _Thread_local int mivariable = 10;
Con esta palabra, cada hilo tendrá una variable
estática diferente.
34
Funciones recursivas
http://en.wikipedia.org/wiki/Recursion_%28computer_science%29
Son funciones que se llaman a si mismas.
Se debe poner mucho cuidado al escribir una
función recursiva ya que esta no se debe llamar a
si misma indefinidamente; debe haber un punto
en el que la función en verdad retorne un valor.
De lo contrario la función agotará toda la memoria
de pila disponible en el computador y este
terminará.
35
36
Se debe tener en cuenta que las funciones
recursivas pueden agotar la memoria de pila.
37
Funciones inline
http://en.wikipedia.org/wiki/Inline_function
Con esta palabra, definida en C99, se solicita al
compilador (si es posible) que inserte el cuerpo completo
de la función en cada lugar donde se llama esta, en vez
de generar código que llame a la función. El compilador
no está obligado a cumplir esta instrucción. Esta
instrucción es útil para incrementar la velocidad del
código y se utiliza generalmente con funciones muy
pequeñas. Bjarne Stroustrup, el creador de C++, sugiere
que no se deben emplear macros (#define) para hacer
funciones pequeñas sino que se deben utilizar funciones
inline.
En el C99 el inline solo se puede colocar en el prototipo.
Si se pone en la definición de la función, habrá error de
compilación.
38
Ejemplo de funciones inline
39
Funciones anidadas
GNU C extension
Una función anidada (nested) es una
función encapsulada dentro de otra
función. Solo puede ser llamada por la
función que contenedora o por las
funciones anidadas en el mismo nivel.
Se utilizan para ocultar procedimientos
que sólo son útiles localmente. Se
deben definir junto con la declaración
de variables al principio de la función.
La función main()
Es obligatoria ya que es el punto de entrada al
programa.
El standard C permite los siguiente formas de
invocar a main():
No es necesario escribir una declaración para
main().
Debe retornar siempre un int
Valores que retorna main()
0 = EXIT_SUCCESS indica que el programa
terminó correctamente.
1 = EXIT_FAILURE indica que el programa
terminó con un error
Estas constantes están definidas en stdlib.h
main() con parámetros
Ver: http://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html
argc (argument count) contiene el número de parámetros recibidos
por el programa (incluyendo el nombre del programa mismo).
argv (argument vector) es una matriz de punteros a cada uno de los
parámetros en el mismo orden en que fueron recibidos.
Es lo mismo que char **argv
El primer elemento del arreglo
argv[0] contiene el nombre del
programa (como se invocó). argv[1]
indica el primer parámetro pasado
al programa; argv[2] el segundo
parámetro, y así sucesivamente.
La función getopt()
● Está definida en unistd.h, se utiliza para
procesar opciones en línea de comandos, tal y
como es común en la aplicaciones de consola.
● Soporta opciones de
● un carácter: -a
● múltiples opciones especificadas al mismo tiempo:
-a -b y -c se especifican como -abc
● opciones con argumentos: -a arg, -i 3
● Ver:
http://en.wikipedia.org/wiki/Getopt
http://www.gnu.org/software/libc/manual/html_node/Getopt.html
$ man 3 getopt (en Linux y MacOS)
La función getopt_long()
● Está definida en getopt.h, es una versión
avanzada de getopt().
● Soporta opciones como:
● un carácter: -a o de un nombre --name
● múltiples opciones especificadas al mismo tiempo:
-a -b y -c se especifican como -abc
● opciones con argumentos -a arg, --name=arg, -i 3
Ver:
http://en.wikipedia.org/wiki/Getopt
http://www.gnu.org/software/libc/manual/html_node/Getopt.html
$ man 3 getopt (en Linux y MacOS)
47
void exit (int exitcode);
Hace que el programa termine de forma natural.
Está definida en stdlib.h
exit(EXIT_SUCCESS); es equivalente a return 0;
exit(EXIT_FAILURE); es equivalente a return 1;
En Linux/BSD existe la librería sysexits.h la cual
contiene varios códigos de error.
48
Funciones variádicas
http://en.wikipedia.org/wiki/Variadic_function
Son funciones que toman un número variable de
argumentos, que de algún modo se debe saber
con antelación.
Se necesita especificar al menos un parámetro de
un tipo de dato conocido. Los siguientes
parámetros son opcionales y pueden variar en
cantidad y en tipos de datos.
Se definen usando la librería stdarg.h.
Ver:
http://www.gnu.org/software/libc/manual/html_node/Argument-Macros.html#Argument-Macros
49
50
Llamado de funciones a través de
punteros a funciones
http://en.wikipedia.org/wiki/Function_pointer
Un puntero a función es un tipo de puntero el cual en vez
de referirse a datos, se refiere a la dirección del código
ejecutable correspondiente a una función el cual se
encuentra dentro de la memoria. Al invocar la función a
la cual el puntero apunta, se ejecuta dicho código.
Aparentemente su uso es complicado, pero si se domina
su uso, pueden ser fuente de una programación
extremadamente eficiente y elegante.
Ver: http://www.newty.de/fpt/
51
52
Material basado en:
http://www.slideshare.net/amraldo/introduction-to-c-p
http://www.slideshare.net/petdance/just-enough-c-for
Wikipedia

Más contenido relacionado

La actualidad más candente

ESTRUCTURA BÁSICA PARA C++
ESTRUCTURA BÁSICA PARA C++ESTRUCTURA BÁSICA PARA C++
ESTRUCTURA BÁSICA PARA C++GabrielFVilla15
 
Resolución de problemas haciendo uso del computador
Resolución de problemas haciendo uso del computadorResolución de problemas haciendo uso del computador
Resolución de problemas haciendo uso del computadorVictor Alfonzo Marquina
 
Estructuras de Lenguaje .NET
Estructuras de Lenguaje .NETEstructuras de Lenguaje .NET
Estructuras de Lenguaje .NETbrobelo
 
Palabras Reservadas en C++
Palabras Reservadas en C++Palabras Reservadas en C++
Palabras Reservadas en C++ncrmax
 
Tipos de metodos programacion dos
Tipos de metodos  programacion dosTipos de metodos  programacion dos
Tipos de metodos programacion dosEdesTigse
 
programacion orientada a objetos
programacion orientada a objetosprogramacion orientada a objetos
programacion orientada a objetosjent46
 
Estructuras repetitivas anidadas exposiciones
Estructuras repetitivas anidadas exposicionesEstructuras repetitivas anidadas exposiciones
Estructuras repetitivas anidadas exposicionesAhurinContreras
 
procedimientos (programación)
procedimientos (programación)procedimientos (programación)
procedimientos (programación)Jandry Banegas
 
Presentacion de Visual Basic
Presentacion de Visual BasicPresentacion de Visual Basic
Presentacion de Visual BasicFrancheska Parras
 
Unidad 4 est. dat. recursividad
Unidad 4  est. dat. recursividadUnidad 4  est. dat. recursividad
Unidad 4 est. dat. recursividadrehoscript
 
PostgreSQL - Lección 7 - Usando los operadores de conjunto
PostgreSQL - Lección 7 - Usando los operadores de conjuntoPostgreSQL - Lección 7 - Usando los operadores de conjunto
PostgreSQL - Lección 7 - Usando los operadores de conjuntoNicola Strappazzon C.
 

La actualidad más candente (20)

ESTRUCTURA BÁSICA PARA C++
ESTRUCTURA BÁSICA PARA C++ESTRUCTURA BÁSICA PARA C++
ESTRUCTURA BÁSICA PARA C++
 
Resolución de problemas haciendo uso del computador
Resolución de problemas haciendo uso del computadorResolución de problemas haciendo uso del computador
Resolución de problemas haciendo uso del computador
 
Estructuras de Lenguaje .NET
Estructuras de Lenguaje .NETEstructuras de Lenguaje .NET
Estructuras de Lenguaje .NET
 
Palabras Reservadas en C++
Palabras Reservadas en C++Palabras Reservadas en C++
Palabras Reservadas en C++
 
Java colecciones
Java coleccionesJava colecciones
Java colecciones
 
Programación estructurada
Programación estructuradaProgramación estructurada
Programación estructurada
 
Programacion MODULAR
Programacion MODULARProgramacion MODULAR
Programacion MODULAR
 
Tipos de metodos programacion dos
Tipos de metodos  programacion dosTipos de metodos  programacion dos
Tipos de metodos programacion dos
 
programacion orientada a objetos
programacion orientada a objetosprogramacion orientada a objetos
programacion orientada a objetos
 
Estructuras repetitivas anidadas exposiciones
Estructuras repetitivas anidadas exposicionesEstructuras repetitivas anidadas exposiciones
Estructuras repetitivas anidadas exposiciones
 
procedimientos (programación)
procedimientos (programación)procedimientos (programación)
procedimientos (programación)
 
Presentacion de Visual Basic
Presentacion de Visual BasicPresentacion de Visual Basic
Presentacion de Visual Basic
 
Unidad 4 est. dat. recursividad
Unidad 4  est. dat. recursividadUnidad 4  est. dat. recursividad
Unidad 4 est. dat. recursividad
 
Historia de la Programacion funcional
Historia de la Programacion funcionalHistoria de la Programacion funcional
Historia de la Programacion funcional
 
Ejercicios Java
Ejercicios JavaEjercicios Java
Ejercicios Java
 
LENGUAJE ENSAMBLADOR
LENGUAJE ENSAMBLADOR LENGUAJE ENSAMBLADOR
LENGUAJE ENSAMBLADOR
 
Polimorfismo en Java
Polimorfismo en JavaPolimorfismo en Java
Polimorfismo en Java
 
PostgreSQL - Lección 7 - Usando los operadores de conjunto
PostgreSQL - Lección 7 - Usando los operadores de conjuntoPostgreSQL - Lección 7 - Usando los operadores de conjunto
PostgreSQL - Lección 7 - Usando los operadores de conjunto
 
UNIDAD 2 PROGRAMACIÓN BASICA
UNIDAD 2 PROGRAMACIÓN BASICAUNIDAD 2 PROGRAMACIÓN BASICA
UNIDAD 2 PROGRAMACIÓN BASICA
 
Interfaces en java
Interfaces en javaInterfaces en java
Interfaces en java
 

Destacado

07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...Diego Andrés Alvarez Marín
 
Sesion 02 c++
Sesion 02   c++Sesion 02   c++
Sesion 02 c++imagincor
 
Tema6
Tema6Tema6
Tema6UH
 
Ciclo de vida de un programa
Ciclo de vida de un programaCiclo de vida de un programa
Ciclo de vida de un programaCarlos Pes
 
FUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE CFUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE Cflaquita_dany
 
Capitulo 10 Introduccion a los diagramas de flujo
Capitulo 10 Introduccion a los diagramas de flujoCapitulo 10 Introduccion a los diagramas de flujo
Capitulo 10 Introduccion a los diagramas de flujoCarlos Pes
 
GUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/ALGUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/ALmakac0 makac0
 
Logica taller de tipo de datos
Logica taller de tipo de datosLogica taller de tipo de datos
Logica taller de tipo de datosuanelectromecanica
 
Representación de los datos
Representación de los datosRepresentación de los datos
Representación de los datosCarlos Pes
 
Instrucciones de control alternativas
Instrucciones de control alternativasInstrucciones de control alternativas
Instrucciones de control alternativasCarlos Pes
 
Caracteres y Cadenas en C
Caracteres y Cadenas en CCaracteres y Cadenas en C
Caracteres y Cadenas en CRonny Parra
 
Lenguaje c 1
Lenguaje c   1Lenguaje c   1
Lenguaje c 1Denisse C
 

Destacado (20)

Funciones en Lenguaje C
Funciones en Lenguaje CFunciones en Lenguaje C
Funciones en Lenguaje C
 
06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C
 
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
 
FUNCIONES LENGUAJE C
FUNCIONES LENGUAJE CFUNCIONES LENGUAJE C
FUNCIONES LENGUAJE C
 
Elementos basicos C++
Elementos basicos C++Elementos basicos C++
Elementos basicos C++
 
Lenguaje C
Lenguaje CLenguaje C
Lenguaje C
 
Sesion 02 c++
Sesion 02   c++Sesion 02   c++
Sesion 02 c++
 
2 punteros y lenguaje c
2 punteros y lenguaje c2 punteros y lenguaje c
2 punteros y lenguaje c
 
Lenguaje C_Curso Secap
Lenguaje C_Curso SecapLenguaje C_Curso Secap
Lenguaje C_Curso Secap
 
Tema6
Tema6Tema6
Tema6
 
Ciclo de vida de un programa
Ciclo de vida de un programaCiclo de vida de un programa
Ciclo de vida de un programa
 
FUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE CFUNCIONES EN LENGUAJE C
FUNCIONES EN LENGUAJE C
 
Capitulo 10 Introduccion a los diagramas de flujo
Capitulo 10 Introduccion a los diagramas de flujoCapitulo 10 Introduccion a los diagramas de flujo
Capitulo 10 Introduccion a los diagramas de flujo
 
GUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/ALGUÍA RÁPIDA LENGUAJE C/AL
GUÍA RÁPIDA LENGUAJE C/AL
 
Logica taller de tipo de datos
Logica taller de tipo de datosLogica taller de tipo de datos
Logica taller de tipo de datos
 
Representación de los datos
Representación de los datosRepresentación de los datos
Representación de los datos
 
Instrucciones de control alternativas
Instrucciones de control alternativasInstrucciones de control alternativas
Instrucciones de control alternativas
 
Caracteres y Cadenas en C
Caracteres y Cadenas en CCaracteres y Cadenas en C
Caracteres y Cadenas en C
 
Lenguaje c 1
Lenguaje c   1Lenguaje c   1
Lenguaje c 1
 
Estructuras de control
Estructuras de controlEstructuras de control
Estructuras de control
 

Similar a 05 - Funciones en lenguaje C

Funciones lenguaje c modulo4
Funciones lenguaje c modulo4Funciones lenguaje c modulo4
Funciones lenguaje c modulo4flaquita_dany
 
Capítulo 3 Algoritmos recursivos.pdf
Capítulo 3 Algoritmos recursivos.pdfCapítulo 3 Algoritmos recursivos.pdf
Capítulo 3 Algoritmos recursivos.pdfIgor Rodriguez
 
Presen iii 26 funciones
Presen iii  26 funcionesPresen iii  26 funciones
Presen iii 26 funcionesRafaeloRivas
 
TABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESTABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESChistian Hernandez
 
investigación de Comandos, Sentencias y/o Paquetes del Lenguaje de Programaci...
investigación de Comandos, Sentencias y/o Paquetes del Lenguaje de Programaci...investigación de Comandos, Sentencias y/o Paquetes del Lenguaje de Programaci...
investigación de Comandos, Sentencias y/o Paquetes del Lenguaje de Programaci...Arazelii Puentez
 
Presentación introducción a Matlab y su estructura
Presentación introducción a Matlab y su estructuraPresentación introducción a Matlab y su estructura
Presentación introducción a Matlab y su estructuraJOSUEANIBALCOCHOJILH
 
04 - Módulos. Funciones.doc
04 - Módulos. Funciones.doc04 - Módulos. Funciones.doc
04 - Módulos. Funciones.docAdrianaLuna80
 
SEMANA 7 INFORMATICA APLICADA A INGENIERI.pptx
SEMANA 7 INFORMATICA APLICADA A INGENIERI.pptxSEMANA 7 INFORMATICA APLICADA A INGENIERI.pptx
SEMANA 7 INFORMATICA APLICADA A INGENIERI.pptxvictorore2140
 
Metodos funciones
Metodos funcionesMetodos funciones
Metodos funcioneseulo10
 
Trabajo tutorial de visual C++
Trabajo tutorial de visual C++Trabajo tutorial de visual C++
Trabajo tutorial de visual C++Bryangio2002
 
Programación Modular - Subprogramas o funciones
Programación Modular - Subprogramas o funcionesProgramación Modular - Subprogramas o funciones
Programación Modular - Subprogramas o funcionesAlexanderAloid
 

Similar a 05 - Funciones en lenguaje C (20)

Funciones lenguaje c modulo4
Funciones lenguaje c modulo4Funciones lenguaje c modulo4
Funciones lenguaje c modulo4
 
Sesion 4
Sesion 4Sesion 4
Sesion 4
 
Capítulo 3 Algoritmos recursivos.pdf
Capítulo 3 Algoritmos recursivos.pdfCapítulo 3 Algoritmos recursivos.pdf
Capítulo 3 Algoritmos recursivos.pdf
 
Presen iii 26 funciones
Presen iii  26 funcionesPresen iii  26 funciones
Presen iii 26 funciones
 
Comandos
ComandosComandos
Comandos
 
TABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETESTABLA DE COMANDO /SENTENCIAS/PAQUETES
TABLA DE COMANDO /SENTENCIAS/PAQUETES
 
investigación de Comandos, Sentencias y/o Paquetes del Lenguaje de Programaci...
investigación de Comandos, Sentencias y/o Paquetes del Lenguaje de Programaci...investigación de Comandos, Sentencias y/o Paquetes del Lenguaje de Programaci...
investigación de Comandos, Sentencias y/o Paquetes del Lenguaje de Programaci...
 
Funciones
FuncionesFunciones
Funciones
 
Presentación introducción a Matlab y su estructura
Presentación introducción a Matlab y su estructuraPresentación introducción a Matlab y su estructura
Presentación introducción a Matlab y su estructura
 
04 - Módulos. Funciones.doc
04 - Módulos. Funciones.doc04 - Módulos. Funciones.doc
04 - Módulos. Funciones.doc
 
SEMANA 7 INFORMATICA APLICADA A INGENIERI.pptx
SEMANA 7 INFORMATICA APLICADA A INGENIERI.pptxSEMANA 7 INFORMATICA APLICADA A INGENIERI.pptx
SEMANA 7 INFORMATICA APLICADA A INGENIERI.pptx
 
Tutorial jared
Tutorial jaredTutorial jared
Tutorial jared
 
Funcionesclase1
Funcionesclase1Funcionesclase1
Funcionesclase1
 
Funciones
FuncionesFunciones
Funciones
 
Funciones en C
Funciones en CFunciones en C
Funciones en C
 
Funciones
FuncionesFunciones
Funciones
 
Metodos funciones
Metodos funcionesMetodos funciones
Metodos funciones
 
Trabajo tutorial de visual C++
Trabajo tutorial de visual C++Trabajo tutorial de visual C++
Trabajo tutorial de visual C++
 
8448148681
84481486818448148681
8448148681
 
Programación Modular - Subprogramas o funciones
Programación Modular - Subprogramas o funcionesProgramación Modular - Subprogramas o funciones
Programación Modular - Subprogramas o funciones
 

Más de Diego Andrés Alvarez Marín

Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...Diego Andrés Alvarez Marín
 
01 - Introducción al lenguaje de programación Python 3
01 - Introducción al lenguaje de programación Python 301 - Introducción al lenguaje de programación Python 3
01 - Introducción al lenguaje de programación Python 3Diego Andrés Alvarez Marín
 
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...Diego Andrés Alvarez Marín
 
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
02 - Conceptos fundamentales sobre tipos de datos en lenguaje CDiego Andrés Alvarez Marín
 
07 – Estimación puntual e introducción a la estadística inferencial
07 – Estimación puntual e introducción a la estadística inferencial07 – Estimación puntual e introducción a la estadística inferencial
07 – Estimación puntual e introducción a la estadística inferencialDiego Andrés Alvarez Marín
 
00/01 - Introduccion al curso y a la estadística descriptiva
00/01 - Introduccion al curso y a la estadística descriptiva00/01 - Introduccion al curso y a la estadística descriptiva
00/01 - Introduccion al curso y a la estadística descriptivaDiego Andrés Alvarez Marín
 

Más de Diego Andrés Alvarez Marín (16)

Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
Alvarez (2023) - Teoría de la Elasticidad usando Matlab y Maxima - volumen 1 ...
 
03 - Cadenas en Python 3
03 - Cadenas en Python 303 - Cadenas en Python 3
03 - Cadenas en Python 3
 
02 - Tipos de datos escalares en Python 3
02 - Tipos de datos escalares en Python 302 - Tipos de datos escalares en Python 3
02 - Tipos de datos escalares en Python 3
 
01 - Introducción al lenguaje de programación Python 3
01 - Introducción al lenguaje de programación Python 301 - Introducción al lenguaje de programación Python 3
01 - Introducción al lenguaje de programación Python 3
 
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
 
03 - Entrada y salida en lenguaje C
03 - Entrada y salida en lenguaje C03 - Entrada y salida en lenguaje C
03 - Entrada y salida en lenguaje C
 
08 - Punteros en lenguaje C
08 - Punteros en lenguaje C08 - Punteros en lenguaje C
08 - Punteros en lenguaje C
 
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
02 - Conceptos fundamentales sobre tipos de datos en lenguaje C
 
01 - Introducción al lenguaje C
01 - Introducción al lenguaje C01 - Introducción al lenguaje C
01 - Introducción al lenguaje C
 
07 – Estimación puntual e introducción a la estadística inferencial
07 – Estimación puntual e introducción a la estadística inferencial07 – Estimación puntual e introducción a la estadística inferencial
07 – Estimación puntual e introducción a la estadística inferencial
 
06 - Variables aleatorias conjuntas
06 - Variables aleatorias conjuntas06 - Variables aleatorias conjuntas
06 - Variables aleatorias conjuntas
 
05 - Funciones de densidad de probabilidad
05 - Funciones de densidad de probabilidad05 - Funciones de densidad de probabilidad
05 - Funciones de densidad de probabilidad
 
04 - Funciones de distribución discretas
04 - Funciones de distribución discretas04 - Funciones de distribución discretas
04 - Funciones de distribución discretas
 
03 Variable Aleatoria
03   Variable Aleatoria03   Variable Aleatoria
03 Variable Aleatoria
 
02 - Introducción a la teoría de probabilidad
02 - Introducción a la teoría de probabilidad02 - Introducción a la teoría de probabilidad
02 - Introducción a la teoría de probabilidad
 
00/01 - Introduccion al curso y a la estadística descriptiva
00/01 - Introduccion al curso y a la estadística descriptiva00/01 - Introduccion al curso y a la estadística descriptiva
00/01 - Introduccion al curso y a la estadística descriptiva
 

05 - Funciones en lenguaje C

  • 1. 1 05 – Funciones en lenguaje C Diego Andrés Alvarez Marín Profesor Asociado Universidad Nacional de Colombia Sede Manizales
  • 2. 2 Temario Programación funcional Declaración (prototipos) y definición de funciones return; Ambito de las variables Variables auto Variables static Uso de la memoria RAM Llamada a función (paso de parámetros por valor y por referencia) Funciones recursivas Funciones inline Funciones anidadas La función main() Las funciones getopt() y getopt_long() La función exit() Funciones variádicas Llamado de funciones usando punteros a funciones
  • 3. 3 Divide y vencerás: la programación funcional Divida un problema grande en muchos problemas pequeños http://en.wikipedia.org/wiki/Comparison_of_programming_paradigms
  • 4. Encabezado Inclusión de librerías Declaración o prototipos de funciones Declaración de constantes y variables globales Funcion main() Definición de las funciones
  • 5. 5 Declaración de funciones o prototipos de funciones La declaración/Los prototipos de funciones son opcionales, pero se recomienda fuertemente, para evitar alertas (warnings) en la compilación. Estas se deben poner antes del primer uso de la función. tipo_que_retorna nombre_de_funcion(lista_de_parametros); Si la función no retorna nada entonces el tipo_que_retorna debe ser void nombre_de_funcion: puede ser cualquier identificador válido lista_de_parametros: pueden ser cero (void) o más parámetros separados por comas.
  • 6. 6 Declaración de funciones o prototipos de funciones Se deben colocar antes del main(), con el objeto que el programa sepa que las funciones existen. De hecho los archivos *.h están llenos de prototipos de funciones, y las funciones como tal están en otros archivos *.c. Ejemplo de prototipo: double area_trapecio(double B, double b, double h); o simplemente: double area_trapecio(double, double, double);
  • 7. 7 Declaración de funciones Ejemplos: Los nombres de las variables en la declaración no necesitan ser iguales a aquellos en la definición (aunque se aconseja por orden). Cuando se crean librerías, las declaraciones se ponen en un archivo .h y se llaman utilizando un #include
  • 8. 8 Que pasa si no se declaran las funciones:
  • 9. 9 Definición de funciones La declaración de una función debe ser de la siguiente forma: tipo_que_retorna nombre_de_funcion(lista_de_parametros) { cuerpo de la función } tipo_que_retorna y nombre_de_funcion deben ser los mismos especificados en el prototipo.
  • 10. return Termina la ejecución de una función y retorna el control a la función que la llamó return valor_a_retornar; valor_a_retornar es opcional. Si el tipo de retorno de la función es void, entonces no se puede retornar una expresión, pero si se puede usar el return solo. Es una mala práctica de programación no retornar un valor en funciones que se dijo que se iba a retornar un valor.
  • 12. 12 Ambito de variables (variable scope) El ámbito de una variable determina el rango del código sobre el cual dicha variable existe y por lo tanto puede ser utilizada. Esto sirve para que se pueda volver a definir una variable con un mismo nombre en diferentes partes del programa sin que hayan conflictos entre ellos. Se recomienda que el ámbito de una variable sea tan pequeño como sea posible, de modo que se reduzca el número de variables que se tengan que tener presentes cuando se programe, lo cual redunda en menores errores de programación.
  • 13. 13 Ambito de variables (variable scope) Si una variable es declarada dentro de un bloque (método/función/procedimiento), ésta será válida solo dentro de ese bloque y se destruirá al terminar el bloque. Adicionalmente, la variable no podrá verse ni usarse fuera del bloque (en el exterior del bloque). La variable dentro del bloque es una variable local (variable auto) y solo tiene alcance dentro del bloque que se creó y sus bloques hijos, pero no en bloques hermanos ni padres. Una variable definida fuera de cualquier bloque es una variable global y cualquier bloque puede acceder a ella y modificarla.
  • 14.
  • 15. Ambito de las variables Las variables se dividen en variables globales y locales. Las variables locales sólo existen en el bloque en el cual se definieron { } y se deben declarar antes de utilizarlas: Aquí ya no existe tmp2 Aquí existe tmp y tmp2 Aquí no existe ni tmp ni tmp2 Aquí existe tmp
  • 16. Ambito de variables por bloques Las variables (locales) sólo existen en el bloque en el cual se definieron. Los bloques se definen por { } Si aquí se hace una referencia a b, aparecería un error de compilación
  • 17.
  • 18. Variables auto auto es una palabra reservada de C que se supone que sirve para definir las variables locales. Como este es el comportamiento implícito de las variables en una función, dicha palabra nunca se usa. Dicha palabra es inútil y existe porque la heredó el lenguaje C de su predecesor, el lenguaje B.
  • 19. Variables static http://en.wikipedia.org/wiki/Static_variable Las variables static son locales a la función en la que se definieron, pero existen durante toda la ejecución del programa. Solo se inicializan la primera vez.
  • 20. Cuidados con las variables globales Póngale a las variables globales un nombre con sentido: int i; // mal nombre para una variable global int NUM_MAX_ITERAC; // buen nombre para una variable global Unicamente declare variables globales cuando sea estrictamente necesario. Nunca las utilice si una variable estática podría hacer el mismo trabajo.
  • 21. 21 Uso de la memoria RAM ● Código del programa, las constantes cadena y las constantes #define se guardan en el segmento de código (code segment) ● Variables globales, constantes globales creadas con const y variables static se crean en el segmento de datos (data segment); si no se han inicializado se guardan en un subconjunto del segmento de datos llamado .bss. Cualquier variable dentro del .bss se inicializa a cero. ● Variables locales (variables auto) (variables creadas en bloques {}), constantes locales creadas con const y llamados de funciones se crean en la pila de llamadas (call stack). La pila tiene un tamaño limitado por el sistema operativo. Modelo de memoria LIFO. ● Memoria dinámica (malloc) se toma del montón (heap) y se accede usando punteros.
  • 22. 22 La pila de llamadas (call stack) http://en.wikipedia.org/wiki/Call_stack La pila de llamadas o simplemente “la pila” es una estructura dinámica de datos LIFO, que almacena la información sobre las subrutinas activas (aquellas que se han llamado pero todavía no han completado su ejecución) de un programa. La principal razón de su uso, es seguir el curso del punto al cual cada subrutina activa debe retornar el control cuando termine de ejecutar. La pila de llamadas está compuesta por los llamados marcos de pila (stack frames). Un marco de pila incluye la siguiente información: ● los argumentos (parámetros) pasados a la función; ● la dirección de memoria del código que se debe seguir ejecutándose una vez se retorne de la función (dirección de memoria que está dentro del segmento de código correspondiente a la función llamante); ● espacio para las variables locales de la función.
  • 23. 23 La pila de llamadas (call stack) http://en.wikipedia.org/wiki/Call_stack Aquí la DrawLine() está corriendo actualmente, y fue llamada por DrawSquare()
  • 24. 24 La pila de llamadas (call stack) |
  • 25. 25 Paso de parámetros: por valor o por referencia Por valor: se hace una copia local de la información dentro de la función y por lo tanto el valor original no cambia. Por referencia: se transfiere la dirección de memoria de la variable con un puntero y por lo tanto cualquier cambio a la variable hecha por la función se observa en la función invocadora. Se hace para cambiar el valor de la variable, o cuando los datos a pasar son muy grandes y se quiere acelerar los cálculos o conservar la memoria.
  • 26. 26 x se está pasando por valor y se está pasando por referencia z es la salida de la función Declaración de la función Definición de la función Llamado de la función
  • 27. 27 r pasa por valor p y A pasan por referencia
  • 28. 28 Como hacer una función que devuelva más de dos variables? 1. Pasando punteros
  • 29. 29
  • 30. 30 Como hacer una función que devuelva más de dos variables? 2. Retornando una estructura que contiene los valores deseados:
  • 31. 31 Como hacer una función que devuelva más de dos variables? 3. Utilizar un híbrido: pasar un puntero a una estructura, que posteriormente es llenada:
  • 32. 32 Punteros a variables estáticas Como las variables estáticas se crean en el segmento de datos, un puntero a una variable estática siempre será válido incluso después de haberse salido de la función. HACER EJEMPLO
  • 33. 33 Variables estáticas cuando se tienen varios hilos (threads) El C11 definión la palabra clave _Thread_local: static _Thread_local int mivariable = 10; Con esta palabra, cada hilo tendrá una variable estática diferente.
  • 34. 34 Funciones recursivas http://en.wikipedia.org/wiki/Recursion_%28computer_science%29 Son funciones que se llaman a si mismas. Se debe poner mucho cuidado al escribir una función recursiva ya que esta no se debe llamar a si misma indefinidamente; debe haber un punto en el que la función en verdad retorne un valor. De lo contrario la función agotará toda la memoria de pila disponible en el computador y este terminará.
  • 35. 35
  • 36. 36 Se debe tener en cuenta que las funciones recursivas pueden agotar la memoria de pila.
  • 37. 37 Funciones inline http://en.wikipedia.org/wiki/Inline_function Con esta palabra, definida en C99, se solicita al compilador (si es posible) que inserte el cuerpo completo de la función en cada lugar donde se llama esta, en vez de generar código que llame a la función. El compilador no está obligado a cumplir esta instrucción. Esta instrucción es útil para incrementar la velocidad del código y se utiliza generalmente con funciones muy pequeñas. Bjarne Stroustrup, el creador de C++, sugiere que no se deben emplear macros (#define) para hacer funciones pequeñas sino que se deben utilizar funciones inline. En el C99 el inline solo se puede colocar en el prototipo. Si se pone en la definición de la función, habrá error de compilación.
  • 39. 39 Funciones anidadas GNU C extension Una función anidada (nested) es una función encapsulada dentro de otra función. Solo puede ser llamada por la función que contenedora o por las funciones anidadas en el mismo nivel. Se utilizan para ocultar procedimientos que sólo son útiles localmente. Se deben definir junto con la declaración de variables al principio de la función.
  • 40. La función main() Es obligatoria ya que es el punto de entrada al programa. El standard C permite los siguiente formas de invocar a main(): No es necesario escribir una declaración para main(). Debe retornar siempre un int
  • 41. Valores que retorna main() 0 = EXIT_SUCCESS indica que el programa terminó correctamente. 1 = EXIT_FAILURE indica que el programa terminó con un error Estas constantes están definidas en stdlib.h
  • 42.
  • 43.
  • 44. main() con parámetros Ver: http://www.gnu.org/software/libc/manual/html_node/Program-Arguments.html argc (argument count) contiene el número de parámetros recibidos por el programa (incluyendo el nombre del programa mismo). argv (argument vector) es una matriz de punteros a cada uno de los parámetros en el mismo orden en que fueron recibidos. Es lo mismo que char **argv El primer elemento del arreglo argv[0] contiene el nombre del programa (como se invocó). argv[1] indica el primer parámetro pasado al programa; argv[2] el segundo parámetro, y así sucesivamente.
  • 45. La función getopt() ● Está definida en unistd.h, se utiliza para procesar opciones en línea de comandos, tal y como es común en la aplicaciones de consola. ● Soporta opciones de ● un carácter: -a ● múltiples opciones especificadas al mismo tiempo: -a -b y -c se especifican como -abc ● opciones con argumentos: -a arg, -i 3 ● Ver: http://en.wikipedia.org/wiki/Getopt http://www.gnu.org/software/libc/manual/html_node/Getopt.html $ man 3 getopt (en Linux y MacOS)
  • 46. La función getopt_long() ● Está definida en getopt.h, es una versión avanzada de getopt(). ● Soporta opciones como: ● un carácter: -a o de un nombre --name ● múltiples opciones especificadas al mismo tiempo: -a -b y -c se especifican como -abc ● opciones con argumentos -a arg, --name=arg, -i 3 Ver: http://en.wikipedia.org/wiki/Getopt http://www.gnu.org/software/libc/manual/html_node/Getopt.html $ man 3 getopt (en Linux y MacOS)
  • 47. 47 void exit (int exitcode); Hace que el programa termine de forma natural. Está definida en stdlib.h exit(EXIT_SUCCESS); es equivalente a return 0; exit(EXIT_FAILURE); es equivalente a return 1; En Linux/BSD existe la librería sysexits.h la cual contiene varios códigos de error.
  • 48. 48 Funciones variádicas http://en.wikipedia.org/wiki/Variadic_function Son funciones que toman un número variable de argumentos, que de algún modo se debe saber con antelación. Se necesita especificar al menos un parámetro de un tipo de dato conocido. Los siguientes parámetros son opcionales y pueden variar en cantidad y en tipos de datos. Se definen usando la librería stdarg.h. Ver: http://www.gnu.org/software/libc/manual/html_node/Argument-Macros.html#Argument-Macros
  • 49. 49
  • 50. 50 Llamado de funciones a través de punteros a funciones http://en.wikipedia.org/wiki/Function_pointer Un puntero a función es un tipo de puntero el cual en vez de referirse a datos, se refiere a la dirección del código ejecutable correspondiente a una función el cual se encuentra dentro de la memoria. Al invocar la función a la cual el puntero apunta, se ejecuta dicho código. Aparentemente su uso es complicado, pero si se domina su uso, pueden ser fuente de una programación extremadamente eficiente y elegante. Ver: http://www.newty.de/fpt/
  • 51. 51
  • 52. 52