Вы находитесь на странице: 1из 23

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); declaración
……..
int main (void)
{
Parámetros Reales
float x, y, z;
x = 23.12;
y = 14.33;
………
z =suma ( x, y); llamada
……….
}
float suma ( flota a, flota b) definición
{
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) 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) 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); 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 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; 2
void Fun(void); 3
4
for (i=0; i<10; i++) 5
Fun( ); 6
} 7
void Fun (void) 8
{ 9
static int count=1; 10
11
count++;
printf(“ %d \n”, count);
}

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;
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: Pila
int doble (int a);
……..
int main(void)
{
int w; Variable z
……….. Parámetro a
w = doble ( 2);
LLamada
……………
}

int doble(int a)
{
int z;
z=2*a; z
return z; a
} Retorno
Traza de Programas

Ejemplo:
int a, b; /* variables globales */
void F1(int *c);
int main() Traza:
{ Linea a b/G c / *c b/L
1) a = 1; 1 1 ?
2) b = 3; 2 1 3
3) F1(&a); 3 1 3 &a /1 ?
4) printf(“ %d %d \n”,a,b); 5 1 3 &a /1 2
return 0; 6 5 3 &a /5 2
} 4 5 3
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.


Recursividad
Ejemplo clásico:
Traza:
long fact(int n)
R= fact(4) 24
{
long f;
4 *fact(3) 4* 6
if (n > 1)
{
3*fact(2) 3*2
2) f = n*fact(n-1); Llamada recursiva
}
2*fact(1) 2*1
else
3) f = 1; Caso base
1 1
return f;
}

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*/
{ Módulo1
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; Programa Principal
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;}
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*/ >prueba Pepe


#include <stdio.h>

main(int argc, char *argv[]) argv[0]


{ argv[1]
argc = 2
if(argc!=2) {
printf("Adjunte su nombre al ejecutable.\n"); >Hola Pepe
exit(1);
}
printf("Hola %s", argv[1]);
}

>prueba Pepe Mario >prueba “Juan Lopez”


argc=3 argc=2
>Adjunte su nombre al ejecutable >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; >prueba2 2.3
if(argc>3) {
printf("Demasiados parámetros.\n"); >Falta un parámetro
exit(1);
}
else >prueba2 2.0 4.0
if(argc<3) {
printf("Falta un parámetros.\n"); >El area es:4.0
exit(1);
}
base = atof(argv[1]);
altura = atof(argv[2]);
area = base * altura /2;
printf("El area es: %f",area);
}
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

>......................................

Вам также может понравиться