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 T11 T12 Tarea2 T21 Tarea3 T31 Tarea4 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); declaración …….. int main (void) { Parámetros Reales float x, y, z; x = 23.12; y = 14.33; ……… llamada z =suma ( x, y); ………. } definición float suma ( flota a, flota b) { return a+b; } 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) { Declaraciones Instrucciones return Valor; } Llamada de una función en C: Nombre(lista de parámetros reales); Cabecera de la función Cuerpo de la función Valor de retorno 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; llamada x = triple(3) + 2; /*→ x = 9 + 2*/ y = triple(triple(2)); /*→ y = triple(6) → y = 18*/ .... } 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 llamada Á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); 5 printf(“%d\n”,suma); 3 printf(“%d\n”,z); return 0; } int Sumar(int x, int y) { int z; /* z Local a Sumar. Oculta la z global*/ z = x + y; return z;} 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 int a; int b; void main(void) { ………. } Fichero2 extern int a; extern int b; 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 int a; static int b; void main(void) { ………. } Fichero2 extern int a; FunA( ) { ……………} FunC ( ) { ……..……} FunB ( ) { ………. } 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; } 3 4 void main(void) { ... n = 4; Decremento(n); → 3 printf(“%d\n”,n); ‘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; } Pila Variable Parámetro 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 1 2 3 5 6 4 a 1 1 1 1 5 5 La traza se podrá verificar en el Laboratorio con el depurador del IDE. b/G ? 3 3 3 3 3 c / *c b/L &a /1 &a /1 &a /5 ? 2 2 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) 1 2*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 separada Compilación de un programa en un sólo fichero: 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> >prueba Pepe main(int argc, char *argv[]) { argv[0] argv[1] argc = 2 if(argc!=2) { printf("Adjunte su nombre al ejecutable.\n"); exit(1); } printf("Hola %s", argv[1]); } >prueba Pepe Mario argc=3 >Adjunte su nombre al ejecutable >prueba “Juan Lopez” argc=2 >Hola Juan Lopez >Hola Pepe 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 >......................................