PROGRAMACION MODULAR FUNCIONES - Tesla · PROGRAMACION MODULAR FUNCIONES Ventajas de la...
Transcript of PROGRAMACION MODULAR FUNCIONES - Tesla · PROGRAMACION MODULAR FUNCIONES Ventajas de la...
PROGRAMACION MODULARFUNCIONES
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; }
declaración
llamada
definición
Parámetros Reales
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ónInstrucciones 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ónint main(){float x, y;x = triple(3) + 2; /*→ x = 9 + 2*/ llamaday = 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) Definición{printf(“la suma es %d\n”,a + b);return;}
Á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 Local a Sumar. Oculta la z global*/z = x + y;return z;}
53
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 autoVariables externas:
Fichero1 Fichero2int 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);}
Variables estáticas globales:
234567891011
Fichero1 Fichero2int 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); → 3printf(“%d\n”,n);
‘n’ no cambia su valor
Ejemplo Paso por Referencia
34
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){...int n = 4;Decremento(&n); → 3printf(“%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;}
33
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;}
a z
ParámetroVariable
Pila
LLamada
a z
Retorno
Traza de Programas
Ejemplo:int a, b; /* variables globales */void F1(int *c);int main() Traza:{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;}
La traza se podrá verificar en el Laboratorio con el depurador del IDE.
Linea a b/G c / *c b/L1 1 ?2 1 33 1 3 &a /1 ?5 1 3 &a /1 26 5 3 &a /5 24 5 3
RecursividadEjemplo clásico:long fact(int n){long f;if (n > 1){2) f = n*fact(n-1); Llamada recursiva}else3) f = 1; Caso basereturn f;}
Ejemplo: Mostrar en pantalla los dígitos de un número entero positivo en forma inversa56755765
void cifras (int num){printf(“%d”,num%10);if(num/10 !=0)
cifras(num/10);return;}
Traza:R= fact(4) 24
4 *fact(3) 4* 6
3*fact(2) 3*2
2*fact(1) 2*1
1 1
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 1argv[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);}elseif(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
>......................................