Programación modular

Anuncio
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
>......................................
Descargar