PROGRAMACION ESTRUCTURADA: Tema 3. Funciones Presenta: David Martínez Torres Universidad Tecnológica de la Mixteca Instituto de Computación Oficina No. 37 dtorres@mixteco.utm.mx Contenido 1. Definiciones de funciones 2. Funciones con paso de parámetros por valor 3. Funciones con paso de parámetros por referencia 4. Funciones recursivas 5. Referencias 1
1. Diseño descendente También conocido como diseño top-down o divide y vencerás. Consiste en empezar analizar un problema complejo e ir descomponiendo en subproblemas(módulos) e ir avanzando nivel a nivel, hasta obtener subproblemas fáciles de solucionar. En lenguaje C, la solución de un problema se compone de una función principal, el cual invoca a funciones que resuelven una parte del problema dado, donde cada función puede particionarse en otras más. 1. Diseño descendente Nivel 1 Cálculo superficie de un rectángulo Nivel 2 Entrada Cálculo Salida Nivel 3 Entrada altura Entrada base S = B * Alt Salida altura Salida base Salida superficie Lectura num. Real Validación Lectura num. Real Validación Nivel 4 2
1. Diseño descendente Ventajas Facilita solución de problemas Permite que cada desarrollador realice una parte de forma independiente. Propicia la reutilización de código. Consideraciones Realizar una correcta descomposición Adecuada definición de las interfaces(argumentos) Terminar con una correcta integración incremental suficientemente probada. 2. Funciones Las funciones son módulos que resuelven una parte de un problema complejo. Componentes de una función en C Prototipo de función Llamadas a función (Paso de parámetros) Definición o implementación de la función Ejemplo, desarrollar el problema del cálculo de la superficie de un rectángulo. 3
4
2. Funciones Tanto el prototipo, llamada e implementación de la función, deben coincidir en tipo de retorno, nombre de la función y tipos de los parámetros, así como el orden de estos últimos. (ver ejemplo anterior) Las funciones crean un espacio en memoria durante su ejecución y se libera ese espacio al terminar su ejecución. 2. Funciones #include <stdio.h> int menu(); // prototipos de funciones void introducir( ); int main() { int opc; opc=menu(); int menu() {... void introducir( ) {... //llamadas de función //Implementación de función //Implementación de función 5
2. Funciones (Prototipos) Las funciones en C deben de ser declaradas antes de ser usadas, de manera que tenemos dos opciones: 1. El estándar ANSI C en la estructura de un programa indica que el prototipo de función se coloca antes de la implementación del main. 2. Puede no colocarse el prototipo e iniciar con la implementación de la función antes de la implementación del main (no recomendado de acuerdo al ANSI C). 2. Funciones (Prototipos) El uso de propotipos de función le indica al compilador la cantidad y tipo de dato de los parámetros o argumentos y el tipo de dato que retornará la función. En el prototipo no es necesario definir el nombre de los argumentos, es suficiente con los tipos de datos correspondientes. 6
2. Funciones (Prototipos) tipodatoretorno nombrefuncion(listaparámetros); Ejemplo: prototipo de la función del cálculo de factorial: #include <stdio.h> int factorial (int num); //prototipo de función int main() { 2. Funciones (Llamada de función) La llamada a una función es cuando se solicita la ejecución de una función que ya se encuentra definida previamente. En este caso se debe incluir el nombre de la función y entre paréntesis la lista de los datos que se envían como parámetros, en caso que devuelva un valor, considerar la asignación correspondiente. 7
2. Funciones (Llamada de función) Los datos deben coincidir en número y tipo con los declarados en el prototipo y la definición de la función. #include <stdio.h> int factorial (int num); int main() { int resultado; resultado=factorial(num); //prototipo //llamada 2. Funciones (implementación de función) tipo nombre (listaparámetros ) { declaraciones; instrucciones; 8
2. Funciones (implementación de función) mifuncionnula(){ Al no declarar tipo de retorno, se considera entero Será válida? 2. Funciones (implementación de función) Ejemplo: A continuación se muestra la implementación de la función que calcula el factorial de un número entero positivo. int factorial (int n){ int i, result =1; for( i=2; i<=n; i++) result = result *i; return result; 9
3. Funciones con paso de parámetros por valor En la llamada de función, se pasa solo el contenido de los parámetros (variables) a la función que se invoca. Estas funciones no modifican los valores de las variables que se pasan como argumentos. El resultado que retorna es la solución del subproblema. 3. Funciones con paso de parámetros por valor En estas funciones, para que la función regrese algún valor es necesario utilizar la instrucción return return provoca además la terminación de la ejecución de la función Se recomienda que se coloque al final de la función La sintaxis de la instrucción return es: return expresión; ejemplo: return resultado; 10
//Ejemplo de función con paso por valor #include <stdio.h> int factorial (int); int main() { resultado=factorial(num); int factorial (int n){ int i, mult; mult =1; for( i=n; i>1; i--) mult = mult *i; return mult; //prototipo //llamada 4. Funciones con paso de parámetros por referencia En la llamada de función, se pasa la dirección de uno o más parámetros a la función que se invoca. Desde la implementación de la función, se puede modificar el valor de variables que se pasaron por referencia. 11
4. Funciones con paso de parámetros por referencia Importante mencionar que en C no existe el paso de parámetros por referencia [2], todos los parámetros se pasan por valor. Sin embargo, es posible por medio de variables de tipo apuntador simular el paso por referencia. 4. Funciones con paso de parámetros por referencia Antes, Introducción a apuntadores. Un apuntador es una variable que contiene una dirección de memoria. Frecuentemente esta dirección es la localidad de otra variable. La forma general de la declaración de una variable apuntador es: tipo * nombrevariable; 12
4. Funciones con paso de parámetros por referencia Declaración de variables apuntador int *intptr; float *floatptr; char *strptr; int **intptrptr; 4. Funciones con paso de parámetros por referencia Operadores a utilizar con apuntadores: & Operador de dirección o referencia. Devuelve la dirección de memoria de la variable * Operador de indirección o desreferencia. Devuelve el valor situado en la dirección del operando. Se dice que da acceso a la variable que señala el apuntador. 13
4. Funciones con paso de parámetros por referencia int balance, value; int *bal_ptr; balance=3200; //step 1 bal_ptr = &balance; //step 2 value=*bal_ptr; //step 3 14
//Cálculo de una tabla de potencias #include <stdio.h> #define N 7 //prototipos long pot(int, int); void impencab(void); void imptabpot(int); //long int es implícito void main(void){ impencab(); imptabpot(n); //paso por valor //implementación continuación de del función ejemplo void impencab(void) { int i; printf("\n ------- Tabla de potencias --------\n"); printf("1"); for(i=2; i<=n; i++) printf("%9d", i); putchar('\n'); printf("------------------------------------------------------\n"); 15
void imptabpot(int n){ int i, j; for(i=1; i<=n; i++) { for(j=1; j<=n; j++) if(j==1) printf("%ld", pot(i,j)); else printf("%9ld", pot(i,j)); putchar('\n'); long pot(int m, int n){ int i; long producto=1; for(i=1; i<=n; i++) producto*=m; return producto; 5. Funciones recursivas Una función recursiva es una función que se llama a sí misma, ya sea directa o indirecta a través de otra función. Componentes Caso base. Es el resultado más simple, lo que conoce la función. Paso de recursión. Llamada a la misma función, pero con el problema poco menos complejo que el original. También puede incluir la palabra reservada return. 16
5. Funciones recursivas Calculo del factorial, ejemplo recursivo 33 5. Funciones recursivas 34 17
5. Funciones recursivas int factorial(int n) //definición de la función { int fact; if(n==0 n==1) //caso base fact=1; else fact=n*factorial(n-1); return fact; 35 5. Funciones recursivas Cálculo de la potencia, ejemplo de problema recursivo 36 18
5. Funciones recursivas La serie Fibonacci 0,1,1,2,3,5,8,13,21,34, Empieza con 0 y 1, y tiene la propiedad que cada número Fibonacci subsecuente es la suma de los dos números Fibonacci previos. La serie Fibonacci se puede defininir recursivamente de la siguiente manera: fibonacci(0)=0 fibonacci(1)=1 fibonacci(n)=fibonacci(n-1)+fibonacci(n-2) 7. Referencias 1. Joyanes Aguilar, Luis (1996) Fundamentos de programación, Algoritmos y Estructura de datos. McGraw-Hill, México. 2. Deitel & Deitel (2001) C++ Como programar en C/C++. Prentice Hall 3. Kerrighan y Ritchie El lenguaje de programación. Prentice Hall 4. Gottfried, Byron (1999) Programación en C McGrawHill, México. 5. Levine Gutierrez, Guillermo (1990) Introducción a la computación y a la programación estructurada. McGraw-Hill, México. 6. Levine Gutierrez, Guillermo (1990) Introducción a la computación y a la programación estructurada. McGraw-Hill, México. 7. H. Schildt, C++ from the Ground Up, McGraw-Hill, Berkeley, CA, 1998 8. Keller,,AL;Pohl,Ira. A Book on C. 3 ª edición. Edit.Benjamin umnings.1995 19