You are on page 1of 24

Funciones, Procedimientos & Apuntadores

ALFONSO MARTNEZ MARTNEZ

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de datos

Funciones
Desde la perspectiva de las matemticas, es una operacin que toma uno o ms valores llamados argumentos y regresa un resultado:

f(x)=x

f= nombre de la funcin x= argumento. Al argumento x no se le asocia un valor especfico, entonces x es un parmetro formal empleado para definir la funcin
Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Funciones
Para evaluar a f debemos darle un valor real o actual a x, por ejemplo x=3 o x=5: f(3)=9 o f(5)=25 Una funcin puede tener varios argumentos: f(x,y) o f(x, y, z)

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Funciones: en pseudocdigo
tipo_resultado funcion nombre_funcion (lista_parametros) declaraciones_locales; comienza sentencias; ; ; regresa valor o expresin; termina Notas: tipo_resultado= ent flot car alumno, etc. lista_parametros= ent a, ref flot b, etc. declaraciones_locales= ent temp;
Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Parmetros formales

Funciones: f(x)=x
Definicin:

flot funcion eleva_al_cuadrado (ent x) comienza regresa x*x; termina

Parmetro formal

Invocacin:
ent funcion principal() ent y; comienza y = 40 + eleva_al_cuadrado(5); escribe(y); termina

Parmetro reales argumentos

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Procedimientos
Es un sub-programa que ejecuta un proceso especfico y cuya invocacin no se puede incluir en una expresin Las funciones regresan un solo valor, los procedimientos regresan 0, 1 n valores en una lista de parmetros

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Procedimientos: en pseudocdigo
proc nombre_procedimiento (lista_parametros) declaraciones_locales; comienza sentencias; ; ; termina Notas: lista_parametros= ent a, ref flot b, etc. declaraciones_locales= ent temp;

Parmetros formales

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Procedimientos: ejemplo
Definicin:
proc mostrar_mensaje (car msg[]) comienza escribir (msg); termina

Parmetro formal

Invocacin:
ent funcion principal() ent y;

Parmetro real argumento

comienza mostrar_mensaje(Introducir un dato entero); y = leer_entero(); termina


Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Parmetros
Los parmetros en funciones y procedimientos pueden ser:
Entradas: paso de parmetros por valor Salidas: paso de parmetros por referencia Entradas / salidas: paso de parmetros por referencia

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Paso de parmetros
Por valor: los parmetros formales reciben directamente el valor del argumento, sin importar si se trata del resultado de una expresin
proc x (ent a, ent b); /*declaracin prototipo*/ ent func principal() ent m,n; comienza m=5; n=10; x(n, m+5); ; termina

Invocacin: 5 Declaracin:

x(n, m+5) 15

x(ent a, ent b)
10

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Paso de parmetros
Por valor: mecanismo
ent func principal() ent m,n; comienza m=5; n=10; x(n, m+5); ; termina n m 10 5 Memoria del programa
Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Suponiendo que x realiza la multiplicacin de sus parmetros y despliega el resultado:

proc x (ent a, ent b) ent c; comienza c=a*b; escribir(c); termina 100 10 10 Pila c b a
11

Paso de parmetros
Por referencia: los parmetros formales reciben la referencia de una variable enviada como argumento
ent func principal() ent m, n; comienza m=5; n=10; intercambia(dir n, dir m); ; termina proc intercambia (ref ent a, ref ent b) ent temp; comienza temp=dref a; dref a= dref b; dref b= temp; termina

n m 10 10 5 5 Memoria del programa


Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

temp 10 dir m b dir n a Pila

12

mbito de variables
Variable local: variable declarada localmente dentro del programa principal o dentro de algn sub-programa (funcin o procedimiento) y su mbito es nicamente dentro de ste Variable global: variable declarada fuera del programa principal y de sus sub-programas y pueden ser utilizadas por estos. Estas variables ocupan espacios diferentes en la memoria utilizada por un programa
Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

13

Apuntadores
Variables que guardan direcciones de algun tipo de dato cero (NULO) Para habilitar el uso de apuntadores en un lenguaje de programacin, se requiere
Mecanismo para declarar apuntadores:
ent ref a; dref a= 5; a= dir i; int * a; *a= 5; a= &i;
14

Mecanismo de indireccionamiento Mecanismo para obtener la direccin de una variable

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

Apuntadores
Una variable apuntador despus de ser declarada de un tipo especfico, no puede apuntar a un valor de tipo diferente durante un programa
ent ref u; /* u es una variable de tipo apuntador de enteros que no podr apuntar a datos de otro tipo */

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

15

Apuntadores: ejemplos
car ref p, c; p= dir c;
p c

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

16

Apuntadores: ejercicio
Obtener los valores finales de x, y e ip.
Pseudocdigo: ent ref ip; ent x,y; x=1; y=2; ip= dir x; y=dref ip; dref ip=0; ip=dir z[0]; Lenguaje 'C' int *ip; int x,y; x=1; y=2; ip= &x; y= *ip; *ip=0; ip= &z[0];

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

17

Memoria dinmica
Memoria utilizada en tiempo de ejecucin
Memoria demandada de acuerdo a las necesidades de un programa durante su ejecucin Se solicita al Sistema Operativo quien la provee si existe un segmento que pueda ofrecer de acuerdo a la peticin

Mecanismos requeridos:
Solicitud Manejo (a travs de apuntadores) Liberacin
Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

18

Memoria dinmica: mecanismos


Solicitud y asignacin de memoria
Pseudocdigo
ent ref a; a=asignar_mem(tamano(ent)*50);

Lenguaje 'C'
int * a; a=malloc(sizeof(int)*50);

Liberar memoria
Pseudocdigo
liberar_mem(a);

Lenguaje 'C'
free(a);
Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

19

Apuntadores y arreglos en 'C'


En 'C' existe una fuerte relacin entre apuntadores y arreglos Cualquier operacin que se pueda lograr por indexacin puede realizarse con apuntadores La operacin con apuntadores es ms rpida, pero ms difcil de entender

Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

20

Apuntadores y arreglos en 'C'


int a[10]; int *pa, x; pa = &a[0]; a[0]=4; x=*pa;
pa=&a[0]; x=a[i]; x=*(pa+i);

pa 4 0
pa=&a[0]; x=*(pa+i); x=pa[i];

pa+1 pa+2

x 4 5 6 7 8 9

4 a

Expresiones equivalentes:

pa+1 significa que el apuntador se mover al siguiente entero, no al siguiente byte pa+i apuntar al i-simo elemento a partir de la de la direccin del elemento asignado a pa (en el ejemplo, a[0])
Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

21

Apuntadores y arreglos en 'C'


int a[10]; int *pa, x;

Existe diferencia entre el nombre de un arreglo y un apuntador


Un apuntador es una variable, por eso: pa= pa+i y pa =a El nombre de un arreglo es un identificador y no es una variable a=pa a++ No son vlidas!
Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

22

Apuntadores y arreglos en 'C'


Los arreglos enviados como argumento:
int suma_arreglo(int *a, int n) Int main() { { int suma,i; int a[10]; suma=0; int x; for(i=0;i<n;i++) x=10; suma=suma+a[i];/*suma=suma+*(a+i)*/ ; return suma; x=suma_arreglo(a,x); } printf(%i,x); return 0; }

Puede observarse que mientras a es un arreglo en el principal, a es un apuntador en la funcin suma_arreglo() y en su cuerpo, se manipula como arreglo, Programacin Avanzada & Estructura de Datos pero se puede manipular como apuntador Alfonso Martnez Martnez:

23

Aritmtica de direcciones en 'C'


Si p y q son apuntadores, apuntando a elementos de un mismo arreglo, entonces se pueden aplicar los operadores de relacin entre los apuntadores: ==, !=, <, >, <= y >= Tambin se pueden aplicar diferentes operadores aritmticos un apuntador p, apuntando al un arreglo: ++, +, +=, -, etc
Se le deja como responsabilidad al programador vigilar que en las operaciones con apuntadores, no se est invadiendo memoria no asignada, dado que el S. O. terminar el proceso en tiempo de ejecucin Alfonso Martnez Martnez: Programacin Avanzada & Estructura de Datos

24

You might also like