Bloque 4 La descomposición funcional y el diseño descendente
Cómo afrontar un problema complejo Dividir cada una de las dificultades que se examinen en tantos fragmentos como sea posible y que se requieran para mejorar la solución Descartes: El Discurso del Método Las cosas grandes se pueden reducir a cosas pequeñas, y las pequeñas a la nada Proverbio chino
Facilidad de lectura Para comprender un programa de una sola pieza, un ser humano necesita normalmente un tiempo que aumenta exponencialmente con la longitud del programa Dijkstra Otras técnicas: Introducir comentarios Tabular el código Utilizar estructuras de control (no GOTO, etc.)
Ventajas de la división en subprogramas Mayor facilidad para encontrar la solución Mayor facilidad para leer el código Mayor facilidad para repartir el trabajo entre diferentes programadores Mayor facilidad para reutilizar el código en otros problemas
Funciones en C A partir de unos parámetros de entrada, la función realiza unas operaciones y devuelve un valor A B C FUNCIÓ f Valor retornat
Ejemplo: función factorial Tipo del valor retornado Nombre de la función long int factorial(int n) Variables locales int i; long int f=1; for (i=n;i>=2;i--) f=f*i; Nombre y tipo del parámetro Cabecera de la función Cuerpo de la función (instrucciones) return f; Valor que retorna la función
Ejemplo: llamada a la función factorial main() int x=5; long int res; res=factorial(x); printf("%d\n",res); Llamada a la función factorial
#include <stdio.h> long int factorial(int n) int i; long int f=1; for (i=n;i>=2;i--) f=f*i; return f; main() int x=5; long int res; res=factorial(x); printf("%d\n",res);
Parámetros Diferencia entre: Parámetro formal: n Parámetro real (o parámetro de llamada): x Paso de parámetro por valor Se hace una copia del valor del parámetro real al parámetro formal
Ejemplo con más de un int major(int a, int b) if (a>=b) return 1; else return 0; main() int a=5,b=3,c; c=major(b,a);... parámetro
Visibilidad En la función factorial: i, f son variables locales Sólo pueden ser accedidas (son visibles) dentro de la función factorial En main: x también es una variable local No es visible desde la función factorial En realidad main también es una función, la que se llama cuando se ejecuta el programa NOTA: en otros lenguajes puede haber funciones locales (internas a una función y sólo accesibles desde ella), pero en C no
#include <stdio.h> long int factorial(int n); Prototipo de una función main() int x=5; long int res; res=factorial(x); printf("%d\n",res); long int factorial(int n) int i; long int f=1; for (i=n;i>=2;i--) f=f*i; return f;
Ejemplo Calcular m n = m! n!( m n)! Dos funciones: factorial combinatori
long int factorial(int n) int i; long int f=1; for (i=n;i>=2;i--) f=f*i; return f;
long int factorial(int n) int i; long int f=1; for (i=n;i>=2;i--) f=f*i; return f; long int combinatori(int m, int n) return factorial(m)/(factorial(n)*factorial(m-n));
#include <stdio.h> long int factorial(int n) int i; long int f=1; for (i=n;i>=2;i--) f=f*i; return f; main() int m,n; printf("calcul DEL COMBINATORI m sobre n\n"); printf("introdueix m: "); scanf("%d",&m); printf("introdueix n: "); scanf("%d",&n); printf("%d\n",combinatori(m,n)); long int combinatori(int m, int n) return factorial(m)/(factorial(n)*factorial(m-n));
... void escriu_resultat(int m, int n, int c) printf("%d sobre %d val %d\n",m,n,c); El tipo void main() int m,n,c; printf("calcul DEL COMBINATORI m sobre n\n"); printf("introdueix m: "); scanf("%d",&m); printf("introdueix n: "); scanf("%d",&n); c=combinatori(m,n); escriu_resultat(m,n,c);
#include <stdio.h> void f1(int a,int b) b=a-1; void f2(int b, int a) a=a+b; void main() int a=3,b=5; f1(b,a); f2(a,b); printf( %d %d,a,b); Ejercicio Qué escribe este programa?
Ejercicio Calcular e x según la siguiente fórmula (desarrollo de Taylor), sin utilizar los operadores * ni / e x x n = n! n=0