Logo Studenta

Funciones

¡Este material tiene más páginas!

Vista previa del material en texto

Informática I
Departamento de Ingeniería Electrónica
Funciones en C
Informática I – Ingeniería Electrónica
¿Qué es una función?
1) Una función es un fragmento de código que posee un punto de entrada y un 
punto (o más de salida).
2) Puede recibir uno o más argumentos
3) Puede retornar un único valor
FunciónArgumentos Resultado
Informática I – Ingeniería Electrónica
Declaración de función
//Declaración de la función
[tipo devuelto] nombre_de_función (lista de parámetros)
{
//Declaración de variables locales a la función
//Código de la función
//Retorno de valor (opcional)
}
Informática I – Ingeniería Electrónica
Ejemplo: Código de función
#include <stdio.h>
int suma (int,int);
int main (void)
{
int a=5,b=3,c;
c=suma(a,b);
printf(“c=%d=%d+%d”,c,a,b);
}
int suma (int x, int y)
{
int z;
z=x+y;
return z;
}
Prototipo
Llamada 
a función Código de la función
Parámetros formales
Argumentos
Retorno de
valor
Informática I – Ingeniería Electrónica
Ejemplo: Código de función
#include <stdio.h>
int suma (int,int);
int main (void)
{
int a=5,b=3,c;
c=suma(a,b);
printf(“c=%d=%d+%d”,c,a,b);
}
int suma (int x, int y)
{
int z;
z=x+y;
return z;
}
Prototipo
Llamada 
a función Código de la función
Parámetros formales
Argumentos
Retorno de
valor
Informática I – Ingeniería Electrónica
Ejemplo: Código de función
#include <stdio.h>
int suma (int,int);
int main (void)
{
int a=5,b=3,c;
c=suma(a,b);
printf(“c=%d=%d+%d”,c,a,b);
}
int suma (int x, int y)
{
int z;
z=x+y;
return z;
}
5
3
Pasaje por 
valor
Informática I – Ingeniería Electrónica
Tipos de variables
#include <stdio.h>
int suma (int,int);
int var;
int main (void)
{
int a=5,b=3,c;
c=suma(a,b);
printf(“c=%d=%d+%d”,c,a,b);
}
int suma (int x, int y)
{
int z;
z=x+y;
return z;
}
Variable global
Variables locales 
de main
Variable local de suma
Parámetros formales de suma
Informática I – Ingeniería Electrónica
Tipos de variables
Variables Valor inicial Hábitat
Tiempo de 
vida
Visibilidad
Globales Cero Área estática Todo el proceso
Todas las 
funciones *
Locales Valor “aleatorio”
Área de pila 
asignada a la 
función
Vigencia de la 
función donde 
fueron creadas
Sólo en la 
función en que 
fueron 
declaradas
Parámetros 
formales
Argumento
transferido
* Salvo el caso de variables locales homónimas
Informática I – Ingeniería Electrónica
¿Por qué escribir funciones?
1) Modularidad: Dividir el código en módulos más pequeños facilita:
1) Análisis
2) Debugging
3) Lectura y comprensión
2) Reusabilidad: Las funciones pueden agruparse en bibliotecas (libraries) 
las cuales pueden reusarse en futuras aplicaciones
3) Eficiencia: Las funciones pueden llamarse varias veces reduciendo el 
tamaño del código de programa.
Informática I – Ingeniería Electrónica
A programar…
1) Escribir una función que recibe un número e indica si es primo (1) o no 
(0).
int esPrimo (int num)
2) Usar la función anterior para encontrar pares de números primos 
separados por dos unidades ( ejemplo: 3 y 5, 5 y 7, etc.) desde 1 a 1000.
Compilación Separada
Funciones en C:
Internals
Pila
Informática I – Ingeniería Electrónica
Internals de llamados a funciones
Conceptos previos
¿Qué es una pila?
Es una estructura de datos de tipo LIFO (last in / first out), es decir, el último
dato en entrar es el primero en salir.
Se opera sobre la pila ingresando o retirando datos, siendo la lectura
destructiva.
Informática I – Ingeniería Electrónica
Internals de llamados a funciones
Carga de datos en la pila (PUSH)
SP
(stack pointer)
SP
(stack pointer)
1. Se decrementa el SP
(según tamaño del operando)
2. Se guarda el dato en la 
posición actual
dato
PUSH dato
Mapa de memoria
Direcciones de 
memoria 
decreciente
Informática I – Ingeniería Electrónica
Internals de llamados a funciones
Lectura de datos de la pila (POP)
1. Guarda el dato y se guarda en la 
dirección (dir) indicada
2. Se ingrementa el SP
POP dir
Mapa de memoria
dato
SP
(stack pointer)
Direcciones de 
memoria 
decreciente
SP
(stack pointer)
Informática I – Ingeniería Electrónica
Ámbito del main
int main (void)
{
int a=5,b=3,c;
c=suma(a,b);
printf(“c=%d=%d+%d”,c,a,b);
}
Ámbito de la función
int suma (int x, int y)
{
int z;
z=x+y;
return z;
}
Internals de llamados a funciones
Cambio de contexto
Informática I – Ingeniería Electrónica
Ámbito del main
int main (void)
{
int a=5,b=3,c;
c=suma(a,b);
printf(“c=%d=%d+%d”,c,a,b);
}
Ámbito de la función
int suma (int x, int y)
{
int z;
z=x+y;
return z;
}
Llamado a 
función
Retorno
Internals de llamados a funciones
Cambio de contexto
Informática I – Ingeniería Electrónica
Ámbito del main
int main (void)
{
int a=5,b=3,c;
c=suma(a,b);
printf(“c=%d=%d+%d”,c,a,b);
}
Ámbito de la función
int suma (int x, int y)
{
int z;
z=x+y;
return z;
}
Llamado a 
función
Retorno
Dirección de 
retorno
Parámetros 
formales
Esta información debe ser 
accesible desde el ámbito de 
la función.
Internals de llamados a funciones
Cambio de contexto
Informática I – Ingeniería Electrónica
Informática I – Ingeniería Electrónica
Ámbito del main
int main (void)
{
esPrimo (arg_1);
esPrimo (arg_2);
esPrimo (arg_3);
}
Ámbito de la función
void esPrimo (int x)
{
/*Código…*/
return z;
}
Funciones: Memoria y tiempo de ejecucion
Primer llamado de 
esPrimo ();
Informática I – Ingeniería Electrónica
Ámbito del main
int main (void)
{
esPrimo (arg_1);
esPrimo (arg_2);
esPrimo (arg_3);
}
Ámbito de la función
void esPrimo (int x)
{
/*Código…*/
return z;
}
Funciones: Memoria y tiempo de ejecucion
Segundo llamado de 
esPrimo ();
Informática I – Ingeniería Electrónica
Ámbito del main
int main (void)
{
esPrimo (arg_1);
esPrimo (arg_2);
esPrimo (arg_3);
}
Ámbito de la función
void esPrimo (int x)
{
/*Código…*/
return z;
}
Funciones: Memoria y tiempo de ejecucion
Tercer llamado de 
funcionA ();
En cada una de las llamadas a la función de código! esPrimo() 
reutilizo el mismo bloque 
Informática I – Ingeniería Electrónica
Solución sin funciones
int main (void)
{
}
Funciones: Memoria y tiempo de ejecucion
Bloque de código para 
determinar si un numero es 
primo para NUM_1
Bloque de código para 
determinar si un numero ES 
PRIMO para NUM_2
Bloque de código para 
determinar si un numero ES 
PRIMO para NUM_3
Si se resuelve sin utilizar funciones, nos 
veríamos obligados a repetir el mismo código 
cada vez que quisiéramos averiguar si un 
número es primo.
La repetición de código consume más memoria, 
haciendo nuestro programa menos eficiente.
Para la ingeniería de software, la repetición de 
código es considerado como CODE SMELL. Esto 
significa que posiblemente, podríamos mejorar 
la forma en la hemos escrito el mismo.
Informática I – Ingeniería Electrónica
Contras del uso de funciones:
• El cambio de contexto que se realiza en cada llamado a función, consume ciclos de 
programa extras, por lo que la ejecución de un código desde una función es mas 
lento
• Lo dicho, SOLO es relevante en situaciones críticas:
• Por ej: En el caso de que la función sea sumamente corta y necesite ser 
llamada con intervalos de tiempo considerablemente cortos. 
• En caso contrario, podríamos considerar esta contraindicación como despreciable.
Funciones: Memoria y tiempo de ejecucion
Informática I – Ingeniería Electrónica
Más ejercicios
1) Escribir una función que reciba dos caracteres e indique si son iguales (1) o 
no (0) independientemente si están en mayúsculas o minúsculas.
int charComp(char c1, char c2);
2) Escribir una función que reciba un número y devuelva su factorial.
long int factorial (int num);
En ambos casos comprobar el correcto funcionamiento de las funciones.
Cálculo de factorial con 
funciones anidadas.
Videos de referencia:
Funciones. Práctica: https://www.youtube.com/watch?v=aHaj17hyyls
Funciones. Teoría: https://www.youtube.com/watch?v=qML2DiiFXFo
https://www.youtube.com/watch?v=aHaj17hyylshttps://www.youtube.com/watch?v=qML2DiiFXFo

Continuar navegando