Descarga la aplicación para disfrutar aún más
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
Compartir