PROGRAMACION MODULAR FUNCIONES Ventajas de la programación modular: Aumentar la legibilidad y comprensión del programa Reducir el tiempo de desarrollo, aprovechando módulos ya existentes Permitir la resolución del problema por varios programadores a la vez Facilitar la depuración del programa Facilitar el mantenimiento TÉCNICA DE DISEÑO DESCENDENTE ( Top Down Design) Problema Tarea1 Tarea2 Tarea3 Tarea4 T11 T12 T21 T31 T41 T42 T43
En el tratamiento de funciones ó subprogramas hay que distinguir tres instancias fundamentales: La declaración de la función La definición de la función La llamada a la función
#include <stdio.h> float suma ( float a, float b);.. int main (void) float x, y, z; x = 23.12; y = 14.33; z =suma ( x, y);. float suma ( flota a, flota b) return a+b; Parámetros Reales declaración llamada definición Parámetros Formales
Declaración de función en C: Tipo Nombre (lista de parámetros); Definición de funciones en C: Tipo Nombre (lista de parámetros formales) Cabecera de la función Declaraciones Cuerpo de la función Instrucciones return Valor; Valor de retorno Llamada de una función en C: Nombre(lista de parámetros reales);
Ejemplo: int main()... func1 ( );. func2 ( );... return 0; void func1 ( )... return; void func2 ()... return;
Ejemplo: float triple (float x); declaración int main() float x, y; x = triple(3) + 2; /* x = 9 + 2*/ llamada y = triple(triple(2)); /* y = triple(6) y = 18*/ llamada... float triple(float x) definición return (3 * x); Ejemplo: void Suma(int a, int b) printf( la suma es %d\n,a + b); return; Definición
ÁMBITO DE LAS VARIABLES Variables Globales Variables Locales Ejemplo de variables globales: int g1; /*g1 es global para todo el programa*/ void main( void)... int FunA( )... int g2; /*g2 es global para FunB y FunC*/ int FunB( )... float FunC( )...
Ejemplo de variables locales: float Fun( ) int loc1; /*loc1 es local a Func*/ int loc2; /*loc2 es local al bloque de código entre llaves*/... Ejemplo de variables con el mismo nombre: #include <stdio.h> int z; /* Variable Global */ int Sumar (int x, int y); declaración int main( void ) int suma; /* VariableLocal a main */ z = 3; suma = Sumar(2, 3); printf( %d\n,suma); printf( %d\n,z); return 0; int Sumar(int x, int y) int z; z = x + y; return z; /* z Local a Sumar. Oculta la z global*/ 5 3
LAS VARIABLES GLOBALES DEBEN EVITARSE!!!!!!! Ejemplo: int z; int Sumar(int x, int y); int main() int suma; z = 3; suma = Sumar(2, 3); /* -> 5*/ printf( %d,z); /*z -> 5*/ /*Efecto lateral no deseado*/ int Sumar(int x, int y) z = x + y; return z; Función no portable Dificultad para realizar cambios en el programa Imposible trabajar en grupo
TIPOS DE VARIABLES EN FUNCIÓN DEL ESPECIFICADOR DE ÁMBITO <Especificador de Ambito> <Modificador de Tipo> <Tipo> <Identificador> ; Las variables según el especificador de ámbito se pueden clasificar en: automáticas externas estáticas registro Variables automáticas: Son variables locales, palabra clave auto Variables externas: Fichero1 Fichero2 int a; extern int a; int b; extern int b; void main(void) FunB ( ).. FunA( ) FunC ( )..
Variables estáticas locales: Ejemplo: void main(void) int i; void Fun(void); for (i=0; i<10; i++) Fun( ); void Fun (void) static int count=1; count++; printf( %d \n, count); 2 3 4 5 6 7 8 9 10 11 Variables estáticas globales: Fichero1 Fichero2 int a; extern int a; static int b; void main(void) FunB ( ).. FunA( ) FunC ( )..
Variables registro: Ejemplo: void main(void) register int i; for (i=0,i<180;i++).. Paso de Parámetros a una Función Existen dos posibilidades para pasar parámetros a un subprograma: por valor por referencia.
Ejemplo Paso Por Valor: void Decremento(int x) x = x - 1; printf( %d\n,x); return; void main(void)... n = 4; Decremento(n); 3 printf( %d\n,n); 3 4 n no cambia su valor Ejemplo Paso por Referencia Los arreglos se pasan a las funciones por referencia
Ejemplo: void Decremento(int *x) *x = *x - 1; printf( %d\n,*x); return; void main(void)... 3 int n = 4; 3 Decremento(&n); 3 printf( %d\n,*x); El valor de n cambia después de llamar a la función. Ejemplo: void intercambio(int *x, int *y) int z; z = *x; *x = *y; *y = z; return;
Gestión de la memoria Ejemplo: int doble (int a);.. int main(void) int w;.. w = doble ( 2); int doble(int a) int z; z=2*a; return z; Variable Parámetro Pila z a LLamada z a Retorno
Traza de Programas Ejemplo: int a, b; /* variables globales */ void F1(int *c); int main() 1) a = 1; 2) b = 3; 3) F1(&a); 4) printf( %d %d \n,a,b); return 0; void F1(int *c) int b; 5) b = 2; 6) *c = a + b + 2; return; Traza: Linea a b/g c / *c b/l 1 1? 2 1 3 3 1 3 &a /1? 5 1 3 &a /1 2 6 5 3 &a /5 2 4 5 3 La traza se podrá verificar en el Laboratorio con el depurador del IDE.
Recursividad Ejemplo clásico: long fact(int n) long f; if (n > 1) 2) f = n*fact(n-1); Llamada recursiva else 3) f = 1; Caso base return f; Traza: R= fact(4) 24 4 *fact(3) 4* 6 3*fact(2) 3*2 2*fact(1) 2*1 1 1 Ejemplo: Mostrar en pantalla los dígitos de un número entero positivo en forma inversa 5675 5765 void cifras (int num) printf( %d,num%10); if(num/10!=0) cifras(num/10); return;
Compilación de un programa en un sólo fichero: Compilación separada Compilación de un programa en varios ficheros: Ejemplo: Programa para el cálculo de las combinaciones de m elementos tomados de a n mediante módulos
fact.h: /* Fichero de cabecera para calculo de factorial */ float fact(int n); /*declaración*/ fact.c: /* Funciones para el calculo del factorial */ #include "fact.h" float fact(int n) /*definicion*/ float f; int i; f = 1; for(i = 1; i <= n; i++) f = f * i; return f; combinatoria.cpp: /* Programa para el calculo de m sobre n */ #include <stdio.h> #include "fact.h" /*el archivo está en el directorio de trabajo*/ int main() int m,n; float comb; printf("introduce los valores de m y n"); scanf( %d %d,&m,&n); comb = fact(m) / (fact(n) * fact(m n) ); printf("\nel resultado es:",comb); return 0; Módulo1 Programa Principal
Argumentos de la Función main( ) main(int argc, char *argv[]) argc (argument count) Es un parámetro de tipo entero que contiene el número de argumentos que se han introducido considerando el nombre del ejecutable. argv ( argument values) Es un arreglo de punteros a cadenas de caracteres. Contiene los argumentos que se pasan desde el SO cuando se invoca el programa. Cada argumento debe estar separado por espacio ó una tabulación Ejemplo1: >prueba argc vale 1 argv[0] apunta a la cadena prueba
Ejemplo2: Programa que saluda al usuario cuyo nombre lo ingresa como argumento de main() por linea de comandos del SO. /*prueba.c*/ #include <stdio.h> main(int argc, char *argv[]) if(argc!=2) printf("adjunte su nombre al ejecutable.\n"); exit(1); printf("hola %s", argv[1]); >prueba Pepe argv[0] argv[1] argc = 2 >Hola Pepe >prueba Pepe Mario argc=3 >Adjunte su nombre al ejecutable >prueba Juan Lopez argc=2 >Hola Juan Lopez
NOTA: Si se ingresan cadenas de texto que deben ser convertidas en números utilizar las funciones que convierten una cadena de caracteres ASCII a float, int, long: atof( const char *cad), atol (const char *cad ), atoi (const char *cad). Ejemplo: Pasados por referencia la base y la altura de un triángulo. Calcular el área. /*prueba2.c*/ #include <stdio.h> void main(int argc,char*argv[]) float base, altura, area; if(argc>3) printf("demasiados parámetros.\n"); exit(1); else if(argc<3) printf("falta un parámetros.\n"); exit(1); base = atof(argv[1]); altura = atof(argv[2]); area = base * altura /2; printf("el area es: %f",area); >prueba2 2.3 >Falta un parámetro >prueba2 2.0 4.0 >El area es:4.0
Ejemplo: Programa que muestra en pantalla los argumentos entrados por linea de comandos. #include <stdio.h> void main(int argc, char*argv[]) while (--argc) printf( %s%c,*++argv, argc = = 1? \n : ); > pueba3 cual es la salida >...