Está en la página 1de 37

Programacin Estructurada y

Funciones

Prof. Omar Rosales

Introduccin
La Programacin Estructurada pretende evitar la
edicin de programas en un solo bloque
(monolticos), dificiles de manejar por su longitud.
Algunos autores aconsejan que el cuerpo de una
funcin debera ser visible en una sola pantalla.
La Programacin Estructurada es una estrategia de
resolucin de problemas y una metodologa de
programacin que incluye dos grandes lneas:
El control de flujo en un programa debera ser tan
simple como fuera posible.
La construccin de un programa debera hacerse
empleando la tcnica del diseo descendente (topdown).
Prof. Omar Rosales

Diseo Top-down.
El mtodo de diseo Top-Down, tambin llamado
mtodo de refinamientos sucesivos o divide y
vencers,
consiste
en
descomponer
repetidamente un problema en problemas ms
pequeos. Es decir:
Construir un programa a partir de pequeas piezas o
componentes.
Esas pequeas piezas son llamadas mdulos.
Cada pieza es ms manejable que el programa original
Prof. Omar Rosales

Programando Mdulos en C
Funciones;
Mdulos en C.
Los programas combinan funciones definidas por el
usuario (funciones de usuario) con funciones de librera.
Las libreras estandar de C contienen una amplsima coleccin de
funciones generales y especficas.

Llamadas a funciones:
Invocar a funciones:
Mediante su nombre y argumentos (datos sobre los que actuar)
Pueden devolver resultados.

Analoga de la llamada a una funcin:


En un empresa el jefe encarga una labor al trabajador.
El trabajador busca la informacin, hace el trabajo y devuelve
un resultado.
La informacin ha permanecido oculta: el jefe desconoce los
detalles.
Prof. Omar Rosales

Funciones de la librera math.h


Funciones de math.h:
Se emplean en clculos matemticos
#include <math.h>

Formato de la llamada a la funcin:


NombreFuncion( argumento/s );
y = sqrt( 900.0 ); //llamada
La llamada, emplea un argumento (900.0) sobre el que acta,
devolviendo su raiz cuadrada, que se guarda en la variable y
Si lleva ms de un argumento, se separan mediante comas (,):
z = pow(base, exponente);
Las funciones de math.h devuelven valores de tipo double

Los argumentos pueden ser constantes, variables o


expresiones.
Prof. Omar
Rosales

Algunas funciones disponibles en math.h


Funcion:

Devolucin:

int abs(int num)


double fabs(double num)

Valor absoluto de un entero.


Valor el valor absoluto de un
argumento de doble precisin (double)
El valor x elevado a y.
Nmero aleatorio.
El seno de un ngulo (angulo en
radianes).
El coseno de un ngulo en radianes.
Raiz cuadrada de num.
Logaritmo neperiano de val
Logaritmo en base 10 de num
El entero ms pequeo de un decimal
El entero inmediato superior a un
decimal

double pow(double x,double y)


int rand(void)
double sin(double angle)
double cos(double angle)
double sqrt(double num)
double log (double val)
double log10 (double num)
double ceil (double num);
double floor (double num);

Prof. Omar
Rosales

Utilizacin de funciones de librera

Calcular la raiz cuadrada de (x1 - x2)2 + (y1 - y2)2


a
b
c
d

=
=
=
=

x1 x2;
y1 y2;
pow(a,2) + pow(b, 2);
sqrt(d);

O bien:
d = sqrt(pow((x1-x2),2) + pow((y1-y2),2));

Prof. Omar
Rosales

Funciones
Realmente al llegar a este punto, tod@s hemos escrito nuestras propias
funciones y usado funciones de librera::

main() es una funcin que debe existir en todo


programa en C: Funcin principal
printf(), scanf() son funciones de librera que
hemos utilizado muchsimas veces en nuestros
programas. Su definicin se encuentra en las libreras de
cabecera xxx.h
mi_funcin()es una funcin de usuario, creada por
mi, cuyo cdigo editar yo.
Para utilizar funciones no declaradas en las xxx.h es necesario hacer dos
cosas:

Crear las funciones.


Llamar a las funciones (invocacin, evocacin de la
funcin).
Prof. Omar
Rosales

Declaracin de funciones
La definicin de una funcin es como sigue:
tipo_devuelto nombre_funcion(lista parmetros formales)

{
declaraciones
sentencias

Protipo de funcin
Cuerpo de la funcin

}
tipo_devuelto - es el tipo del dato que devuelve la funcin.
void indica que la funcin no devuelve valor.
nombre_funcion cualquier identificador vlido.
lista de parmetros formales describe el tipo y el
nombre de los argumentos que se le pasan a la funcin cuando es
invocada, separados por comas, para que acte sobre ellos.
Prof. Omar
Rosales

Ejemplo
Definimos la funcin que eleva al cubo un
nmero:
int cubo(int num)
{
int resultado;
resultado = num * num * num;
return resultado;
}
Esta funcin puede ser llamada como:
n = cubo(5);
O bien:
printf(El cubo de %d es %d, n, cubo(5));
Prof. Omar
Rosales

10

Prototipos de Funcin
Funcin prototipo:
Nombre de la funcin.
Parmetros que la funcin va a utilizar.
Tipo de dato devuelto: tipo del dato que la funcin
devuelve mediante return (por defecto es int)

La funcin prototipo slo es necesaria si su definicin


(cuerpo de la funcin) se encuentra en otro lugar (por
ejemplo despus de main())
La funcin de prototipo:
int maximo( int, int, int );
Toma tres enteros
Devuelve un entero
Prof. Omar
Rosales

11

#include <stdio.h>
#include <conio.h>
int maximo( int, int, int );

/* funcion prototipo */

int main()
{
int a, b, c;
printf( "Intro tres enteros:\n " );
scanf( "%d%d%d", &a, &b, &c );
printf( "El maximo es: %d\n", maximo( a, b, c ) );
getch();
return 0;
Ver
}
/* Definicin, cuerpo de la funcion maximo */

f3.cpp

int maximo(int x, int y, int z)


{
int max = x;
if ( y > max )
max = y;
if ( z > max )
max = z;
return max;
}
Prof. Omar
Rosales

12

#include <stdio.h>

#include <conio.h>
//declaracin y cuerpo de la funcion
int maximo( int x, int y , int z)
{
int max = x;
if ( y > max )
max = y;
f4.cpp
if ( z > max )
max = z;
return max;
}

int main()
Ver
{
int a, b, c;
printf( "Intro tres enteros:\n " );
scanf( "%d%d%d", &a, &b, &c );
printf( "El maximo es: %d\n", maximo( a, b, c ) );
getch();
return 0;
}

f5.cpp

Prof. Omar
Rosales

13

Estilos en la definicin y utilizacin de funciones


#include <stdio.h>

#include <stdio.h>

int max(int,int); //prototipos


int min(int,int);

int max (int a, int b)


{
.
}

int main(void)
{
min(x,y);
max(u,v);
..
}
int max (int a, int b) //cuerpo
{
.
}
int min (int a, int b)
{
.
}

int min (int a, int b)


{
.
}
int main(void)
{
..
min(x,y);
max(u,v);
..
}
14

Llamada a la Funcin
Un programa consta de una o
ms funciones, una de las cuales
debe ser la funcin principal
main( ).
Cuando un programa encuentra
nombre elde una funcin, la
funcin es llamada o invocada.
Cuando la funcin finaliza su
trabajo, el control del programa
es devuelto al entorno desde
donde
fue
invocada,
continuando all la ejecucin del
programa.

main()
func1

func2

Prof. Omar
Rosales

15

Ejemplo de funcin
#include <stdio.h>
void mensaje(void); // prototipo de funcin
// o funcin prototipo
int main (void)
{
mensaje( ); /* Llamada a la funcin*/
return 0;
}
void mensaje(void) /*Definicin, cuerpo de la funcin*/
{
printf(Un mensaje para t,\n);
printf(desde la funcion\n);
}
Significado: void mensaje(void);
No devuelve nada.
No recibe argumentos para operar
Prof. Omar
Rosales

16

Tipos de variables segn la visibilidad


Las variables en C se pueden clasificar de varias formas, pero
atendiendo a la parte del cdigo que puede acceder a ellas
se clasifican en:
- Variables Globales: son accesibles desde cualquier lugar
del cdigo (tanto desde main() como desde las funciones.
- Variables Locales: son accesibles desde la funcin en que
son declaradas. Invisibles para otras funciones.
La declaracin de las variables globales ha de hacerse antes
de la funcin main()
La declaracion de las variables locales se har en el cuerpo
cada funcin.
Veamos un ejemplo:
Prof. Omar
Rosales

17

include <...>

Variables Globales

//void funcion(void); //prototipo de funcion


//Declaracin de variables GLOBALES:
int numero = 5;
float valor = 12.3;
char *c = Hola;
int main()
{
int posicion //local a main
...
funcion(); //Llamada a la funcin
printf(%d, resultado);
...
}

Son variable distintas

void funcion(void)
{
int posicion; //local a funcion()
int resultado //local a funcion()
resultado = (int)(numero + valor);
}

Prof. Omar
Rosales

18

/* ejemplo de variables locales*/


#include <stdio.h>
#include <conio.h>
void func1 (void);
int main (void)
{
int i = 5; //local a main()
printf("En main(): %d \n", i);
func1( );
printf("\nDe nuevo en main(): %d \n",i);
getch();
return 0;
}
void func1 (void)
{
int i = 6; //local a func1
printf("\nEn la funcion: %d\n", i);
i++;
printf("\nEn la funcion i++: %d\n", i);
Prof. Omar
}
Rosales

19

Reglas de visibilidad (scope rules)-I


Variables locales:
Son las que se declaran dentro de una funcin. Estn ocultas a otras
funciones.
Se crean al iniciarse la ejecucin de la funcin en que se encuentran
declaradas y se destruyen al salir de la funcin
Variables con el mismo nombre locales en dos funciones, son variables
diferentes.

x, y, m, n son variables
diferentes, en las mismas
direcciones de memoria
(no simultneamente)

int funcion1(...)
{
int x = 1, y = 2, m = 3, n = 4;
. . .
}
int funcion2(...)
{
int x = 1, y = 2, m = 3, n = 4;
. . .
}

local.cpp
local2.cpp
Prof. Omar
Rosales

20

Reglas de visibilidad (scope rules)-II


Variables globales:
Una variable es global cuando es declarada fuera de
cualquier funcin.
Son visibles desde cualquier lugar del programa y se
pueden utilizar en cualquier sitio.
Si dentro de una funcin se vuelve a declarar, de modo
local, una variable global, dentro de la funcin se utilizar
la variable local.
Al ser visibles desde cualquier lugar, pueden ser alteradas
de modo local de forma no deseada: efecto lateral.
Una variable global no debe ser enviada como argumento a
una funcin.
Ver global.cpp y global_local.cpp
21

La sentencia return

Si una funcin debe devolver algo, lo hace mendiante la sentencia return.

Cuando se ejecuta la instruccin return, el control del programa es


devuelto inmediatamente al entorno de la llamada.

Si a la instruccin return le sigue una expresin , el valor de esa expresin


ser devuelto al lugar de llamada de la funcin.

Si una funcin es declarada sin tipo a devolver, por defecto devolver un valor
int:
main()
//devolver un entero

Una instruccin return tendr una de las siguientes formas:


return;
return expresion;
return 0;
Prof. Omar
Rosales

22

Ejemplos de return
return;

//Devuelve el control del programa.


// No devuelve valor

return 77;

//Devuelve el control del programa


//y un valor

return ++a;

//Devuelve el control del programa


//y un valor

return (a+b+c);

//Devuelve el control del programa


//y el valor de (a+b+c)

Hay que tener cuenta que cualquier instruccin que vaya detrs
de return no ser ejecutada (ya que el flujo del programa es
transferido al lugar de la llamada a la funcin).
Prof. Omar Rosales

23

#include <stdio.h>
#include <conio.h>
int min (int a, int b);

int main (void)


{
int j, k, m;
printf(\nIntro dos enteros: ");
scanf("%d %d", &j, &k);
m = min(j, k);
printf("\nEl minimo es: %d\n", m);
getch();
return 0;
printf("\nFin de programa"); //Codigo inancanzable
}
int min(int a, int b)
{
if (a < b)
return a;
else
return b;
}
Prof. Omar
Rosales

24

Parmetros, argumentos

Una funcin puede ser llamada con cero o


ms argumentos.
En el prototipo de funcin:
int func(int x, double y, char c);
La lista de parmetros formales
(variables y sus tipos)es
declarada aqu

En la llamada a la funcin:
valor = func(edad, puntuacion, letra);
Lista de parmetros
actuales (sin su tipo):

Prof. Omar Rosales

25

Normas para escribir la lista de argumentos


formales
El nmero de parmetros formales y actuales debe ser coincidente.
La asociacin de argumentos es posicional: el primer parametro actual se
corresponde con el primer parmetro formal, el segundo con el segundo,
etc

Los parmetros actuales y formales deben ser tipos de datos compatibles.


Los argumentos actuales pueden ser variables, constantes o cualquier
expresin del tipo de dato correspondiente al parmetro formal.
Las llamadas pueden ser por valor o por referencia
Prof. Omar
Rosales

26

#include <stdio.h>
void imprime_mensaje (int k);

/*funcion

int main (void)


{
int n;

Parmetros, argumentos formales

prototipo */

printf(Tengo un mensaje para t.\n);


printf(Cuantas veces quieres verlo?
);
scanf(%d, &n);
imprime_mensaje(n);
return 0;
Parmetros, argumentos actuales

void imprime_mensaje(int k)
{
int i;

/* definicin de funcion */

printf(\nEste es tu mensaje:\n);
for (i=0; i < k; ++i)
printf(En el fondo del mar\n);
}

Prof. Omar
Rosales

27

Paso de parmetros por valor


Cada argumento es evaluado, y su valor es usado
localmente en el lugar del correspondiente parmetro
formal.
Si se pasa una variable a una funcin, el valor de esta
variable almacenado en el entorno de la llamada no
cambia. (la variable transferida si es alterada en la
funcion llamada, no afecta al valor original
Al llamar por valor, el valor de la variable que queremos
transferir es copiado en el parmetro actual.
Ver: por_valor.cpp

Prof. Omar
Rosales

28

#include <stdio.h>
int sumar (int n);
int main (void)
{
int n, resultado;

n = 3;
printf(%d\n, n);
resultado = sumar(n);
printf(%d\n,n);
printf(%d\n,resultado);
return 0;
}
Prof. Omar
Rosales

int sumar(int x)
{
int sum=0;
for ( ; x > 0; --x)
sum += x;
printf(%d\n, x);
return sum;
}
Ver

f2.cpp

3
0
3
6
29

Corrige los errores en los siguientes


fragmentos de programa
1.
{

int g (void)
printf (Funcin interna\n);
int h(void)
{
printf(Funcion interna h\n);
}

La funcin h() no
es correcta. LAS
FUNCIONES NO
PUEDEN SER
ANIDADAS

2.
{

int sum(int x, int y)


int resultado;
resultado = x + y;

La funcin debe
devolver un valor
int

}
Prof. Omar
Rosales

30

Corrige los errores en los siguientes


fragmentos de programa
3. void f (float a);
{
float a;
printf (%f, a);
}
4.

void producto (void)


{

int a, b, c, resultado;
printf(Intro 3 enteros: );
scanf(%d %d %d, &a, &b, &c);
resultado = a * b * c;
printf(El resultado es %d\n, resultado);
return result;
}

Prof. Omar
Rosales

31

#include <conio.h>
#include <stdio.h>
void f(float a);
void main()
{
float z=25;
f(z);
printf("\nEl valor de z en main() no cambia: %g", z);
getch();
}
void f(float z)
{
z += 100;
printf (En la funcion imprimimos; %g", z);
}

Ver

f1.cpp
Prof. Omar
Rosales

32

Paso de parmetros por referencia (por direccin)


Cuando a una funcin se le pasa un parmetro por
referencia, lo que se hace es enviar a la funcin la
direccin de memoria de la variable.
La funcin puede modificar el valor de la variable
pasada por referencia (se le pasa la direccin de
memoria, se modifica el contenido y se almacena en
el misma direccin, con lo que se trata de la misma
variable)
Al pasar un variable por referencia, la variable debe ir
precedida por el operador &.
Se pueden pasar punteros como argumentos,
mtodo empleado para la transferencia de arrays.
Ver seriefpun.cpp

Prof. Omar
Rosales

33

Paso de parmetros por referencia (por direccin)


La declaracin:
int funcion(char *car, int &p);
indica una funcin que devuelve un valor entero y recibe dos
argumentos: un puntero *car y la direccin de memoria &p
de una variable.
char *funcion(char *p, int y);
funcin que recibe un puntero a carcter y un entero,
devolviendo un puntero a carcter. El puntero que recibe y
devuelve puede ser a un simple carcter o a una cadena de
caracteres (en este caso puede requerir su inicializacin como
cadena o la realizacin de una reserva dinmica de memoria
en funcin del tamao deseado).
matf1.cpp

cadcat.cpp

matbi.cpp

matf2.cpp
34

Paso de parmetros por referencia (por direccin)


Si en lugar de arrays monodimensionales (vectores y/o
cadenas de caracteres), pretendemos pasar como
argumentos arrays de dos a mas dimensiones, el asunto
se complica, aunque se utiliza la misma tcnica del paso por
referencia. Emplearemos declaraciones como:
void funcion(int array[][5]); recibe un
array indeterminado ([ ] vaco).
void funcion(int array[][2][3]); idem
pero tridimensional.
Ver: intbidim.cpp intridim.cpp por_referencia.cpp
charff.cpp

charff2.cpp

charff3.cpp
Prof. Omar
Rosales

35

Recursividad
Dado que una funcin puede llamar a otras funciones, en C
est permitido que una funcin pueda llamarse a s misma.
Esta propiedad recibe el nombre de recursividad.
Como la funcin es llamada con argumento, este debe
cambiar para evitar caer en un bucle infinito.
Ver recursiv.cpp

La recursividad se emplea frecuentemente en problemas


de calculo factorial y potencias, pero es ineficaz en
problemas que pueden resolverse mediante bucles (la
recursividad consume mucha memoria, creando nuevas
copias de los argumentos en cada una de las llamadas)
Ver recursi1.cpp

Ver recursi2.cpp

Ver potrecusiv.cpp
36

FIN DE PRESENTACIN DE FUNCIONES

Realizado por Prof. Omar Rosales

37

También podría gustarte